[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\nindent_style = space\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nindent_size = 2\n\n[*.{js,ts,tsx}]\nindent_size = 4\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [bradymholt]\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n\n# dotnet core\nbin/\nobj/\nproject.lock.json\nNuGetScratch/\n\napi/wwwroot/**\n!api/wwwroot/scratch.html\n!api/wwwroot/favicon.ico\n\n# node\nnode_modules/\ntypings/\nnpm-debug.log\n\n# client-react\nclient-react/components/*.js\nclient-react.test/build\n!client-react.test/build/client-react/styles/\n\n# ops\nops/hosts\nops/config.yml\nops/*.retry\n\n# other\n*.js.map\n\n# IDE\n.idea/\n.vs/\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Debug api/ (server)\",\n      \"type\": \"coreclr\",\n      \"request\": \"launch\",\n      \"preLaunchTask\": \"build\",\n      \"program\": \"${workspaceRoot}/api/bin/Debug/netcoreapp3.1/api.dll\",\n      \"args\": [],\n      \"env\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\",\n        \"NODE_PATH\": \"../node_modules/\"\n      },\n      \"cwd\": \"${workspaceRoot}/api\",\n      \"externalConsole\": false,\n      \"stopAtEntry\": false,\n      \"internalConsoleOptions\": \"openOnSessionStart\"\n    },\n    {\n      \"name\": \"Debug client-react.test/ (Mocha tests)\",\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"protocol\": \"inspector\",\n      \"program\": \"${workspaceRoot}/node_modules/mocha/bin/_mocha\",\n      \"stopOnEntry\": false,\n      \"args\": [\n        \"--require\",\n        \"ignore-styles\",\n        \"--recursive\",\n        \"client-react.test/build/client-react.test\"\n      ],\n      \"cwd\": \"${workspaceRoot}\",\n      \"preLaunchTask\": \"pretest:client\",\n      \"runtimeArgs\": [\n        \"--nolazy\"\n      ],\n      \"env\": {\n        \"NODE_ENV\": \"development\"\n      },\n      \"sourceMaps\": true\n    },\n    {\n      \"name\": \".NET Core Attach\",\n      \"type\": \"coreclr\",\n      \"request\": \"attach\",\n      \"processId\": \"${command:pickProcess}\"\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"files.exclude\": {\n    \"**/.git\": true,\n    \"**/.svn\": true,\n    \"**/.hg\": true,\n    \"**/CVS\": true,\n    \"**/.DS_Store\": true,\n    \"**/bin\": true,\n    \"**/obj\": true\n  }\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n  // See https://go.microsoft.com/fwlink/?LinkId=733558\n  // for the documentation about the tasks.json format\n  \"version\": \"0.1.0\",\n  \"command\": \"npm\",\n  \"isShellCommand\": true,\n  \"showOutput\": \"always\",\n  \"suppressTaskName\": true,\n  \"tasks\": [\n    {\n      \"taskName\": \"build\",\n      \"args\": [\n        \"run\",\n        \"build\"\n      ],\n      \"isBuildCommand\": true\n    },\n    {\n      \"taskName\": \"test\",\n      \"args\": [\n        \"run\",\n        \"test\"\n      ],\n      \"isTestCommand\": true\n    },\n    {\n      \"taskName\": \"pretest:client\",\n      \"args\":[\n        \"run\",\n        \"pretest:client\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Brady Holt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# ASP.NET Core / React SPA Template App\n\n<img align=\"left\" src=\"https://user-images.githubusercontent.com/759811/210273710-b13913e2-0a71-4d9d-94da-1fe538b8a73e.gif\"/>\n\n<br/>\n\n &nbsp;**Would you take a quick second and ⭐️ my repo?**\n\n<br/>\n\n\nThis app is a template application using ASP.NET Core 3.1 for a REST/JSON API server and React for a web client.\n\n![screen recording 2017-06-10 at 04 12 pm](https://user-images.githubusercontent.com/759811/27006360-bd3b8152-4df7-11e7-9011-f22204abe4d5.gif)\n\n## Overview of Stack\n- Server\n  - ASP.NET Core 3.1\n  - PostgreSQL 10\n  - Entity Framework Core w/ EF Migrations\n  - JSON Web Token (JWT) authorization\n  - Docker used for development PostgreSQL database and MailCatcher server\n- Client\n  - React 16\n  - Webpack for asset bundling and HMR (Hot Module Replacement)\n  - CSS Modules\n  - Fetch API for REST requests\n- Testing\n  - xUnit for .NET Core\n  - Enzyme for React\n  - MailCatcher for development email delivery\n- DevOps\n  - Ansible playbook for provisioning (Nginx reverse proxy, SSL via Let's Encrypt, PostgreSQL backups to S3)\n  - Ansible playbook for deployment\n\n## Demo\n\n[![Demo Video](https://cloud.githubusercontent.com/assets/759811/26319096/4075a7e2-3ee3-11e7-8017-26df7b278b27.png)](https://www.youtube.com/watch?v=xh5plRGg3Nc)\n\n## Setup\n\n1. Install the following:\n   - [.NET Core 3.1](https://www.microsoft.com/net/core)\n   - [Node.js >= v8](https://nodejs.org/en/download/)\n   - [Ansible >= 2.6](http://docs.ansible.com/ansible/intro_installation.html)\n   - [Docker](https://docs.docker.com/engine/installation/)\n2. Run `npm install && npm start`\n3. Open browser and navigate to [http://localhost:5000](http://localhost:5000).\n\nThis template was developed and tested on macOS Sierra but should run on Windows (for development) as well.  If you experience any issues getting it to run on Windows and work through them, please submit a PR!  The production provisioning and deployment scripts (`provision:prod` and `deploy:prod`) use Ansible and require a Linux/Ubuntu >= 16.04 target host.\n\n## Scripts\n\n### `npm install`\n\nWhen first cloning the repo or adding new dependencies, run this command.  This will:\n\n- Install Node dependencies from package.json\n- Install .NET Core dependencies from api/api.csproj and api.test/api.test.csproj (using dotnet restore)\n\n### `npm start`\n\nTo start the app for development, run this command.  This will:\n\n- Run `docker-compose up` to ensure the PostgreSQL and MailCatcher Docker images are up and running\n- Run `dotnet watch run` which will build the app (if changed), watch for changes and start the web server on http://localhost:5000\n- Run Webpack dev middleware with HMR via [ASP.NET JavaScriptServices](https://github.com/aspnet/JavaScriptServices)\n\n### `npm run migrate`\n\nAfter making changes to Entity Framework models in `api/Models/`, run this command to generate and run a migration on the database.  A timestamp will be used for the migration name.\n\n### `npm test`\n\nThis will run the xUnit tests in api.test/ and the Mocha/Enzyme tests in client-react.test/.\n\n### `npm run provision:prod`\n\n _Before running this script, you need to create an ops/config.yml file first.  See the [ops README](ops/) for instructions._\n\n This will run the ops/provision.yml Ansible playbook and provision hosts in ops/hosts inventory file.  Ubuntu 16.04 (Xenial) and Ubuntu 18.04 (Bionic) is supported and tested.\n\n This prepares the hosts to recieve deployments by doing the following:\n  - Install Nginx\n  - Generate a SSL certificate from [Let's Encrypt](https://letsencrypt.org/) and configure Nginx to use it\n  - Install .Net Core\n  - Install Supervisor (will run/manage the ASP.NET app)\n  - Install PostgreSQL\n  - Setup a cron job to automatically backup the PostgreSQL database, compress it, and upload it to S3.\n  - Setup UFW (firewall) to lock everything down except inbound SSH and web traffic\n  - Create a deploy user, directory for deployments and configure Nginx to serve from this directory\n\n### `npm run deploy:prod`\n\n_Before running this script, you need to create a ops/config.yml file first.  See the [ops README](ops/) for instructions._\n\nThis script will:\n - Build release Webpack bundles\n - Package the .NET Core application in Release mode (dotnet publish)\n - Run the ops/deploy.yml Ansible playbook to deploy this app to hosts in /ops/config.yml inventory file.\n\n This does the following:\n  - Copies the build assets to the remote host(s)\n  - Updates the `appsettings.json` file with PostgreSQL credentials specified in ops/group_vars/all file and the app URL (needed for JWT tokens)\n  - Restarts the app so that changes will be picked up\n\n Entity Framework Migrations are [automatically applied upon startup](https://github.com/bradymholt/aspnet-core-react-template/blob/master/api/Program.cs#L23-L24) so they will run when the app restarts.\n\n## Development Email Delivery\n\nThis template includes a [MailCatcher](https://mailcatcher.me/) Docker image so that when email is sent during development (i.e. new user registration), it can be viewed\nin the MailCacher web interface at [http://localhost:1080/](http://localhost:1080/).\n\n## Older Versions\n\nThis template was originally created on .NET Core 1.0 and has been upgraded with new versions of .NET Core.  Older versions can be found on the [Releases](https://github.com/bradymholt/aspnet-core-react-template/releases) page.\n\n## Visual Studio Code config\n\nThis project has [Visual Studio Code](https://code.visualstudio.com/) tasks and debugger launch config located in .vscode/.\n\n### Tasks\n\n- **Command+Shift+B** - Runs the \"build\" task which builds the api/ project\n- **Command+Shift+T** - Runs the \"test\" task which runs the xUnit tests in api.test/ and Mocha/Enzyme tests in client-react.test/.\n\n### Debug Launcher\n\nWith the following debugger launch configs, you can set breakpoints in api/ or the the Mocha tests in client-react.test/ and have full debugging support.\n\n- **Debug api/ (server)** - Runs the vscode debugger (breakpoints) on the api/ .NET Core app\n- **Debug client-react.test/ (Mocha tests)** - Runs the vscode debugger on the client-react.test/ Mocha tests\n\n## Credit\n\nThe following resources were helpful in setting up this template:\n\n- [Sample for implementing Authentication with a React Flux app and JWTs](https://github.com/auth0-blog/react-flux-jwt-authentication-sample)\n- [Angular 2, React, and Knockout apps on ASP.NET Core](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/)\n- [Setting up ASP.NET v5 (vNext) to use JWT tokens (using OpenIddict)](http://capesean.co.za/blog/asp-net-5-jwt-tokens/)\n- [Cross-platform Single Page Applications with ASP.NET Core 1.0, Angular 2 & TypeScript](https://chsakell.com/2016/01/01/cross-platform-single-page-applications-with-asp-net-5-angular-2-typescript/)\n- [Stack Overflow - Token Based Authentication in ASP.NET Core](http://stackoverflow.com/questions/30546542/token-based-authentication-in-asp-net-core-refreshed)\n- [SPA example of a token based authentication implementation using the Aurelia front end framework and ASP.NET core]( https://github.com/alexandre-spieser/AureliaAspNetCoreAuth)\n- [A Real-World React.js Setup for ASP.NET Core and MVC5](https://www.simple-talk.com/dotnet/asp-net/a-real-world-react-js-setup-for-asp-net-core-and-mvc)\n- [Customising ASP.NET Core Identity EF Core naming conventions for PostgreSQL](https://andrewlock.net/customising-asp-net-core-identity-ef-core-naming-conventions-for-postgresql)\n- My own perseverance because this took a _lot_ of time to get right 🤓\n"
  },
  {
    "path": "api/.config/dotnet-tools.json",
    "content": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"dotnet-ef\": {\n      \"version\": \"3.1.1\",\n      \"commands\": [\n        \"dotnet-ef\"\n      ]\n    }\n  }\n}"
  },
  {
    "path": "api/Controllers/AuthController.cs",
    "content": "using System;\nusing System.Text;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Identity;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\nusing aspnetCoreReactTemplate.Models;\nusing aspnetCoreReactTemplate.Services;\nusing aspnetCoreReactTemplate.ViewModels;\nusing System.Security.Claims;\nusing System.IdentityModel.Tokens.Jwt;\nusing Microsoft.IdentityModel.Tokens;\n\nnamespace aspnetCoreReactTemplate.Controllers\n{\n    public class AuthController : Controller\n    {\n        private readonly UserManager<ApplicationUser> _userManager;\n        private readonly IOptions<IdentityOptions> _identityOptions;\n        private readonly JwtOptions _jwtOptions;\n        private readonly IEmailSender _emailSender;\n        private readonly SignInManager<ApplicationUser> _signInManager;\n        private readonly ILogger _logger;\n\n        public AuthController(\n            UserManager<ApplicationUser> userManager,\n            IOptions<IdentityOptions> identityOptions,\n            IOptions<JwtOptions> jwtOptions,\n            IEmailSender emailSender,\n            SignInManager<ApplicationUser> signInManager,\n            ILoggerFactory loggerFactory)\n        {\n            _userManager = userManager;\n            _identityOptions = identityOptions;\n            _jwtOptions = jwtOptions.Value;\n            _emailSender = emailSender;\n            _signInManager = signInManager;\n            _logger = loggerFactory.CreateLogger<AuthController>();\n        }\n\n        [AllowAnonymous]\n        [HttpPost(\"~/api/auth/login\")]\n        [Produces(\"application/json\")]\n        public async Task<IActionResult> Login(string username, string password)\n        {\n            // Ensure the username and password is valid.\n            var user = await _userManager.FindByNameAsync(username);\n            if (user == null || !await _userManager.CheckPasswordAsync(user, password))\n            {\n                return BadRequest(new\n                {\n                    error = \"\", //OpenIdConnectConstants.Errors.InvalidGrant,\n                    error_description = \"The username or password is invalid.\"\n                });\n            }\n\n            // Ensure the email is confirmed.\n            if (!await _userManager.IsEmailConfirmedAsync(user))\n            {\n                return BadRequest(new\n                {\n                    error = \"email_not_confirmed\",\n                    error_description = \"You must have a confirmed email to log in.\"\n                });\n            }\n\n            _logger.LogInformation($\"User logged in (id: {user.Id})\");\n\n            // Generate and issue a JWT token\n            var claims = new [] {\n                new Claim(ClaimTypes.Name, user.Email),\n                new Claim(JwtRegisteredClaimNames.Sub, user.Email),\n                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())\n              };\n\n            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.key));\n            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n\n            var token = new JwtSecurityToken(\n              issuer: _jwtOptions.issuer,\n              audience: _jwtOptions.issuer,\n              claims: claims,\n              expires: DateTime.Now.AddMinutes(30),\n              signingCredentials: creds);\n\n            return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });\n        }\n\n        [AllowAnonymous]\n        [HttpPost(\"~/api/auth/register\")]\n        public async Task<IActionResult> Register(NewUser model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return BadRequest(ModelState);\n            }\n\n            var user = new ApplicationUser { UserName = model.username, Email = model.username };\n            var result = await _userManager.CreateAsync(user, model.password);\n            if (result.Succeeded)\n            {\n                _logger.LogInformation($\"New user registered (id: {user.Id})\");\n\n                if (!user.EmailConfirmed)\n                {\n                    // Send email confirmation email\n                    var confirmToken = await _userManager.GenerateEmailConfirmationTokenAsync(user);\n                    var emailConfirmUrl = Url.RouteUrl(\"ConfirmEmail\", new { uid = user.Id, token = confirmToken }, this.Request.Scheme);\n                    await _emailSender.SendEmailAsync(model.username, \"Please confirm your account\",\n    $\"Please confirm your account by clicking this <a href=\\\"{emailConfirmUrl}\\\">link</a>.\"\n                    );\n\n                    _logger.LogInformation($\"Sent email confirmation email (id: {user.Id})\");\n                }\n\n                // Create a new authentication ticket.\n                //var ticket = await CreateTicket(user);\n\n                _logger.LogInformation($\"User logged in (id: {user.Id})\");\n\n                return Ok();\n            }\n            else\n            {\n                return BadRequest(new { general = result.Errors.Select(x => x.Description) });\n            }\n        }\n\n        [AllowAnonymous]\n        [HttpGet(\"~/api/auth/confirm\", Name = \"ConfirmEmail\")]\n        public async Task<IActionResult> Confirm(string uid, string token)\n        {\n            var user = await _userManager.FindByIdAsync(uid);\n            var confirmResult = await _userManager.ConfirmEmailAsync(user, token);\n            if (confirmResult.Succeeded)\n            {\n                return Redirect(\"/?confirmed=1\");\n            }\n            else\n            {\n                return Redirect(\"/error/email-confirm\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "api/Controllers/ContactController.cs",
    "content": "using System.Linq;\nusing System.Collections.Generic;\nusing Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\nusing aspnetCoreReactTemplate.Models;\nusing Microsoft.EntityFrameworkCore;\nusing System.Threading.Tasks;\n\nnamespace aspnetCoreReactTemplate.Controllers\n{\n    [Authorize]\n    [Route(\"api/[controller]\")]\n    public class ContactsController : Controller\n    {\n        private readonly DefaultDbContext _context;\n\n        public ContactsController(DefaultDbContext context)\n        {\n            _context = context;\n        }\n\n        // GET api/contacts\n        [HttpGet]\n        public IEnumerable<Contact> Get()\n        {\n            return _context.Contacts.OrderBy((o)=> o.LastName);\n        }\n\n        // GET api/contacts/5\n        [HttpGet(\"{id}\", Name = \"GetContact\")]\n        public Contact Get(int id)\n        {\n            return _context.Contacts.Find(id);\n        }\n\n        // GET api/contacts/?=\n        [HttpGet(\"search\")]\n        public IEnumerable<Contact> Search(string q)\n        {\n            return _context.Contacts.\n            Where((c)=> c.LastName.ToLower().Contains(q.ToLower()) || c.FirstName.ToLower().Contains(q.ToLower())).\n            OrderBy((o) => o.LastName);\n        }\n\n        // POST api/contacts\n        [HttpPost]\n        public async Task<IActionResult> Post([FromBody]Contact model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return BadRequest(ModelState);\n            }\n\n            _context.Contacts.Add(model);\n            await _context.SaveChangesAsync();\n            return CreatedAtRoute(\"GetContact\", new { id = model.Id }, model);\n        }\n\n        // PUT api/contacts/5\n        [HttpPut(\"{id}\")]\n        public async Task<IActionResult> Put(int id, [FromBody]Contact model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return BadRequest(ModelState);\n            }\n\n            model.Id = id;\n            _context.Update(model);\n            await _context.SaveChangesAsync();\n            return Ok();\n        }\n\n        // DELETE api/contacts/5\n        [HttpDelete(\"{id}\")]\n        public async Task<IActionResult> Delete(int id)\n        {\n            var contact = new Contact() { Id = id };\n            _context.Entry(contact).State = EntityState.Deleted;\n\n            await _context.SaveChangesAsync();\n            return Ok();\n        }\n    }\n}\n"
  },
  {
    "path": "api/Extensions/StringExtension.cs",
    "content": "﻿using System.Text.RegularExpressions;\n\nnamespace aspnetCoreReactTemplate.Extensions\n{\n    public static class StringExtensions\n    {\n        public static string ToSnakeCase(this string input)\n        {\n          if (string.IsNullOrEmpty(input))\n          {\n            return input;\n          }\n\n          var startUnderscores = Regex.Match(input, @\"^_+\");\n          return startUnderscores + Regex.Replace(input, @\"([a-z0-9])([A-Z])\", \"$1_$2\").ToLower();\n        }\n    }\n}\n"
  },
  {
    "path": "api/Middleware/SpaFallbackMiddleware.cs",
    "content": "using System.Threading.Tasks;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.Logging;\n\nnamespace aspnetCoreReactTemplate\n{\n    /*\n        Middleware that will rewrite (not redirect!) nested SPA page requests to the SPA root path.\n        For SPA apps that are using client-side routing, a refresh or direct request for a nested path will\n        be received by the server but the root path page should be actually be served because the client\n        is responsible for routing, not the server.  Only those requests not prefixed with\n        options.ApiPathPrefix and not containing a path extention (i.e. image.png, scripts.js) will\n        be rewritten.\n\n        (SpaFallbackOptions options):\n            ApiPathPrefix - The api path prefix is what requests for the REST api begin with.  These\n                            will be ignored and not rewritten.  So, if this is supplied as 'api',\n                            any requests starting with 'api' will not be rewritten.\n            RewritePath   - What path to rewrite to (usually '/')\n\n        Examples:\n            (options.ApiPathPrefix == \"api\", options.RewritePath=\"/\")\n            http://localhost:5000/api/auth/login => (no rewrite)\n            http://localhost:5000/style.css => (no rewrite)\n            http://localhost:5000/contacts => /\n            http://localhost:5000/contacts/5/edit => /\n    */\n\n\n    public class SpaFallbackMiddleware\n    {\n        private readonly RequestDelegate _next;\n        private readonly ILogger _logger;\n        private SpaFallbackOptions _options;\n\n        public SpaFallbackMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, SpaFallbackOptions options)\n        {\n            _next = next;\n            _logger = loggerFactory.CreateLogger<SpaFallbackMiddleware>();\n            _options = options;\n        }\n\n        public async Task Invoke(HttpContext context)\n        {\n            _logger.LogInformation(\"Handling request: \" + context.Request.Path);\n\n            // If request path starts with _apiPathPrefix and the path does not have an extension (i.e. .css, .js, .png)\n            if (!context.Request.Path.Value.StartsWith(_options.ApiPathPrefix) && !context.Request.Path.Value.Contains(\".\"))\n            {\n                _logger.LogInformation($\"Rewriting path: {context.Request.Path} > {_options.RewritePath}\");\n                context.Request.Path = _options.RewritePath;\n            }\n\n            await _next.Invoke(context);\n            _logger.LogInformation(\"Finished handling request.\");\n        }\n    }\n\n    public static class SpaFallbackExtensions\n    {\n        public static IApplicationBuilder UseSpaFallback(this IApplicationBuilder builder, SpaFallbackOptions options)\n        {\n            if (options == null)\n            {\n                options = new SpaFallbackOptions();\n            }\n            return builder.UseMiddleware<SpaFallbackMiddleware>(options);\n        }\n    }\n}\n"
  },
  {
    "path": "api/Middleware/SpaFallbackOptions.cs",
    "content": "namespace aspnetCoreReactTemplate\n{\n    public class SpaFallbackOptions\n    {\n        public SpaFallbackOptions()\n        {\n            this.ApiPathPrefix = \"/api\";\n            this.RewritePath = \"/\";\n        }\n        public string ApiPathPrefix { get; set; }\n        public string RewritePath { get; set; }\n    }\n}\n"
  },
  {
    "path": "api/Migrations/20171204210645_Initial.Designer.cs",
    "content": "﻿// <auto-generated />\nusing aspnetCoreReactTemplate.Models;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Migrations;\nusing Microsoft.EntityFrameworkCore.Storage;\nusing Microsoft.EntityFrameworkCore.Storage.Internal;\nusing Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;\nusing System;\n\nnamespace api.Migrations\n{\n    [DbContext(typeof(DefaultDbContext))]\n    [Migration(\"20171204210645_Initial\")]\n    partial class Initial\n    {\n        protected override void BuildTargetModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.SerialColumn)\n                .HasAnnotation(\"ProductVersion\", \"2.0.0-rtm-26452\");\n\n            modelBuilder.Entity(\"aspnetCoreReactTemplate.Models.ApplicationUser\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\");\n\n                    b.Property<int>(\"AccessFailedCount\")\n                        .HasColumnName(\"access_failed_count\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnName(\"concurrency_stamp\");\n\n                    b.Property<string>(\"Email\")\n                        .HasColumnName(\"email\")\n                        .HasMaxLength(256);\n\n                    b.Property<bool>(\"EmailConfirmed\")\n                        .HasColumnName(\"email_confirmed\");\n\n                    b.Property<string>(\"GivenName\")\n                        .HasColumnName(\"given_name\");\n\n                    b.Property<bool>(\"LockoutEnabled\")\n                        .HasColumnName(\"lockout_enabled\");\n\n                    b.Property<DateTimeOffset?>(\"LockoutEnd\")\n                        .HasColumnName(\"lockout_end\");\n\n                    b.Property<string>(\"NormalizedEmail\")\n                        .HasColumnName(\"normalized_email\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"NormalizedUserName\")\n                        .HasColumnName(\"normalized_user_name\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"PasswordHash\")\n                        .HasColumnName(\"password_hash\");\n\n                    b.Property<string>(\"PhoneNumber\")\n                        .HasColumnName(\"phone_number\");\n\n                    b.Property<bool>(\"PhoneNumberConfirmed\")\n                        .HasColumnName(\"phone_number_confirmed\");\n\n                    b.Property<string>(\"SecurityStamp\")\n                        .HasColumnName(\"security_stamp\");\n\n                    b.Property<bool>(\"TwoFactorEnabled\")\n                        .HasColumnName(\"two_factor_enabled\");\n\n                    b.Property<string>(\"UserName\")\n                        .HasColumnName(\"user_name\")\n                        .HasMaxLength(256);\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_users\");\n\n                    b.HasIndex(\"NormalizedEmail\")\n                        .HasName(\"email_index\");\n\n                    b.HasIndex(\"NormalizedUserName\")\n                        .IsUnique()\n                        .HasName(\"user_name_index\");\n\n                    b.ToTable(\"users\");\n                });\n\n            modelBuilder.Entity(\"aspnetCoreReactTemplate.Models.Contact\", b =>\n                {\n                    b.Property<int>(\"id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\");\n\n                    b.Property<string>(\"email\")\n                        .HasColumnName(\"email\")\n                        .HasMaxLength(30);\n\n                    b.Property<string>(\"firstName\")\n                        .IsRequired()\n                        .HasColumnName(\"first_name\");\n\n                    b.Property<string>(\"lastName\")\n                        .IsRequired()\n                        .HasColumnName(\"last_name\");\n\n                    b.Property<string>(\"phone\")\n                        .HasColumnName(\"phone\");\n\n                    b.HasKey(\"id\")\n                        .HasName(\"pk_contacts\");\n\n                    b.ToTable(\"contacts\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRole\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnName(\"concurrency_stamp\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnName(\"name\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"NormalizedName\")\n                        .HasColumnName(\"normalized_name\")\n                        .HasMaxLength(256);\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_roles\");\n\n                    b.HasIndex(\"NormalizedName\")\n                        .IsUnique()\n                        .HasName(\"role_name_index\");\n\n                    b.ToTable(\"roles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\");\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnName(\"claim_type\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnName(\"claim_value\");\n\n                    b.Property<string>(\"RoleId\")\n                        .IsRequired()\n                        .HasColumnName(\"role_id\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_role_claims\");\n\n                    b.HasIndex(\"RoleId\")\n                        .HasName(\"ix_role_claims_role_id\");\n\n                    b.ToTable(\"role_claims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\");\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnName(\"claim_type\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnName(\"claim_value\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnName(\"user_id\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_user_claims\");\n\n                    b.HasIndex(\"UserId\")\n                        .HasName(\"ix_user_claims_user_id\");\n\n                    b.ToTable(\"user_claims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnName(\"login_provider\");\n\n                    b.Property<string>(\"ProviderKey\")\n                        .HasColumnName(\"provider_key\");\n\n                    b.Property<string>(\"ProviderDisplayName\")\n                        .HasColumnName(\"provider_display_name\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnName(\"user_id\");\n\n                    b.HasKey(\"LoginProvider\", \"ProviderKey\")\n                        .HasName(\"pk_user_logins\");\n\n                    b.HasIndex(\"UserId\")\n                        .HasName(\"ix_user_logins_user_id\");\n\n                    b.ToTable(\"user_logins\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnName(\"user_id\");\n\n                    b.Property<string>(\"RoleId\")\n                        .HasColumnName(\"role_id\");\n\n                    b.HasKey(\"UserId\", \"RoleId\")\n                        .HasName(\"pk_user_roles\");\n\n                    b.HasIndex(\"RoleId\")\n                        .HasName(\"ix_user_roles_role_id\");\n\n                    b.ToTable(\"user_roles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnName(\"user_id\");\n\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnName(\"login_provider\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnName(\"name\");\n\n                    b.Property<string>(\"Value\")\n                        .HasColumnName(\"value\");\n\n                    b.HasKey(\"UserId\", \"LoginProvider\", \"Name\")\n                        .HasName(\"pk_user_tokens\");\n\n                    b.ToTable(\"user_tokens\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\")\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .HasConstraintName(\"fk_role_claims_roles_role_id\")\n                        .OnDelete(DeleteBehavior.Cascade);\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\")\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_claims_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade);\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\")\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_logins_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade);\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\")\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .HasConstraintName(\"fk_user_roles_roles_role_id\")\n                        .OnDelete(DeleteBehavior.Cascade);\n\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\")\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_roles_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade);\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\")\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_tokens_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade);\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "api/Migrations/20171204210645_Initial.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore.Metadata;\nusing Microsoft.EntityFrameworkCore.Migrations;\nusing Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;\nusing System;\nusing System.Collections.Generic;\n\nnamespace api.Migrations\n{\n    public partial class Initial : Migration\n    {\n        protected override void Up(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.CreateTable(\n                name: \"contacts\",\n                columns: table => new\n                {\n                    id = table.Column<int>(type: \"int4\", nullable: false)\n                        .Annotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.SerialColumn),\n                    email = table.Column<string>(type: \"varchar(30)\", maxLength: 30, nullable: true),\n                    first_name = table.Column<string>(type: \"text\", nullable: false),\n                    last_name = table.Column<string>(type: \"text\", nullable: false),\n                    phone = table.Column<string>(type: \"text\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_contacts\", x => x.id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"roles\",\n                columns: table => new\n                {\n                    id = table.Column<string>(type: \"text\", nullable: false),\n                    concurrency_stamp = table.Column<string>(type: \"text\", nullable: true),\n                    name = table.Column<string>(type: \"varchar(256)\", maxLength: 256, nullable: true),\n                    normalized_name = table.Column<string>(type: \"varchar(256)\", maxLength: 256, nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_roles\", x => x.id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"users\",\n                columns: table => new\n                {\n                    id = table.Column<string>(type: \"text\", nullable: false),\n                    access_failed_count = table.Column<int>(type: \"int4\", nullable: false),\n                    concurrency_stamp = table.Column<string>(type: \"text\", nullable: true),\n                    email = table.Column<string>(type: \"varchar(256)\", maxLength: 256, nullable: true),\n                    email_confirmed = table.Column<bool>(type: \"bool\", nullable: false),\n                    given_name = table.Column<string>(type: \"text\", nullable: true),\n                    lockout_enabled = table.Column<bool>(type: \"bool\", nullable: false),\n                    lockout_end = table.Column<DateTimeOffset>(type: \"timestamptz\", nullable: true),\n                    normalized_email = table.Column<string>(type: \"varchar(256)\", maxLength: 256, nullable: true),\n                    normalized_user_name = table.Column<string>(type: \"varchar(256)\", maxLength: 256, nullable: true),\n                    password_hash = table.Column<string>(type: \"text\", nullable: true),\n                    phone_number = table.Column<string>(type: \"text\", nullable: true),\n                    phone_number_confirmed = table.Column<bool>(type: \"bool\", nullable: false),\n                    security_stamp = table.Column<string>(type: \"text\", nullable: true),\n                    two_factor_enabled = table.Column<bool>(type: \"bool\", nullable: false),\n                    user_name = table.Column<string>(type: \"varchar(256)\", maxLength: 256, nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_users\", x => x.id);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"role_claims\",\n                columns: table => new\n                {\n                    id = table.Column<int>(type: \"int4\", nullable: false)\n                        .Annotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.SerialColumn),\n                    claim_type = table.Column<string>(type: \"text\", nullable: true),\n                    claim_value = table.Column<string>(type: \"text\", nullable: true),\n                    role_id = table.Column<string>(type: \"text\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_role_claims\", x => x.id);\n                    table.ForeignKey(\n                        name: \"fk_role_claims_roles_role_id\",\n                        column: x => x.role_id,\n                        principalTable: \"roles\",\n                        principalColumn: \"id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"user_claims\",\n                columns: table => new\n                {\n                    id = table.Column<int>(type: \"int4\", nullable: false)\n                        .Annotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.SerialColumn),\n                    claim_type = table.Column<string>(type: \"text\", nullable: true),\n                    claim_value = table.Column<string>(type: \"text\", nullable: true),\n                    user_id = table.Column<string>(type: \"text\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_user_claims\", x => x.id);\n                    table.ForeignKey(\n                        name: \"fk_user_claims_users_user_id\",\n                        column: x => x.user_id,\n                        principalTable: \"users\",\n                        principalColumn: \"id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"user_logins\",\n                columns: table => new\n                {\n                    login_provider = table.Column<string>(type: \"text\", nullable: false),\n                    provider_key = table.Column<string>(type: \"text\", nullable: false),\n                    provider_display_name = table.Column<string>(type: \"text\", nullable: true),\n                    user_id = table.Column<string>(type: \"text\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_user_logins\", x => new { x.login_provider, x.provider_key });\n                    table.ForeignKey(\n                        name: \"fk_user_logins_users_user_id\",\n                        column: x => x.user_id,\n                        principalTable: \"users\",\n                        principalColumn: \"id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"user_roles\",\n                columns: table => new\n                {\n                    user_id = table.Column<string>(type: \"text\", nullable: false),\n                    role_id = table.Column<string>(type: \"text\", nullable: false)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_user_roles\", x => new { x.user_id, x.role_id });\n                    table.ForeignKey(\n                        name: \"fk_user_roles_roles_role_id\",\n                        column: x => x.role_id,\n                        principalTable: \"roles\",\n                        principalColumn: \"id\",\n                        onDelete: ReferentialAction.Cascade);\n                    table.ForeignKey(\n                        name: \"fk_user_roles_users_user_id\",\n                        column: x => x.user_id,\n                        principalTable: \"users\",\n                        principalColumn: \"id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateTable(\n                name: \"user_tokens\",\n                columns: table => new\n                {\n                    user_id = table.Column<string>(type: \"text\", nullable: false),\n                    login_provider = table.Column<string>(type: \"text\", nullable: false),\n                    name = table.Column<string>(type: \"text\", nullable: false),\n                    value = table.Column<string>(type: \"text\", nullable: true)\n                },\n                constraints: table =>\n                {\n                    table.PrimaryKey(\"pk_user_tokens\", x => new { x.user_id, x.login_provider, x.name });\n                    table.ForeignKey(\n                        name: \"fk_user_tokens_users_user_id\",\n                        column: x => x.user_id,\n                        principalTable: \"users\",\n                        principalColumn: \"id\",\n                        onDelete: ReferentialAction.Cascade);\n                });\n\n            migrationBuilder.CreateIndex(\n                name: \"ix_role_claims_role_id\",\n                table: \"role_claims\",\n                column: \"role_id\");\n\n            migrationBuilder.CreateIndex(\n                name: \"role_name_index\",\n                table: \"roles\",\n                column: \"normalized_name\",\n                unique: true);\n\n            migrationBuilder.CreateIndex(\n                name: \"ix_user_claims_user_id\",\n                table: \"user_claims\",\n                column: \"user_id\");\n\n            migrationBuilder.CreateIndex(\n                name: \"ix_user_logins_user_id\",\n                table: \"user_logins\",\n                column: \"user_id\");\n\n            migrationBuilder.CreateIndex(\n                name: \"ix_user_roles_role_id\",\n                table: \"user_roles\",\n                column: \"role_id\");\n\n            migrationBuilder.CreateIndex(\n                name: \"email_index\",\n                table: \"users\",\n                column: \"normalized_email\");\n\n            migrationBuilder.CreateIndex(\n                name: \"user_name_index\",\n                table: \"users\",\n                column: \"normalized_user_name\",\n                unique: true);\n        }\n\n        protected override void Down(MigrationBuilder migrationBuilder)\n        {\n            migrationBuilder.DropTable(\n                name: \"contacts\");\n\n            migrationBuilder.DropTable(\n                name: \"role_claims\");\n\n            migrationBuilder.DropTable(\n                name: \"user_claims\");\n\n            migrationBuilder.DropTable(\n                name: \"user_logins\");\n\n            migrationBuilder.DropTable(\n                name: \"user_roles\");\n\n            migrationBuilder.DropTable(\n                name: \"user_tokens\");\n\n            migrationBuilder.DropTable(\n                name: \"roles\");\n\n            migrationBuilder.DropTable(\n                name: \"users\");\n        }\n    }\n}\n"
  },
  {
    "path": "api/Migrations/20200128145031_1580223026.Designer.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Migrations;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\nusing Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;\nusing aspnetCoreReactTemplate.Models;\n\nnamespace api.Migrations\n{\n    [DbContext(typeof(DefaultDbContext))]\n    [Migration(\"20200128145031_1580223026\")]\n    partial class _1580223026\n    {\n        protected override void BuildTargetModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)\n                .HasAnnotation(\"ProductVersion\", \"3.1.1\")\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 63);\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRole\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnName(\"concurrency_stamp\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnName(\"name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"NormalizedName\")\n                        .HasColumnName(\"normalized_name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_roles\");\n\n                    b.HasIndex(\"NormalizedName\")\n                        .IsUnique()\n                        .HasName(\"role_name_index\");\n\n                    b.ToTable(\"roles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"integer\")\n                        .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnName(\"claim_type\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnName(\"claim_value\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"RoleId\")\n                        .IsRequired()\n                        .HasColumnName(\"role_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_role_claims\");\n\n                    b.HasIndex(\"RoleId\")\n                        .HasName(\"ix_role_claims_role_id\");\n\n                    b.ToTable(\"role_claims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"integer\")\n                        .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnName(\"claim_type\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnName(\"claim_value\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_user_claims\");\n\n                    b.HasIndex(\"UserId\")\n                        .HasName(\"ix_user_claims_user_id\");\n\n                    b.ToTable(\"user_claims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnName(\"login_provider\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ProviderKey\")\n                        .HasColumnName(\"provider_key\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ProviderDisplayName\")\n                        .HasColumnName(\"provider_display_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"LoginProvider\", \"ProviderKey\")\n                        .HasName(\"pk_user_logins\");\n\n                    b.HasIndex(\"UserId\")\n                        .HasName(\"ix_user_logins_user_id\");\n\n                    b.ToTable(\"user_logins\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"RoleId\")\n                        .HasColumnName(\"role_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"UserId\", \"RoleId\")\n                        .HasName(\"pk_user_roles\");\n\n                    b.HasIndex(\"RoleId\")\n                        .HasName(\"ix_user_roles_role_id\");\n\n                    b.ToTable(\"user_roles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnName(\"login_provider\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnName(\"name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Value\")\n                        .HasColumnName(\"value\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"UserId\", \"LoginProvider\", \"Name\")\n                        .HasName(\"pk_user_tokens\");\n\n                    b.ToTable(\"user_tokens\");\n                });\n\n            modelBuilder.Entity(\"aspnetCoreReactTemplate.Models.ApplicationUser\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<int>(\"AccessFailedCount\")\n                        .HasColumnName(\"access_failed_count\")\n                        .HasColumnType(\"integer\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnName(\"concurrency_stamp\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Email\")\n                        .HasColumnName(\"email\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<bool>(\"EmailConfirmed\")\n                        .HasColumnName(\"email_confirmed\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<string>(\"GivenName\")\n                        .HasColumnName(\"given_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<bool>(\"LockoutEnabled\")\n                        .HasColumnName(\"lockout_enabled\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<DateTimeOffset?>(\"LockoutEnd\")\n                        .HasColumnName(\"lockout_end\")\n                        .HasColumnType(\"timestamp with time zone\");\n\n                    b.Property<string>(\"NormalizedEmail\")\n                        .HasColumnName(\"normalized_email\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"NormalizedUserName\")\n                        .HasColumnName(\"normalized_user_name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"PasswordHash\")\n                        .HasColumnName(\"password_hash\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"PhoneNumber\")\n                        .HasColumnName(\"phone_number\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<bool>(\"PhoneNumberConfirmed\")\n                        .HasColumnName(\"phone_number_confirmed\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<string>(\"SecurityStamp\")\n                        .HasColumnName(\"security_stamp\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<bool>(\"TwoFactorEnabled\")\n                        .HasColumnName(\"two_factor_enabled\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<string>(\"UserName\")\n                        .HasColumnName(\"user_name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_users\");\n\n                    b.HasIndex(\"NormalizedEmail\")\n                        .HasName(\"email_index\");\n\n                    b.HasIndex(\"NormalizedUserName\")\n                        .IsUnique()\n                        .HasName(\"user_name_index\");\n\n                    b.ToTable(\"users\");\n                });\n\n            modelBuilder.Entity(\"aspnetCoreReactTemplate.Models.Contact\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"integer\")\n                        .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);\n\n                    b.Property<string>(\"Email\")\n                        .HasColumnName(\"email\")\n                        .HasColumnType(\"character varying(30)\")\n                        .HasMaxLength(30);\n\n                    b.Property<string>(\"FirstName\")\n                        .IsRequired()\n                        .HasColumnName(\"first_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"LastName\")\n                        .IsRequired()\n                        .HasColumnName(\"last_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Phone\")\n                        .HasColumnName(\"phone\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_contacts\");\n\n                    b.ToTable(\"contacts\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .HasConstraintName(\"fk_role_claims_roles_role_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_claims_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_logins_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .HasConstraintName(\"fk_user_roles_roles_role_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_roles_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_tokens_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "api/Migrations/20200128145031_1580223026.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore.Migrations;\n\nnamespace api.Migrations\n{\n    public partial class _1580223026 : Migration\n    {\n        protected override void Up(MigrationBuilder migrationBuilder)\n        {\n\n        }\n\n        protected override void Down(MigrationBuilder migrationBuilder)\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "api/Migrations/DefaultDbContextModelSnapshot.cs",
    "content": "﻿// <auto-generated />\nusing System;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Microsoft.EntityFrameworkCore.Storage.ValueConversion;\nusing Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;\nusing aspnetCoreReactTemplate.Models;\n\nnamespace api.Migrations\n{\n    [DbContext(typeof(DefaultDbContext))]\n    partial class DefaultDbContextModelSnapshot : ModelSnapshot\n    {\n        protected override void BuildModel(ModelBuilder modelBuilder)\n        {\n#pragma warning disable 612, 618\n            modelBuilder\n                .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)\n                .HasAnnotation(\"ProductVersion\", \"3.1.1\")\n                .HasAnnotation(\"Relational:MaxIdentifierLength\", 63);\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRole\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnName(\"concurrency_stamp\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnName(\"name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"NormalizedName\")\n                        .HasColumnName(\"normalized_name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_roles\");\n\n                    b.HasIndex(\"NormalizedName\")\n                        .IsUnique()\n                        .HasName(\"role_name_index\");\n\n                    b.ToTable(\"roles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"integer\")\n                        .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnName(\"claim_type\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnName(\"claim_value\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"RoleId\")\n                        .IsRequired()\n                        .HasColumnName(\"role_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_role_claims\");\n\n                    b.HasIndex(\"RoleId\")\n                        .HasName(\"ix_role_claims_role_id\");\n\n                    b.ToTable(\"role_claims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"integer\")\n                        .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);\n\n                    b.Property<string>(\"ClaimType\")\n                        .HasColumnName(\"claim_type\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ClaimValue\")\n                        .HasColumnName(\"claim_value\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_user_claims\");\n\n                    b.HasIndex(\"UserId\")\n                        .HasName(\"ix_user_claims_user_id\");\n\n                    b.ToTable(\"user_claims\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnName(\"login_provider\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ProviderKey\")\n                        .HasColumnName(\"provider_key\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"ProviderDisplayName\")\n                        .HasColumnName(\"provider_display_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"UserId\")\n                        .IsRequired()\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"LoginProvider\", \"ProviderKey\")\n                        .HasName(\"pk_user_logins\");\n\n                    b.HasIndex(\"UserId\")\n                        .HasName(\"ix_user_logins_user_id\");\n\n                    b.ToTable(\"user_logins\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"RoleId\")\n                        .HasColumnName(\"role_id\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"UserId\", \"RoleId\")\n                        .HasName(\"pk_user_roles\");\n\n                    b.HasIndex(\"RoleId\")\n                        .HasName(\"ix_user_roles_role_id\");\n\n                    b.ToTable(\"user_roles\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.Property<string>(\"UserId\")\n                        .HasColumnName(\"user_id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"LoginProvider\")\n                        .HasColumnName(\"login_provider\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Name\")\n                        .HasColumnName(\"name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Value\")\n                        .HasColumnName(\"value\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"UserId\", \"LoginProvider\", \"Name\")\n                        .HasName(\"pk_user_tokens\");\n\n                    b.ToTable(\"user_tokens\");\n                });\n\n            modelBuilder.Entity(\"aspnetCoreReactTemplate.Models.ApplicationUser\", b =>\n                {\n                    b.Property<string>(\"Id\")\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<int>(\"AccessFailedCount\")\n                        .HasColumnName(\"access_failed_count\")\n                        .HasColumnType(\"integer\");\n\n                    b.Property<string>(\"ConcurrencyStamp\")\n                        .IsConcurrencyToken()\n                        .HasColumnName(\"concurrency_stamp\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Email\")\n                        .HasColumnName(\"email\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<bool>(\"EmailConfirmed\")\n                        .HasColumnName(\"email_confirmed\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<string>(\"GivenName\")\n                        .HasColumnName(\"given_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<bool>(\"LockoutEnabled\")\n                        .HasColumnName(\"lockout_enabled\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<DateTimeOffset?>(\"LockoutEnd\")\n                        .HasColumnName(\"lockout_end\")\n                        .HasColumnType(\"timestamp with time zone\");\n\n                    b.Property<string>(\"NormalizedEmail\")\n                        .HasColumnName(\"normalized_email\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"NormalizedUserName\")\n                        .HasColumnName(\"normalized_user_name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.Property<string>(\"PasswordHash\")\n                        .HasColumnName(\"password_hash\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"PhoneNumber\")\n                        .HasColumnName(\"phone_number\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<bool>(\"PhoneNumberConfirmed\")\n                        .HasColumnName(\"phone_number_confirmed\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<string>(\"SecurityStamp\")\n                        .HasColumnName(\"security_stamp\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<bool>(\"TwoFactorEnabled\")\n                        .HasColumnName(\"two_factor_enabled\")\n                        .HasColumnType(\"boolean\");\n\n                    b.Property<string>(\"UserName\")\n                        .HasColumnName(\"user_name\")\n                        .HasColumnType(\"character varying(256)\")\n                        .HasMaxLength(256);\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_users\");\n\n                    b.HasIndex(\"NormalizedEmail\")\n                        .HasName(\"email_index\");\n\n                    b.HasIndex(\"NormalizedUserName\")\n                        .IsUnique()\n                        .HasName(\"user_name_index\");\n\n                    b.ToTable(\"users\");\n                });\n\n            modelBuilder.Entity(\"aspnetCoreReactTemplate.Models.Contact\", b =>\n                {\n                    b.Property<int>(\"Id\")\n                        .ValueGeneratedOnAdd()\n                        .HasColumnName(\"id\")\n                        .HasColumnType(\"integer\")\n                        .HasAnnotation(\"Npgsql:ValueGenerationStrategy\", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);\n\n                    b.Property<string>(\"Email\")\n                        .HasColumnName(\"email\")\n                        .HasColumnType(\"character varying(30)\")\n                        .HasMaxLength(30);\n\n                    b.Property<string>(\"FirstName\")\n                        .IsRequired()\n                        .HasColumnName(\"first_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"LastName\")\n                        .IsRequired()\n                        .HasColumnName(\"last_name\")\n                        .HasColumnType(\"text\");\n\n                    b.Property<string>(\"Phone\")\n                        .HasColumnName(\"phone\")\n                        .HasColumnType(\"text\");\n\n                    b.HasKey(\"Id\")\n                        .HasName(\"pk_contacts\");\n\n                    b.ToTable(\"contacts\");\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .HasConstraintName(\"fk_role_claims_roles_role_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserClaim<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_claims_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserLogin<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_logins_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserRole<string>\", b =>\n                {\n                    b.HasOne(\"Microsoft.AspNetCore.Identity.IdentityRole\", null)\n                        .WithMany()\n                        .HasForeignKey(\"RoleId\")\n                        .HasConstraintName(\"fk_user_roles_roles_role_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_roles_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n\n            modelBuilder.Entity(\"Microsoft.AspNetCore.Identity.IdentityUserToken<string>\", b =>\n                {\n                    b.HasOne(\"aspnetCoreReactTemplate.Models.ApplicationUser\", null)\n                        .WithMany()\n                        .HasForeignKey(\"UserId\")\n                        .HasConstraintName(\"fk_user_tokens_asp_net_users_user_id\")\n                        .OnDelete(DeleteBehavior.Cascade)\n                        .IsRequired();\n                });\n#pragma warning restore 612, 618\n        }\n    }\n}\n"
  },
  {
    "path": "api/Models/ApplicationUser.cs",
    "content": "using Microsoft.AspNetCore.Identity;\nusing Microsoft.AspNetCore.Identity.EntityFrameworkCore;\n\nnamespace aspnetCoreReactTemplate.Models\n{\n    public class ApplicationUser: IdentityUser\n    {\n        public string GivenName { get; set; }\n    }\n}\n"
  },
  {
    "path": "api/Models/Contact.cs",
    "content": "using System.ComponentModel.DataAnnotations;\n\nnamespace aspnetCoreReactTemplate.Models\n{\n    public class Contact\n    {\n        public int Id { get; set; }\n\n        [Required]\n        [MinLength(3)]\n        public string LastName { get; set; }\n\n        [Required]\n        public string FirstName { get; set; }\n\n        public string Phone { get; set; }\n\n        [DataType(DataType.EmailAddress)]\n        [StringLength(30, MinimumLength = 0)]\n        public string Email { get; set; }\n    }\n}\n"
  },
  {
    "path": "api/Models/DefaultDbContext.cs",
    "content": "using aspnetCoreReactTemplate.Extensions;\nusing Microsoft.AspNetCore.Identity.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace aspnetCoreReactTemplate.Models\n{\n  public class DefaultDbContext : IdentityDbContext<ApplicationUser>\n  {\n    public DefaultDbContext(DbContextOptions<DefaultDbContext> options)\n      : base(options)\n    {\n    }\n\n    public DbSet<ApplicationUser> ApplicationUsers { get; set; }\n    public DbSet<Contact> Contacts { get; set; }\n\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\n    {\n      base.OnModelCreating(modelBuilder);\n\n      foreach (var entity in modelBuilder.Model.GetEntityTypes())\n      {\n        // Remove 'AspNet' prefix and convert table name from PascalCase to snake_case. E.g. AspNetRoleClaims -> role_claims\n        entity.SetTableName(entity.GetTableName().Replace(\"AspNet\", \"\").ToSnakeCase());\n\n        // Convert column names from PascalCase to snake_case.\n        foreach (var property in entity.GetProperties())\n        {\n          property.SetColumnName(property.Name.ToSnakeCase());\n        }\n\n        // Convert primary key names from PascalCase to snake_case. E.g. PK_users -> pk_users\n        foreach (var key in entity.GetKeys())\n        {\n          key.SetName(key.GetName().ToSnakeCase());\n        }\n\n        // Convert foreign key names from PascalCase to snake_case.\n        foreach (var key in entity.GetForeignKeys())\n        {\n          key.SetConstraintName(key.GetConstraintName().ToSnakeCase());\n        }\n\n        // Convert index names from PascalCase to snake_case.\n        foreach (var index in entity.GetIndexes())\n        {\n          index.SetName(index.GetName().ToSnakeCase());\n        }\n      }\n\n    }\n\n  }\n}\n"
  },
  {
    "path": "api/Models/DefaultDbContextInitializer.cs",
    "content": "using Microsoft.AspNetCore.Identity;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace aspnetCoreReactTemplate.Models\n{\n    public class DefaultDbContextInitializer : IDefaultDbContextInitializer\n    {\n        private readonly DefaultDbContext _context;\n        private readonly UserManager<ApplicationUser> _userManager;\n        private readonly RoleManager<IdentityRole> _roleManager;\n\n        public DefaultDbContextInitializer(DefaultDbContext context, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)\n        {\n            _userManager = userManager;\n            _context = context;\n            _roleManager = roleManager;\n        }\n\n        public bool EnsureCreated()\n        {\n            return _context.Database.EnsureCreated();\n        }\n\n        public async Task Seed()\n        {\n            var email = \"user@test.com\";\n            if (await _userManager.FindByEmailAsync(email) == null)\n            {\n                var user = new ApplicationUser\n                {\n                    UserName = email,\n                    Email = email,\n                    EmailConfirmed = true,\n                    GivenName = \"John Doe\"\n                };\n\n                await _userManager.CreateAsync(user, \"P2ssw0rd!\");\n            }\n\n            if (_context.Contacts.Any())\n            {\n                foreach (var u in _context.Contacts)\n                {\n                    _context.Remove(u);\n                }\n            }\n\n            _context.Contacts.Add(new Contact() { LastName = \"Finkley\", FirstName = \"Adam\", Phone = \"555-555-5555\", Email = \"adam@somewhere.com\" });\n            _context.Contacts.Add(new Contact() { LastName = \"Biles\", FirstName = \"Steven\", Phone = \"555-555-5555\", Email = \"sbiles@somewhere.com\" });\n            _context.SaveChanges();\n        }\n    }\n\n    public interface IDefaultDbContextInitializer\n    {\n        bool EnsureCreated();\n        Task Seed();\n    }\n}\n"
  },
  {
    "path": "api/Models/DesignTimeDefaultDbContext.cs",
    "content": "using Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Design;\nusing Microsoft.Extensions.Configuration;\n\nnamespace aspnetCoreReactTemplate.Models\n{\n    public class BloggingContextFactory : IDesignTimeDbContextFactory<DefaultDbContext>\n    {\n        public DefaultDbContext CreateDbContext(string[] args)\n        {\n            var config = new ConfigurationBuilder()\n                  .SetBasePath(System.IO.Directory.GetCurrentDirectory())\n                  .AddJsonFile(\"appsettings.json\")\n                  .Build();\n\n            var options = new DbContextOptionsBuilder<DefaultDbContext>();\n            options.UseNpgsql(config.GetConnectionString(\"defaultConnection\"));\n\n            return new DefaultDbContext(options.Options);\n        }\n    }\n}\n"
  },
  {
    "path": "api/NuGet.Config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <add key=\"NuGet\" value=\"https://api.nuget.org/v3/index.json\" />\n    <add key=\"aspnet-contrib\" value=\"https://www.myget.org/F/aspnet-contrib/api/v3/index.json\" />\n  </packageSources>\n</configuration>"
  },
  {
    "path": "api/Program.cs",
    "content": "﻿using System.IO;\nusing aspnetCoreReactTemplate.Models;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace aspnetCoreReactTemplate\n{\n  public class Program\n  {\n    public static void Main(string[] args)\n    {\n      var config = new ConfigurationBuilder()\n            .SetBasePath(Directory.GetCurrentDirectory())\n            .AddJsonFile(\"appsettings.json\")\n            .Build();\n\n      var host = CreateHostBuilder(config, args).Build();\n      using (var scope = host.Services.CreateScope())\n      {\n        var dbContext = scope.ServiceProvider.GetService<DefaultDbContext>();\n        dbContext.Database.Migrate();\n\n        var env = scope.ServiceProvider.GetRequiredService<IWebHostEnvironment>();\n        if (env.IsDevelopment())\n        {\n          // Seed the database in development mode\n          var dbInitializer = scope.ServiceProvider.GetRequiredService<Models.IDefaultDbContextInitializer>();\n          dbInitializer.Seed().GetAwaiter().GetResult();\n        }\n      }\n\n      host.Run();\n    }\n\n    public static IHostBuilder CreateHostBuilder(IConfigurationRoot config, string[] args) =>\n      Host.CreateDefaultBuilder(args)\n        .ConfigureLogging(logging =>\n        {\n          logging.ClearProviders();\n          // Log to console (stdout) - in production stdout will be written to /var/log/{{app_name}}.out.log\n          logging.AddConsole();\n          logging.AddDebug();\n        })\n        .ConfigureWebHostDefaults(webBuilder =>\n          {\n            webBuilder\n            .UseUrls(config[\"serverBindingUrl\"])\n            .UseStartup<Startup>();\n          });\n  }\n}\n"
  },
  {
    "path": "api/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:5000/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"http://localhost:5000\",\n      \"environmentVariables\": {\n        \"NODE_PATH\": \"../node_modules/\",\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"api\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n\t\t\"NODE_PATH\": \"../node_modules/\",\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:5000/\"\n    }\n  }\n}"
  },
  {
    "path": "api/Services/EmailSender.cs",
    "content": "using System.Net;\nusing System.Net.Mail;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Options;\n\nnamespace aspnetCoreReactTemplate.Services\n{\n    public class EmailSender : IEmailSender\n    {\n        public EmailSender(IOptions<EmailSenderOptions> optionsAccessor)\n        {\n            Options = optionsAccessor.Value;\n        }\n\n        public EmailSenderOptions Options { get; }\n\n        public async Task SendEmailAsync(string toEmail, string subject, string htmlMessage, string textMessage = null)\n        {\n            MailMessage mailMessage = new MailMessage();\n            mailMessage.From = new MailAddress(this.Options.emailFromAddress, this.Options.emailFromName);\n            mailMessage.To.Add(toEmail);\n            mailMessage.Body = textMessage;\n            mailMessage.BodyEncoding = Encoding.UTF8;\n            mailMessage.Subject = subject;\n            mailMessage.SubjectEncoding = Encoding.UTF8;\n\n            if (!string.IsNullOrEmpty(htmlMessage))\n            {\n                AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlMessage);\n                htmlView.ContentType = new System.Net.Mime.ContentType(\"text/html\");\n                mailMessage.AlternateViews.Add(htmlView);\n            }\n\n            using (SmtpClient client = new SmtpClient(this.Options.host, this.Options.port))\n            {\n                client.UseDefaultCredentials = false;\n                client.Credentials = new NetworkCredential(this.Options.username, this.Options.password);\n                client.EnableSsl = this.Options.enableSSL;\n                await client.SendMailAsync(mailMessage);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "api/Services/EmailSenderOptions.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace aspnetCoreReactTemplate.Services\n{\n  public class EmailSenderOptions\n  {\n    private string _smtpConfig { get; set; }\n    public string smtpConfig\n    {\n      get { return this._smtpConfig; }\n      set\n      {\n        this._smtpConfig = value;\n\n        // smtpConfig is in username:password@localhost:1025 format; extract the part\n        var smtpConfigPartsRegEx = new Regex(@\"(.*)\\:(.*)@(.+)\\:(.+)\");\n        var smtpConfigPartsMatch = smtpConfigPartsRegEx.Match(value);\n\n        this.username = smtpConfigPartsMatch.Groups[1].Value;\n        this.password = smtpConfigPartsMatch.Groups[2].Value;\n        this.host = smtpConfigPartsMatch.Groups[3].Value;\n        this.port = Convert.ToInt32(smtpConfigPartsMatch.Groups[4].Value);\n      }\n    }\n\n    public string emailFromName { get; set; }\n    public string emailFromAddress { get; set; }\n    public bool enableSSL { get; set; }\n    public string username { get; protected set; }\n    public string password { get; protected set; }\n    public string host { get; protected set; }\n    public int port { get; protected set; }\n  }\n}\n"
  },
  {
    "path": "api/Services/IEmailSender.cs",
    "content": "using System.Threading.Tasks;\n\nnamespace aspnetCoreReactTemplate.Services\n{\n    public interface IEmailSender\n    {\n        Task SendEmailAsync(string toEmail, string subject, string htmlMessage, string textMessage = null);\n    }\n}\n"
  },
  {
    "path": "api/Services/JwtOptions.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace aspnetCoreReactTemplate.Services\n{\n    public class JwtOptions\n    {\n        public string key { get; set; }\n        public string issuer { get; set; }\n    }\n}\n"
  },
  {
    "path": "api/Startup.cs",
    "content": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.EntityFrameworkCore;\nusing aspnetCoreReactTemplate.Models;\nusing aspnetCoreReactTemplate.Services;\nusing Microsoft.AspNetCore.HttpOverrides;\nusing Microsoft.AspNetCore.Identity;\nusing Microsoft.AspNetCore.Authentication.JwtBearer;\nusing Microsoft.IdentityModel.Tokens;\nusing Microsoft.Extensions.Hosting;\nusing System.Text;\n\nnamespace aspnetCoreReactTemplate\n{\n  public class Startup\n  {\n    public IHostEnvironment CurrentEnvironment { get; protected set; }\n    public IConfiguration Configuration { get; }\n\n    public Startup(IConfiguration configuration)\n    {\n      Configuration = configuration;\n    }\n\n    // This method gets called by the runtime. Use this method to add services to the container.\n    public void ConfigureServices(IServiceCollection services)\n    {\n      services.AddControllersWithViews();\n\n      services.AddEntityFrameworkNpgsql().AddDbContext<DefaultDbContext>(options =>\n      {\n        options.UseNpgsql(Configuration.GetConnectionString(\"defaultConnection\"));\n      });\n\n      // Configure Entity Framework Initializer for seeding\n      services.AddTransient<IDefaultDbContextInitializer, DefaultDbContextInitializer>();\n\n      services.AddDatabaseDeveloperPageExceptionFilter();\n\n      // Configure Entity Framework Identity for Auth\n      services.AddIdentity<ApplicationUser, IdentityRole>()\n      .AddEntityFrameworkStores<DefaultDbContext>()\n      .AddDefaultTokenProviders();\n\n      services.AddAuthentication(options =>\n      {\n        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;\n        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;\n      })\n\n      .AddJwtBearer(config =>\n      {\n        config.RequireHttpsMetadata = false;\n        config.SaveToken = true;\n\n        config.TokenValidationParameters = new TokenValidationParameters()\n        {\n          ValidIssuer = Configuration[\"jwt:issuer\"],\n          ValidAudience = Configuration[\"jwt:issuer\"],\n          IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration[\"jwt:key\"]))\n        };\n      });\n\n      services.AddTransient<IEmailSender, EmailSender>();\n      services.Configure<EmailSenderOptions>(Configuration.GetSection(\"email\"));\n      services.Configure<JwtOptions>(Configuration.GetSection(\"jwt\"));\n    }\n\n    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n    public void Configure(IApplicationBuilder app, IHostEnvironment env, ILoggerFactory loggerFactory)\n    {\n      // If not requesting /api*, rewrite to / so SPA app will be returned\n      app.UseSpaFallback(new SpaFallbackOptions()\n      {\n        ApiPathPrefix = \"/api\",\n        RewritePath = \"/\"\n      });\n\n      app.UseDefaultFiles();\n      app.UseHttpsRedirection();\n      app.UseStaticFiles();\n\n      app.UseForwardedHeaders(new ForwardedHeadersOptions\n      {\n        // Read and use headers coming from reverse proxy: X-Forwarded-For X-Forwarded-Proto\n        // This is particularly important so that HttpContet.Request.Scheme will be correct behind a SSL terminating proxy\n        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto\n      });\n\n      app.UseRouting();\n\n      app.UseAuthentication();\n      app.UseAuthorization();\n\n      app.UseEndpoints(endpoints =>\n      {\n        endpoints.MapControllerRoute(\n            name: \"default\",\n            pattern: \"{controller=Home}/{action=Index}/{id?}\");\n      });\n\n      if (env.IsDevelopment())\n      {\n        app.UseSpa(spa =>\n        {\n          spa.UseProxyToSpaDevelopmentServer(\"http://localhost:8080/\");\n        });\n\n        app.UseDeveloperExceptionPage();\n        app.UseMigrationsEndPoint();\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "api/ViewModels/ConfirmEmail.cs",
    "content": "namespace aspnetCoreReactTemplate.ViewModels\n{\n    public class ConfirmEmail\n    {\n        public string user_id { get; set; }\n        public string token { get; set; }\n    }\n}\n"
  },
  {
    "path": "api/ViewModels/NewUser.cs",
    "content": "using System.ComponentModel.DataAnnotations;\n\nnamespace aspnetCoreReactTemplate.ViewModels\n{\n    public class NewUser\n    {\n        [Required]\n        [EmailAddress]\n        public string username { get; set; }\n\n        [Required]\n        [MinLength(8)]\n        public string password { get; set; }\n}\n}\n"
  },
  {
    "path": "api/api.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore.Authentication.JwtBearer\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Authentication.OpenIdConnect\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Identity.EntityFrameworkCore\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.SpaServices.Extensions\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.Design\" Version=\"5.0.9\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.Sqlite\" Version=\"5.0.9\" />\n    <PackageReference Include=\"Npgsql.EntityFrameworkCore.PostgreSQL\" Version=\"5.0.7\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"wwwroot\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "api/appsettings.json",
    "content": "{\n  \"connectionStrings\": {\n    \"defaultConnection\": \"Host=localhost;Port=5433;Username=postgres;Password=postgres;Database=dotnetcore\"\n  },\n  \"frontEndUrl\": \"http://localhost:5000\",\n  \"serverBindingUrl\": \"http://0.0.0.0:5000\",\n  \"logging\": {\n    \"includeScopes\": false,\n    \"logLevel\": {\n      \"default\": \"Debug\",\n      \"system\": \"Information\",\n      \"microsoft\": \"Information\"\n    }\n  },\n  \"webClientPath\": \"../client-react\",\n  \"jwt\": {\n    \"key\" : \"2af4ff57-4ca0-4b3a-804b-178ad27aaf88\",\n    \"issuer\": \"aspnet-core-react-template\"\n  },\n  \"email\": {\n    \"smtpConfig\": \":@localhost:1025\",\n    \"enableSSL\": false,\n    \"emailFromName\": \"aspnet-core-react-template\",\n    \"emailFromAddress\": \"noreply@aspnet-core-react-template.com\"\n  }\n}\n"
  },
  {
    "path": "api/log/development-20170420.log",
    "content": "2017-04-20T11:35:30.8306170-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:30.8800930-05:00  [INF] Executed DbCommand (14ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:35:30.8820010-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:30.8946950-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:30.8966570-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:35:30.8967560-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:30.9031950-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:30.9049280-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:35:30.9054630-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.3218430-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.5298490-05:00  [INF] Executed DbCommand (77ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:35:31.5958230-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.6509440-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.6571590-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:35:31.6583500-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.6775930-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.6789170-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:35:31.7076610-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.7669820-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:31.7728150-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:35:31.8349080-05:00  [INF] Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:35:31.8603320-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:35:33.0652850-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:35:33.0802850-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:35:33.1537040-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:35:37.9044370-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 5087ms (83001040)\n2017-04-20T11:35:43.1417480-05:00  [DBG] Connection id \"\"0HL481D4TQDAN\"\" started. (1426b994)\n2017-04-20T11:35:43.2379250-05:00 0HL481D4URNUT [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:36:11.8277120-05:00  [DBG] Connection id \"\"0HL481D4TQDAQ\"\" started. (1426b994)\n2017-04-20T11:36:11.8277120-05:00  [DBG] Connection id \"\"0HL481D4TQDAP\"\" started. (1426b994)\n2017-04-20T11:36:11.8277120-05:00  [DBG] Connection id \"\"0HL481D4TQDAO\"\" started. (1426b994)\n2017-04-20T11:36:11.8279810-05:00  [DBG] Connection id \"\"0HL481D4TQDAR\"\" started. (1426b994)\n2017-04-20T11:36:11.8280120-05:00  [DBG] Connection id \"\"0HL481D4TQDAS\"\" started. (1426b994)\n2017-04-20T11:36:11.9435780-05:00 0HL481D4URNUU [INF] Request starting HTTP/1.1 GET http://localhost:5000/sign-in/?expired=1   (e5be5b71)\n2017-04-20T11:36:11.9719460-05:00 0HL481D4URNUU [INF] Handling request: /sign-in/ (6455a65b)\n2017-04-20T11:36:11.9724410-05:00 0HL481D4URNUU [INF] Rewriting path: /sign-in/ > / (170f1f87)\n2017-04-20T11:36:12.0015370-05:00 0HL481D4URNUU [INF] Sending file. Request path: '\"/index.html\"'. Physical path: '\"/Users/bholt/dev/aspnet-core-react-template/api/wwwroot/index.html\"' (27b0a520)\n2017-04-20T11:36:12.0271890-05:00 0HL481D4URNUU [INF] Finished handling request. (d2c25297)\n2017-04-20T11:36:12.0277690-05:00  [DBG] Connection id \"\"0HL481D4TQDAN\"\" received FIN. (acf58720)\n2017-04-20T11:36:12.0336340-05:00 0HL481D4URNUU [DBG] Connection id \"\"0HL481D4TQDAP\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:36:12.0426020-05:00 0HL481D4URNUU [INF] Request finished in 91.3023ms 200 text/html (15c52c40)\n2017-04-20T11:36:12.0500360-05:00 0HL481D4URNUV [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:36:12.1321120-05:00 0HL481D4URNUV [DBG] Connection id \"\"0HL481D4TQDAP\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:36:12.1322260-05:00 0HL481D4URNUV [INF] Request finished in 82.2472ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:36:12.2905320-05:00 0HL481D4URNV0 [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:36:12.3184020-05:00  [INF] Connection id \"\"0HL481D4TQDAN\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:36:12.3195980-05:00  [DBG] Connection id \"\"0HL481D4TQDAN\"\" disconnecting. (b29b9868)\n2017-04-20T11:36:12.3227210-05:00  [DBG] Connection id \"\"0HL481D4TQDAN\"\" stopped. (056149f8)\n2017-04-20T11:36:14.4920170-05:00  [DBG] Connection id \"\"0HL481D4TQDAT\"\" started. (1426b994)\n2017-04-20T11:36:14.5987070-05:00 0HL481D4URNV1 [INF] Request starting HTTP/1.1 GET http://localhost:5000/sign-in/?expired=1   (e5be5b71)\n2017-04-20T11:36:14.6008020-05:00 0HL481D4URNV1 [INF] Handling request: /sign-in/ (6455a65b)\n2017-04-20T11:36:14.6009470-05:00 0HL481D4URNV1 [INF] Rewriting path: /sign-in/ > / (170f1f87)\n2017-04-20T11:36:14.6015570-05:00 0HL481D4URNV1 [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:36:14.6052500-05:00 0HL481D4URNV1 [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:36:14.6059120-05:00 0HL481D4URNV1 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:36:14.6082100-05:00 0HL481D4URNV1 [DBG] Connection id \"\"0HL481D4TQDAQ\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:36:14.6083090-05:00 0HL481D4URNV1 [INF] Request finished in 9.6036ms 304 text/html (15c52c40)\n2017-04-20T11:36:14.6105660-05:00  [DBG] Connection id \"\"0HL481D4TQDAP\"\" received FIN. (acf58720)\n2017-04-20T11:36:14.6150570-05:00 0HL481D4URNV2 [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:36:14.6490190-05:00 0HL481D4URNV2 [DBG] Connection id \"\"0HL481D4TQDAQ\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:36:14.6491170-05:00 0HL481D4URNV2 [INF] Request finished in 34.0525ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:36:14.7931650-05:00 0HL481D4URNV3 [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:36:14.8183730-05:00  [INF] Connection id \"\"0HL481D4TQDAP\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:36:14.8184200-05:00  [DBG] Connection id \"\"0HL481D4TQDAP\"\" disconnecting. (b29b9868)\n2017-04-20T11:36:14.8185990-05:00  [DBG] Connection id \"\"0HL481D4TQDAP\"\" stopped. (056149f8)\n2017-04-20T11:36:31.0322080-05:00  [INF] Received SIGINT. Waiting for .NET process to exit... (39e2bf0e)\n2017-04-20T11:36:31.0363300-05:00  [DBG] Hosting shutdown (49005419)\n2017-04-20T11:36:42.5679710-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:42.6172200-05:00  [INF] Executed DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:36:42.6190720-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:42.6324510-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:42.6352190-05:00  [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:36:42.6353160-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:42.6419620-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:42.6434930-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:36:42.6440570-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.0661490-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.2727970-05:00  [INF] Executed DbCommand (72ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:36:43.3405580-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.3952030-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.4003370-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:36:43.4014950-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.4214390-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.4230960-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:36:43.4509720-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.5138800-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:43.5196070-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:36:43.5970100-05:00  [INF] Executed DbCommand (6ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:36:43.6252790-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:36:44.8000390-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:36:44.8266520-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:36:44.9005150-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:36:46.9926100-05:00  [DBG] Connection id \"\"0HL481DNUOBGO\"\" started. (1426b994)\n2017-04-20T11:36:46.9926270-05:00  [DBG] Connection id \"\"0HL481DNUOBGL\"\" started. (1426b994)\n2017-04-20T11:36:46.9926370-05:00  [DBG] Connection id \"\"0HL481DNUOBGN\"\" started. (1426b994)\n2017-04-20T11:36:46.9926430-05:00  [DBG] Connection id \"\"0HL481DNUOBGM\"\" started. (1426b994)\n2017-04-20T11:36:46.9982000-05:00  [DBG] Connection id \"\"0HL481DNUOBGQ\"\" started. (1426b994)\n2017-04-20T11:36:46.9982010-05:00  [DBG] Connection id \"\"0HL481DNUOBGP\"\" started. (1426b994)\n2017-04-20T11:36:47.1680840-05:00 0HL481DO0HIUT [INF] Request starting HTTP/1.1 GET http://localhost:5000/sign-in/?expired=1   (e5be5b71)\n2017-04-20T11:36:49.6840130-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 5127ms (d4c9e226)\n2017-04-20T11:36:49.8292910-05:00 0HL481DO0HIUT [INF] Handling request: /sign-in/ (6455a65b)\n2017-04-20T11:36:49.8316730-05:00 0HL481DO0HIUT [INF] Rewriting path: /sign-in/ > / (170f1f87)\n2017-04-20T11:36:49.8673890-05:00 0HL481DO0HIUT [INF] Sending file. Request path: '\"/index.html\"'. Physical path: '\"/Users/bholt/dev/aspnet-core-react-template/api/wwwroot/index.html\"' (27b0a520)\n2017-04-20T11:36:49.9422540-05:00 0HL481DO0HIUT [INF] Finished handling request. (d2c25297)\n2017-04-20T11:36:49.9487830-05:00 0HL481DO0HIUT [DBG] Connection id \"\"0HL481DNUOBGO\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:36:49.9574050-05:00 0HL481DO0HIUT [INF] Request finished in 2803.0445ms 200 text/html (15c52c40)\n2017-04-20T11:36:49.9652020-05:00 0HL481DO0HIUU [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:36:50.0631710-05:00 0HL481DO0HIUU [DBG] Connection id \"\"0HL481DNUOBGO\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:36:50.0633730-05:00 0HL481DO0HIUU [INF] Request finished in 98.145ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:36:50.2230400-05:00 0HL481DO0HIUV [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:37:43.9188350-05:00  [DBG] Connection id \"\"0HL481DNUOBGL\"\" received FIN. (acf58720)\n2017-04-20T11:37:43.9188350-05:00  [DBG] Connection id \"\"0HL481DNUOBGP\"\" received FIN. (acf58720)\n2017-04-20T11:37:43.9188350-05:00  [DBG] Connection id \"\"0HL481DNUOBGM\"\" received FIN. (acf58720)\n2017-04-20T11:37:43.9189140-05:00  [DBG] Connection id \"\"0HL481DNUOBGN\"\" received FIN. (acf58720)\n2017-04-20T11:37:43.9190380-05:00  [DBG] Connection id \"\"0HL481DNUOBGQ\"\" received FIN. (acf58720)\n2017-04-20T11:37:43.9191040-05:00  [DBG] Connection id \"\"0HL481DNUOBGR\"\" started. (1426b994)\n2017-04-20T11:37:43.9193680-05:00  [DBG] Connection id \"\"0HL481DNUOBGS\"\" started. (1426b994)\n2017-04-20T11:37:43.9195950-05:00  [DBG] Connection id \"\"0HL481DNUOBGP\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:43.9196100-05:00  [DBG] Connection id \"\"0HL481DNUOBGL\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:43.9196140-05:00  [DBG] Connection id \"\"0HL481DNUOBGT\"\" started. (1426b994)\n2017-04-20T11:37:43.9196310-05:00  [DBG] Connection id \"\"0HL481DNUOBGQ\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:43.9196490-05:00  [DBG] Connection id \"\"0HL481DNUOBGU\"\" started. (1426b994)\n2017-04-20T11:37:43.9196590-05:00  [DBG] Connection id \"\"0HL481DNUOBGM\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:43.9196950-05:00  [DBG] Connection id \"\"0HL481DNUOBGN\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:43.9231050-05:00  [DBG] Connection id \"\"0HL481DNUOBGQ\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:43.9230940-05:00  [DBG] Connection id \"\"0HL481DNUOBGN\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:43.9230990-05:00  [DBG] Connection id \"\"0HL481DNUOBGP\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:43.9231120-05:00  [DBG] Connection id \"\"0HL481DNUOBGL\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:43.9246720-05:00  [DBG] Connection id \"\"0HL481DNUOBGM\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:43.9286220-05:00  [DBG] Connection id \"\"0HL481DNUOBGP\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:43.9286400-05:00  [DBG] Connection id \"\"0HL481DNUOBGN\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:43.9286180-05:00  [DBG] Connection id \"\"0HL481DNUOBGL\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:43.9286460-05:00  [DBG] Connection id \"\"0HL481DNUOBGQ\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:43.9320710-05:00  [DBG] Connection id \"\"0HL481DNUOBGN\"\" stopped. (056149f8)\n2017-04-20T11:37:43.9320770-05:00  [DBG] Connection id \"\"0HL481DNUOBGL\"\" stopped. (056149f8)\n2017-04-20T11:37:43.9320710-05:00  [DBG] Connection id \"\"0HL481DNUOBGQ\"\" stopped. (056149f8)\n2017-04-20T11:37:43.9320710-05:00  [DBG] Connection id \"\"0HL481DNUOBGP\"\" stopped. (056149f8)\n2017-04-20T11:37:43.9322520-05:00  [DBG] Connection id \"\"0HL481DNUOBGM\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:43.9324070-05:00  [DBG] Connection id \"\"0HL481DNUOBGM\"\" stopped. (056149f8)\n2017-04-20T11:37:44.0243850-05:00 0HL481DO0HIV0 [INF] Request starting HTTP/1.1 GET http://localhost:5000/sign-in/?expired=1   (e5be5b71)\n2017-04-20T11:37:44.0274720-05:00 0HL481DO0HIV0 [INF] Handling request: /sign-in/ (6455a65b)\n2017-04-20T11:37:44.0276610-05:00 0HL481DO0HIV0 [INF] Rewriting path: /sign-in/ > / (170f1f87)\n2017-04-20T11:37:44.0291950-05:00 0HL481DO0HIV0 [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:37:44.0335380-05:00 0HL481DO0HIV0 [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:37:44.0340220-05:00 0HL481DO0HIV0 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:37:44.0364350-05:00 0HL481DO0HIV0 [DBG] Connection id \"\"0HL481DNUOBGR\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:44.0365290-05:00 0HL481DO0HIV0 [INF] Request finished in 12.181ms 304 text/html (15c52c40)\n2017-04-20T11:37:44.0387160-05:00  [DBG] Connection id \"\"0HL481DNUOBGO\"\" received FIN. (acf58720)\n2017-04-20T11:37:44.0447030-05:00 0HL481DO0HIV1 [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:37:44.1497720-05:00 0HL481DO0HIV1 [DBG] Connection id \"\"0HL481DNUOBGR\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:44.1499180-05:00 0HL481DO0HIV1 [INF] Request finished in 105.2445ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:37:44.3064100-05:00 0HL481DO0HIV2 [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:37:44.3697020-05:00  [INF] Connection id \"\"0HL481DNUOBGO\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:37:44.3706480-05:00  [DBG] Connection id \"\"0HL481DNUOBGO\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:44.3707470-05:00  [DBG] Connection id \"\"0HL481DNUOBGO\"\" stopped. (056149f8)\n2017-04-20T11:37:44.7403160-05:00 0HL481DO0HIV3 [INF] Request starting HTTP/1.1 GET http://localhost:5000/sign-in/?expired=1   (e5be5b71)\n2017-04-20T11:37:44.7441180-05:00 0HL481DO0HIV3 [INF] Handling request: /sign-in/ (6455a65b)\n2017-04-20T11:37:44.7443270-05:00 0HL481DO0HIV3 [INF] Rewriting path: /sign-in/ > / (170f1f87)\n2017-04-20T11:37:44.7445570-05:00 0HL481DO0HIV3 [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:37:44.7447200-05:00 0HL481DO0HIV3 [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:37:44.7447680-05:00 0HL481DO0HIV3 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:37:44.7449150-05:00 0HL481DO0HIV3 [DBG] Connection id \"\"0HL481DNUOBGS\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:44.7449890-05:00 0HL481DO0HIV3 [INF] Request finished in 4.8109ms 304 text/html (15c52c40)\n2017-04-20T11:37:44.7472770-05:00  [DBG] Connection id \"\"0HL481DNUOBGR\"\" received FIN. (acf58720)\n2017-04-20T11:37:44.7519900-05:00 0HL481DO0HIV4 [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:37:44.7881250-05:00 0HL481DO0HIV4 [DBG] Connection id \"\"0HL481DNUOBGS\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:44.7882510-05:00 0HL481DO0HIV4 [INF] Request finished in 36.2429ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:37:44.9357150-05:00 0HL481DO0HIV5 [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:37:45.0186840-05:00  [INF] Connection id \"\"0HL481DNUOBGR\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:37:45.0187000-05:00  [DBG] Connection id \"\"0HL481DNUOBGR\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:45.0188670-05:00  [DBG] Connection id \"\"0HL481DNUOBGR\"\" stopped. (056149f8)\n2017-04-20T11:37:47.8385420-05:00  [DBG] Connection id \"\"0HL481DNUOBGV\"\" started. (1426b994)\n2017-04-20T11:37:47.8391390-05:00 0HL481DO0HIV6 [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T11:37:47.8441730-05:00 0HL481DO0HIV6 [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:37:47.8450270-05:00 0HL481DO0HIV6 [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:37:47.8782690-05:00 0HL481DO0HIV6 [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:37:47.9079750-05:00  [DBG] Connection id \"\"0HL481DNUOBH0\"\" started. (1426b994)\n2017-04-20T11:37:47.9081840-05:00 0HL481DO0HIV7 [INF] Request starting HTTP/1.1 GET http://localhost:5000/.well-known/openid-configuration   (e5be5b71)\n2017-04-20T11:37:47.9112280-05:00 0HL481DO0HIV7 [INF] Handling request: /.well-known/openid-configuration (28f0d040)\n2017-04-20T11:37:47.9124590-05:00 0HL481DO0HIV7 [DBG] The request path \"/.well-known/openid-configuration\" does not match a supported file type (4910e68e)\n2017-04-20T11:37:47.9129630-05:00 0HL481DO0HIV7 [DBG] Authentication was skipped because no bearer token was received. (9de85986)\n2017-04-20T11:37:47.9604730-05:00 0HL481DO0HIV7 [INF] The discovery request was successfully extracted from the HTTP request: \"{}\" (8eb39e75)\n2017-04-20T11:37:47.9609200-05:00 0HL481DO0HIV7 [INF] The discovery request was successfully validated. (5773bc23)\n2017-04-20T11:37:47.9968510-05:00 0HL481DO0HIV7 [INF] The discovery response was successfully returned: \"{\n  \\\"issuer\\\": \\\"http://localhost:5000/\\\",\n  \\\"token_endpoint\\\": \\\"http://localhost:5000/api/auth/login\\\",\n  \\\"jwks_uri\\\": \\\"http://localhost:5000/.well-known/jwks\\\",\n  \\\"grant_types_supported\\\": [\n    \\\"refresh_token\\\",\n    \\\"password\\\"\n  ],\n  \\\"scopes_supported\\\": [\n    \\\"openid\\\",\n    \\\"profile\\\",\n    \\\"email\\\",\n    \\\"phone\\\",\n    \\\"roles\\\",\n    \\\"offline_access\\\"\n  ],\n  \\\"id_token_signing_alg_values_supported\\\": [\n    \\\"RS256\\\"\n  ],\n  \\\"subject_types_supported\\\": [\n    \\\"public\\\"\n  ],\n  \\\"token_endpoint_auth_methods_supported\\\": [\n    \\\"client_secret_basic\\\",\n    \\\"client_secret_post\\\"\n  ]\n}\" (ee57d974)\n2017-04-20T11:37:48.0282260-05:00 0HL481DO0HIV7 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:37:48.0298620-05:00 0HL481DO0HIV7 [DBG] Connection id \"\"0HL481DNUOBH0\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:48.0299690-05:00 0HL481DO0HIV7 [INF] Request finished in 121.8068ms 200 application/json;charset=UTF-8 (15c52c40)\n2017-04-20T11:37:48.0480060-05:00 0HL481DO0HIV8 [INF] Request starting HTTP/1.1 GET http://localhost:5000/.well-known/jwks   (e5be5b71)\n2017-04-20T11:37:48.0506240-05:00 0HL481DO0HIV8 [INF] Handling request: /.well-known/jwks (3092411e)\n2017-04-20T11:37:48.0509020-05:00 0HL481DO0HIV8 [DBG] The request path \"/.well-known/jwks\" does not match a supported file type (4910e68e)\n2017-04-20T11:37:48.0509530-05:00 0HL481DO0HIV8 [DBG] Authentication was skipped because no bearer token was received. (9de85986)\n2017-04-20T11:37:48.0668590-05:00 0HL481DO0HIV8 [INF] The discovery request was successfully extracted from the HTTP request: \"{}\" (8eb39e75)\n2017-04-20T11:37:48.0733790-05:00 0HL481DO0HIV8 [INF] The discovery response was successfully returned: \"{\n  \\\"keys\\\": [\n    {\n      \\\"kid\\\": \\\"ZINIJNEZDR5SICRGXFCAQ2N2M0GJHODRC_YSGCBP\\\",\n      \\\"use\\\": \\\"sig\\\",\n      \\\"kty\\\": \\\"RSA\\\",\n      \\\"alg\\\": \\\"RS256\\\",\n      \\\"e\\\": \\\"AQAB\\\",\n      \\\"n\\\": \\\"ziNiJnezDr5SIcRGXFcaQ2n2M0gjhODRc_YSgcbPrt1X3JZ7VSIo1RvPH1P1v37GV5nvF-B4QTTV2I8ZOyPa8OIY9j0qPl5DMEDO8iavf2pMdBjxA5JI_fO1EO-eZRojPtHFrE-dbnt8AOWNgqx3okN5Js-odWL3pg3TybsENv_lxFk3K4v7zlF7-J7gdlqDKTjgoRfU2OzxgOvEAIGQ66hy8alXn8IjJJ1sPBsw77r6ij7jOs1TB6YjE1ZMzRs-jUm4cR8Q2q7vzPHEgelM61sjW9Gac0NTLgS6UNCnNTBYebum1Q-HVhdCJCZ8VDq6R7iWlm-8NeoGT78EC4pLbQ\\\"\n    }\n  ]\n}\" (ee57d974)\n2017-04-20T11:37:48.0735570-05:00 0HL481DO0HIV8 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:37:48.0736820-05:00 0HL481DO0HIV8 [DBG] Connection id \"\"0HL481DNUOBH0\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:48.0737980-05:00 0HL481DO0HIV8 [INF] Request finished in 25.7882ms 200 application/json;charset=UTF-8 (15c52c40)\n2017-04-20T11:37:48.0922480-05:00 0HL481DO0HIV6 [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T11:37:48.3252880-05:00 0HL481DO0HIV6 [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:37:48.3736270-05:00 0HL481DO0HIV6 [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:37:48.6162920-05:00 0HL481DO0HIV6 [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:37:48.7035500-05:00 0HL481DO0HIV6 [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:37:48.7151230-05:00 0HL481DO0HIV6 [INF] Executed DbCommand (10ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:37:48.7158920-05:00 0HL481DO0HIV6 [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:37:48.7245730-05:00 0HL481DO0HIV6 [WRN] User \"9bf02c6f-6f89-4282-8ac3-4489462861ad\" validation failed: \"DuplicateUserName\". (5dc28e15)\n2017-04-20T11:37:48.7274430-05:00 0HL481DO0HIV6 [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T11:37:48.7497940-05:00 0HL481DO0HIV6 [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T11:37:48.7547650-05:00 0HL481DO0HIV6 [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T11:37:48.7550900-05:00 0HL481DO0HIV6 [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T11:37:48.7902840-05:00 0HL481DO0HIV6 [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 412.9491ms (afa2e885)\n2017-04-20T11:37:48.7915380-05:00 0HL481DO0HIV6 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:37:48.7952490-05:00 0HL481DO0HIV6 [DBG] Connection id \"\"0HL481DNUOBGV\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:37:48.7953670-05:00 0HL481DO0HIV6 [INF] Request finished in 956.6813ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T11:37:58.3918390-05:00  [DBG] Connection id \"\"0HL481DNUOBGU\"\" received FIN. (acf58720)\n2017-04-20T11:37:58.3918390-05:00  [DBG] Connection id \"\"0HL481DNUOBGT\"\" received FIN. (acf58720)\n2017-04-20T11:37:58.3919610-05:00  [DBG] Connection id \"\"0HL481DNUOBGT\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:58.3919600-05:00  [DBG] Connection id \"\"0HL481DNUOBGU\"\" disconnecting. (b29b9868)\n2017-04-20T11:37:58.3920110-05:00  [DBG] Connection id \"\"0HL481DNUOBGT\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:58.3920570-05:00  [DBG] Connection id \"\"0HL481DNUOBGU\"\" sending FIN. (ffb251f5)\n2017-04-20T11:37:58.3921150-05:00  [DBG] Connection id \"\"0HL481DNUOBGU\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:58.3921360-05:00  [DBG] Connection id \"\"0HL481DNUOBGT\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:37:58.3921880-05:00  [DBG] Connection id \"\"0HL481DNUOBGU\"\" stopped. (056149f8)\n2017-04-20T11:37:58.3921880-05:00  [DBG] Connection id \"\"0HL481DNUOBGT\"\" stopped. (056149f8)\n2017-04-20T11:39:08.8648310-05:00  [DBG] Connection id \"\"0HL481DNUOBH2\"\" started. (1426b994)\n2017-04-20T11:39:08.8648300-05:00  [DBG] Connection id \"\"0HL481DNUOBH1\"\" started. (1426b994)\n2017-04-20T11:39:08.9771260-05:00 0HL481DO0HIV9 [INF] Request starting HTTP/1.1 GET http://localhost:5000/register   (e5be5b71)\n2017-04-20T11:39:08.9797620-05:00 0HL481DO0HIV9 [INF] Handling request: /register (d15267fc)\n2017-04-20T11:39:08.9798190-05:00 0HL481DO0HIV9 [INF] Rewriting path: /register > / (b5db4a63)\n2017-04-20T11:39:08.9799910-05:00 0HL481DO0HIV9 [INF] Sending file. Request path: '\"/index.html\"'. Physical path: '\"/Users/bholt/dev/aspnet-core-react-template/api/wwwroot/index.html\"' (27b0a520)\n2017-04-20T11:39:08.9802130-05:00 0HL481DO0HIV9 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:39:08.9802920-05:00 0HL481DO0HIV9 [DBG] Connection id \"\"0HL481DNUOBH1\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:39:08.9803620-05:00 0HL481DO0HIV9 [INF] Request finished in 3.2755ms 200 text/html (15c52c40)\n2017-04-20T11:39:08.9822110-05:00  [DBG] Connection id \"\"0HL481DNUOBGS\"\" received FIN. (acf58720)\n2017-04-20T11:39:08.9871980-05:00 0HL481DO0HIVA [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:39:09.0885690-05:00 0HL481DO0HIVA [DBG] Connection id \"\"0HL481DNUOBH1\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:39:09.0887120-05:00 0HL481DO0HIVA [INF] Request finished in 101.5631ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:39:09.2537060-05:00 0HL481DO0HIVB [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:39:09.8290340-05:00 0HL481DO0HIVC [INF] Request starting HTTP/1.1 GET http://localhost:5000/register   (e5be5b71)\n2017-04-20T11:39:09.8308800-05:00 0HL481DO0HIVC [INF] Handling request: /register (d15267fc)\n2017-04-20T11:39:09.8309960-05:00 0HL481DO0HIVC [INF] Rewriting path: /register > / (b5db4a63)\n2017-04-20T11:39:09.8311750-05:00 0HL481DO0HIVC [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:39:09.8312350-05:00 0HL481DO0HIVC [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:39:09.8312670-05:00 0HL481DO0HIVC [INF] Finished handling request. (d2c25297)\n2017-04-20T11:39:09.8313890-05:00 0HL481DO0HIVC [DBG] Connection id \"\"0HL481DNUOBH2\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:39:09.8314930-05:00 0HL481DO0HIVC [INF] Request finished in 2.4718ms 304 text/html (15c52c40)\n2017-04-20T11:39:09.8334490-05:00  [DBG] Connection id \"\"0HL481DNUOBH1\"\" received FIN. (acf58720)\n2017-04-20T11:39:09.8381890-05:00 0HL481DO0HIVD [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:39:09.8744170-05:00 0HL481DO0HIVD [DBG] Connection id \"\"0HL481DNUOBH2\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:39:09.8745270-05:00 0HL481DO0HIVD [INF] Request finished in 36.3432ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:39:10.0234160-05:00 0HL481DO0HIVE [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:39:10.0562140-05:00  [INF] Connection id \"\"0HL481DNUOBGS\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:39:10.0562050-05:00  [DBG] Connection id \"\"0HL481DNUOBGS\"\" disconnecting. (b29b9868)\n2017-04-20T11:39:10.0563640-05:00  [DBG] Connection id \"\"0HL481DNUOBGS\"\" stopped. (056149f8)\n2017-04-20T11:39:10.0587750-05:00  [INF] Connection id \"\"0HL481DNUOBH1\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:39:10.0587850-05:00  [DBG] Connection id \"\"0HL481DNUOBH1\"\" disconnecting. (b29b9868)\n2017-04-20T11:39:10.0589970-05:00  [DBG] Connection id \"\"0HL481DNUOBH1\"\" stopped. (056149f8)\n2017-04-20T11:39:14.1101400-05:00 0HL481DO0HIVF [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T11:39:14.1120980-05:00 0HL481DO0HIVF [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:39:14.1121790-05:00 0HL481DO0HIVF [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:39:14.1124730-05:00 0HL481DO0HIVF [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:39:14.1125950-05:00 0HL481DO0HIVF [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T11:39:14.1127600-05:00 0HL481DO0HIVF [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:39:14.1140020-05:00 0HL481DO0HIVF [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:39:14.1156750-05:00 0HL481DO0HIVF [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:39:14.1415600-05:00 0HL481DO0HIVF [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:39:14.1455590-05:00 0HL481DO0HIVF [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:39:14.1458010-05:00 0HL481DO0HIVF [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:39:14.1460050-05:00 0HL481DO0HIVF [WRN] User \"2f93a607-6b5b-4b6b-899b-f459f4322d02\" validation failed: \"DuplicateUserName\". (5dc28e15)\n2017-04-20T11:39:14.1461340-05:00 0HL481DO0HIVF [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T11:39:14.1463360-05:00 0HL481DO0HIVF [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T11:39:14.1464230-05:00 0HL481DO0HIVF [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T11:39:14.1464610-05:00 0HL481DO0HIVF [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T11:39:14.1467060-05:00 0HL481DO0HIVF [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 32.6371ms (afa2e885)\n2017-04-20T11:39:14.1468290-05:00 0HL481DO0HIVF [INF] Finished handling request. (d2c25297)\n2017-04-20T11:39:14.1470340-05:00 0HL481DO0HIVF [DBG] Connection id \"\"0HL481DNUOBGV\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:39:14.1471100-05:00 0HL481DO0HIVF [INF] Request finished in 37.0278ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T11:39:48.9834480-05:00  [DBG] Connection id \"\"0HL481DNUOBH0\"\" disconnecting. (b29b9868)\n2017-04-20T11:39:48.9835820-05:00  [DBG] Connection id \"\"0HL481DNUOBH0\"\" sending FIN. (ffb251f5)\n2017-04-20T11:39:48.9836800-05:00  [DBG] Connection id \"\"0HL481DNUOBH0\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:39:48.9838000-05:00  [DBG] Connection id \"\"0HL481DNUOBH0\"\" stopped. (056149f8)\n2017-04-20T11:39:58.9621780-05:00 0HL481DO0HIVG [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T11:39:58.9649200-05:00 0HL481DO0HIVG [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:39:58.9650300-05:00 0HL481DO0HIVG [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:39:58.9652620-05:00 0HL481DO0HIVG [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:39:58.9653330-05:00 0HL481DO0HIVG [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T11:39:58.9655650-05:00 0HL481DO0HIVG [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:39:58.9656550-05:00 0HL481DO0HIVG [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:39:58.9659790-05:00 0HL481DO0HIVG [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:39:58.9859840-05:00 0HL481DO0HIVG [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:39:58.9877550-05:00 0HL481DO0HIVG [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:39:58.9879100-05:00 0HL481DO0HIVG [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:39:58.9880440-05:00 0HL481DO0HIVG [WRN] User \"86431f92-3002-4f53-bb99-3becedaaddbe\" validation failed: \"DuplicateUserName\". (5dc28e15)\n2017-04-20T11:39:58.9881080-05:00 0HL481DO0HIVG [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T11:39:58.9881740-05:00 0HL481DO0HIVG [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T11:39:58.9882110-05:00 0HL481DO0HIVG [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T11:39:58.9882440-05:00 0HL481DO0HIVG [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T11:39:58.9883520-05:00 0HL481DO0HIVG [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 22.6438ms (afa2e885)\n2017-04-20T11:39:58.9884410-05:00 0HL481DO0HIVG [INF] Finished handling request. (d2c25297)\n2017-04-20T11:39:58.9884990-05:00 0HL481DO0HIVG [DBG] Connection id \"\"0HL481DNUOBGV\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:39:58.9885460-05:00 0HL481DO0HIVG [INF] Request finished in 26.4137ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T11:40:02.4118890-05:00 0HL481DO0HIVH [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T11:40:02.4152190-05:00 0HL481DO0HIVH [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:40:02.4153030-05:00 0HL481DO0HIVH [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:40:02.4155360-05:00 0HL481DO0HIVH [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:40:02.4156250-05:00 0HL481DO0HIVH [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T11:40:02.4157540-05:00 0HL481DO0HIVH [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:40:02.4158230-05:00 0HL481DO0HIVH [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:40:02.4161110-05:00 0HL481DO0HIVH [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:40:02.4384170-05:00 0HL481DO0HIVH [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:02.4402280-05:00 0HL481DO0HIVH [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:40:02.4405080-05:00 0HL481DO0HIVH [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:02.4407150-05:00 0HL481DO0HIVH [WRN] User \"8a5d0dff-4e0d-47dc-99c6-dfb6f331b36e\" validation failed: \"DuplicateUserName\". (5dc28e15)\n2017-04-20T11:40:02.4407910-05:00 0HL481DO0HIVH [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T11:40:02.4408430-05:00 0HL481DO0HIVH [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T11:40:02.4408950-05:00 0HL481DO0HIVH [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T11:40:02.4409290-05:00 0HL481DO0HIVH [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T11:40:02.4410590-05:00 0HL481DO0HIVH [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 25.1783ms (afa2e885)\n2017-04-20T11:40:02.4411560-05:00 0HL481DO0HIVH [INF] Finished handling request. (d2c25297)\n2017-04-20T11:40:02.4412390-05:00 0HL481DO0HIVH [DBG] Connection id \"\"0HL481DNUOBGV\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:02.4413110-05:00 0HL481DO0HIVH [INF] Request finished in 29.4581ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T11:40:06.6871600-05:00  [DBG] Connection id \"\"0HL481DNUOBH3\"\" started. (1426b994)\n2017-04-20T11:40:06.6873480-05:00 0HL481DO0HIVI [INF] Request starting HTTP/1.1 GET http://localhost:5000/register   (e5be5b71)\n2017-04-20T11:40:06.6896230-05:00 0HL481DO0HIVI [INF] Handling request: /register (d15267fc)\n2017-04-20T11:40:06.6896800-05:00 0HL481DO0HIVI [INF] Rewriting path: /register > / (b5db4a63)\n2017-04-20T11:40:06.6899040-05:00 0HL481DO0HIVI [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:40:06.6899730-05:00 0HL481DO0HIVI [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:40:06.6900170-05:00 0HL481DO0HIVI [INF] Finished handling request. (d2c25297)\n2017-04-20T11:40:06.6900850-05:00 0HL481DO0HIVI [DBG] Connection id \"\"0HL481DNUOBH3\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:06.6901910-05:00 0HL481DO0HIVI [INF] Request finished in 2.828ms 304 text/html (15c52c40)\n2017-04-20T11:40:06.6920350-05:00  [DBG] Connection id \"\"0HL481DNUOBH2\"\" received FIN. (acf58720)\n2017-04-20T11:40:06.6982060-05:00 0HL481DO0HIVJ [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:40:06.7981140-05:00 0HL481DO0HIVJ [DBG] Connection id \"\"0HL481DNUOBH3\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:06.7982550-05:00 0HL481DO0HIVJ [INF] Request finished in 100.0866ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:40:06.9514120-05:00 0HL481DO0HIVK [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:40:07.7135560-05:00  [DBG] Connection id \"\"0HL481DNUOBH4\"\" started. (1426b994)\n2017-04-20T11:40:07.7137430-05:00 0HL481DO0HIVL [INF] Request starting HTTP/1.1 GET http://localhost:5000/register   (e5be5b71)\n2017-04-20T11:40:07.7165340-05:00 0HL481DO0HIVL [INF] Handling request: /register (d15267fc)\n2017-04-20T11:40:07.7166070-05:00 0HL481DO0HIVL [INF] Rewriting path: /register > / (b5db4a63)\n2017-04-20T11:40:07.7168370-05:00 0HL481DO0HIVL [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:40:07.7169050-05:00 0HL481DO0HIVL [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:40:07.7169620-05:00 0HL481DO0HIVL [INF] Finished handling request. (d2c25297)\n2017-04-20T11:40:07.7170540-05:00 0HL481DO0HIVL [DBG] Connection id \"\"0HL481DNUOBH4\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:07.7171230-05:00 0HL481DO0HIVL [INF] Request finished in 3.3808ms 304 text/html (15c52c40)\n2017-04-20T11:40:07.7190570-05:00  [DBG] Connection id \"\"0HL481DNUOBH3\"\" received FIN. (acf58720)\n2017-04-20T11:40:07.7245360-05:00 0HL481DO0HIVM [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:40:07.7679270-05:00 0HL481DO0HIVM [DBG] Connection id \"\"0HL481DNUOBH4\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:07.7680490-05:00 0HL481DO0HIVM [INF] Request finished in 43.5382ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:40:07.9121720-05:00 0HL481DO0HIVN [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:40:07.9323120-05:00  [INF] Connection id \"\"0HL481DNUOBH2\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:40:07.9323120-05:00  [DBG] Connection id \"\"0HL481DNUOBH2\"\" disconnecting. (b29b9868)\n2017-04-20T11:40:07.9325000-05:00  [INF] Connection id \"\"0HL481DNUOBH2\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:40:07.9327500-05:00  [INF] Connection id \"\"0HL481DNUOBH3\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:40:07.9328240-05:00  [DBG] Connection id \"\"0HL481DNUOBH3\"\" disconnecting. (b29b9868)\n2017-04-20T11:40:07.9329040-05:00  [DBG] Connection id \"\"0HL481DNUOBH2\"\" stopped. (056149f8)\n2017-04-20T11:40:07.9329500-05:00  [DBG] Connection id \"\"0HL481DNUOBH3\"\" stopped. (056149f8)\n2017-04-20T11:40:12.8112560-05:00 0HL481DO0HIVO [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T11:40:12.8130870-05:00 0HL481DO0HIVO [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:40:12.8132280-05:00 0HL481DO0HIVO [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:40:12.8134190-05:00 0HL481DO0HIVO [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:40:12.8135180-05:00 0HL481DO0HIVO [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T11:40:12.8136160-05:00 0HL481DO0HIVO [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:40:12.8136940-05:00 0HL481DO0HIVO [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:40:12.8139390-05:00 0HL481DO0HIVO [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:40:12.8347490-05:00 0HL481DO0HIVO [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:12.8363430-05:00 0HL481DO0HIVO [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:40:12.8365570-05:00 0HL481DO0HIVO [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:12.8367310-05:00 0HL481DO0HIVO [WRN] User \"ccb83522-ab79-4c44-9b0b-5ff35929e0a2\" validation failed: \"DuplicateUserName\". (5dc28e15)\n2017-04-20T11:40:12.8368240-05:00 0HL481DO0HIVO [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T11:40:12.8368970-05:00 0HL481DO0HIVO [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T11:40:12.8369660-05:00 0HL481DO0HIVO [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T11:40:12.8370050-05:00 0HL481DO0HIVO [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T11:40:12.8371390-05:00 0HL481DO0HIVO [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 23.4046ms (afa2e885)\n2017-04-20T11:40:12.8373040-05:00 0HL481DO0HIVO [INF] Finished handling request. (d2c25297)\n2017-04-20T11:40:12.8373970-05:00 0HL481DO0HIVO [DBG] Connection id \"\"0HL481DNUOBGV\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:12.8374680-05:00 0HL481DO0HIVO [INF] Request finished in 26.2417ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T11:40:18.4429330-05:00 0HL481DO0HIVP [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 43 (e5be5b71)\n2017-04-20T11:40:18.4456770-05:00 0HL481DO0HIVP [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:40:18.4458000-05:00 0HL481DO0HIVP [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:40:18.4460320-05:00 0HL481DO0HIVP [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:40:18.4461620-05:00 0HL481DO0HIVP [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T11:40:18.4463040-05:00 0HL481DO0HIVP [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:40:18.4463950-05:00 0HL481DO0HIVP [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:40:18.4468380-05:00 0HL481DO0HIVP [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:40:18.4673860-05:00 0HL481DO0HIVP [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:18.4687650-05:00 0HL481DO0HIVP [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:40:18.4688690-05:00 0HL481DO0HIVP [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:18.5011340-05:00 0HL481DO0HIVP [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:18.5012750-05:00 0HL481DO0HIVP [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:40:18.5092810-05:00 0HL481DO0HIVP [INF] Executed DbCommand (2ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?', @p8='?', @p9='?', @p10='?', @p11='?', @p12='?', @p13='?', @p14='?', @p15='?'], CommandType='Text', CommandTimeout='30']\nINSERT INTO \"AspNetUsers\" (\"Id\", \"AccessFailedCount\", \"ConcurrencyStamp\", \"Email\", \"EmailConfirmed\", \"GivenName\", \"LockoutEnabled\", \"LockoutEnd\", \"NormalizedEmail\", \"NormalizedUserName\", \"PasswordHash\", \"PhoneNumber\", \"PhoneNumberConfirmed\", \"SecurityStamp\", \"TwoFactorEnabled\", \"UserName\")\nVALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15); (6438bdd5)\n2017-04-20T11:40:18.5199150-05:00 0HL481DO0HIVP [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:18.5220720-05:00 0HL481DO0HIVP [INF] New user registered (id: 28e718f7-6d7a-4eb5-9d7d-3983acd1cfeb) (ee102ef0)\n2017-04-20T11:40:18.5488350-05:00 0HL481DO0HIVP [DBG] Reading data from file '\"/Users/bholt/.aspnet/DataProtection-Keys/key-2115e1cc-6a7a-4f94-a5af-79045dd7268a.xml\"'. (5ce001c4)\n2017-04-20T11:40:18.5536860-05:00 0HL481DO0HIVP [DBG] Reading data from file '\"/Users/bholt/.aspnet/DataProtection-Keys/key-65a1dbdc-ff60-43d0-ad97-4b44b66d8604.xml\"'. (5ce001c4)\n2017-04-20T11:40:18.5614190-05:00 0HL481DO0HIVP [DBG] Found key {2115e1cc-6a7a-4f94-a5af-79045dd7268a}. (f843275d)\n2017-04-20T11:40:18.5668030-05:00 0HL481DO0HIVP [DBG] Found key {65a1dbdc-ff60-43d0-ad97-4b44b66d8604}. (f843275d)\n2017-04-20T11:40:18.5819820-05:00 0HL481DO0HIVP [DBG] Considering key {2115e1cc-6a7a-4f94-a5af-79045dd7268a} with expiration date 2017-07-15 20:23:44Z as default key. (ca2e3b22)\n2017-04-20T11:40:18.5986940-05:00 0HL481DO0HIVP [DBG] Using managed symmetric algorithm '\"System.Security.Cryptography.Aes\"'. (0f299fe5)\n2017-04-20T11:40:18.5998270-05:00 0HL481DO0HIVP [DBG] Using managed keyed hash algorithm '\"System.Security.Cryptography.HMACSHA256\"'. (47d8f6fe)\n2017-04-20T11:40:18.6142350-05:00 0HL481DO0HIVP [DBG] Using key {2115e1cc-6a7a-4f94-a5af-79045dd7268a} as the default key. (4cf2d764)\n2017-04-20T11:40:19.1260690-05:00 0HL481DO0HIVP [INF] Sent email confirmation email (id: 28e718f7-6d7a-4eb5-9d7d-3983acd1cfeb) (88a75a42)\n2017-04-20T11:40:19.2434760-05:00 0HL481DO0HIVP [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:19.2513050-05:00 0HL481DO0HIVP [INF] Executed DbCommand (6ms) [Parameters=[@__userId_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"role\".\"Name\"\nFROM \"AspNetUserRoles\" AS \"userRole\"\nINNER JOIN \"AspNetRoles\" AS \"role\" ON \"userRole\".\"RoleId\" = \"role\".\"Id\"\nWHERE \"userRole\".\"UserId\" = @__userId_0 (6438bdd5)\n2017-04-20T11:40:19.2522840-05:00 0HL481DO0HIVP [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:19.2770190-05:00 0HL481DO0HIVP [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:19.2791770-05:00 0HL481DO0HIVP [INF] Executed DbCommand (1ms) [Parameters=[@__user_Id_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"uc\".\"Id\", \"uc\".\"ClaimType\", \"uc\".\"ClaimValue\", \"uc\".\"UserId\"\nFROM \"AspNetUserClaims\" AS \"uc\"\nWHERE \"uc\".\"UserId\" = @__user_Id_0 (6438bdd5)\n2017-04-20T11:40:19.2794120-05:00 0HL481DO0HIVP [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:40:19.2890810-05:00 0HL481DO0HIVP [INF] User logged in (id: 28e718f7-6d7a-4eb5-9d7d-3983acd1cfeb) (bf48a8ee)\n2017-04-20T11:40:19.2893740-05:00 0HL481DO0HIVP [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.OkResult\". (f72615e0)\n2017-04-20T11:40:19.2922430-05:00 0HL481DO0HIVP [INF] Executing HttpStatusCodeResult, setting HTTP status code 200 (e28ccfae)\n2017-04-20T11:40:19.2931220-05:00 0HL481DO0HIVP [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 846.7138ms (afa2e885)\n2017-04-20T11:40:19.2932340-05:00 0HL481DO0HIVP [INF] Finished handling request. (d2c25297)\n2017-04-20T11:40:19.2939380-05:00 0HL481DO0HIVP [DBG] Connection id \"\"0HL481DNUOBGV\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:19.2940030-05:00 0HL481DO0HIVP [INF] Request finished in 851.1767ms 200  (15c52c40)\n2017-04-20T11:40:19.8710400-05:00  [DBG] Connection id \"\"0HL481DNUOBH5\"\" started. (1426b994)\n2017-04-20T11:40:19.8712390-05:00 0HL481DO0HIVQ [INF] Request starting HTTP/1.1 GET http://localhost:5000/favicon.ico   (e5be5b71)\n2017-04-20T11:40:19.8732470-05:00 0HL481DO0HIVQ [INF] Handling request: /favicon.ico (b3d76b52)\n2017-04-20T11:40:19.8735140-05:00 0HL481DO0HIVQ [INF] Sending file. Request path: '\"/favicon.ico\"'. Physical path: '\"/Users/bholt/dev/aspnet-core-react-template/api/wwwroot/favicon.ico\"' (27b0a520)\n2017-04-20T11:40:19.8744590-05:00 0HL481DO0HIVQ [INF] Finished handling request. (d2c25297)\n2017-04-20T11:40:19.8745650-05:00 0HL481DO0HIVQ [DBG] Connection id \"\"0HL481DNUOBH5\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:40:19.8747030-05:00 0HL481DO0HIVQ [INF] Request finished in 3.427ms 200 image/x-icon (15c52c40)\n2017-04-20T11:42:20.0860490-05:00  [DBG] Connection id \"\"0HL481DNUOBGV\"\" disconnecting. (b29b9868)\n2017-04-20T11:42:20.0862240-05:00  [DBG] Connection id \"\"0HL481DNUOBGV\"\" sending FIN. (ffb251f5)\n2017-04-20T11:42:20.0863450-05:00  [DBG] Connection id \"\"0HL481DNUOBGV\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:42:20.0864070-05:00  [DBG] Connection id \"\"0HL481DNUOBGV\"\" stopped. (056149f8)\n2017-04-20T11:42:21.0952590-05:00  [DBG] Connection id \"\"0HL481DNUOBH5\"\" disconnecting. (b29b9868)\n2017-04-20T11:42:21.0954820-05:00  [DBG] Connection id \"\"0HL481DNUOBH5\"\" sending FIN. (ffb251f5)\n2017-04-20T11:42:21.0956160-05:00  [DBG] Connection id \"\"0HL481DNUOBH5\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:42:21.0957040-05:00  [DBG] Connection id \"\"0HL481DNUOBH5\"\" stopped. (056149f8)\n2017-04-20T11:45:42.4452760-05:00  [DBG] Connection id \"\"0HL481DNUOBH6\"\" started. (1426b994)\n2017-04-20T11:45:42.4454930-05:00 0HL481DO0HIVR [INF] Request starting HTTP/1.1 GET http://localhost:5000/register   (e5be5b71)\n2017-04-20T11:45:42.4470350-05:00 0HL481DO0HIVR [INF] Handling request: /register (d15267fc)\n2017-04-20T11:45:42.4470960-05:00 0HL481DO0HIVR [INF] Rewriting path: /register > / (b5db4a63)\n2017-04-20T11:45:42.4472760-05:00 0HL481DO0HIVR [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:45:42.4473350-05:00 0HL481DO0HIVR [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:45:42.4473680-05:00 0HL481DO0HIVR [INF] Finished handling request. (d2c25297)\n2017-04-20T11:45:42.4474200-05:00 0HL481DO0HIVR [DBG] Connection id \"\"0HL481DNUOBH6\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:45:42.4474760-05:00 0HL481DO0HIVR [INF] Request finished in 2.0026ms 304 text/html (15c52c40)\n2017-04-20T11:45:42.4492840-05:00  [DBG] Connection id \"\"0HL481DNUOBH4\"\" received FIN. (acf58720)\n2017-04-20T11:45:42.4549310-05:00 0HL481DO0HIVS [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:45:42.5539130-05:00 0HL481DO0HIVS [DBG] Connection id \"\"0HL481DNUOBH6\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:45:42.5540400-05:00 0HL481DO0HIVS [INF] Request finished in 99.113ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:45:42.7079810-05:00 0HL481DO0HIVT [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:45:42.7262130-05:00  [DBG] Connection id \"\"0HL481DNUOBH4\"\" disconnecting. (b29b9868)\n2017-04-20T11:45:42.7262060-05:00  [INF] Connection id \"\"0HL481DNUOBH4\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:45:42.7265250-05:00  [DBG] Connection id \"\"0HL481DNUOBH4\"\" stopped. (056149f8)\n2017-04-20T11:45:44.0215750-05:00  [DBG] Connection id \"\"0HL481DNUOBH7\"\" started. (1426b994)\n2017-04-20T11:45:44.0217810-05:00 0HL481DO0HIVU [INF] Request starting HTTP/1.1 GET http://localhost:5000/register   (e5be5b71)\n2017-04-20T11:45:44.0246960-05:00 0HL481DO0HIVU [INF] Handling request: /register (d15267fc)\n2017-04-20T11:45:44.0247650-05:00 0HL481DO0HIVU [INF] Rewriting path: /register > / (b5db4a63)\n2017-04-20T11:45:44.0250240-05:00 0HL481DO0HIVU [INF] The file \"/index.html\" was not modified (f1f8d725)\n2017-04-20T11:45:44.0250900-05:00 0HL481DO0HIVU [DBG] Handled. Status code: 304 File: \"/index.html\" (58f8d392)\n2017-04-20T11:45:44.0251170-05:00 0HL481DO0HIVU [INF] Finished handling request. (d2c25297)\n2017-04-20T11:45:44.0252020-05:00 0HL481DO0HIVU [DBG] Connection id \"\"0HL481DNUOBH7\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:45:44.0252840-05:00 0HL481DO0HIVU [INF] Request finished in 3.5368ms 304 text/html (15c52c40)\n2017-04-20T11:45:44.0272240-05:00  [DBG] Connection id \"\"0HL481DNUOBH6\"\" received FIN. (acf58720)\n2017-04-20T11:45:44.0331880-05:00 0HL481DO0HIVV [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T11:45:44.0766880-05:00 0HL481DO0HIVV [DBG] Connection id \"\"0HL481DNUOBH7\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:45:44.0768270-05:00 0HL481DO0HIVV [INF] Request finished in 43.6235ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T11:45:44.2229510-05:00 0HL481DO0HJ00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T11:45:44.2441810-05:00  [INF] Connection id \"\"0HL481DNUOBH6\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:45:44.2441810-05:00  [DBG] Connection id \"\"0HL481DNUOBH6\"\" disconnecting. (b29b9868)\n2017-04-20T11:45:44.2445160-05:00  [DBG] Connection id \"\"0HL481DNUOBH6\"\" stopped. (056149f8)\n2017-04-20T11:45:47.6464490-05:00  [DBG] Connection id \"\"0HL481DNUOBH8\"\" started. (1426b994)\n2017-04-20T11:45:47.6466580-05:00 0HL481DO0HJ01 [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T11:45:47.6479610-05:00 0HL481DO0HJ01 [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T11:45:47.6480340-05:00 0HL481DO0HJ01 [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T11:45:47.6499000-05:00 0HL481DO0HJ01 [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T11:45:47.6499920-05:00 0HL481DO0HJ01 [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: undefined\" (48071232)\n2017-04-20T11:45:47.6501160-05:00 0HL481DO0HJ01 [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T11:45:47.6501750-05:00 0HL481DO0HJ01 [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T11:45:47.6504120-05:00 0HL481DO0HJ01 [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T11:45:47.6704730-05:00 0HL481DO0HJ01 [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:45:47.6722490-05:00 0HL481DO0HJ01 [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:45:47.6724530-05:00 0HL481DO0HJ01 [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:45:47.6726710-05:00 0HL481DO0HJ01 [WRN] User \"56e5f22f-fe8e-48e6-948b-df981b56a516\" validation failed: \"DuplicateUserName\". (5dc28e15)\n2017-04-20T11:45:47.6727610-05:00 0HL481DO0HJ01 [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T11:45:47.6728260-05:00 0HL481DO0HJ01 [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T11:45:47.6728740-05:00 0HL481DO0HJ01 [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T11:45:47.6729030-05:00 0HL481DO0HJ01 [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T11:45:47.6730350-05:00 0HL481DO0HJ01 [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 22.8055ms (afa2e885)\n2017-04-20T11:45:47.6731460-05:00 0HL481DO0HJ01 [INF] Finished handling request. (d2c25297)\n2017-04-20T11:45:47.6732390-05:00 0HL481DO0HJ01 [DBG] Connection id \"\"0HL481DNUOBH8\"\" completed keep alive response. (9784cde9)\n2017-04-20T11:45:47.6733630-05:00 0HL481DO0HJ01 [INF] Request finished in 26.7243ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T11:46:32.0935980-05:00  [DBG] Connection id \"\"0HL481DNUOBH7\"\" received FIN. (acf58720)\n2017-04-20T11:46:44.7399420-05:00  [INF] Connection id \"\"0HL481DNUOBH7\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T11:46:44.7399420-05:00  [DBG] Connection id \"\"0HL481DNUOBH7\"\" disconnecting. (b29b9868)\n2017-04-20T11:46:44.7401040-05:00  [DBG] Connection id \"\"0HL481DNUOBH7\"\" stopped. (056149f8)\n2017-04-20T11:47:49.3103430-05:00  [DBG] Connection id \"\"0HL481DNUOBH8\"\" disconnecting. (b29b9868)\n2017-04-20T11:47:49.3104560-05:00  [DBG] Connection id \"\"0HL481DNUOBH8\"\" sending FIN. (ffb251f5)\n2017-04-20T11:47:49.3105770-05:00  [DBG] Connection id \"\"0HL481DNUOBH8\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T11:47:49.3106450-05:00  [DBG] Connection id \"\"0HL481DNUOBH8\"\" stopped. (056149f8)\n2017-04-20T11:52:20.1843890-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.2332790-05:00  [INF] Executed DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:52:20.2351180-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.2481480-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.2500520-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:52:20.2501960-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.2571800-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.2592600-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:52:20.2599360-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.6921930-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:20.9067920-05:00  [INF] Executed DbCommand (80ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:52:20.9730240-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:21.0340690-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:21.0403040-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:52:21.0413620-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:21.0642120-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:21.0653390-05:00  [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:52:21.0931910-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:21.1567550-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:21.1638260-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:52:21.2243800-05:00  [INF] Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:52:21.2502520-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:22.7258160-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:52:22.8394760-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:52:22.9107110-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:52:27.5521150-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 5111ms (1f3d84b9)\n2017-04-20T11:52:47.2953080-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:47.3580130-05:00  [INF] Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:52:47.3602790-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:47.3782690-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:47.3805780-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:52:47.3806700-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:47.3875940-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:47.3896410-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:52:47.3902200-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:47.8297450-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.0395240-05:00  [INF] Executed DbCommand (75ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:52:48.1077930-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.1673110-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.1728720-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:52:48.1738080-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.1944370-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.1957490-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:52:48.2256620-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.2887970-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:48.2950040-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:52:48.3600290-05:00  [INF] Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:52:48.3845130-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:52:49.8241640-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:52:49.9339700-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:52:50.0188480-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:52:55.0134310-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 5531ms (b9c85d60)\n2017-04-20T11:54:37.8666580-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:37.9142260-05:00  [INF] Executed DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:54:37.9161890-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:37.9289630-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:37.9304160-05:00  [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:54:37.9304990-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:37.9374140-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:37.9396900-05:00  [INF] Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:54:37.9402820-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.3839950-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.6121920-05:00  [INF] Executed DbCommand (77ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:54:38.6732720-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.7260900-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.7327780-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:54:38.7341370-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.7549120-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.7562400-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:54:38.7832790-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.8424430-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:38.8480970-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:54:38.9072120-05:00  [INF] Executed DbCommand (5ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:54:38.9331130-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:40.1053810-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:54:40.2924400-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:54:40.3627690-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:54:50.6248200-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:50.6718600-05:00  [INF] Executed DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:54:50.6737260-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:50.6870270-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:50.6895530-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:54:50.6896620-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:50.6964780-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:50.6985020-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:54:50.6991060-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.1002400-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.3094630-05:00  [INF] Executed DbCommand (72ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:54:51.3715670-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.4247370-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.4297140-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:54:51.4310560-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.4494260-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.4508040-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:54:51.4763700-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.5366480-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:51.5426550-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:54:51.6043500-05:00  [INF] Executed DbCommand (5ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:54:51.6280460-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:54:52.8274950-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:54:52.8352330-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:54:52.9060220-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:54:57.5428390-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 4979ms (b9b435f5)\n2017-04-20T11:55:53.0172200-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.0730740-05:00  [INF] Executed DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:55:53.0748940-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.0888600-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.0904870-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T11:55:53.0906000-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.0971490-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.0988070-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T11:55:53.0993710-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.5183410-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.7221070-05:00  [INF] Executed DbCommand (70ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T11:55:53.7940560-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.8483900-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.8535630-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T11:55:53.8547220-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.8735420-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.8749900-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T11:55:53.9024970-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.9601450-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:53.9665450-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T11:55:54.0287680-05:00  [INF] Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T11:55:54.0585200-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T11:55:55.2623320-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T11:55:55.2623220-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T11:55:55.3342570-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T11:56:00.1801500-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 5200ms (956f4986)\n2017-04-20T12:00:22.4181940-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:22.4677210-05:00  [INF] Executed DbCommand (13ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T12:00:22.4696350-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:22.4831110-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:22.4846130-05:00  [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T12:00:22.4847230-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:22.4915870-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:22.4937610-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T12:00:22.4944190-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:22.9182370-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.1413910-05:00  [INF] Executed DbCommand (84ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T12:00:23.2110220-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.2746920-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.2808440-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T12:00:23.2819780-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.3029210-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.3043030-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T12:00:23.3355490-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.4000400-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:23.4061710-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T12:00:23.4717800-05:00  [INF] Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T12:00:23.4978960-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:00:25.0319380-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T12:00:25.1801430-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T12:00:25.2532920-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T12:00:29.8988860-05:00  [INF] webpack built d5ef16186ce4d979a8ac in 5161ms (08a05fce)\n2017-04-20T12:00:41.9349910-05:00  [INF] Received SIGINT. Waiting for .NET process to exit... (39e2bf0e)\n2017-04-20T12:00:41.9382870-05:00  [DBG] Hosting shutdown (49005419)\n2017-04-20T12:03:38.5101220-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:38.5572210-05:00  [INF] Executed DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T12:03:38.5590790-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:38.5721740-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:38.5734910-05:00  [INF] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname='__EFMigrationsHistory'); (6438bdd5)\n2017-04-20T12:03:38.5735800-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:38.5807060-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:38.5824650-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"MigrationId\", \"ProductVersion\"\nFROM \"__EFMigrationsHistory\"\nORDER BY \"MigrationId\"; (6438bdd5)\n2017-04-20T12:03:38.5831840-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:38.9784220-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.1762800-05:00  [INF] Executed DbCommand (72ms) [Parameters=[@__normalizedEmail_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedEmail\" = @__normalizedEmail_0\nLIMIT 1 (6438bdd5)\n2017-04-20T12:03:39.2326690-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.2856610-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.2914480-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT CASE\n    WHEN EXISTS (\n        SELECT 1\n        FROM \"Contacts\" AS \"c\")\n    THEN TRUE::bool ELSE FALSE::bool\nEND (6438bdd5)\n2017-04-20T12:03:39.2925420-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.3124240-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.3137460-05:00  [INF] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\nSELECT \"c\".\"contactId\", \"c\".\"email\", \"c\".\"name\", \"c\".\"phone\"\nFROM \"Contacts\" AS \"c\" (6438bdd5)\n2017-04-20T12:03:39.3442980-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.4031530-05:00  [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:39.4095790-05:00  [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T12:03:39.4732710-05:00  [INF] Executed DbCommand (4ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?'], CommandType='Text', CommandTimeout='30']\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p0;\nDELETE FROM \"Contacts\"\nWHERE \"contactId\" = @p1;\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p2, @p3, @p4)\nRETURNING \"contactId\";\nINSERT INTO \"Contacts\" (\"email\", \"name\", \"phone\")\nVALUES (@p5, @p6, @p7)\nRETURNING \"contactId\"; (6438bdd5)\n2017-04-20T12:03:39.4988230-05:00  [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:03:40.6756750-05:00  [INF] ts-loader: Using typescript@2.2.2 and /Users/bholt/dev/aspnet-core-react-template/client-react/tsconfig.json (114b565e)\n2017-04-20T12:03:40.7047630-05:00  [DBG] Hosting starting (32b26330)\n2017-04-20T12:03:40.7724530-05:00  [DBG] Hosting started (e6def423)\n2017-04-20T12:03:45.4096500-05:00  [INF] webpack built ad079844fd07da916916 in 4997ms (4aff4f6d)\n2017-04-20T12:03:47.5948830-05:00  [DBG] Connection id \"\"0HL481SQTVFU1\"\" started. (1426b994)\n2017-04-20T12:03:47.9383650-05:00 0HL481SR1D5UL [INF] Request starting HTTP/1.1 GET http://localhost:5000/   (e5be5b71)\n2017-04-20T12:03:48.0400040-05:00 0HL481SR1D5UL [DBG] Connection id \"\"0HL481SQTVFU1\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:48.0498140-05:00 0HL481SR1D5UL [INF] Request finished in 122.973ms 200 text/html; charset=UTF-8 (15c52c40)\n2017-04-20T12:03:48.0553960-05:00 0HL481SR1D5UM [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T12:03:48.1681380-05:00 0HL481SR1D5UM [DBG] Connection id \"\"0HL481SQTVFU1\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:48.1682940-05:00 0HL481SR1D5UM [INF] Request finished in 112.8857ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T12:03:48.3202130-05:00  [DBG] Connection id \"\"0HL481SQTVFU2\"\" started. (1426b994)\n2017-04-20T12:03:48.3205310-05:00 0HL481SR1D5UN [INF] Request starting HTTP/1.1 GET http://localhost:5000/api/contacts   (e5be5b71)\n2017-04-20T12:03:48.3448840-05:00 0HL481SR1D5UN [INF] Handling request: /api/contacts (629acf5c)\n2017-04-20T12:03:48.3568930-05:00 0HL481SR1D5UO [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T12:03:48.3576260-05:00 0HL481SR1D5UN [DBG] The request path \"/api/contacts\" does not match a supported file type (4910e68e)\n2017-04-20T12:03:48.4058830-05:00 0HL481SR1D5UN [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T12:03:48.4486980-05:00  [DBG] Connection id \"\"0HL481SQTVFU3\"\" started. (1426b994)\n2017-04-20T12:03:48.4489960-05:00 0HL481SR1D5UP [INF] Request starting HTTP/1.1 GET http://localhost:5000/.well-known/openid-configuration   (e5be5b71)\n2017-04-20T12:03:48.4505430-05:00 0HL481SR1D5UP [INF] Handling request: /.well-known/openid-configuration (28f0d040)\n2017-04-20T12:03:48.4529540-05:00 0HL481SR1D5UP [DBG] The request path \"/.well-known/openid-configuration\" does not match a supported file type (4910e68e)\n2017-04-20T12:03:48.4534470-05:00 0HL481SR1D5UP [DBG] Authentication was skipped because no bearer token was received. (9de85986)\n2017-04-20T12:03:48.5033370-05:00 0HL481SR1D5UP [INF] The discovery request was successfully extracted from the HTTP request: \"{}\" (8eb39e75)\n2017-04-20T12:03:48.5037540-05:00 0HL481SR1D5UP [INF] The discovery request was successfully validated. (5773bc23)\n2017-04-20T12:03:48.5400880-05:00 0HL481SR1D5UP [INF] The discovery response was successfully returned: \"{\n  \\\"issuer\\\": \\\"http://localhost:5000/\\\",\n  \\\"token_endpoint\\\": \\\"http://localhost:5000/api/auth/login\\\",\n  \\\"jwks_uri\\\": \\\"http://localhost:5000/.well-known/jwks\\\",\n  \\\"grant_types_supported\\\": [\n    \\\"refresh_token\\\",\n    \\\"password\\\"\n  ],\n  \\\"scopes_supported\\\": [\n    \\\"openid\\\",\n    \\\"profile\\\",\n    \\\"email\\\",\n    \\\"phone\\\",\n    \\\"roles\\\",\n    \\\"offline_access\\\"\n  ],\n  \\\"id_token_signing_alg_values_supported\\\": [\n    \\\"RS256\\\"\n  ],\n  \\\"subject_types_supported\\\": [\n    \\\"public\\\"\n  ],\n  \\\"token_endpoint_auth_methods_supported\\\": [\n    \\\"client_secret_basic\\\",\n    \\\"client_secret_post\\\"\n  ]\n}\" (ee57d974)\n2017-04-20T12:03:48.5825080-05:00 0HL481SR1D5UP [INF] Finished handling request. (d2c25297)\n2017-04-20T12:03:48.5844190-05:00 0HL481SR1D5UP [DBG] Connection id \"\"0HL481SQTVFU3\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:48.5845260-05:00 0HL481SR1D5UP [INF] Request finished in 135.5407ms 200 application/json;charset=UTF-8 (15c52c40)\n2017-04-20T12:03:48.6058940-05:00 0HL481SR1D5UQ [INF] Request starting HTTP/1.1 GET http://localhost:5000/.well-known/jwks   (e5be5b71)\n2017-04-20T12:03:48.6072710-05:00 0HL481SR1D5UQ [INF] Handling request: /.well-known/jwks (3092411e)\n2017-04-20T12:03:48.6074590-05:00 0HL481SR1D5UQ [DBG] The request path \"/.well-known/jwks\" does not match a supported file type (4910e68e)\n2017-04-20T12:03:48.6075200-05:00 0HL481SR1D5UQ [DBG] Authentication was skipped because no bearer token was received. (9de85986)\n2017-04-20T12:03:48.6249250-05:00 0HL481SR1D5UQ [INF] The discovery request was successfully extracted from the HTTP request: \"{}\" (8eb39e75)\n2017-04-20T12:03:48.6325910-05:00 0HL481SR1D5UQ [INF] The discovery response was successfully returned: \"{\n  \\\"keys\\\": [\n    {\n      \\\"kid\\\": \\\"YKN8_CMCU_FN-GLM7GYAZWQZXR8VSF63JSHNHSEG\\\",\n      \\\"use\\\": \\\"sig\\\",\n      \\\"kty\\\": \\\"RSA\\\",\n      \\\"alg\\\": \\\"RS256\\\",\n      \\\"e\\\": \\\"AQAB\\\",\n      \\\"n\\\": \\\"yKN8_cmCU_fn-glM7gYaZwQzxR8VSF63JShnHsEGs9yGW8-0RzmsK9lL0wSk1fIs9qQy9jsDL0sonpy8pGcMVFkctE8lLORL_k_0ibh8mFhFhcm4UXistOCxEbMdTXv94PG6KiIzanDYez0wbZ3eHyzRsRDoTee62tdVG3c-j_TJg5Hn1Q5lWqZaunrf5EGYzFz6r2AjHBBwWcq_rbUeaH76ngrrMni7Aclc-Ab4gEwR6F8DMnWTflGJgAvQHGDzOgHmAaaIFcJDNd-H0h3JFG8PhX2wPjw1yZQxNGs3Wjpot5KIb9fmS_YhCrSMDaqdMnGKRbIqUv0GrmL23wlQKw\\\"\n    }\n  ]\n}\" (ee57d974)\n2017-04-20T12:03:48.6327880-05:00 0HL481SR1D5UQ [INF] Finished handling request. (d2c25297)\n2017-04-20T12:03:48.6328560-05:00 0HL481SR1D5UQ [DBG] Connection id \"\"0HL481SQTVFU3\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:48.6329040-05:00 0HL481SR1D5UQ [INF] Request finished in 27.0548ms 200 application/json;charset=UTF-8 (15c52c40)\n2017-04-20T12:03:48.6540530-05:00 0HL481SR1D5UN [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: undefined\" (48071232)\n2017-04-20T12:03:48.9003550-05:00 0HL481SR1D5UN [DBG] Request successfully matched the route with name 'null' and template '\"api/Contacts\"'. (555ac2ba)\n2017-04-20T12:03:48.9291670-05:00 0HL481SR1D5UN [DBG] Action '\"aspnetCoreReactTemplate.Controllers.ContactsController.Post (api)\"' with id '\"455df96b-8ffd-4dea-957a-f523a47b3b25\"' did not match the constraint '\"Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint\"' (bdbe25b0)\n2017-04-20T12:03:48.9549550-05:00 0HL481SR1D5UN [DBG] Executing action \"aspnetCoreReactTemplate.Controllers.ContactsController.Get (api)\" (3f3ef15a)\n2017-04-20T12:03:48.9861310-05:00 0HL481SR1D5UN [INF] Authorization failed for user: null. (a4ab1676)\n2017-04-20T12:03:48.9875910-05:00 0HL481SR1D5UN [INF] Authorization failed for the request at filter '\"Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter\"'. (8b6446cb)\n2017-04-20T12:03:48.9936790-05:00 0HL481SR1D5UN [INF] Executing ChallengeResult with authentication schemes ([]). (f3dca807)\n2017-04-20T12:03:49.0151770-05:00 0HL481SR1D5UN [INF] AuthenticationScheme: \"Bearer\" was challenged. (d45f1f38)\n2017-04-20T12:03:49.0266850-05:00 0HL481SR1D5UN [INF] AuthenticationScheme: \"Bearer\" was challenged. (d45f1f38)\n2017-04-20T12:03:49.0304770-05:00 0HL481SR1D5UN [INF] Executed action \"aspnetCoreReactTemplate.Controllers.ContactsController.Get (api)\" in 71.4524ms (afa2e885)\n2017-04-20T12:03:49.0389200-05:00 0HL481SR1D5UN [INF] Finished handling request. (d2c25297)\n2017-04-20T12:03:49.0415560-05:00 0HL481SR1D5UN [DBG] Connection id \"\"0HL481SQTVFU2\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:49.0417320-05:00 0HL481SR1D5UN [INF] Request finished in 721.201ms 401  (15c52c40)\n2017-04-20T12:03:49.0556630-05:00  [DBG] Connection id \"\"0HL481SQTVFU4\"\" started. (1426b994)\n2017-04-20T12:03:49.0559010-05:00 0HL481SR1D5UR [INF] Request starting HTTP/1.1 GET http://localhost:5000/sign-in/?expired=1   (e5be5b71)\n2017-04-20T12:03:49.0575180-05:00 0HL481SR1D5UR [INF] Handling request: /sign-in/ (6455a65b)\n2017-04-20T12:03:49.0591650-05:00 0HL481SR1D5UR [INF] Rewriting path: /sign-in/ > / (170f1f87)\n2017-04-20T12:03:49.0780580-05:00 0HL481SR1D5UR [INF] Sending file. Request path: '\"/index.html\"'. Physical path: '\"/Users/bholt/dev/aspnet-core-react-template/api/wwwroot/index.html\"' (27b0a520)\n2017-04-20T12:03:49.0940300-05:00 0HL481SR1D5UR [INF] Finished handling request. (d2c25297)\n2017-04-20T12:03:49.0941480-05:00 0HL481SR1D5UR [DBG] Connection id \"\"0HL481SQTVFU4\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:49.0942190-05:00 0HL481SR1D5UR [INF] Request finished in 38.3498ms 200 text/html (15c52c40)\n2017-04-20T12:03:49.0949780-05:00  [DBG] Connection id \"\"0HL481SQTVFU1\"\" received FIN. (acf58720)\n2017-04-20T12:03:49.1001780-05:00 0HL481SR1D5US [INF] Request starting HTTP/1.1 GET http://localhost:5000/main.js   (e5be5b71)\n2017-04-20T12:03:49.1362530-05:00 0HL481SR1D5US [DBG] Connection id \"\"0HL481SQTVFU4\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:49.1363640-05:00 0HL481SR1D5US [INF] Request finished in 36.2062ms 200 application/javascript; charset=UTF-8 (15c52c40)\n2017-04-20T12:03:49.2847120-05:00 0HL481SR1D5UT [INF] Request starting HTTP/1.1 GET http://localhost:5000/__webpack_hmr   (e5be5b71)\n2017-04-20T12:03:50.4215460-05:00  [INF] Connection id \"\"0HL481SQTVFU1\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T12:03:50.4217330-05:00  [INF] Connection id \"\"0HL481SQTVFU1\"\" communication error. (7fa6c29c)\nMicrosoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -32 EPIPE broken pipe\n2017-04-20T12:03:50.4224660-05:00  [DBG] Connection id \"\"0HL481SQTVFU1\"\" disconnecting. (b29b9868)\n2017-04-20T12:03:50.4249090-05:00  [DBG] Connection id \"\"0HL481SQTVFU1\"\" stopped. (056149f8)\n2017-04-20T12:03:55.5028440-05:00 0HL481SR1D5UU [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 41 (e5be5b71)\n2017-04-20T12:03:55.5043420-05:00 0HL481SR1D5UU [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T12:03:55.5047010-05:00 0HL481SR1D5UU [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T12:03:55.5105050-05:00 0HL481SR1D5UU [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T12:03:55.5106420-05:00 0HL481SR1D5UU [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T12:03:55.5108000-05:00 0HL481SR1D5UU [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T12:03:55.5121460-05:00 0HL481SR1D5UU [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T12:03:55.7391590-05:00 0HL481SR1D5UU [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Invalid (ba7f4ac2)\n2017-04-20T12:03:55.7466260-05:00 0HL481SR1D5UU [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T12:03:55.7642750-05:00 0HL481SR1D5UU [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T12:03:55.7679960-05:00 0HL481SR1D5UU [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T12:03:55.7682780-05:00 0HL481SR1D5UU [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T12:03:55.7937650-05:00 0HL481SR1D5UU [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 281.5072ms (afa2e885)\n2017-04-20T12:03:55.7939070-05:00 0HL481SR1D5UU [INF] Finished handling request. (d2c25297)\n2017-04-20T12:03:55.7970820-05:00 0HL481SR1D5UU [DBG] Connection id \"\"0HL481SQTVFU2\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:55.7971850-05:00 0HL481SR1D5UU [INF] Request finished in 294.7455ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T12:03:58.5619700-05:00 0HL481SR1D5UV [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 48 (e5be5b71)\n2017-04-20T12:03:58.5634780-05:00 0HL481SR1D5UV [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T12:03:58.5635650-05:00 0HL481SR1D5UV [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T12:03:58.5638350-05:00 0HL481SR1D5UV [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T12:03:58.5639610-05:00 0HL481SR1D5UV [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T12:03:58.5640900-05:00 0HL481SR1D5UV [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T12:03:58.5654830-05:00 0HL481SR1D5UV [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T12:03:58.5676940-05:00 0HL481SR1D5UV [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T12:03:58.5927620-05:00 0HL481SR1D5UV [WRN] User \"105b322c-970d-47d3-82bd-adb33459da80\" password validation failed: \"PasswordRequiresDigit;PasswordRequiresUpper\". (2f223212)\n2017-04-20T12:03:58.5940030-05:00 0HL481SR1D5UV [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.BadRequestObjectResult\". (f72615e0)\n2017-04-20T12:03:58.5942910-05:00 0HL481SR1D5UV [DBG] No information found on request to perform content negotiation. (6aec0ec5)\n2017-04-20T12:03:58.5944090-05:00 0HL481SR1D5UV [DBG] Selected output formatter '\"Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter\"' and content type '\"application/json\"' to write the response. (fcc32779)\n2017-04-20T12:03:58.5946160-05:00 0HL481SR1D5UV [INF] Executing ObjectResult, writing value \"Microsoft.AspNetCore.Mvc.ControllerContext\". (4e968210)\n2017-04-20T12:03:58.5981060-05:00 0HL481SR1D5UV [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 32.5596ms (afa2e885)\n2017-04-20T12:03:58.5982140-05:00 0HL481SR1D5UV [INF] Finished handling request. (d2c25297)\n2017-04-20T12:03:58.5983680-05:00 0HL481SR1D5UV [DBG] Connection id \"\"0HL481SQTVFU2\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:03:58.5984560-05:00 0HL481SR1D5UV [INF] Request finished in 36.5465ms 400 application/json; charset=utf-8 (15c52c40)\n2017-04-20T12:04:02.4319320-05:00 0HL481SR1D5V0 [INF] Request starting HTTP/1.1 POST http://localhost:5000/api/auth/register application/x-www-form-urlencoded 42 (e5be5b71)\n2017-04-20T12:04:02.4333870-05:00 0HL481SR1D5V0 [INF] Handling request: /api/auth/register (2c1017b8)\n2017-04-20T12:04:02.4335050-05:00 0HL481SR1D5V0 [DBG] \"POST\" requests are not supported (1c759b4c)\n2017-04-20T12:04:02.4337520-05:00 0HL481SR1D5V0 [INF] \"Bearer\" was not authenticated. Failure message: \"Authentication failed because the access token was invalid.\" (48071232)\n2017-04-20T12:04:02.4338740-05:00 0HL481SR1D5V0 [INF] \"Bearer\" was not authenticated. Failure message: \"No SecurityTokenValidator available for token: null\" (48071232)\n2017-04-20T12:04:02.4340060-05:00 0HL481SR1D5V0 [DBG] Request successfully matched the route with name 'null' and template '\"api/auth/register\"'. (555ac2ba)\n2017-04-20T12:04:02.4341090-05:00 0HL481SR1D5V0 [DBG] Executing action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" (3f3ef15a)\n2017-04-20T12:04:02.4344650-05:00 0HL481SR1D5V0 [INF] Executing action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" with arguments ([\"aspnetCoreReactTemplate.ViewModels.NewUser\"]) - ModelState is Valid (ba7f4ac2)\n2017-04-20T12:04:02.5105070-05:00 0HL481SR1D5V0 [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:02.5130100-05:00 0HL481SR1D5V0 [INF] Executed DbCommand (1ms) [Parameters=[@__normalizedUserName_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"u\".\"Id\", \"u\".\"AccessFailedCount\", \"u\".\"ConcurrencyStamp\", \"u\".\"Email\", \"u\".\"EmailConfirmed\", \"u\".\"GivenName\", \"u\".\"LockoutEnabled\", \"u\".\"LockoutEnd\", \"u\".\"NormalizedEmail\", \"u\".\"NormalizedUserName\", \"u\".\"PasswordHash\", \"u\".\"PhoneNumber\", \"u\".\"PhoneNumberConfirmed\", \"u\".\"SecurityStamp\", \"u\".\"TwoFactorEnabled\", \"u\".\"UserName\"\nFROM \"AspNetUsers\" AS \"u\"\nWHERE \"u\".\"NormalizedUserName\" = @__normalizedUserName_0\nLIMIT 1 (6438bdd5)\n2017-04-20T12:04:02.5135100-05:00 0HL481SR1D5V0 [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:02.5546810-05:00 0HL481SR1D5V0 [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:02.5548090-05:00 0HL481SR1D5V0 [DBG] Beginning transaction with isolation level 'Unspecified'. (3b5ca34b)\n2017-04-20T12:04:02.5626250-05:00 0HL481SR1D5V0 [INF] Executed DbCommand (1ms) [Parameters=[@p0='?', @p1='?', @p2='?', @p3='?', @p4='?', @p5='?', @p6='?', @p7='?', @p8='?', @p9='?', @p10='?', @p11='?', @p12='?', @p13='?', @p14='?', @p15='?'], CommandType='Text', CommandTimeout='30']\nINSERT INTO \"AspNetUsers\" (\"Id\", \"AccessFailedCount\", \"ConcurrencyStamp\", \"Email\", \"EmailConfirmed\", \"GivenName\", \"LockoutEnabled\", \"LockoutEnd\", \"NormalizedEmail\", \"NormalizedUserName\", \"PasswordHash\", \"PhoneNumber\", \"PhoneNumberConfirmed\", \"SecurityStamp\", \"TwoFactorEnabled\", \"UserName\")\nVALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15); (6438bdd5)\n2017-04-20T12:04:02.5720760-05:00 0HL481SR1D5V0 [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:02.5739830-05:00 0HL481SR1D5V0 [INF] New user registered (id: 5314c967-f171-4f79-88f5-e75489da4d37) (ffbe08cf)\n2017-04-20T12:04:02.5947020-05:00 0HL481SR1D5V0 [DBG] Reading data from file '\"/Users/bholt/.aspnet/DataProtection-Keys/key-2115e1cc-6a7a-4f94-a5af-79045dd7268a.xml\"'. (5ce001c4)\n2017-04-20T12:04:02.5994620-05:00 0HL481SR1D5V0 [DBG] Reading data from file '\"/Users/bholt/.aspnet/DataProtection-Keys/key-65a1dbdc-ff60-43d0-ad97-4b44b66d8604.xml\"'. (5ce001c4)\n2017-04-20T12:04:02.6046770-05:00 0HL481SR1D5V0 [DBG] Found key {2115e1cc-6a7a-4f94-a5af-79045dd7268a}. (f843275d)\n2017-04-20T12:04:02.6110710-05:00 0HL481SR1D5V0 [DBG] Found key {65a1dbdc-ff60-43d0-ad97-4b44b66d8604}. (f843275d)\n2017-04-20T12:04:02.6232370-05:00 0HL481SR1D5V0 [DBG] Considering key {2115e1cc-6a7a-4f94-a5af-79045dd7268a} with expiration date 2017-07-15 20:23:44Z as default key. (ca2e3b22)\n2017-04-20T12:04:02.6380090-05:00 0HL481SR1D5V0 [DBG] Using managed symmetric algorithm '\"System.Security.Cryptography.Aes\"'. (0f299fe5)\n2017-04-20T12:04:02.6389190-05:00 0HL481SR1D5V0 [DBG] Using managed keyed hash algorithm '\"System.Security.Cryptography.HMACSHA256\"'. (47d8f6fe)\n2017-04-20T12:04:02.6506800-05:00 0HL481SR1D5V0 [DBG] Using key {2115e1cc-6a7a-4f94-a5af-79045dd7268a} as the default key. (4cf2d764)\n2017-04-20T12:04:02.9026460-05:00 0HL481SR1D5V0 [INF] Sent email confirmation email (id: 5314c967-f171-4f79-88f5-e75489da4d37) (c5bc96c6)\n2017-04-20T12:04:03.0144530-05:00 0HL481SR1D5V0 [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:03.0172700-05:00 0HL481SR1D5V0 [INF] Executed DbCommand (1ms) [Parameters=[@__userId_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"role\".\"Name\"\nFROM \"AspNetUserRoles\" AS \"userRole\"\nINNER JOIN \"AspNetRoles\" AS \"role\" ON \"userRole\".\"RoleId\" = \"role\".\"Id\"\nWHERE \"userRole\".\"UserId\" = @__userId_0 (6438bdd5)\n2017-04-20T12:04:03.0186440-05:00 0HL481SR1D5V0 [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:03.0457040-05:00 0HL481SR1D5V0 [DBG] Opening connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:03.0474650-05:00 0HL481SR1D5V0 [INF] Executed DbCommand (1ms) [Parameters=[@__user_Id_0='?'], CommandType='Text', CommandTimeout='30']\nSELECT \"uc\".\"Id\", \"uc\".\"ClaimType\", \"uc\".\"ClaimValue\", \"uc\".\"UserId\"\nFROM \"AspNetUserClaims\" AS \"uc\"\nWHERE \"uc\".\"UserId\" = @__user_Id_0 (6438bdd5)\n2017-04-20T12:04:03.0476680-05:00 0HL481SR1D5V0 [DBG] Closing connection to database 'dotnetcore' on server 'tcp://localhost:5433'. (3b5ca34b)\n2017-04-20T12:04:03.0565200-05:00 0HL481SR1D5V0 [INF] User logged in (id: 5314c967-f171-4f79-88f5-e75489da4d37) (d87185fb)\n2017-04-20T12:04:03.0567800-05:00 0HL481SR1D5V0 [DBG] Executed action method \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\", returned result \"Microsoft.AspNetCore.Mvc.OkResult\". (f72615e0)\n2017-04-20T12:04:03.0595620-05:00 0HL481SR1D5V0 [INF] Executing HttpStatusCodeResult, setting HTTP status code 200 (e28ccfae)\n2017-04-20T12:04:03.0604090-05:00 0HL481SR1D5V0 [INF] Executed action \"aspnetCoreReactTemplate.aspnetCoreReactTemplate.Controllers.AuthController.Register (api)\" in 626.3141ms (afa2e885)\n2017-04-20T12:04:03.0605200-05:00 0HL481SR1D5V0 [INF] Finished handling request. (d2c25297)\n2017-04-20T12:04:03.0616630-05:00 0HL481SR1D5V0 [DBG] Connection id \"\"0HL481SQTVFU2\"\" completed keep alive response. (9784cde9)\n2017-04-20T12:04:03.0617160-05:00 0HL481SR1D5V0 [INF] Request finished in 629.8908ms 200  (15c52c40)\n2017-04-20T12:05:49.8207400-05:00  [DBG] Connection id \"\"0HL481SQTVFU3\"\" disconnecting. (b29b9868)\n2017-04-20T12:05:49.8211020-05:00  [DBG] Connection id \"\"0HL481SQTVFU3\"\" sending FIN. (ffb251f5)\n2017-04-20T12:05:49.8262480-05:00  [DBG] Connection id \"\"0HL481SQTVFU3\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T12:05:49.8263780-05:00  [DBG] Connection id \"\"0HL481SQTVFU3\"\" stopped. (056149f8)\n2017-04-20T12:06:03.8291950-05:00  [DBG] Connection id \"\"0HL481SQTVFU2\"\" disconnecting. (b29b9868)\n2017-04-20T12:06:03.8293130-05:00  [DBG] Connection id \"\"0HL481SQTVFU2\"\" sending FIN. (ffb251f5)\n2017-04-20T12:06:03.8294370-05:00  [DBG] Connection id \"\"0HL481SQTVFU2\"\" sent FIN with status \"0\". (69d90ca7)\n2017-04-20T12:06:03.8295040-05:00  [DBG] Connection id \"\"0HL481SQTVFU2\"\" stopped. (056149f8)\n"
  },
  {
    "path": "api.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"api\", \"api\\api.csproj\", \"{62842846-868D-4B6E-A191-C37121587533}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"api.test\", \"api.test\\api.test.csproj\", \"{002B4B4F-3A5D-4342-98AB-C50F7147F863}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{62842846-868D-4B6E-A191-C37121587533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{62842846-868D-4B6E-A191-C37121587533}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{62842846-868D-4B6E-A191-C37121587533}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{62842846-868D-4B6E-A191-C37121587533}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{002B4B4F-3A5D-4342-98AB-C50F7147F863}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{002B4B4F-3A5D-4342-98AB-C50F7147F863}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{002B4B4F-3A5D-4342-98AB-C50F7147F863}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{002B4B4F-3A5D-4342-98AB-C50F7147F863}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "api.test/Controller/Tests.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing app = aspnetCoreReactTemplate;\n\nnamespace Tests.Controller\n{\n    public class Tests\n    {\n        // [Fact]\n        // public void Index_ReturnsAViewResult_WithAListOfBrainstormSessions()\n        // {\n        //     var controller = new app.Controllers.ContactsController(null);\n        //     var result = (IEnumerable<app.Models.Contact>)controller.Get();\n\n        //     Assert.NotEqual(result.Count(), 0);\n        // }\n    }\n}\n"
  },
  {
    "path": "api.test/ControllerTests.cs",
    "content": "﻿using Xunit;\n\nnamespace Tests\n{\n    public class ControllerTests\n    {\n        [Fact]\n        public void Test1()\n        {\n            var contact = new aspnetCoreReactTemplate.Models.Contact();\n            Assert.True(string.IsNullOrEmpty(contact.Email));\n        }\n    }\n}\n"
  },
  {
    "path": "api.test/NuGet.Config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <add key=\"NuGet\" value=\"https://api.nuget.org/v3/index.json\" />\n    <add key=\"aspnet-contrib\" value=\"https://www.myget.org/F/aspnet-contrib/api/v3/index.json\" />\n  </packageSources>\n</configuration>"
  },
  {
    "path": "api.test/Unit/Tests.cs",
    "content": "﻿using Xunit;\nusing app = aspnetCoreReactTemplate;\n\nnamespace Tests.Unit\n{\n    public class Tests\n    {\n        [Fact]\n        public void TestNewContactProperties()\n        {\n            var contact = new app.Models.Contact();\n\n            Assert.True(string.IsNullOrEmpty(contact.LastName));\n            Assert.True(string.IsNullOrEmpty(contact.FirstName));\n            Assert.True(string.IsNullOrEmpty(contact.Email));\n            Assert.True(string.IsNullOrEmpty(contact.Phone));\n        }\n    }\n}\n"
  },
  {
    "path": "api.test/api.test.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"../api/api.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"xunit\" Version=\"2.4.1\" />\n    <PackageReference Include=\"Npgsql.EntityFrameworkCore.PostgreSQL\" Version=\"5.0.7\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.3\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "client-react/boot.tsx",
    "content": "import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport Routes from './components/Routes';\n\n// Polyfills\nimport 'whatwg-fetch';\nimport './polyfills/object-assign';\nimport './polyfills/array-find';\n\n// Styles\nimport '../node_modules/bootstrap/dist/css/bootstrap.css';\nimport './styles/global.css';\n\nReactDOM.render(\n    <Router>\n        <Routes />\n    </Router>,\n    document.getElementById(\"app\")\n);\n\n// Allow Hot Module Reloading\ndeclare var module: any;\nif (module.hot) {\n    module.hot.accept();\n}\n"
  },
  {
    "path": "client-react/components/Auth.tsx",
    "content": "import * as React from \"react\";\nimport { Link, Redirect, RouteComponentProps } from 'react-router-dom';\nimport { RoutePaths } from './Routes';\nimport AuthService from '../services/Auth';\nlet authStyle = require('../styles/auth.styl');\nlet authService = new AuthService();\n\nexport class SignIn extends React.Component<RouteComponentProps<any>, any> {\n    refs: {\n        username: HTMLInputElement;\n        password: HTMLInputElement;\n    };\n\n    state = {\n        initialLoad: true,\n        error: null as string\n    };\n\n    handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n        event.preventDefault();\n\n        this.setState({ errors: null, initialLoad: false });\n        authService.signIn(this.refs.username.value, this.refs.password.value).then(response => {\n            if (!response.is_error) {\n                this.props.history.push(RoutePaths.Contacts);\n            } else {\n                this.setState({ error: response.error_content.error_description });\n            }\n        });\n    }\n\n    render() {\n        const search = this.props.location.search;\n        const params = new URLSearchParams(search);\n\n        let initialLoadContent = null;\n        if (this.state.initialLoad) {\n            if (params.get('confirmed')) {\n                initialLoadContent = <div className=\"alert alert-success\" role=\"alert\">\n                    Your email address has been successfully confirmed.\n                    </div>\n            }\n\n            if (params.get('expired')) {\n                initialLoadContent = <div className=\"alert alert-info\" role=\"alert\">\n                    <strong>Sesion Expired</strong> You need to sign in again.\n                    </div>\n            }\n\n            if (this.props.history.location.state && this.props.history.location.state.signedOut) {\n                initialLoadContent = <div className=\"alert alert-info\" role=\"alert\">\n                    <strong>Signed Out</strong>\n                </div>\n            }\n        }\n        return <div className={authStyle.auth}>\n            <form className={authStyle.formAuth} onSubmit={(e) => this.handleSubmit(e)}>\n                <h2 className={authStyle.formAuthHeading}>Please sign in</h2>\n                {initialLoadContent}\n                {this.state.error &&\n                    <div className=\"alert alert-danger\" role=\"alert\">\n                        {this.state.error}\n                    </div>\n                }\n                <label htmlFor=\"inputEmail\" className=\"form-control-label sr-only\">Email address</label>\n                <input type=\"email\" id=\"inputEmail\" ref=\"username\" defaultValue=\"user@test.com\" className=\"form-control form-control-danger\" placeholder=\"Email address\"/>\n                <label htmlFor=\"inputPassword\" className=\"form-control-label sr-only\">Password</label>\n                <input type=\"password\" id=\"inputPassword\" ref=\"password\" defaultValue=\"P2ssw0rd!\" className=\"form-control\" placeholder=\"Password\" />\n                <button className=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Sign in</button>\n            </form>\n            <div className={authStyle.authEtc}>\n                <Link to=\"/register\">Register</Link>\n            </div>\n        </div>;\n    }\n}\n\nexport class Register extends React.Component<any, any> {\n    refs: {\n        email: HTMLInputElement;\n        password: HTMLInputElement;\n    };\n\n    state = {\n        registerComplete: false,\n        errors: {} as { [key: string]: string }\n    };\n\n    handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n        event.preventDefault();\n\n        this.setState({ errors: {} });\n        authService.register(this.refs.email.value, this.refs.password.value).then(response => {\n            if (!response.is_error) {\n                this.setState({ registerComplete: true })\n            } else {\n                this.setState({ errors: response.error_content });\n            }\n        });\n    }\n\n    _formGroupClass(field: string) {\n        var className = \"form-group \";\n        if (field) {\n            className += \" has-danger\"\n        }\n        return className;\n    }\n\n    render() {\n        if (this.state.registerComplete) {\n            return <RegisterComplete email={this.refs.email.value} />\n        } else {\n            return <div className={authStyle.auth}>\n                <form className={authStyle.formAuth} onSubmit={(e) => this.handleSubmit(e)}>\n                    <h2 className={authStyle.formAuthHeading}>Please register for access</h2>\n                    {this.state.errors.general &&\n                        <div className=\"alert alert-danger\" role=\"alert\">\n                            {this.state.errors.general}\n                        </div>\n                    }\n                    <div className={this._formGroupClass(this.state.errors.username)}>\n                        <label htmlFor=\"inputEmail\">Email address</label>\n                        <input type=\"email\" id=\"inputEmail\" ref=\"email\" className=\"form-control\" placeholder=\"Email address\" />\n                        <div className=\"form-control-feedback\">{this.state.errors.username}</div>\n                    </div>\n                    <div className={this._formGroupClass(this.state.errors.password)}>\n                        <label htmlFor=\"inputPassword\">Password</label>\n                        <input type=\"password\" id=\"inputPassword\" ref=\"password\" className=\"form-control\" placeholder=\"Password\" />\n                        <div className=\"form-control-feedback\">{this.state.errors.password}</div>\n                    </div>\n                    <button className=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Sign up</button>\n                </form>\n            </div>;\n        };\n    }\n}\n\ninterface RegisterCompleteProps {\n    email: string;\n}\n\nexport class RegisterComplete extends React.Component<RegisterCompleteProps, any> {\n    render() {\n        return <div className={authStyle.auth}>\n            <div className=\"alert alert-success\" role=\"alert\">\n                <strong>Success!</strong>  Your account has been created.\n            </div>\n            <p>\n                A confirmation email has been sent to {this.props.email}. You will need to follow the provided link to confirm your email address before signing in.\n            </p>\n            <Link className=\"btn btn-lg btn-primary btn-block\" role=\"button\" to=\"/\">Sign in</Link>\n        </div>;\n    }\n}\n"
  },
  {
    "path": "client-react/components/ContactForm.tsx",
    "content": "import 'object-assign';\nimport * as React from 'react';\nimport { Link, Redirect, RouteComponentProps } from 'react-router-dom';\nimport ContactService, { IContact } from '../services/Contacts'\nimport { RoutePaths } from './Routes';\n\nlet contactService = new ContactService();\n\nexport class ContactForm extends React.Component<RouteComponentProps<any>, any> {\n    state = {\n        contact: null as IContact,\n        errors: {} as { [key: string]: string }\n    }\n\n    componentDidMount() {\n        if (this.props.match.path == RoutePaths.ContactEdit) {\n            contactService.fetch(this.props.match.params.id).then((response) => {\n                this.setState({ contact: response.content });\n            });\n        } else {\n            let newContact: IContact = {\n                lastName: '', firstName: '', email: '', phone: ''\n            };\n            this.setState({ contact: newContact });\n        }\n    }\n\n    handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n        event.preventDefault();\n        this.saveContact(this.state.contact);\n    }\n\n    handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n        const target = event.target;\n        const value = target.type === 'checkbox' ? target.checked : target.value;\n        const name = target.name;\n        let contactUpdates = {\n            [name]: value\n        };\n\n        this.setState({\n            contact: Object.assign(this.state.contact, contactUpdates)\n        });\n    }\n\n    saveContact(contact: IContact) {\n        this.setState({ errors: {} as { [key: string]: string } });\n        contactService.save(contact).then((response) => {\n            if (!response.is_error) {\n                this.props.history.push(RoutePaths.Contacts);\n            } else {\n                this.setState({ errors: response.error_content });\n            }\n        });\n    }\n\n    _formGroupClass(field: string) {\n        var className = \"form-group \";\n        if (field) {\n            className += \" has-danger\"\n        }\n        return className;\n    }\n\n    render() {\n        if (!this.state.contact) {\n            return <div>Loading...</div>;\n        }\n        else {\n            return <fieldset className=\"form-group\">\n                <legend>{this.state.contact.id ? \"Edit Contact\" : \"New Contact\" }</legend>\n                <form onSubmit={(e) => this.handleSubmit(e)}>\n                    <div className={this._formGroupClass(this.state.errors.lastName)}>\n                        <label htmlFor=\"inputLastName\" className=\"form-control-label\">Last Name</label>\n                        <input type=\"text\" autoFocus name=\"lastName\" id=\"inputLastName\" value={this.state.contact.lastName} onChange={(e) => this.handleInputChange(e)} className=\"form-control form-control-danger\" required />\n                        <div className=\"form-control-feedback\">{this.state.errors.lastName}</div>\n                    </div>\n                    <div className={this._formGroupClass(this.state.errors.firstName)}>\n                        <label htmlFor=\"inputFirstName\" className=\"form-control-label\">First Name</label>\n                        <input type=\"text\" name=\"firstName\" id=\"inputFirstName\" value={this.state.contact.firstName} onChange={(e) => this.handleInputChange(e)} className=\"form-control form-control-danger\" required />\n                        <div className=\"form-control-feedback\">{this.state.errors.firstName}</div>\n                    </div>\n                    <div className={this._formGroupClass(this.state.errors.email)}>\n                        <label htmlFor=\"inputEmail\" className=\"form-control-label\">Email</label>\n                        <input type=\"email\" name=\"email\" id=\"inputEmail\" value={this.state.contact.email} onChange={(e) => this.handleInputChange(e)} className=\"form-control form-control-danger\" />\n                        <div className=\"form-control-feedback\">{this.state.errors.email}</div>\n                    </div>\n                    <div className={this._formGroupClass(this.state.errors.phone)}>\n                        <label htmlFor=\"inputPhone\" className=\"form-control-label\">Phone</label>\n                        <input type=\"tel\" name=\"phone\" id=\"inputPhone\" value={this.state.contact.phone} onChange={(e) => this.handleInputChange(e)} className=\"form-control form-control-danger\" />\n                        <div className=\"form-control-feedback\">{this.state.errors.phone}</div>\n                    </div>\n                    <button className=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Save</button>\n                    <Link className=\"btn btn-lg btn-light btn-block\" to=\"/contacts\">Cancel</Link>\n                </form>\n            </fieldset>\n        }\n    }\n}\n"
  },
  {
    "path": "client-react/components/Contacts.tsx",
    "content": "import * as React from \"react\";\nimport { Link, Redirect } from 'react-router-dom';\nimport { RoutePaths } from './Routes';\nimport { ContactForm } from './ContactForm';\nimport ContactService, { IContact } from '../services/Contacts';\nimport { RouteComponentProps } from \"react-router\";\n\nlet contactService = new ContactService();\n\nexport class Contacts extends React.Component<RouteComponentProps<any>, any> {\n    refs: {\n        query: HTMLInputElement;\n    };\n\n    state = {\n        contacts: [] as Array<IContact>,\n        editContact: null as Object,\n        isAddMode: false as boolean,\n        searchQuery: '' as string\n    };\n\n    componentDidMount() {\n        this.showAll();\n    }\n\n    showAll() {\n        contactService.fetchAll().then((response) => {\n            this.setState({ searchQuery: '', contacts: response.content });\n        });\n    }\n\n    handleSearchQueryChange(event: React.ChangeEvent<HTMLInputElement>) {\n        this.setState({ searchQuery: event.target.value });\n    }\n\n    handleSeachSubmit(event: React.FormEvent<HTMLFormElement>) {\n        event.preventDefault();\n\n        if(!this.state.searchQuery){\n            this.showAll();\n            return;\n        }\n\n        contactService.search(this.state.searchQuery).then((response) => {\n            this.setState({ contacts: response.content });\n        });\n    }\n\n    delete(contact: IContact) {\n        contactService.delete(contact.id).then((response) => {\n            let updatedContacts = this.state.contacts;\n            updatedContacts.splice(updatedContacts.indexOf(contact), 1);\n            this.setState({ contacts: updatedContacts });\n        });\n    }\n\n    render() {\n        return <div>\n            <h1>Contacts</h1>\n            <form className=\"form-inline my-2 my-lg-0\" onSubmit={(e) => this.handleSeachSubmit(e)}>\n                <input className=\"form-control form-control form-control-sm\" type=\"text\" value={this.state.searchQuery} onChange={(e) => this.handleSearchQueryChange(e)} placeholder=\"Search!\" />\n                <button className=\"btn btn-outline-success btn-sm\" type=\"submit\">Search</button>&nbsp;\n            </form>\n            {this.state.searchQuery && this.state.contacts && this.state.contacts.length == 0 &&\n                <p>No results!</p>\n            }\n            {this.state.contacts && this.state.contacts.length > 0 &&\n                <table className=\"table\">\n                    <thead>\n                        <tr>\n                            <th>Last Name</th>\n                            <th>First Name</th>\n                            <th>Email</th>\n                            <th>Phone</th>\n                            <th></th>\n                        </tr>\n                    </thead>\n                    <tbody>\n                        {this.state.contacts.map((contact, index) =>\n                            <tr key={contact.id}>\n                                <td>{contact.lastName}</td>\n                                <td>{contact.firstName}</td>\n                                <td>{contact.email}</td>\n                                <td>{contact.phone}</td>\n                                <td><Link to={RoutePaths.ContactEdit.replace(\":id\", contact.id.toString())}>edit</Link>\n                                    <button type=\"button\" className=\"btn btn-link\" onClick={(e) => this.delete(contact)}>delete</button></td>\n                            </tr>\n                        )}\n                    </tbody>\n                </table>\n            }\n            {this.state.searchQuery &&\n                <button type=\"button\" className=\"btn btn-primary\" onClick={(e) => this.showAll()}>clear search</button>\n            }\n            <Link className=\"btn btn-success\" to={RoutePaths.ContactNew}>add</Link>\n\n        </div>\n    };\n}\n"
  },
  {
    "path": "client-react/components/Error.tsx",
    "content": "import * as React from \"react\";\nimport { Link, RouteComponentProps } from 'react-router-dom';\n\nexport class ErrorPage extends React.Component<RouteComponentProps<any>, any> {\n\n    getErrorCode() {\n        return this.props.match.params.code;\n    }\n\n    getErrorMessage() {\n        let message = null;\n        switch (this.props.match.params.code) {\n            case 'email-confirm':\n                message = 'The email confirmation link you used is invalid or expired.'\n                break;\n            default:\n                message = 'An unknown error has occured.'\n        }\n\n        return message;\n    }\n\n    render() {\n        let code = this.getErrorCode();\n        return <div>\n            <h1>Error</h1>\n            <p>{this.getErrorMessage()}</p>\n            {code &&\n                <p>Code: {code}</p>\n            }\n\n        </div>;\n    }\n}\n"
  },
  {
    "path": "client-react/components/Header.tsx",
    "content": "import * as React from \"react\";\nimport { Link, Redirect } from 'react-router-dom';\nimport { RouteComponentProps } from \"react-router\";\nimport { RoutePaths } from './Routes';\nimport AuthService from '../services/Auth';\nimport AuthStore from '../stores/Auth';\n\nlet authService = new AuthService();\n\nexport class Header extends React.Component<RouteComponentProps<any>, any> {\n    signOut() {\n        authService.signOut();\n        this.props.history.push(RoutePaths.SignIn, { signedOut: true });\n    }\n\n    render() {\n        const search = this.props.location.search;\n        const params = new URLSearchParams(search);\n\n        return <nav className=\"navbar navbar-expand-lg navbar-dark bg-dark fixed-top\">\n            <button className=\"navbar-toggler navbar-toggler-right\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarsExampleDefault\"\n                aria-controls=\"navbarsExampleDefault\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span className=\"navbar-toggler-icon\"></span>\n            </button>\n            <a className=\"navbar-brand\" href=\"#\">Template</a>\n            <div className=\"collapse navbar-collapse\" id=\"navbarsExampleDefault\">\n                <ul className=\"navbar-nav mr-auto\">\n                    <li className=\"nav-item active\">\n                        <a className=\"nav-link\" href=\"#\">Landing <span className=\"sr-only\">(current)</span></a>\n                    </li>\n                    <li className=\"nav-item\">\n                        <a className=\"nav-link\" href=\"#\">Link</a>\n                    </li>\n                    <li className=\"nav-item\">\n                        <a className=\"nav-link disabled\" href=\"#\">Disabled</a>\n                    </li>\n                    <li className=\"nav-item dropdown\">\n                        <a className=\"nav-link dropdown-toggle\" href=\"http://example.com\" id=\"dropdown01\" data-toggle=\"dropdown\" aria-haspopup=\"true\"\n                            aria-expanded=\"false\">Dropdown</a>\n                        <div className=\"dropdown-menu\" aria-labelledby=\"dropdown01\">\n                            <a className=\"dropdown-item\" href=\"#\">Action</a>\n                            <a className=\"dropdown-item\" href=\"#\">Another action</a>\n                            <a className=\"dropdown-item\" href=\"#\">Something else here</a>\n                        </div>\n                    </li>\n                </ul>\n                <button className=\"btn btn-outline-warning my-2 my-sm-0\" type=\"button\" onClick={() => this.signOut()}>Sign out</button>\n            </div>\n        </nav>;\n    }\n}\n"
  },
  {
    "path": "client-react/components/Routes.tsx",
    "content": "import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { Route, Redirect, Switch } from 'react-router-dom';\nimport { SignIn, Register } from './Auth';\nimport AuthService from '../services/Auth';\nimport { ErrorPage } from './Error';\nimport { Contacts } from './Contacts';\nimport { ContactForm } from './ContactForm';\nimport { Header } from './Header';\n\nexport class RoutePaths {\n    public static Contacts: string = \"/contacts\";\n    public static ContactEdit: string = \"/contacts/edit/:id\";\n    public static ContactNew: string = \"/contacts/new\";\n    public static SignIn: string = \"/\";\n    public static Register: string = \"/register/\";\n}\n\nexport default class Routes extends React.Component<any, any> {\n    render() {\n        return <Switch>\n            <Route exact path={RoutePaths.SignIn} component={SignIn} />\n            <Route path={RoutePaths.Register} component={Register} />\n            <DefaultLayout exact path={RoutePaths.Contacts} component={Contacts} />\n            <DefaultLayout path={RoutePaths.ContactNew} component={ContactForm} />\n            <DefaultLayout path={RoutePaths.ContactEdit} component={ContactForm} />\n            <Route path='/error/:code?' component={ErrorPage} />\n        </Switch>\n    }\n}\n\nconst DefaultLayout = ({ component: Component, ...rest }: { component: any, path: string, exact?: boolean }) => (\n    <Route {...rest} render={props => (\n        AuthService.isSignedIn() ? (\n            <div>\n                <Header {...props} />\n                <div className=\"container\">\n                    <Component {...props} />\n                </div>\n            </div>\n        ) : (\n                <Redirect to={{\n                    pathname: RoutePaths.SignIn,\n                    state: { from: props.location }\n                }} />\n            )\n    )} />\n);\n"
  },
  {
    "path": "client-react/index.ejs",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n  <title>aspnet-core-react-template</title>\n</head>\n\n<body>\n  <div class=\"container\" id='app'></div>\n\n  <%if (htmlWebpackPlugin.options.useCdn) { %>\n    <script src=\"https://unpkg.com/react@15.3.1/dist/react.min.js\"></script>\n    <script src=\"https://unpkg.com/react-dom@15.3.1/dist/react-dom.min.js\"></script>\n    <% } %>\n\n      <!-- Scripts will be injected here -->\n</body>\n\n</html>\n"
  },
  {
    "path": "client-react/polyfills/array-find.d.ts",
    "content": "interface Array<T> {\n    find(predicate: (search: T) => boolean): T;\n}\n"
  },
  {
    "path": "client-react/polyfills/array-find.ts",
    "content": "/// <reference path=\"./array-find.d.ts\" />\n\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\nif (!Array.prototype.find) {\n    Object.defineProperty(Array.prototype, 'find', {\n        value: function (predicate:any) {\n            // 1. Let O be ? ToObject(this value).\n            if (this == null) {\n                throw new TypeError('\"this\" is null or not defined');\n            }\n\n            var o = Object(this);\n\n            // 2. Let len be ? ToLength(? Get(O, \"length\")).\n            var len = o.length >>> 0;\n\n            // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n            if (typeof predicate !== 'function') {\n                throw new TypeError('predicate must be a function');\n            }\n\n            // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n            var thisArg = arguments[1];\n\n            // 5. Let k be 0.\n            var k = 0;\n\n            // 6. Repeat, while k < len\n            while (k < len) {\n                // a. Let Pk be ! ToString(k).\n                // b. Let kValue be ? Get(O, Pk).\n                // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n                // d. If testResult is true, return kValue.\n                var kValue = o[k];\n                if (predicate.call(thisArg, kValue, k, o)) {\n                    return kValue;\n                }\n                // e. Increase k by 1.\n                k++;\n            }\n\n            // 7. Return undefined.\n            return undefined;\n        }\n    });\n}\n"
  },
  {
    "path": "client-react/polyfills/object-assign.d.ts",
    "content": "declare interface ObjectConstructor {\n    assign(...objects: Object[]): Object;\n}\n"
  },
  {
    "path": "client-react/polyfills/object-assign.ts",
    "content": "/// <reference path=\"./object-assign.d.ts\" />\n\nif (typeof Object.assign != 'function') {\n    Object.assign = function (target: any, varArgs: any) { // .length of function is 2\n        'use strict';\n        if (target == null) { // TypeError if undefined or null\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var to = Object(target);\n\n        for (var index = 1; index < arguments.length; index++) {\n            var nextSource = arguments[index];\n\n            if (nextSource != null) { // Skip over if undefined or null\n                for (var nextKey in nextSource) {\n                    // Avoid bugs when hasOwnProperty is shadowed\n                    if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                        to[nextKey] = nextSource[nextKey];\n                    }\n                }\n            }\n        }\n        return to;\n    };\n}\n"
  },
  {
    "path": "client-react/services/Auth.ts",
    "content": "import RestUtilities from './RestUtilities';\nimport AuthStore from '../stores/Auth';\n\ninterface IAuthResponse {\n    token: string;\n}\n\nexport default class Auth {\n    static isSignedIn(): boolean {\n        return !!AuthStore.getToken();\n    }\n\n    signInOrRegister(email: string, password: string, isRegister: boolean = false) {\n        return RestUtilities.post<IAuthResponse>(`/api/auth/${isRegister ? 'register' : 'login'}`,\n            `username=${email}&password=${password}${!isRegister ? '&grant_type=password' : ''}`)\n            .then((response) => {\n                if (!response.is_error) {\n                    AuthStore.setToken(response.content.token);\n                }\n                return response;\n            });\n    }\n\n    signIn(email: string, password: string) {\n        return this.signInOrRegister(email, password, false);\n    }\n\n    register(email: string, password: string) {\n        return this.signInOrRegister(email, password, true);\n    }\n\n    confirm(token: string): Promise<boolean> {\n        return RestUtilities.post('/api/auth/confirm', { token: token })\n            .then((response) => {\n                return true;\n            }).catch((err) => {\n                console.log(err);\n                return false;\n            });\n    }\n\n    signOut(): void {\n        AuthStore.removeToken();\n    }\n}\n"
  },
  {
    "path": "client-react/services/Contacts.ts",
    "content": "import RestUtilities from './RestUtilities';\n\nexport interface IContact {\n    id?: number,\n    lastName: string;\n    firstName: string;\n    phone: string;\n    email: string;\n}\n\nexport default class Contacts {\n    fetchAll() {\n        return RestUtilities.get<Array<IContact>>('/api/contacts');\n    }\n\n    fetch(contactId: number) {\n        return RestUtilities.get<IContact>(`/api/contacts/${contactId}`);\n    }\n\n    search(query: string) {\n        return RestUtilities.get<Array<IContact>>(`/api/contacts/search/?q=${query}`);\n    }\n\n    update(contact: IContact) {\n        return RestUtilities.put<IContact>(`/api/contacts/${contact.id}`, contact);\n    }\n\n    create(contact: IContact) {\n        return RestUtilities.post<IContact>('/api/contacts', contact);\n    }\n\n    save(contact: IContact) {\n        if (contact.id) {\n            return this.update(contact);\n        } else {\n            return this.create(contact);\n        }\n    }\n\n    delete(contactId: number) {\n        return RestUtilities.delete(`/api/contacts/${contactId}`);\n    }\n}\n\n"
  },
  {
    "path": "client-react/services/RestUtilities.ts",
    "content": "import AuthStore from \"../stores/Auth\";\n\nexport interface IErrorContent {\n    error: string;\n    error_description: string;\n    [key: string]: string;\n}\n\nexport interface IRestResponse<T> {\n    is_error?: boolean;\n    error_content?: IErrorContent;\n    content?: T;\n}\n\nexport default class RestUtilities {\n    static get<T>(url: string): Promise<IRestResponse<T>> {\n        return RestUtilities.request<T>(\"GET\", url);\n    }\n\n    static delete(url: string): Promise<IRestResponse<void>> {\n        return RestUtilities.request<void>(\"DELETE\", url);\n    }\n\n    static put<T>(\n        url: string,\n        data: Object | string\n    ): Promise<IRestResponse<T>> {\n        return RestUtilities.request<T>(\"PUT\", url, data);\n    }\n\n    static post<T>(\n        url: string,\n        data: Object | string\n    ): Promise<IRestResponse<T>> {\n        return RestUtilities.request<T>(\"POST\", url, data);\n    }\n\n    private static request<T>(\n        method: string,\n        url: string,\n        data: Object | string = null\n    ): Promise<IRestResponse<T>> {\n        let isJsonResponse: boolean = false;\n        let isBadRequest = false;\n        let body = data;\n        let headers = new Headers();\n\n        headers.set('Authorization',`Bearer ${AuthStore.getToken()}`);\n        headers.set('Accept','application/json');\n\n        if (data) {\n            if (typeof data === \"object\") {\n                headers.set('Content-Type','application/json');\n                body = JSON.stringify(data);\n            } else {\n                headers.set('Content-Type','application/x-www-form-urlencoded');\n            }\n        }\n\n        return fetch(url, {\n            method: method,\n            headers: headers,\n            body: <string>body\n        }).then((response: any) => {\n                if (response.status == 401) {\n                    // Unauthorized; redirect to sign-in\n                    AuthStore.removeToken();\n                    window.location.replace(`/?expired=1`);\n                }\n\n                isBadRequest = response.status == 400;\n\n                let responseContentType = response.headers.get(\"content-type\");\n                if (\n                    responseContentType &&\n                    responseContentType.indexOf(\"application/json\") !== -1\n                ) {\n                    isJsonResponse = true;\n                    return response.json();\n                } else {\n                    return response.text();\n                }\n            })\n            .then((responseContent: any) => {\n                let response: IRestResponse<T> = {\n                    is_error: isBadRequest,\n                    error_content: isBadRequest ? responseContent : null,\n                    content: isBadRequest ? null : responseContent\n                };\n                return response;\n            });\n    }\n}\n"
  },
  {
    "path": "client-react/stores/Auth.ts",
    "content": "export default class Auth {\n    static STORAGE_KEY: string = \"token\";\n\n    static getToken() {\n        return window.localStorage.getItem(Auth.STORAGE_KEY);\n    }\n\n    static setToken(token: string) {\n        window.localStorage.setItem(Auth.STORAGE_KEY, token);\n    }\n\n    static removeToken(): void {\n        window.localStorage.removeItem(Auth.STORAGE_KEY);\n    }\n}\n"
  },
  {
    "path": "client-react/styles/auth.styl",
    "content": ".auth {\n  margin: 0 auto;\n  width:500px;\n  margin-top:50px;\n  padding: 25px;\n  background-color: #f2f2f2;\n}\n\n.authEtc {\n  margin-top:20px;\n}\n\n.formAuth {\n  .form-signin-heading, .checkbox {\n    margin-bottom: 10px;\n  }\n\n  .checkbox {\n    font-weight: normal;\n  }\n\n  .form-control {\n    position: relative;\n    height: auto;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    padding: 10px;\n    font-size: 16px;\n\n    &:focus {\n      z-index: 2;\n    }\n  }\n\n  input[type=\"email\"] {\n    margin-bottom: -1px;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n\n  input[type=\"password\"] {\n    margin-bottom: 10px;\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n  }\n}\n"
  },
  {
    "path": "client-react/styles/contacts.styl",
    "content": ".content {\n   padding: 3rem 1.5rem;\n}\n"
  },
  {
    "path": "client-react/styles/global.css",
    "content": "body {\n  padding-top: 5rem;\n  font-family: \"century gothic\", verdana;\n\n}\n\n.btn-link {\n  cursor: pointer;\n}\n\n.btn {\n  margin: 10px 3px 10px 3px;\n}\n\n.table td{\n  vertical-align: middle;\n}\n"
  },
  {
    "path": "client-react/styles/styles.d.ts",
    "content": "declare module \"*.styl\" {\n    let styles: any;\n    export default styles;\n}\n\ndeclare module \"*.css\" {\n    let styles: any;\n    export default styles;\n}\n"
  },
  {
    "path": "client-react/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es2015\",\n    \"target\": \"es2015\",\n    \"jsx\": \"react\"\n  },\n  \"files\": [\"./boot.tsx\", \"./styles/styles.d.ts\"]\n}\n"
  },
  {
    "path": "client-react/webpack.config.js",
    "content": "var webpack = require(\"webpack\");\nvar HtmlWebpackPlugin = require(\"html-webpack-plugin\");\nvar releaseConfig = require(\"./webpack.config.release\");\nvar isProductionEnvironment =\n    process.env.ASPNETCORE_ENVIRONMENT === \"Production\";\nvar path = require(\"path\");\nvar merge = require(\"extendify\")({ isDeep: true, arrays: \"replace\" });\n\nvar config = {\n    mode: \"development\",\n    entry: {\n        main: path.join(__dirname, \"boot.tsx\")\n    },\n    output: {\n        path: path.join(__dirname, \"../api/\", \"wwwroot\"),\n        filename: \"[name].js\",\n        publicPath: \"/\"\n    },\n    resolve: {\n        extensions: [\".ts\", \".tsx\", \".js\", \".styl\", \".css\"]\n    },\n    module: {\n        rules: [\n            {\n                test: /\\.styl$/,\n                use: [\n                    {\n                        loader: \"style-loader\"\n                    },\n                    {\n                        loader: \"css-loader\",\n                        options: {\n                            modules: true,\n                            importLoaders: 2,\n                            sourceMap: false\n                        }\n                    },\n                    {\n                        loader: \"stylus-loader\"\n                    }\n                ]\n            },\n            { test: /\\.ts(x?)$/, loaders: [\"ts-loader\"] },\n            { test: /\\.css/, loader: \"style-loader!css-loader\" },\n            {\n                test: /\\.(png|woff|woff2|eot|ttf|svg)$/,\n                loader: \"url-loader?limit=100000\"\n            }\n        ]\n    },\n    devtool: \"inline-source-map\",\n    plugins: [\n        // plugins should not be empty: https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices'[\n        new HtmlWebpackPlugin({\n            template: path.join(__dirname, \"index.ejs\"),\n            inject: true\n        })\n        // new webpack.NamedModulesPlugin()\n        // We do not use ExtractTextPlugin in development mode so that HMR will work with styles\n    ]\n};\n\nif (isProductionEnvironment) {\n    // Merge production config\n    config = merge(config, releaseConfig);\n}\n\nmodule.exports = config;\n"
  },
  {
    "path": "client-react/webpack.config.release.js",
    "content": "var webpack = require('webpack');\nvar HtmlWebpackPlugin = require('html-webpack-plugin');\nvar ExtractTextPlugin = require(\"extract-text-webpack-plugin\");\nvar path = require('path');\n\nvar config = {\n    mode: \"production\",\n    module: {\n        rules: [\n            // Use react-hot for HMR and then ts-loader to transpile TS (pass path to tsconfig because it is not in root (cwd) path)\n            { test: /\\.ts(x?)$/, loaders: ['ts-loader'] },\n            { test: /\\.styl$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader?modules&importLoaders=2&sourceMap&localIdentName=[local]___[hash:base64:5]!stylus-loader' }) },\n            { test: /\\.css/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }\n        ]\n    },\n    devtool: '',\n    externals: {\n        react: 'React',\n        'react-dom': 'ReactDOM'\n    },\n    plugins: [\n        new HtmlWebpackPlugin({\n            release: true,\n            template: path.join(__dirname, 'index.ejs'),\n            useCdn: true,\n            minify: {\n                collapseWhitespace: true,\n                removeComments: true\n            }\n        }),\n        new ExtractTextPlugin(\"styles.css\")\n    ]\n};\n"
  },
  {
    "path": "client-react.test/polyfill/localStorage.js",
    "content": "module.exports = {\n    polyfill: function () {\n        window.localStorage = window.sessionStorage = {\n            getItem: function (key) {\n                return this[key];\n            },\n            setItem: function (key, value) {\n                this[key] = value;\n            }\n        };\n    }\n}\n\n"
  },
  {
    "path": "client-react.test/tests/Contacts.tsx",
    "content": "import { expect } from \"chai\";\nimport { mount, shallow, configure } from \"enzyme\";\nimport * as Adapter from \"enzyme-adapter-react-16\";\nimport * as React from \"react\";\nimport { MemoryRouter as Router, Route } from \"react-router-dom\";\nimport { stubFetch } from \"../utils\";\nimport { Contacts } from \"../../client-react/components/Contacts\";\n\nconfigure({ adapter: new Adapter() });\n\ndescribe(\"<Contacts/> component \", function() {\n    it(\"renders a h1\", function() {\n        let fakeContactsData = [\n            { id: 1, lastName: \"Smith\", firstName: \"John\" }\n        ];\n        let fetchStub = stubFetch(fakeContactsData);\n        let emptyArgs: any = {};\n        const wrapper = shallow(<Contacts {...emptyArgs} />);\n        expect(wrapper.find(\"h1\")).to.have.length(1);\n        fetchStub.restore();\n    });\n\n    it(\"renders a list of contacts\", function(done) {\n        let fakeContactsData = [\n            { id: 1, lastName: \"Smith\", firstName: \"John\" }\n        ];\n        let fetchStub = stubFetch(fakeContactsData);\n\n        const wrapper = mount(\n            <Router>\n                <Route component={Contacts} />\n            </Router>\n        );\n\n        setImmediate(function() {\n            expect(wrapper.html()).to.contain(\n                fakeContactsData[fakeContactsData.length - 1].lastName\n            );\n            fetchStub.restore();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "client-react.test/tests.tsx",
    "content": "import { JSDOM } from \"jsdom\";\nimport * as localStorage from \"./polyfill/localStorage.js\";\n\nbefore(function() {\n    const dom = new JSDOM(\"<!doctype html><html><body></body></html>\", { url: \"http://localhost\" });\n\n    (global as any).window = dom.window;\n    (global as any).document = dom.window.document;\n\n    localStorage.polyfill();\n\n    console.log(\n        \"Successfully mocked a DOM with jsdom and polyfilled localStorage.\"\n    );\n});\n"
  },
  {
    "path": "client-react.test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"commonjs\",\n    \"target\":\"es2015\",\n    \"jsx\": \"react\",\n    \"allowJs\": true,\n    \"outDir\": \"./build\"\n  },\n  \"files\": [\n    \"./tests.tsx\"\n  ],\n  \"include\": [\n    \"./tests/*.ts*\"\n  ]\n}\n"
  },
  {
    "path": "client-react.test/utils.ts",
    "content": "import * as sinon from 'sinon';\n\n\n/**\n * Stubs browser Fetch API and returns given returnData object\n *\n * @param returnData\n */\nfunction stubFetch(returnData: Object) {\n    let g = (global as any);\n    if (!g.fetch) {\n        // If fetch is not defined; define it as a dummy function because sinon will only stub a defined function\n        g.fetch = function () { }\n    }\n\n    if (!g.Headers) {\n        g.Headers = function () {\n            this.set = function(){}\n         }\n    }\n\n    let res = {\n        status: 200,\n        headers: {\n            get: function (key: string) { return 'application/json'; }\n        },\n        json: function () { return Promise.resolve(returnData) }\n    };\n\n    return sinon.stub(global, \"fetch\" as any).callsFake(()=> Promise.resolve(res));\n\n}\n\nexport { stubFetch }\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '2'\nservices:\n  postgres:\n    image: postgres:9.5\n    environment:\n      - POSTGRES_USER=postgres\n      - POSTGRES_PASSWORD=postgres\n    ports:\n      - \"5433:5432\"\n  smtp:\n    image: jeanberu/mailcatcher\n    environment:\n      - SMTP_PORT=1025\n      - HTTP_PORT=1080\n    ports:\n      - \"1025:1025\"\n      - \"1080:1080\"\n"
  },
  {
    "path": "global.json",
    "content": "{\n  \"sdk\": {\n   \"version\": \"5.0.400\"\n  }\n}\n"
  },
  {
    "path": "ops/README.md",
    "content": "This folder contains [Ansible](https://www.ansible.com/) assets responsible for provisioning hosts and deploying this application.\n\n## Setup\n\n1. Procure access to Ubuntu 16.04 (Xenial) or Ubuntu 18.04 (Bionic) host which will be used to host this application.  [AWS](aws.amazon.com) or [Digital Ocean](https://m.do.co/c/974ef9a471c1) are good options.\n2. Setup DNS records to point to these host(s).\n3. Create `config.yml` file in this directory, using `config.yml.example` as a pattern.\n\n## Usage\n\nFrom the root of this respository, run one of the following commands:\n- `npm run provision:prod`: This will provision all production hosts specified in config.yml file.\n- `npm run deploy:prod`: This will deploy the app to all production hosts specified in config.yml file.\n\n## Notes\n - The deploy.yml and provision.yml playbooks were written against and tested on Ubuntu 16.\n - The [Ansible Best Practices](http://docs.ansible.com/ansible/playbooks_best_practices.html) document demonstrates using /groups_vars/... for application environment variables (i.e. production / staging) and /group_vars/all for global variables.  However, we are using inventory group variables, all contained within the inventory file (config.yml) to define environment and global variables.  Because of this, all the variables are in a single location and easily managed.\n"
  },
  {
    "path": "ops/config.yml.example",
    "content": "all:\n  vars:\n    # The following vars apply globally; additional config is in group_vars/all.\n    app_name: aspnetCoreReactTemplate\nproduction:\n  hosts:\n    0.0.0.0                                    # The IP address or hostname of the production web server\n  vars:\n    deploy_user: jdoe                          # The name of the remote user account for provisioning and deployment\n    gh_pubkey_user: johndoe1981                # The GitHub username used to pull the public key for deploy_user authorized_user access\n    use_ssl: true                              # If true, SSL cert will be obtained from Let's Encrypt and Nginx provisioned for SSL\n    letsencrypt_use_live_ca: true              # If true, will use the Live Let's Encrypt ACME servers; otherwise will use staging server\n    database_password: super!secret            # PostgreSQL database will be configured with this password\n    postgresql_backup_to_s3: true              # If true, PostgresSQL backups will be moved to S3 storage\n    s3_key: ABCDEFGHIJKLMNOP                   # S3 Access Key used for uploading PostgreSQL backups\n    s3_secret: ABCDEFGHIJKLMNOP                # S3 Access Secret used for uploading PostgreSQL backups\n    jwt_key: 6872f99e-cb09                     # The key to use for generating JWTs\n    smtp_config: user:pass@smtp.domain.com:587 # The SMTP configuration for sending outgoing mail\n    email_from_address: demo@gmail.com         # The email address for outgoing email\n"
  },
  {
    "path": "ops/deploy.yml",
    "content": "---\n- name: deploy\n  hosts: all\n  gather_facts: false\n  remote_user: \"{{ deploy_user }}\"\n  roles:\n    - deploy\n  post_tasks:\n    - debug: msg=\"Deployed to https://{{ webserver_name }}\"\n"
  },
  {
    "path": "ops/group_vars/all",
    "content": "---\ndatabase_name: \"{{ app_name }}\"\ndatabase_username: \"{{ app_name }}\"\nsource_directory: ../api/bin/Release/netcoreapp3.1/publish/\ndeploy_directory: \"/home/{{ deploy_user }}/apps/{{ app_name }}\"\nemail_enable_ssl: true\nemail_from_name: \"{{ app_name }}\"\npostgresql_backup_to_s3: false\ns3_bucket_name: \"s3://app.{{ app_name }}\"\ns3_db_backup_location: \"{{ s3_bucket_name }}/db_backups\"\nuse_ssl: false\nletsencrypt_use_live_ca: false\nwebserver_user: www-data\nwebserver_name: \"{{ inventory_hostname }}\"\n\n"
  },
  {
    "path": "ops/library/ghetto_json",
    "content": "#!/usr/bin/env python\n\n# Source: https://github.com/FauxFaux/ansible-ghetto-json\n\nimport json\nimport sys\nimport shlex\n\ntry:\n    import commentjson\n    json_load = commentjson.load\nexcept ImportError:\n    json_load = json.load\n\ndef main(params_list):\n    params = dict(x.split(\"=\", 2) for x in params_list)\n    path = params.pop('path')\n    changed = False\n\n    for key in params.keys():\n      if key.startswith('_ansible_'):\n        params.pop(key)\n\n    with open(path) as f:\n        obj = json_load(f)\n        for (key, target) in params.items():\n            parts = key.split('.')\n            ref = obj\n            for part in parts[:-1]:\n                if part not in ref:\n                    ref[part] = {}\n                ref = ref[part]\n\n            last_part = parts[-1]\n            if target == 'unset':\n                if last_part in ref:\n                    del ref[last_part]\n                    changed = True\n            else:\n                if target.isdigit():\n                    target = int(target)\n                if target == 'null':\n                    target = None\n                if target == 'false':\n                    target = False\n                if target == 'true':\n                    target = True\n                if last_part not in ref or ref[last_part] != target:\n                    ref[last_part] = target\n                    changed = True\n\n    if changed:\n        with open(path, 'w') as f:\n            json.dump(obj, f, indent=2, separators=(',', ': '), sort_keys=True)\n\n    print(json.dumps({'changed': changed}))\n\n\nif __name__ == '__main__':\n    if len(sys.argv) == 2:\n        main(shlex.split(open(sys.argv[1]).read()))\n    else:\n        main(sys.argv[1:])\n"
  },
  {
    "path": "ops/provision.yml",
    "content": "---\n- name: provision\n  hosts: all\n  remote_user: root\n  # Do not gather facts here because if host does not have python2 installed (i.e. Ubuntu 16) this will fail initially.  Gather facts later...\n  gather_facts: false\n  pre_tasks:\n    - name: 'install python2'\n      raw: sudo apt-get -y install python-simplejson\n    - name: gather facts\n      setup: # This gather facts: http://stackoverflow.com/a/31060268/626911\n  roles:\n    - nginx\n    - role: ssl\n      when: use_ssl\n      domainsets:\n        - domains:\n          - \"{{ webserver_name }}\"\n    - dotnetcore\n    - supervisor\n    - { role: postgresql, postgresql_server: yes, postgresql_client: yes, postgresql_backup_enabled: yes }\n    - role: s3cmd\n      when: postgresql_backup_to_s3\n    - firewall\n    - deploy_user\n"
  },
  {
    "path": "ops/roles/deploy/defaults/main.yml",
    "content": "---\nappsetting_file: appsettings.json\n"
  },
  {
    "path": "ops/roles/deploy/meta/main.yml",
    "content": "---\ndependencies:\n- role: supervisor\n"
  },
  {
    "path": "ops/roles/deploy/tasks/main.yml",
    "content": "- name: Copy app files\n  synchronize: src={{ source_directory }} dest={{ deploy_directory }} delete=yes rsync_opts=--exclude=.git/\n  notify: Reload supervisor app config\n\n- name: Configure PostgresSQL connection string\n  lineinfile: dest=\"{{ deploy_directory }}/{{ appsetting_file }}\"\n    regexp=\"defaultConnection\\\":\"\n    line=\"\\\"defaultConnection\\\"{{':'}} \\\"Host=127.0.0.1;Username={{ database_username }};Password={{ database_password }};Database={{ database_name }}\\\"\"\n    state=\"present\"\n\n- name: Configure appsettings\n  ghetto_json:\n    path=\"{{ deploy_directory }}/{{ appsetting_file }}\"\n    frontEndUrl=\"http://{{ webserver_name }}/\"\n    jwt.key={{ jwt_key }}\n    jwt.issuer=\"http://{{ webserver_name }}/\"\n    email.smtpConfig={{ smtp_config }}\n    email.enableSSL={{ email_enable_ssl }}\n    email.emailFromName={{ email_from_name }}\n    email.emailFromAddress={{ email_from_address }}\n"
  },
  {
    "path": "ops/roles/deploy_user/meta/main.yml",
    "content": "---\ndependencies:\n- role: postgresql\n"
  },
  {
    "path": "ops/roles/deploy_user/tasks/main.yml",
    "content": "- name: Add deploy user\n  user: name={{ deploy_user }} shell=/bin/bash append=true\n\n- name: Adding postgres user ({{ postgresql_user }}) to deploy user group ({{ deploy_user }}) to allow usage of psql from /home path\n  user: name={{ postgresql_user }}\n        groups={{ deploy_user }}\n        append=yes\n\n- name: Add deploy user public key to authorized_keys\n  authorized_key: user={{ deploy_user }} key=https://github.com/{{ gh_pubkey_user }}.keys\n\n- name: Add deploy user to sudoers\n  lineinfile:\n    \"dest=/etc/sudoers\n    regexp='^{{ deploy_user }} ALL'\n    line='{{ deploy_user }} ALL=(ALL) NOPASSWD: ALL'\n    state=present\"\n\n- name: Creates deploy directory for app\n  file: path={{ deploy_directory }} state=directory owner={{deploy_user}} group={{webserver_user}} mode=0775\n"
  },
  {
    "path": "ops/roles/dotnetcore/defaults/main.yml",
    "content": "---\ndotnetcore_package_name: dotnet-sdk-5.0\n"
  },
  {
    "path": "ops/roles/dotnetcore/tasks/main.yml",
    "content": "---\n- name: Download product repository file\n  get_url:\n    url: \"https://packages.microsoft.com/config/ubuntu/{{ansible_distribution_major_version}}.04/packages-microsoft-prod.deb\"\n    dest: \"/tmp/packages-microsoft-prod.deb\"\n  when: ansible_distribution == \"Ubuntu\" and ansible_distribution_major_version == \"18\"\n\n- name: Execute dehydrated shell script\n  shell: \"dpkg -i /tmp/packages-microsoft-prod.deb\"\n\n- name: Install transport-https\n  apt: pkg=apt-transport-https state=present update_cache=yes\n\n- name: Install dotnet core SDK\n  apt: name={{ dotnetcore_package_name }} state=present\n"
  },
  {
    "path": "ops/roles/firewall/handlers/main.yml",
    "content": "---\n- name: Restart ufw\n  service: name=ufw state=restarted\n"
  },
  {
    "path": "ops/roles/firewall/tasks/main.yml",
    "content": "---\n- name: Install Uncomplicated Firewall (ufw)\n  apt: pkg=ufw state=present cache_valid_time=86400\n\n- name: Configure ufw defaults\n  ufw: direction={{ item.direction }} policy={{ item.policy }}\n  with_items:\n    - { direction: 'incoming', policy: 'deny' }\n    - { direction: 'outgoing', policy: 'allow' }\n  notify:\n    - Restart ufw\n\n- name: Allow OpenSSH\n  ufw: rule=allow name=OpenSSH\n  notify:\n    - Restart ufw\n\n- name: Allow Nginx\n  ufw: rule=allow name=\"Nginx Full\"\n  notify:\n    - Restart ufw\n\n- name: Enable ufw\n  ufw: state=enabled\n  notify:\n    - Restart ufw\n"
  },
  {
    "path": "ops/roles/nginx/defaults/main.yml",
    "content": "---\nnginx_conf_dir: /etc/nginx\nnginx_conf_file: \"{{ nginx_conf_dir }}/sites-available/{{ app_name }}.conf\"\nnginx_conf_enabled_link_file: \"{{ nginx_conf_dir }}/sites-enabled/{{ app_name }}.conf\"\n"
  },
  {
    "path": "ops/roles/nginx/handlers/main.yml",
    "content": "---\n- name: Reload nginx\n  service: name=nginx state=reloaded enabled=true"
  },
  {
    "path": "ops/roles/nginx/tasks/main.yml",
    "content": "---\n- name: Install Nginx\n  apt: pkg=nginx state=present update_cache=yes\n\n- name: Disable the default site\n  file: path=\"{{ nginx_conf_dir }}/sites-enabled/default\" state=absent\n  notify: Reload nginx\n\n- name: Setup app config\n  template: src=\"etc_nginx_sites-available.conf.j2\" dest={{ nginx_conf_file }} group={{ webserver_user }} owner={{ webserver_user }}\n\n- name: Enable app\n  file: src={{ nginx_conf_file }} dest=\"{{ nginx_conf_enabled_link_file }}\" state=link\n  notify: Reload nginx\n"
  },
  {
    "path": "ops/roles/nginx/templates/etc_nginx_sites-available.conf.j2",
    "content": "server {\n  listen 80; #default_listen_marker\n  server_name {{ webserver_name }};\n\n  #ssl_config_marker\n\n  gzip_proxied any;\n  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;\n\n  root {{ deploy_directory }}/wwwroot;\n  index index.html;\n\n  # Root path (to be served by Nginx)\n  location = / {\n  }\n\n  # Static content (to be served by Nginx)\n  location ~ \\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm|woff2|svg)$ {\n      expires 1d;\n      access_log off;\n  }\n\n  # Dynamic content (to be served by Kestrel)\n  location / {\n        proxy_pass http://0.0.0.0:5000;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection keep-alive;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_cache_bypass $http_upgrade;\n  }\n}\n\n#ssl_forced_config_marker\n"
  },
  {
    "path": "ops/roles/postgresql/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "ops/roles/postgresql/README.md",
    "content": "# ansible-postgresql\n\n[PostgreSQL](http://www.postgresql.org/) is a powerful, open source object-relational database system.\n\n[![Platforms](http://img.shields.io/badge/platforms-ubuntu-lightgrey.svg?style=flat)](#)\n\nTunables\n--------\n* `postgresql_client` (boolean) - Install PostgreSQL client?\n* `postgresql_server` (boolean) - Install PostgreSQL server?\n* `postgresql_user` (string) - User to run postgresql as\n* `postgresql_runtime_root` (string) - Directory for runtime data\n* `postgresql_pidfile_path` (string) - Path for pidfile\n* `postgresql_accepts_external_connections` (boolean) - Allow connections from places that aren't localhost?\n* `postgresql_backup_enabled` (boolean) - Enable backups?\n* `postgresql_backup_path` (string) - Directory to store backups\n* `postgresql_backup_frequency` (string) - Frequency of backups\n\nDependencies\n------------\n* [telusdigital.apt-repository](https://github.com/telusdigital/ansible-apt-repository/)\n\nExample Playbook\n----------------\n    - hosts: servers\n      roles:\n         - role: telusdigital.postgresql\n           postgresql_server: yes\n           postgresql_backup_enabled: yes\n           postgresql_backup_frequency: daily\n           postgresql_backup_path: /data/backup/postgresql\n\nLicense\n-------\n[MIT](https://tldrlegal.com/license/mit-license)\n\nContributors\n------------\n* [Chris Olstrom](https://colstrom.github.io/) | [e-mail](mailto:chris@olstrom.com) | [Twitter](https://twitter.com/ChrisOlstrom)\n* Aaron Pederson\n* Steven Harradine\n"
  },
  {
    "path": "ops/roles/postgresql/defaults/main.yml",
    "content": "---\npostgresql_client: no\npostgresql_server: no\n\npostgresql_user: postgres\n\npostgresql_runtime_root: \"{{ runtime_root | default('/var/run') }}/postgresql\"\npostgresql_pidfile_path: \"{{ postgresql_runtime_root }}/postgresql.pid\"\n\npostgresql_log_root: \"{{ log_root | default('/var/log') }}/postgresql\"\npostgresql_log_path: \"{{ postgresql_log_root }}/postgresql-main.log\"\n\npostgresql_accepts_external_connections: yes\n\npostgresql_backup_enabled: no\npostgresql_backup_path: /data/backup/postgresql\npostgresql_backup_frequency: daily\npostgresql_backup_to_s3: false\n"
  },
  {
    "path": "ops/roles/postgresql/handlers/main.yml",
    "content": "---\n- name: Reload Service | postgres\n  service:\n    state: reloaded\n    name: postgresql\n  tags:\n    - disruptive\n"
  },
  {
    "path": "ops/roles/postgresql/tasks/backup.yml",
    "content": "---\n- name: \"Directory Exists | {{ postgresql_backup_path }}\"\n  file:\n    state: directory\n    path: \"{{ postgresql_backup_path }}\"\n    owner: \"{{ postgresql_user }}\"\n    group: staff\n    mode: 0775\n  when: postgresql_backup_enabled\n  tags:\n    - directory-structure\n    - postgres\n    - backup\n\n- name: Copy backup script\n  become: true\n  become_user: postgres\n  template: src=\"pgsql_backup.sh.j2\" dest=\"{{ postgresql_backup_path }}/pgsql_backup.sh\" mode=\"u+x\"\n\n- name: Setup Automated Backups via cron\n  become: true\n  become_user: postgres\n  cron:\n    name: postgres-backup\n    special_time: \"{{ postgresql_backup_frequency }}\"\n    job: \"{{ postgresql_backup_path }}/pgsql_backup.sh\"\n  when: postgresql_backup_enabled\n  tags:\n    - postgres\n    - backup\n    - using-cron\n"
  },
  {
    "path": "ops/roles/postgresql/tasks/configure.yml",
    "content": "---\n- name: \"Directory Exists | {{ postgresql_runtime_root }}\"\n  file:\n    state: directory\n    path: \"{{ postgresql_runtime_root }}\"\n    owner: \"{{ postgresql_user }}\"\n    group: staff\n    mode: 0775\n  tags:\n    - directory-structure\n    - runtime-data\n    - postgres\n\n- name: Configure | postgres | pidfile\n  lineinfile:\n    state: present\n    dest: \"/etc/postgresql/{{ postgresql_major_version }}/main/postgresql.conf\"\n    regexp: '^#*external_pid_file'\n    line: \"external_pid_file = '{{ postgresql_pidfile_path }}'\"\n  notify: Reload Service | postgres\n  tags:\n    - pidfile\n    - service\n\n- name: Configure | postgres | listen_address\n  lineinfile:\n    state: present\n    dest: \"/etc/postgresql/{{ postgresql_major_version }}/main/postgresql.conf\"\n    regexp: '^#* *listen_addresses ='\n    line: \"listen_addresses = '*'\"\n  notify: Reload Service | postgres\n  tags:\n    - networking\n  when: postgresql_accepts_external_connections\n\n- name: Configure | postgres | pg_hba.conf\n  lineinfile:\n    state: present\n    dest: \"/etc/postgresql/{{ postgresql_major_version }}/main/pg_hba.conf\"\n    regexp: \"^#* *host {{ item }}\"\n    line: \"host {{ item }} {{ database_username | default(project) }} all md5\"\n  with_items:\n    - template1\n    - \"{{ database_name | default(project) }}\"\n  notify: Reload Service | postgres\n  tags:\n    - networking\n  when: postgresql_accepts_external_connections\n"
  },
  {
    "path": "ops/roles/postgresql/tasks/install.yml",
    "content": "---\n- name: Install Packages | apt\n  apt:\n    state: latest\n    pkg: 'postgresql-client'\n  when: postgresql_client\n  tags:\n    - software-installation\n    - using-apt\n\n- name: Install Packages | apt\n  apt:\n    state: latest\n    pkg: [\n      'libpq-dev',\n      'python-dev',\n      'python-pip',\n      'postgresql',\n      'postgresql-contrib',\n      'postgresql-server-dev-all',\n      'python-dev'\n    ]\n  when: postgresql_server\n  tags:\n    - software-installation\n    - using-apt\n\n- name: Install Packages | pip\n  pip:\n    state: latest\n    name: 'psycopg2'\n  when: postgresql_server\n  tags:\n    - software-installation\n    - using-pip\n    \n- name: Install Packages | apt\n  apt:\n    state: latest\n    pkg: 'p7zip-full'\n  when: postgresql_backup_enabled\n  tags:\n    - p7zip\n    - backup\n    - using-apt\n\n- name: Create Database User\n  become: true\n  become_user: postgres\n  postgresql_user:\n    state: present\n    name: \"{{ database_username | mandatory }}\"\n    password: \"{{ database_password | mandatory }}\"\n    db: template1\n    priv: CONNECT\n#    role_attr_flags: SUPERUSER\n  when: postgresql_server\n\n- name: Create Database\n  become: true\n  become_user: postgres\n  postgresql_db:\n    state: present\n    name: \"{{ database_name | mandatory }}\"\n    owner: \"{{ database_username | mandatory }}\"\n  when: postgresql_server\n\n- name: Create Database User\n  become: true\n  become_user: postgres\n  postgresql_user:\n    state: present\n    name: \"{{ database_username | mandatory }}\"\n    password: \"{{ database_password | mandatory }}\"\n    db: \"{{ database_name | mandatory }}\"\n    priv: ALL\n    role_attr_flags: CREATEDB\n  when: postgresql_server\n"
  },
  {
    "path": "ops/roles/postgresql/tasks/main.yml",
    "content": "---\n- include: install.yml\n- { include: backup.yml,     when: postgresql_server }\n- { include: configure.yml,  when: postgresql_server }\n"
  },
  {
    "path": "ops/roles/postgresql/templates/pgsql_backup.sh.j2",
    "content": "#!/bin/bash\n\n# Halt on error\nset -e\n\nBACKUP_FILENAME=backup-`date +\\\\%Y\\\\%m\\\\%d\\\\%H.7z`\necho -e \"Dumping {{ database_name }} to {{ postgresql_backup_path }}/${BACKUP_FILENAME}\"\n\npg_dump {{ database_name | default(project) }} | 7z a -an -txz -si -so > {{ postgresql_backup_path }}/${BACKUP_FILENAME}\n\n{% if (postgresql_backup_to_s3 | bool) == true %}\nS3_BUCKET=\"{{ s3_bucket_name }}/{{ s3_db_backup_location }}\"\necho -e \"Uploading to S3 bucket ${S3_BUCKET}\"\ns3cmd mb {{ s3_bucket_name }}\ns3cmd put {{ postgresql_backup_path }}/${BACKUP_FILENAME} ${S3_BUCKET}/${BACKUP_FILENAME}\n\n# Note: Because we are using set -e above, we should not get to this point if there was a problem uploading the backup\n# to S3.  So, the backup file will just remain on this host.\necho -e \"Removing backup file\"\nrm -f \"{{ postgresql_backup_path }}/${BACKUP_FILENAME}\"\n{% endif %}\n"
  },
  {
    "path": "ops/roles/postgresql/vars/main.yml",
    "content": "---\npostgresql_major_version: '10'\n"
  },
  {
    "path": "ops/roles/s3cmd/meta/main.yml",
    "content": "---\ndependencies:\n- role: postgresql\n"
  },
  {
    "path": "ops/roles/s3cmd/tasks/main.yml",
    "content": "- name: Install s3cmd\n  apt: name=s3cmd state=present\n\n- name: Configure with .s3cfg file\n  become: yes\n  become_user: \"{{ postgresql_user }}\"\n  template:\n    src=\"s3cfg.j2\"\n    dest=\"~/.s3cfg\"\n"
  },
  {
    "path": "ops/roles/s3cmd/templates/s3cfg.j2",
    "content": "[default]\naccess_key = {{ s3_key }}\nsecret_key = {{ s3_secret }}\nuse_https = True"
  },
  {
    "path": "ops/roles/ssl/defaults/main.yml",
    "content": "dehydrated_install_dir: /etc/dehydrated\ndehydrated_script_name: dehydrated.sh\nchallenge_root_dir: /var/www/dehydrated\nchallenge_relative_dir: /.well-known/acme-challenge\nletsencrypt_use_live_ca: false\n"
  },
  {
    "path": "ops/roles/ssl/meta/main.yml",
    "content": "---\ndependencies:\n- role: nginx\n"
  },
  {
    "path": "ops/roles/ssl/tasks/main.yml",
    "content": "# Source: https://gist.github.com/raphaelm/10226edb0e46f7ce844e\n# Source: https://github.com/lukas2511/dehydrated\n---\n- name: Ensure Challenge directory exists\n  file: path=\"{{ challenge_root_dir }}{{ challenge_relative_dir }}\" state=directory mode=0755 owner=root group={{ webserver_user }} recurse=yes\n\n- name: Ensure curl is installed\n  apt: name=curl state=present\n\n- name: Ensure SSL base directory exists\n  file: path={{ dehydrated_install_dir }} state=directory mode=0750 owner=root group={{ webserver_user }}\n\n- name: Ensure SSL domain list exists\n  command: \"touch {{ dehydrated_install_dir }}/domains.txt\"\n  args:\n    creates: \"{{ dehydrated_install_dir }}/domains.txt\"\n\n- name: Ensure LE config exists\n  template: src=config.j2 dest=\"{{ dehydrated_install_dir }}/config\" mode=0750 owner=root\n\n- name: Download dehydrated shell script\n  get_url:\n    url: https://raw.githubusercontent.com/lukas2511/dehydrated/master/dehydrated\n    dest: \"{{ dehydrated_install_dir }}/{{ dehydrated_script_name }}\"\n    mode: 0700\n\n- name: Add line to domains file\n  lineinfile:\n    dest: \"{{ dehydrated_install_dir }}/domains.txt\"\n    line: \"{{ item.domains | join(' ') }}\"\n  with_items: \"{{ domainsets }}\"\n\n- name: Configure Nginx to serve the Challenge directory\n  blockinfile:\n    dest: \"{{ nginx_conf_file }}\"\n    insertafter: \"#ssl_config_marker\"\n    marker: \"# {mark} ANSIBLE MANAGED BLOCK (CHALLENGE DIR CONFIG)\"\n    block: |\n      location ^~ {{ challenge_relative_dir }} {\n        root {{ challenge_root_dir }};\n      }\n  register: challenge_directory_config\n\n- name: Reload nginx # Force reload when challenge_directory_config.changed because we need it to run before running LE script\n  service: name=nginx state=reloaded enabled=true\n  when: challenge_directory_config.changed\n\n- name: Execute dehydrated shell script\n  shell: \"./{{ dehydrated_script_name }} --register --accept-terms && ./{{ dehydrated_script_name }} -c\"\n  args:\n    chdir: \"{{ dehydrated_install_dir }}\"\n  notify: Reload nginx\n\n- name: Configure SSL in Nginx\n  blockinfile:\n    dest: \"{{ nginx_conf_file }}\"\n    insertafter: \"#ssl_config_marker\"\n    marker: \"# {mark} ANSIBLE MANAGED BLOCK (SSL CONFIG)\"\n    block: |\n      listen 443 ssl;\n      ssl_certificate {{ dehydrated_install_dir }}/certs/{{ webserver_name }}/fullchain.pem;\n      ssl_certificate_key {{ dehydrated_install_dir }}/certs/{{ webserver_name }}/privkey.pem;\n  notify: Reload nginx\n\n- name: Remove default listen port (will be replaced with another server block)\n  lineinfile:\n    dest: \"{{ nginx_conf_file }}\"\n    state: absent\n    regexp: '#default_listen_marker'\n\n- name: Configure forced SSL redirect in Nginx\n  blockinfile:\n    dest: \"{{ nginx_conf_file }}\"\n    insertafter: \"#ssl_forced_config_marker\"\n    marker: \"# {mark} ANSIBLE MANAGED BLOCK (FORCE SSL CONFIG)\"\n    block: |\n      server {\n        listen  80;\n        server_name {{ webserver_name }};\n        rewrite     ^   https://$server_name$request_uri? permanent;\n      }\n  notify: Reload nginx\n\n- name: Add LE cronjob\n  cron: name=lets-encrypt hour=4 minute=23 day=*/3 job=\"{{ dehydrated_install_dir }}/{{ dehydrated_script_name }} -c && service nginx reload\"\n"
  },
  {
    "path": "ops/roles/ssl/templates/config.j2",
    "content": "########################################################\n# This is the main config file for dehydrated          #\n#                                                      #\n# This file is looked for in the following locations:  #\n# $SCRIPTDIR/config (next to this script)              #\n# /usr/local/etc/dehydrated/config                     #\n# /etc/dehydrated/config                               #\n# ${PWD}/config (in current working-directory)         #\n#                                                      #\n# Default values of this config are in comments        #\n########################################################\n\n# Resolve names to addresses of IP version only. (curl)\n# supported values: 4, 6\n# default: <unset>\n#IP_VERSION=\n\n# Path to certificate authority (default: https://acme-v02.api.letsencrypt.org/directory)\nCA=\"{{ \"https://acme-v02.api.letsencrypt.org/directory\" if (letsencrypt_use_live_ca | bool) == true else \"https://acme-staging-v02.api.letsencrypt.org/directory\" }}\"\n\n# Path to license agreement (default: https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf)\n#LICENSE=\"https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf\"\n\n# Which challenge should be used? Currently http-01 and dns-01 are supported\nCHALLENGETYPE=\"http-01\"\n\n# Path to a directory containing additional config files, allowing to override\n# the defaults found in the main configuration file. Additional config files\n# in this directory needs to be named with a '.sh' ending.\n# default: <unset>\n#CONFIG_D=\n\n# Base directory for account key, generated certificates and list of domains (default: $SCRIPTDIR -- uses config directory if undefined)\n#BASEDIR=$SCRIPTDIR\n\n# File containing the list of domains to request certificates for (default: $BASEDIR/domains.txt)\n#DOMAINS_TXT=\"${BASEDIR}/domains.txt\"\n\n# Output directory for generated certificates\n#CERTDIR=\"${BASEDIR}/certs\"\n\n# Directory for account keys and registration information\n#ACCOUNTDIR=\"${BASEDIR}/accounts\"\n\n# Output directory for challenge-tokens to be served by webserver or deployed in HOOK (default: /var/www/dehydrated)\nWELLKNOWN=\"/var/www/dehydrated/.well-known/acme-challenge\"\n\n# Default keysize for private keys (default: 4096)\n#KEYSIZE=\"4096\"\n\n# Path to openssl config file (default: <unset> - tries to figure out system default)\n#OPENSSL_CNF=\n\n# Program or function called in certain situations\n#\n# After generating the challenge-response, or after failed challenge (in this case altname is empty)\n# Given arguments: clean_challenge|deploy_challenge altname token-filename token-content\n#\n# After successfully signing certificate\n# Given arguments: deploy_cert domain path/to/privkey.pem path/to/cert.pem path/to/fullchain.pem\n#\n# BASEDIR and WELLKNOWN variables are exported and can be used in an external program\n# default: <unset>\n#HOOK=\n\n# Chain clean_challenge|deploy_challenge arguments together into one hook call per certificate (default: no)\n#HOOK_CHAIN=\"no\"\n\n# Minimum days before expiration to automatically renew certificate (default: 30)\n#RENEW_DAYS=\"30\"\n\n# Regenerate private keys instead of just signing new certificates on renewal (default: yes)\n#PRIVATE_KEY_RENEW=\"yes\"\n\n# Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1\n#KEY_ALGO=rsa\n\n# E-mail to use during the registration (default: <unset>)\n#CONTACT_EMAIL=\n\n# Lockfile location, to prevent concurrent access (default: $BASEDIR/lock)\n#LOCKFILE=\"${BASEDIR}/lock\"\n\n# Option to add CSR-flag indicating OCSP stapling to be mandatory (default: no)\n#OCSP_MUST_STAPLE=\"no\"\n"
  },
  {
    "path": "ops/roles/supervisor/defaults/main.yml",
    "content": "log_file: \"/var/log/{{ app_name }}.out.log\"\nerror_file: \"/var/log/{{ app_name }}.err.log\"\n"
  },
  {
    "path": "ops/roles/supervisor/handlers/main.yml",
    "content": "---\n- name: Reload supervisor\n  become: true\n  service: name=supervisor state=reloaded enabled=true\n\n- name: Reload supervisor app config\n  become: true\n  command: supervisorctl restart {{ app_name }}\n"
  },
  {
    "path": "ops/roles/supervisor/tasks/main.yml",
    "content": "---\n- name: Install Supervisor\n  become: true\n  apt: pkg=supervisor state=present cache_valid_time=86400\n\n- name: Setup app config\n  become: true\n  template: src=etc_supervisor_conf.d_app_name.conf.j2 dest=/etc/supervisor/conf.d/{{ app_name }}.conf\n  notify: Reload supervisor\n\n- name: Create .NET Core cert cache directory and give access to {{ webserver_user }}\n  become: true\n  file: path=/var/www/.dotnet/corefx/cryptography/crls state=directory owner={{ webserver_user }} group={{ webserver_user }} mode=0775\n"
  },
  {
    "path": "ops/roles/supervisor/templates/etc_supervisor_conf.d_app_name.conf.j2",
    "content": "[program:{{ app_name }}]\ncommand=/usr/bin/dotnet {{ deploy_directory }}/api.dll\ndirectory={{ deploy_directory }}\nautostart=true\nautorestart=true\nstderr_logfile={{ error_file }}\nstdout_logfile={{ log_file }}\nenvironment=HOME=/var/www/,ASPNETCORE_ENVIRONMENT=Production\nuser={{ webserver_user }}\nstopsignal=INT\nstopasgroup=true\nkillasgroup=true\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"aspnet.core.react.template\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"postinstall\": \"dotnet restore ./api && dotnet restore ./api.test\",\n    \"build\": \"dotnet build ./api\",\n    \"test:api\": \"cd ./api.test && dotnet test\",\n    \"pretest:client\": \"npx tsc -p ./client-react.test/\",\n    \"test:client\": \"mocha --require ignore-styles --recursive client-react.test/build/client-react.test\",\n    \"test\": \"npm run test:api && npm run test:client\",\n    \"migrate\": \"cd ./api/ && node ../scripts/create-migration.js && dotnet ef database update\",\n    \"prestart\": \"docker-compose up -d\",\n    \"start\": \"concurrently \\\"cd ./api && cross-env NODE_PATH=../node_modules/ ASPNETCORE_ENVIRONMENT=Development dotnet watch run\\\" \\\"cd ./client-react && webpack-dev-server\\\"\",\n    \"start:release\": \"npm run prerelease && cd ./api/bin/Release/netcoreapp2.1/publish/ && dotnet api.dll\",\n    \"provision:prod\": \"ansible-playbook -l production -i ./ops/config.yml ./ops/provision.yml\",\n    \"prerelease\": \"cross-env ASPNETCORE_ENVIRONMENT=Production webpack --config ./client-react/webpack.config.js && cd ./api && dotnet publish --configuration Release\",\n    \"deploy:prod\": \"npm run prerelease && ansible-playbook -l production -i ./ops/config.yml ./ops/deploy.yml\",\n    \"ssh:prod\": \"ssh `grep 'deploy_user=' ./ops/hosts | tail -n1 | awk -F'=' '{ print $2}'`@`awk 'f{print;f=0} /[production]/{f=1}' ./ops/hosts | head -n 1`\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {},\n  \"dependencies\": {\n    \"@types/chai\": \"^4.2.7\",\n    \"@types/enzyme\": \"^3.10.4\",\n    \"@types/enzyme-adapter-react-16\": \"^1.0.5\",\n    \"@types/jsdom\": \"^12.2.4\",\n    \"@types/mocha\": \"^5.2.7\",\n    \"@types/react\": \"^16.9.16\",\n    \"@types/react-addons-test-utils\": \"^0.14.25\",\n    \"@types/react-dom\": \"^16.9.4\",\n    \"@types/react-router-dom\": \"^5.1.3\",\n    \"@types/sinon\": \"7.5.1\",\n    \"aspnet-webpack\": \"^3.0.0\",\n    \"aspnet-webpack-react\": \"^4.0.0\",\n    \"bootstrap\": \"4.4.1\",\n    \"chai\": \"^4.2.0\",\n    \"concurrently\": \"^5.0.1\",\n    \"cross-env\": \"^6.0.3\",\n    \"css-loader\": \"^3.3.2\",\n    \"dom\": \"^0.0.3\",\n    \"enzyme\": \"^3.10.0\",\n    \"enzyme-adapter-react-16\": \"^1.15.1\",\n    \"extendify\": \"^1.0.0\",\n    \"extract-text-webpack-plugin\": \"^3.0.2\",\n    \"file-loader\": \"^5.0.2\",\n    \"global\": \"^4.4.0\",\n    \"html-webpack-plugin\": \"^3.2.0\",\n    \"ignore-styles\": \"^5.0.1\",\n    \"jsdom\": \"^15.2.1\",\n    \"mocha\": \"^6.2.2\",\n    \"prop-types\": \"^15.7.2\",\n    \"react\": \"^16.12.0\",\n    \"react-addons-test-utils\": \"^15.6.2\",\n    \"react-dom\": \"^16.12.0\",\n    \"react-hot-loader\": \"^4.12.18\",\n    \"react-router\": \"^5.1.2\",\n    \"react-router-dom\": \"^5.1.2\",\n    \"sinon\": \"7.5.0\",\n    \"source-map-loader\": \"^0.2.4\",\n    \"style-loader\": \"^1.0.1\",\n    \"stylus\": \"^0.54.7\",\n    \"stylus-loader\": \"^3.0.2\",\n    \"ts-loader\": \"^6.2.1\",\n    \"typescript\": \"^3.7.3\",\n    \"url-loader\": \"^3.0.0\",\n    \"webpack\": \"^4.41.2\",\n    \"webpack-cli\": \"^3.3.10\",\n    \"webpack-dev-middleware\": \"^3.7.2\",\n    \"webpack-dev-server\": \"^3.9.0\",\n    \"webpack-hot-middleware\": \"^2.25.0\",\n    \"whatwg-fetch\": \"^3.0.0\"\n  }\n}\n"
  },
  {
    "path": "scripts/create-migration.js",
    "content": "const timestamp = Math.floor(new Date().getTime()/1000).toString();\nconst execSync = require(\"child_process\").execSync;\nexecSync(`dotnet ef migrations add ${timestamp}`);\n"
  }
]