{"action":"created","comment":{"url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/comments/211774142","pull_request_review_id":148268373,"id":211774142,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTc3NDE0Mg==","diff_hunk":"@@ -0,0 +1,363 @@\n+﻿// Copyright (c) .NET Foundation. All rights reserved.\n+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n+\n+using System;\n+using System.Collections.Generic;\n+using System.Linq;\n+using System.Text;\n+using System.Text.RegularExpressions;\n+using System.Threading;\n+using System.Threading.Tasks;\n+\n+namespace NuGetGallery\n+{\n+    public class TyposquattingCheckService : ITyposquattingCheckService\n+    {\n+        private const char PlaceholderForAlignment = '*';  // This const place holder variable is used for strings alignment \n+\n+        private static readonly HashSet<char> SpecialCharacters = new HashSet<char> { '.', '_', '-' };\n+        private static readonly string SpecialCharactersToString = \"[\" + new string(SpecialCharacters.ToArray()) + \"]\";\n+        \n+        /// <summary>\n+        /// The following dictionary is built through picking up similar characters manually from wiki unicode page.\n+        /// https://en.wikipedia.org/wiki/List_of_Unicode_characters\n+        /// </summary>\n+        private static readonly IReadOnlyDictionary<char, string> SimilarCharacterDictionary = new Dictionary<char, string>()\n+        {\n+            {'a', \"AÀÁÂÃÄÅàáâãäåĀāĂăĄąǍǎǞǟǠǡǺǻȀȁȂȃȦȧȺΆΑάαἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏӐӑӒӓὰάᾀᾁᾂᾃᾄᾅᾆᾇᾈᾊᾋᾌᾍᾎᾏᾰᾱᾲᾳᾴᾶᾷᾸᾹᾺΆᾼАДад\"},\n+            {'b', \"BƀƁƂƃƄƅɃḂḃΒϦЂБВЪЬвъьѢѣҌҍႦႪხҔҕӃӄ\" },\n+            {'c', \"CÇçĆćĈĉĊċČčƇƈȻȼϲϹСсҪҫ𐒨\"},\n+            {'d', \"DÐĎďĐđƉƊƋƌǷḊḋԀԁԂԃ\"},\n+            {'e', \"EÈÉÊËèéêëĒēĔĕĖėĘęĚěȄȅȆȇȨȩɆɇΈΕЀЁЄѐёҼҽҾҿӖӗἘἙἚἛἜἝῈΈЕе\"},\n+            {'f', \"FƑƒḞḟϜϝҒғӺӻ\"},\n+            {'g', \"GĜĝĞğĠġĢģƓǤǥǦǧǴǵԌԍ\"},\n+            {'h', \"HĤĥħǶȞȟΉΗἨἩἪἫἬἭἮἯᾘᾙᾚᾛᾜᾝᾞᾟῊΉῌЋНнћҢңҤҥҺһӇӈӉӊԊԋԦԧԨԩհႬႹ𐒅𐒌𐒎𐒣\"},\n+            {'i', \"I¡ìíîïǐȉȋΐίιϊіїὶίῐῑῒΐῖῗΊΙΪȊȈἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿῘῙῚΊІЇӀӏÌÍÎÏĨĩĪīĬĭĮįİǏ\"},\n+            {'j', \"JĴĵǰȷͿϳЈ\"},\n+            {'k', \"KĶķĸƘƙǨǩΚκϏЌКкќҚқҜҝҞҟҠҡԞԟ\"},\n+            {'l', \"LĹĺĻļĽľĿŀŁłſƖƪȴẛ\"},\n+            {'m', \"MṀṁΜϺϻМмӍӎ𐒄\"},\n+            {'n', \"NÑñŃńŅņŇňŉƝǸǹΝᾐᾑᾒᾓᾔᾕᾖᾗῂῃῄῆῇпԤԥԦԧԮԯ𐒐\"},\n+            {'o', \"OÒÓÔÕÖðòóôõöøŌōŎŏŐőƠơǑǒǪǫǬǭȌȍȎȏȪȫȬȭȮȯȰȱΌΟδοόϘϙὀὁὂὃὄὅὈὉὊὋὌὍὸόῸΌОоӦӧՕჿჾ𐒆𐒠0\"},\n+            {'p', \"PÞþƤƥƿṖṗΡρϷϸῤῥῬРрҎҏႲႼ\"},\n+            {'q', \"QȡɊɋԚԛգႭႳ\"},\n+            {'r', \"RŔŕŖŗŘřƦȐȑȒȓɌɼгѓ\"},\n+            {'s', \"SŚśŜŝŞşŠšȘșȿṠṡЅѕՏႽჽ𐒖𐒡\"},\n+            {'t', \"TŢţŤťŦŧƬƭƮȚțȾṪṫͲͳΤτТтҬҭէ\"},\n+            {'u', \"UÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗμυϋύὐὑὒὓὔὕὖὗὺύῠῡῢΰῦῧՍႮ𐒩\"},\n+            {'v', \"VƔƲνѴѵѶѷ\"},\n+            {'w', \"WŴŵƜẀẁẂẃẄẅωώШЩшщѡѿὠὡὢὣὤὥὦὧὼώᾠᾡᾢᾣᾤᾥᾦᾧῲῳῴῶῷԜԝ\"},\n+            {'x', \"X×ΧχХхҲҳӼӽӾӿჯ\"},\n+            {'y', \"YÝýÿŶŷŸƳƴȲȳɎɏỲỳΎΥΫγϒϓϔЎУЧуўҮүҶҷҸҹӋӌӮӯӰӱӲӳӴӵὙὛὝὟῨῩῪΎႯႸ𐒋𐒦\"},\n+            {'z', \"ZŹźŻżŽžƵƶȤȥΖჍ\"},\n+            {'3', \"ƷǮǯȜȝʒЗзэӞӟӠӡჳ\"},\n+            {'8', \"Ȣȣ\"},\n+            {'_', \".-\" }\n+        };\n+        private static readonly IReadOnlyDictionary<char, char> NormalizedMappingDictionary = GetNormalizedMappingDictionary(SimilarCharacterDictionary);\n+\n+        private readonly ITyposquattingUserService _userTyposquattingService;\n+\n+        // TODO: Threshold parameters will be saved in the configuration file.\n+        // https://github.com/NuGet/Engineering/issues/1645\n+        private static List<ThresholdInfo> _thresholdsList = new List<ThresholdInfo>\n+        {\n+            new ThresholdInfo { LowerBound = 0, UpperBound = 30, Threshold = 0 },\n+            new ThresholdInfo { LowerBound = 30, UpperBound = 50, Threshold = 1 },\n+            new ThresholdInfo { LowerBound = 50, UpperBound = 120, Threshold = 2 }\n+        };\n+\n+        // TODO: popular packages checklist will be implemented\n+        // https://github.com/NuGet/Engineering/issues/1624\n+        public static List<PackageInfo> PackagesCheckList { get; set; }\n+\n+        private class BasicEditDistanceInfo\n+        {\n+            public int Distance { get; set; }\n+            public PathInfo[,] Path { get; set; }\n+        }\n+               \n+        private enum PathInfo\n+        {\n+            Match,\n+            Delete,\n+            Substitute,\n+            Insert,\n+        }   \n+        \n+        public TyposquattingCheckService(ITyposquattingUserService typosquattingUserService) \n+        {\n+            _userTyposquattingService = typosquattingUserService ?? throw new ArgumentNullException(nameof(typosquattingUserService));\n+        }\n+\n+        private static Dictionary<char, char> GetNormalizedMappingDictionary(IReadOnlyDictionary<char, string> similarCharacterDictionary)\n+        {\n+            var normalizedMappingDictionary = new Dictionary<char, char>();\n+            foreach (var item in similarCharacterDictionary)\n+            {\n+                foreach(char c in item.Value)\n+                {\n+                    normalizedMappingDictionary[c] = item.Key;\n+                }\n+            }\n+\n+            return normalizedMappingDictionary;\n+        }\n+\n+        private static int GetThreshold(string packageId)\n+        {\n+            foreach (var thresholdInfo in _thresholdsList)\n+            {\n+                if (packageId.Length >= thresholdInfo.LowerBound && packageId.Length < thresholdInfo.UpperBound)\n+                {\n+                    return thresholdInfo.Threshold;\n+                }\n+            }\n+\n+            throw new ArgumentException(\"There is no predefined typo-squatting threshold for this package Id!\");\n+        }\n+\n+        private static string NormalizeString(string str)\n+        {\n+            var normalizedStr = new StringBuilder(str);\n+            for (int i = 0; i < normalizedStr.Length; i++)\n+            {\n+                if (NormalizedMappingDictionary.TryGetValue(normalizedStr[i], out var normalizedCharacter))\n+                {\n+                    normalizedStr[i] = normalizedCharacter;\n+                }\n+            }\n+            \n+            return normalizedStr.ToString();\n+        }\n+\n+        public bool IsUploadedPackageIdTyposquatting(string uploadedPackageId, User uploadedPackageOwner)","path":"src/NuGetGallery/Services/TyposquattingCheckService.cs","position":134,"original_position":134,"commit_id":"6c5e7409a975a83138e24bd058b627bf097ff024","original_commit_id":"d7aeed3ead6a05a999f2f1af437dd34e2881171a","user":{"login":"zhhyu","id":41028779,"node_id":"MDQ6VXNlcjQxMDI4Nzc5","avatar_url":"https://avatars3.githubusercontent.com/u/41028779?v=4","gravatar_id":"","url":"https://api.github.com/users/zhhyu","html_url":"https://github.com/zhhyu","followers_url":"https://api.github.com/users/zhhyu/followers","following_url":"https://api.github.com/users/zhhyu/following{/other_user}","gists_url":"https://api.github.com/users/zhhyu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhhyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhhyu/subscriptions","organizations_url":"https://api.github.com/users/zhhyu/orgs","repos_url":"https://api.github.com/users/zhhyu/repos","events_url":"https://api.github.com/users/zhhyu/events{/privacy}","received_events_url":"https://api.github.com/users/zhhyu/received_events","type":"User","site_admin":false},"body":"Null check for owner and test case have been added. ","created_at":"2018-08-21T22:00:52Z","updated_at":"2018-08-21T22:00:52Z","html_url":"https://github.com/NuGet/NuGetGallery/pull/6315#discussion_r211774142","pull_request_url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/comments/211774142"},"html":{"href":"https://github.com/NuGet/NuGetGallery/pull/6315#discussion_r211774142"},"pull_request":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315"}},"in_reply_to_id":211762505},"pull_request":{"url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315","id":208623257,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA4NjIzMjU3","html_url":"https://github.com/NuGet/NuGetGallery/pull/6315","diff_url":"https://github.com/NuGet/NuGetGallery/pull/6315.diff","patch_url":"https://github.com/NuGet/NuGetGallery/pull/6315.patch","issue_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues/6315","number":6315,"state":"open","locked":false,"title":"Typosquatting: add typosquatting check service codes ","user":{"login":"zhhyu","id":41028779,"node_id":"MDQ6VXNlcjQxMDI4Nzc5","avatar_url":"https://avatars3.githubusercontent.com/u/41028779?v=4","gravatar_id":"","url":"https://api.github.com/users/zhhyu","html_url":"https://github.com/zhhyu","followers_url":"https://api.github.com/users/zhhyu/followers","following_url":"https://api.github.com/users/zhhyu/following{/other_user}","gists_url":"https://api.github.com/users/zhhyu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhhyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhhyu/subscriptions","organizations_url":"https://api.github.com/users/zhhyu/orgs","repos_url":"https://api.github.com/users/zhhyu/repos","events_url":"https://api.github.com/users/zhhyu/events{/privacy}","received_events_url":"https://api.github.com/users/zhhyu/received_events","type":"User","site_admin":false},"body":"1. Typosquatting check service with distance calculation and comparison; \r\n2. Normalize the string before checking;\r\n3. Call `public bool IsDistanceLessThanThreshold(string str1, string str2, int threshold)` to compare two strings; (changed to private)\r\n4. Call `public bool IsUploadedPackageIdTyposquatting(string uploadedPackageId)` to check typosquatting in the checlist.\r\n\r\nFixes: https://github.com/NuGet/Engineering/issues/1593","created_at":"2018-08-15T17:10:38Z","updated_at":"2018-08-21T22:00:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ca29b5514dd1b5fdb2ab467ec985653bbad9a669","assignee":{"login":"zhhyu","id":41028779,"node_id":"MDQ6VXNlcjQxMDI4Nzc5","avatar_url":"https://avatars3.githubusercontent.com/u/41028779?v=4","gravatar_id":"","url":"https://api.github.com/users/zhhyu","html_url":"https://github.com/zhhyu","followers_url":"https://api.github.com/users/zhhyu/followers","following_url":"https://api.github.com/users/zhhyu/following{/other_user}","gists_url":"https://api.github.com/users/zhhyu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhhyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhhyu/subscriptions","organizations_url":"https://api.github.com/users/zhhyu/orgs","repos_url":"https://api.github.com/users/zhhyu/repos","events_url":"https://api.github.com/users/zhhyu/events{/privacy}","received_events_url":"https://api.github.com/users/zhhyu/received_events","type":"User","site_admin":false},"assignees":[{"login":"zhhyu","id":41028779,"node_id":"MDQ6VXNlcjQxMDI4Nzc5","avatar_url":"https://avatars3.githubusercontent.com/u/41028779?v=4","gravatar_id":"","url":"https://api.github.com/users/zhhyu","html_url":"https://github.com/zhhyu","followers_url":"https://api.github.com/users/zhhyu/followers","following_url":"https://api.github.com/users/zhhyu/following{/other_user}","gists_url":"https://api.github.com/users/zhhyu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhhyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhhyu/subscriptions","organizations_url":"https://api.github.com/users/zhhyu/orgs","repos_url":"https://api.github.com/users/zhhyu/repos","events_url":"https://api.github.com/users/zhhyu/events{/privacy}","received_events_url":"https://api.github.com/users/zhhyu/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"agr","id":102933,"node_id":"MDQ6VXNlcjEwMjkzMw==","avatar_url":"https://avatars1.githubusercontent.com/u/102933?v=4","gravatar_id":"","url":"https://api.github.com/users/agr","html_url":"https://github.com/agr","followers_url":"https://api.github.com/users/agr/followers","following_url":"https://api.github.com/users/agr/following{/other_user}","gists_url":"https://api.github.com/users/agr/gists{/gist_id}","starred_url":"https://api.github.com/users/agr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agr/subscriptions","organizations_url":"https://api.github.com/users/agr/orgs","repos_url":"https://api.github.com/users/agr/repos","events_url":"https://api.github.com/users/agr/events{/privacy}","received_events_url":"https://api.github.com/users/agr/received_events","type":"User","site_admin":false},{"login":"xavierdecoster","id":880728,"node_id":"MDQ6VXNlcjg4MDcyOA==","avatar_url":"https://avatars3.githubusercontent.com/u/880728?v=4","gravatar_id":"","url":"https://api.github.com/users/xavierdecoster","html_url":"https://github.com/xavierdecoster","followers_url":"https://api.github.com/users/xavierdecoster/followers","following_url":"https://api.github.com/users/xavierdecoster/following{/other_user}","gists_url":"https://api.github.com/users/xavierdecoster/gists{/gist_id}","starred_url":"https://api.github.com/users/xavierdecoster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xavierdecoster/subscriptions","organizations_url":"https://api.github.com/users/xavierdecoster/orgs","repos_url":"https://api.github.com/users/xavierdecoster/repos","events_url":"https://api.github.com/users/xavierdecoster/events{/privacy}","received_events_url":"https://api.github.com/users/xavierdecoster/received_events","type":"User","site_admin":false},{"login":"zivkan","id":5030577,"node_id":"MDQ6VXNlcjUwMzA1Nzc=","avatar_url":"https://avatars3.githubusercontent.com/u/5030577?v=4","gravatar_id":"","url":"https://api.github.com/users/zivkan","html_url":"https://github.com/zivkan","followers_url":"https://api.github.com/users/zivkan/followers","following_url":"https://api.github.com/users/zivkan/following{/other_user}","gists_url":"https://api.github.com/users/zivkan/gists{/gist_id}","starred_url":"https://api.github.com/users/zivkan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zivkan/subscriptions","organizations_url":"https://api.github.com/users/zivkan/orgs","repos_url":"https://api.github.com/users/zivkan/repos","events_url":"https://api.github.com/users/zivkan/events{/privacy}","received_events_url":"https://api.github.com/users/zivkan/received_events","type":"User","site_admin":false},{"login":"ryuyu","id":11051729,"node_id":"MDQ6VXNlcjExMDUxNzI5","avatar_url":"https://avatars2.githubusercontent.com/u/11051729?v=4","gravatar_id":"","url":"https://api.github.com/users/ryuyu","html_url":"https://github.com/ryuyu","followers_url":"https://api.github.com/users/ryuyu/followers","following_url":"https://api.github.com/users/ryuyu/following{/other_user}","gists_url":"https://api.github.com/users/ryuyu/gists{/gist_id}","starred_url":"https://api.github.com/users/ryuyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryuyu/subscriptions","organizations_url":"https://api.github.com/users/ryuyu/orgs","repos_url":"https://api.github.com/users/ryuyu/repos","events_url":"https://api.github.com/users/ryuyu/events{/privacy}","received_events_url":"https://api.github.com/users/ryuyu/received_events","type":"User","site_admin":false},{"login":"dtivel","id":12734758,"node_id":"MDQ6VXNlcjEyNzM0NzU4","avatar_url":"https://avatars0.githubusercontent.com/u/12734758?v=4","gravatar_id":"","url":"https://api.github.com/users/dtivel","html_url":"https://github.com/dtivel","followers_url":"https://api.github.com/users/dtivel/followers","following_url":"https://api.github.com/users/dtivel/following{/other_user}","gists_url":"https://api.github.com/users/dtivel/gists{/gist_id}","starred_url":"https://api.github.com/users/dtivel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dtivel/subscriptions","organizations_url":"https://api.github.com/users/dtivel/orgs","repos_url":"https://api.github.com/users/dtivel/repos","events_url":"https://api.github.com/users/dtivel/events{/privacy}","received_events_url":"https://api.github.com/users/dtivel/received_events","type":"User","site_admin":false},{"login":"chenriksson","id":15364949,"node_id":"MDQ6VXNlcjE1MzY0OTQ5","avatar_url":"https://avatars2.githubusercontent.com/u/15364949?v=4","gravatar_id":"","url":"https://api.github.com/users/chenriksson","html_url":"https://github.com/chenriksson","followers_url":"https://api.github.com/users/chenriksson/followers","following_url":"https://api.github.com/users/chenriksson/following{/other_user}","gists_url":"https://api.github.com/users/chenriksson/gists{/gist_id}","starred_url":"https://api.github.com/users/chenriksson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chenriksson/subscriptions","organizations_url":"https://api.github.com/users/chenriksson/orgs","repos_url":"https://api.github.com/users/chenriksson/repos","events_url":"https://api.github.com/users/chenriksson/events{/privacy}","received_events_url":"https://api.github.com/users/chenriksson/received_events","type":"User","site_admin":false},{"login":"cristinamanum","id":16580006,"node_id":"MDQ6VXNlcjE2NTgwMDA2","avatar_url":"https://avatars0.githubusercontent.com/u/16580006?v=4","gravatar_id":"","url":"https://api.github.com/users/cristinamanum","html_url":"https://github.com/cristinamanum","followers_url":"https://api.github.com/users/cristinamanum/followers","following_url":"https://api.github.com/users/cristinamanum/following{/other_user}","gists_url":"https://api.github.com/users/cristinamanum/gists{/gist_id}","starred_url":"https://api.github.com/users/cristinamanum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cristinamanum/subscriptions","organizations_url":"https://api.github.com/users/cristinamanum/orgs","repos_url":"https://api.github.com/users/cristinamanum/repos","events_url":"https://api.github.com/users/cristinamanum/events{/privacy}","received_events_url":"https://api.github.com/users/cristinamanum/received_events","type":"User","site_admin":false},{"login":"scottbommarito","id":18014088,"node_id":"MDQ6VXNlcjE4MDE0MDg4","avatar_url":"https://avatars3.githubusercontent.com/u/18014088?v=4","gravatar_id":"","url":"https://api.github.com/users/scottbommarito","html_url":"https://github.com/scottbommarito","followers_url":"https://api.github.com/users/scottbommarito/followers","following_url":"https://api.github.com/users/scottbommarito/following{/other_user}","gists_url":"https://api.github.com/users/scottbommarito/gists{/gist_id}","starred_url":"https://api.github.com/users/scottbommarito/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scottbommarito/subscriptions","organizations_url":"https://api.github.com/users/scottbommarito/orgs","repos_url":"https://api.github.com/users/scottbommarito/repos","events_url":"https://api.github.com/users/scottbommarito/events{/privacy}","received_events_url":"https://api.github.com/users/scottbommarito/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":464979525,"node_id":"MDU6TGFiZWw0NjQ5Nzk1MjU=","url":"https://api.github.com/repos/NuGet/NuGetGallery/labels/Area:%20Security","name":"Area: Security","color":"fef2c0","default":false}],"milestone":{"url":"https://api.github.com/repos/NuGet/NuGetGallery/milestones/111","html_url":"https://github.com/NuGet/NuGetGallery/milestone/111","labels_url":"https://api.github.com/repos/NuGet/NuGetGallery/milestones/111/labels","id":3528509,"node_id":"MDk6TWlsZXN0b25lMzUyODUwOQ==","number":111,"title":"S140 - 2018.08.13","description":"","creator":{"login":"skofman1","id":16807822,"node_id":"MDQ6VXNlcjE2ODA3ODIy","avatar_url":"https://avatars1.githubusercontent.com/u/16807822?v=4","gravatar_id":"","url":"https://api.github.com/users/skofman1","html_url":"https://github.com/skofman1","followers_url":"https://api.github.com/users/skofman1/followers","following_url":"https://api.github.com/users/skofman1/following{/other_user}","gists_url":"https://api.github.com/users/skofman1/gists{/gist_id}","starred_url":"https://api.github.com/users/skofman1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skofman1/subscriptions","organizations_url":"https://api.github.com/users/skofman1/orgs","repos_url":"https://api.github.com/users/skofman1/repos","events_url":"https://api.github.com/users/skofman1/events{/privacy}","received_events_url":"https://api.github.com/users/skofman1/received_events","type":"User","site_admin":false},"open_issues":32,"closed_issues":19,"state":"open","created_at":"2018-07-27T16:58:25Z","updated_at":"2018-08-20T21:51:36Z","due_on":"2018-08-31T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315/commits","review_comments_url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315/comments","review_comment_url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues/6315/comments","statuses_url":"https://api.github.com/repos/NuGet/NuGetGallery/statuses/6c5e7409a975a83138e24bd058b627bf097ff024","head":{"label":"NuGet:typo-squatting","ref":"typo-squatting","sha":"6c5e7409a975a83138e24bd058b627bf097ff024","user":{"login":"NuGet","id":968310,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk2ODMxMA==","avatar_url":"https://avatars2.githubusercontent.com/u/968310?v=4","gravatar_id":"","url":"https://api.github.com/users/NuGet","html_url":"https://github.com/NuGet","followers_url":"https://api.github.com/users/NuGet/followers","following_url":"https://api.github.com/users/NuGet/following{/other_user}","gists_url":"https://api.github.com/users/NuGet/gists{/gist_id}","starred_url":"https://api.github.com/users/NuGet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NuGet/subscriptions","organizations_url":"https://api.github.com/users/NuGet/orgs","repos_url":"https://api.github.com/users/NuGet/repos","events_url":"https://api.github.com/users/NuGet/events{/privacy}","received_events_url":"https://api.github.com/users/NuGet/received_events","type":"Organization","site_admin":false},"repo":{"id":2180736,"node_id":"MDEwOlJlcG9zaXRvcnkyMTgwNzM2","name":"NuGetGallery","full_name":"NuGet/NuGetGallery","owner":{"login":"NuGet","id":968310,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk2ODMxMA==","avatar_url":"https://avatars2.githubusercontent.com/u/968310?v=4","gravatar_id":"","url":"https://api.github.com/users/NuGet","html_url":"https://github.com/NuGet","followers_url":"https://api.github.com/users/NuGet/followers","following_url":"https://api.github.com/users/NuGet/following{/other_user}","gists_url":"https://api.github.com/users/NuGet/gists{/gist_id}","starred_url":"https://api.github.com/users/NuGet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NuGet/subscriptions","organizations_url":"https://api.github.com/users/NuGet/orgs","repos_url":"https://api.github.com/users/NuGet/repos","events_url":"https://api.github.com/users/NuGet/events{/privacy}","received_events_url":"https://api.github.com/users/NuGet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NuGet/NuGetGallery","description":"The NuGet Gallery","fork":false,"url":"https://api.github.com/repos/NuGet/NuGetGallery","forks_url":"https://api.github.com/repos/NuGet/NuGetGallery/forks","keys_url":"https://api.github.com/repos/NuGet/NuGetGallery/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NuGet/NuGetGallery/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NuGet/NuGetGallery/teams","hooks_url":"https://api.github.com/repos/NuGet/NuGetGallery/hooks","issue_events_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues/events{/number}","events_url":"https://api.github.com/repos/NuGet/NuGetGallery/events","assignees_url":"https://api.github.com/repos/NuGet/NuGetGallery/assignees{/user}","branches_url":"https://api.github.com/repos/NuGet/NuGetGallery/branches{/branch}","tags_url":"https://api.github.com/repos/NuGet/NuGetGallery/tags","blobs_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/refs{/sha}","trees_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NuGet/NuGetGallery/statuses/{sha}","languages_url":"https://api.github.com/repos/NuGet/NuGetGallery/languages","stargazers_url":"https://api.github.com/repos/NuGet/NuGetGallery/stargazers","contributors_url":"https://api.github.com/repos/NuGet/NuGetGallery/contributors","subscribers_url":"https://api.github.com/repos/NuGet/NuGetGallery/subscribers","subscription_url":"https://api.github.com/repos/NuGet/NuGetGallery/subscription","commits_url":"https://api.github.com/repos/NuGet/NuGetGallery/commits{/sha}","git_commits_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/commits{/sha}","comments_url":"https://api.github.com/repos/NuGet/NuGetGallery/comments{/number}","issue_comment_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues/comments{/number}","contents_url":"https://api.github.com/repos/NuGet/NuGetGallery/contents/{+path}","compare_url":"https://api.github.com/repos/NuGet/NuGetGallery/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NuGet/NuGetGallery/merges","archive_url":"https://api.github.com/repos/NuGet/NuGetGallery/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NuGet/NuGetGallery/downloads","issues_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues{/number}","pulls_url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls{/number}","milestones_url":"https://api.github.com/repos/NuGet/NuGetGallery/milestones{/number}","notifications_url":"https://api.github.com/repos/NuGet/NuGetGallery/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NuGet/NuGetGallery/labels{/name}","releases_url":"https://api.github.com/repos/NuGet/NuGetGallery/releases{/id}","deployments_url":"https://api.github.com/repos/NuGet/NuGetGallery/deployments","created_at":"2011-08-09T17:57:32Z","updated_at":"2018-08-20T21:51:39Z","pushed_at":"2018-08-21T21:58:05Z","git_url":"git://github.com/NuGet/NuGetGallery.git","ssh_url":"git@github.com:NuGet/NuGetGallery.git","clone_url":"https://github.com/NuGet/NuGetGallery.git","svn_url":"https://github.com/NuGet/NuGetGallery","homepage":"https://www.nuget.org","size":50489,"stargazers_count":1028,"watchers_count":1028,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":553,"mirror_url":null,"archived":false,"open_issues_count":560,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":553,"open_issues":560,"watchers":1028,"default_branch":"master"}},"base":{"label":"NuGet:dev","ref":"dev","sha":"e5bc4fbd03efdb612e7f1851edc4508d57d2f2b7","user":{"login":"NuGet","id":968310,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk2ODMxMA==","avatar_url":"https://avatars2.githubusercontent.com/u/968310?v=4","gravatar_id":"","url":"https://api.github.com/users/NuGet","html_url":"https://github.com/NuGet","followers_url":"https://api.github.com/users/NuGet/followers","following_url":"https://api.github.com/users/NuGet/following{/other_user}","gists_url":"https://api.github.com/users/NuGet/gists{/gist_id}","starred_url":"https://api.github.com/users/NuGet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NuGet/subscriptions","organizations_url":"https://api.github.com/users/NuGet/orgs","repos_url":"https://api.github.com/users/NuGet/repos","events_url":"https://api.github.com/users/NuGet/events{/privacy}","received_events_url":"https://api.github.com/users/NuGet/received_events","type":"Organization","site_admin":false},"repo":{"id":2180736,"node_id":"MDEwOlJlcG9zaXRvcnkyMTgwNzM2","name":"NuGetGallery","full_name":"NuGet/NuGetGallery","owner":{"login":"NuGet","id":968310,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk2ODMxMA==","avatar_url":"https://avatars2.githubusercontent.com/u/968310?v=4","gravatar_id":"","url":"https://api.github.com/users/NuGet","html_url":"https://github.com/NuGet","followers_url":"https://api.github.com/users/NuGet/followers","following_url":"https://api.github.com/users/NuGet/following{/other_user}","gists_url":"https://api.github.com/users/NuGet/gists{/gist_id}","starred_url":"https://api.github.com/users/NuGet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NuGet/subscriptions","organizations_url":"https://api.github.com/users/NuGet/orgs","repos_url":"https://api.github.com/users/NuGet/repos","events_url":"https://api.github.com/users/NuGet/events{/privacy}","received_events_url":"https://api.github.com/users/NuGet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NuGet/NuGetGallery","description":"The NuGet Gallery","fork":false,"url":"https://api.github.com/repos/NuGet/NuGetGallery","forks_url":"https://api.github.com/repos/NuGet/NuGetGallery/forks","keys_url":"https://api.github.com/repos/NuGet/NuGetGallery/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NuGet/NuGetGallery/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NuGet/NuGetGallery/teams","hooks_url":"https://api.github.com/repos/NuGet/NuGetGallery/hooks","issue_events_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues/events{/number}","events_url":"https://api.github.com/repos/NuGet/NuGetGallery/events","assignees_url":"https://api.github.com/repos/NuGet/NuGetGallery/assignees{/user}","branches_url":"https://api.github.com/repos/NuGet/NuGetGallery/branches{/branch}","tags_url":"https://api.github.com/repos/NuGet/NuGetGallery/tags","blobs_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/refs{/sha}","trees_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NuGet/NuGetGallery/statuses/{sha}","languages_url":"https://api.github.com/repos/NuGet/NuGetGallery/languages","stargazers_url":"https://api.github.com/repos/NuGet/NuGetGallery/stargazers","contributors_url":"https://api.github.com/repos/NuGet/NuGetGallery/contributors","subscribers_url":"https://api.github.com/repos/NuGet/NuGetGallery/subscribers","subscription_url":"https://api.github.com/repos/NuGet/NuGetGallery/subscription","commits_url":"https://api.github.com/repos/NuGet/NuGetGallery/commits{/sha}","git_commits_url":"https://api.github.com/repos/NuGet/NuGetGallery/git/commits{/sha}","comments_url":"https://api.github.com/repos/NuGet/NuGetGallery/comments{/number}","issue_comment_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues/comments{/number}","contents_url":"https://api.github.com/repos/NuGet/NuGetGallery/contents/{+path}","compare_url":"https://api.github.com/repos/NuGet/NuGetGallery/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NuGet/NuGetGallery/merges","archive_url":"https://api.github.com/repos/NuGet/NuGetGallery/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NuGet/NuGetGallery/downloads","issues_url":"https://api.github.com/repos/NuGet/NuGetGallery/issues{/number}","pulls_url":"https://api.github.com/repos/NuGet/NuGetGallery/pulls{/number}","milestones_url":"https://api.github.com/repos/NuGet/NuGetGallery/milestones{/number}","notifications_url":"https://api.github.com/repos/NuGet/NuGetGallery/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NuGet/NuGetGallery/labels{/name}","releases_url":"https://api.github.com/repos/NuGet/NuGetGallery/releases{/id}","deployments_url":"https://api.github.com/repos/NuGet/NuGetGallery/deployments","created_at":"2011-08-09T17:57:32Z","updated_at":"2018-08-20T21:51:39Z","pushed_at":"2018-08-21T21:58:05Z","git_url":"git://github.com/NuGet/NuGetGallery.git","ssh_url":"git@github.com:NuGet/NuGetGallery.git","clone_url":"https://github.com/NuGet/NuGetGallery.git","svn_url":"https://github.com/NuGet/NuGetGallery","homepage":"https://www.nuget.org","size":50489,"stargazers_count":1028,"watchers_count":1028,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":553,"mirror_url":null,"archived":false,"open_issues_count":560,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":553,"open_issues":560,"watchers":1028,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315"},"html":{"href":"https://github.com/NuGet/NuGetGallery/pull/6315"},"issue":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/issues/6315"},"comments":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/issues/6315/comments"},"review_comments":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315/comments"},"review_comment":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/pulls/6315/commits"},"statuses":{"href":"https://api.github.com/repos/NuGet/NuGetGallery/statuses/6c5e7409a975a83138e24bd058b627bf097ff024"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"zhhyu"}}