From 2a37a7657ce89658d329a30a3bcce06035a4eb26 Mon Sep 17 00:00:00 2001 From: Prashant Cholachagudda Date: Thu, 17 Mar 2022 15:43:02 +0530 Subject: [PATCH 1/7] initial commit --- SearchScorer/.gitignore | 232 ++++++++++++++ SearchScorer/Common/Bucket.cs | 16 + SearchScorer/Common/ConsoleUtility.cs | 14 + .../Common/CuratedSearchQueriesCsvReader.cs | 153 +++++++++ SearchScorer/Common/CuratedSearchQuery.cs | 16 + SearchScorer/Common/FeedbackDisposition.cs | 11 + .../Common/FeedbackQueriesCsvReader.cs | 111 +++++++ SearchScorer/Common/FeedbackSearchQuery.cs | 32 ++ SearchScorer/Common/GitHubRepository.cs | 24 ++ SearchScorer/Common/GitHubUsageCsvWriter.cs | 34 ++ SearchScorer/Common/GitHubUsageJsonReader.cs | 19 ++ ...GoogleAnalyticsSearchReferralsCsvReader.cs | 66 ++++ .../Common/HashedSearchQueryCsvWriter.cs | 47 +++ SearchScorer/Common/Hasher.cs | 31 ++ .../Common/PackageIdPatternValidator.cs | 107 +++++++ SearchScorer/Common/SearchClient.cs | 65 ++++ SearchScorer/Common/SearchProbesCsvWriter.cs | 42 +++ SearchScorer/Common/SearchQuerySource.cs | 15 + .../Common/SearchQueryWithSelections.cs | 16 + SearchScorer/Common/SearchResponse.cs | 10 + SearchScorer/Common/SearchResult.cs | 8 + SearchScorer/Common/SearchResultDebug.cs | 8 + .../Common/SearchResultDebugDocument.cs | 7 + SearchScorer/Common/SearchSelectionCount.cs | 14 + .../Common/SearchServiceClientExtensions.cs | 77 +++++ .../Common/TopClientSearchQueriesCsvReader.cs | 54 ++++ .../Common/TopSearchQueriesCsvReader.cs | 81 +++++ .../Common/TopSearchSelectionsCsvReader.cs | 63 ++++ .../Common/TopSearchSelectionsV2CsvWriter.cs | 45 +++ .../Common/TopV3SearchQueriesCsvReader.cs | 53 ++++ SearchScorer/Common/WildcardUtility.cs | 36 +++ .../NormalizedDiscountedCumulativeGain.cs | 123 ++++++++ SearchScorer/IREvalutation/RelevancyReport.cs | 14 + .../IREvalutation/RelevancyScoreBuilder.cs | 130 ++++++++ .../IREvalutation/RelevancyScoreEvaluator.cs | 294 ++++++++++++++++++ .../IREvalutation/RelevancyScoreResult.cs | 31 ++ .../IREvalutation/SearchQueriesReport.cs | 16 + .../SearchQueryRelevancyScores.cs | 29 ++ SearchScorer/IREvalutation/VariantReport.cs | 21 ++ .../WeightedRelevancyScoreResult.cs | 15 + SearchScorer/Program.cs | 2 + SearchScorer/SearchScorer.csproj | 23 ++ SearchScorer/SearchScorerSettings.cs | 32 ++ 43 files changed, 2237 insertions(+) create mode 100644 SearchScorer/.gitignore create mode 100644 SearchScorer/Common/Bucket.cs create mode 100644 SearchScorer/Common/ConsoleUtility.cs create mode 100644 SearchScorer/Common/CuratedSearchQueriesCsvReader.cs create mode 100644 SearchScorer/Common/CuratedSearchQuery.cs create mode 100644 SearchScorer/Common/FeedbackDisposition.cs create mode 100644 SearchScorer/Common/FeedbackQueriesCsvReader.cs create mode 100644 SearchScorer/Common/FeedbackSearchQuery.cs create mode 100644 SearchScorer/Common/GitHubRepository.cs create mode 100644 SearchScorer/Common/GitHubUsageCsvWriter.cs create mode 100644 SearchScorer/Common/GitHubUsageJsonReader.cs create mode 100644 SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs create mode 100644 SearchScorer/Common/HashedSearchQueryCsvWriter.cs create mode 100644 SearchScorer/Common/Hasher.cs create mode 100644 SearchScorer/Common/PackageIdPatternValidator.cs create mode 100644 SearchScorer/Common/SearchClient.cs create mode 100644 SearchScorer/Common/SearchProbesCsvWriter.cs create mode 100644 SearchScorer/Common/SearchQuerySource.cs create mode 100644 SearchScorer/Common/SearchQueryWithSelections.cs create mode 100644 SearchScorer/Common/SearchResponse.cs create mode 100644 SearchScorer/Common/SearchResult.cs create mode 100644 SearchScorer/Common/SearchResultDebug.cs create mode 100644 SearchScorer/Common/SearchResultDebugDocument.cs create mode 100644 SearchScorer/Common/SearchSelectionCount.cs create mode 100644 SearchScorer/Common/SearchServiceClientExtensions.cs create mode 100644 SearchScorer/Common/TopClientSearchQueriesCsvReader.cs create mode 100644 SearchScorer/Common/TopSearchQueriesCsvReader.cs create mode 100644 SearchScorer/Common/TopSearchSelectionsCsvReader.cs create mode 100644 SearchScorer/Common/TopSearchSelectionsV2CsvWriter.cs create mode 100644 SearchScorer/Common/TopV3SearchQueriesCsvReader.cs create mode 100644 SearchScorer/Common/WildcardUtility.cs create mode 100644 SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs create mode 100644 SearchScorer/IREvalutation/RelevancyReport.cs create mode 100644 SearchScorer/IREvalutation/RelevancyScoreBuilder.cs create mode 100644 SearchScorer/IREvalutation/RelevancyScoreEvaluator.cs create mode 100644 SearchScorer/IREvalutation/RelevancyScoreResult.cs create mode 100644 SearchScorer/IREvalutation/SearchQueriesReport.cs create mode 100644 SearchScorer/IREvalutation/SearchQueryRelevancyScores.cs create mode 100644 SearchScorer/IREvalutation/VariantReport.cs create mode 100644 SearchScorer/IREvalutation/WeightedRelevancyScoreResult.cs create mode 100644 SearchScorer/Program.cs create mode 100644 SearchScorer/SearchScorer.csproj create mode 100644 SearchScorer/SearchScorerSettings.cs diff --git a/SearchScorer/.gitignore b/SearchScorer/.gitignore new file mode 100644 index 0000000..f9377d5 --- /dev/null +++ b/SearchScorer/.gitignore @@ -0,0 +1,232 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ +/wwwroot/dist/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ \ No newline at end of file diff --git a/SearchScorer/Common/Bucket.cs b/SearchScorer/Common/Bucket.cs new file mode 100644 index 0000000..964c18e --- /dev/null +++ b/SearchScorer/Common/Bucket.cs @@ -0,0 +1,16 @@ +namespace SearchScorer.Common +{ + public enum Bucket + { + Acronym, + Author, + CommonName, + ExactMatch, + Freshness, + MultiTerm, + PartialId, + Prefix, + Tags, + TopDownloads, + } +} diff --git a/SearchScorer/Common/ConsoleUtility.cs b/SearchScorer/Common/ConsoleUtility.cs new file mode 100644 index 0000000..9a7dd65 --- /dev/null +++ b/SearchScorer/Common/ConsoleUtility.cs @@ -0,0 +1,14 @@ +using System; + +namespace SearchScorer.Common +{ + public static class ConsoleUtility + { + public static void WriteHeading(string heading, char fence) + { + Console.WriteLine(); + Console.WriteLine(heading); + Console.WriteLine(new string(fence, heading.Length)); + } + } +} diff --git a/SearchScorer/Common/CuratedSearchQueriesCsvReader.cs b/SearchScorer/Common/CuratedSearchQueriesCsvReader.cs new file mode 100644 index 0000000..7c23b13 --- /dev/null +++ b/SearchScorer/Common/CuratedSearchQueriesCsvReader.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CsvHelper; +using SearchScorer.IREvalutation; + +namespace SearchScorer.Common +{ + public static class CuratedSearchQueriesCsvReader + { + public static IReadOnlyList Read(string path, string fallbackDataPath) + { + var directData = Read(path, includeEmpty: true); + var fallbackData = Read(fallbackDataPath, includeEmpty: false); + var searchQueryToFallback = fallbackData.ToDictionary(x => x.SearchQuery, x => x); + + var data = new List(); + foreach (var query in directData) + { + if (query.PackageIdToScore.Any()) + { + data.Add(query); + } + else + { + if (searchQueryToFallback.TryGetValue(query.SearchQuery, out var fallback)) + { + data.Add(fallback); + } + else + { + WarnEmpty(query.SearchQuery); + } + } + } + + return data; + } + + public static IReadOnlyList Read(string path) + { + return Read(path, includeEmpty: false); + } + + private static IReadOnlyList Read(string path, bool includeEmpty) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + var existingScores = new Dictionary>(); + + var output = new List(); + int lineNumber = 1; // The header is read automatically + foreach (var record in csvReader.GetRecords()) + { + lineNumber++; + + var searchQuery = record.SearchQuery.Trim(); + if (existingScores.ContainsKey(searchQuery)) + { + throw new InvalidOperationException($"The search query '{searchQuery}' is a duplicate in file, line {lineNumber}: {path}"); + } + + var pairs = new[] + { + new { PackageId = record.ID0, Score = record.S0 }, + new { PackageId = record.ID1, Score = record.S1 }, + new { PackageId = record.ID2, Score = record.S2 }, + new { PackageId = record.ID3, Score = record.S3 }, + new { PackageId = record.ID4, Score = record.S4 }, + }; + + var packageIdToScore = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var pair in pairs) + { + var packageId = pair.PackageId?.Trim(); + if (!string.IsNullOrWhiteSpace(packageId)) + { + if (packageIdToScore.ContainsKey(packageId)) + { + throw new InvalidOperationException($"The package ID '{packageId}' is duplicate for search query '{searchQuery}' in file, line {lineNumber}: {path}"); + } + + if (string.IsNullOrWhiteSpace(pair.Score)) + { + throw new InvalidOperationException($"The package ID '{packageId}' has a missing score for search query '{searchQuery}' in file, line {lineNumber}: {path}"); + } + + if (!int.TryParse(pair.Score.Trim(), out var score)) + { + throw new InvalidOperationException($"The package ID '{packageId}' has an invalid score for search query '{searchQuery}' in file, line {lineNumber}: {path}"); + } + + if (score < 1 || score > RelevancyScoreBuilder.MaximumRelevancyScore) + { + throw new InvalidOperationException( + $"The package ID '{packageId}' has a score out of range [1, " + + $"{RelevancyScoreBuilder.MaximumRelevancyScore}] for search query " + + $"'{searchQuery}' in file, line {lineNumber}: {path}"); + } + + packageIdToScore.Add(packageId, score); + } + else + { + if (!string.IsNullOrWhiteSpace(pair.Score)) + { + throw new InvalidOperationException($"There is a score without a package ID for search query '{searchQuery}' in file, line {lineNumber}: {path}"); + } + } + } + + if (includeEmpty || packageIdToScore.Any()) + { + existingScores.Add(searchQuery, packageIdToScore); + + output.Add(new CuratedSearchQuery( + searchQuery, + packageIdToScore)); + } + else + { + WarnEmpty(searchQuery); + } + } + + return output; + } + } + + private static void WarnEmpty(string searchQuery) + { + Console.WriteLine($"[ WARN ] Skipping at search query '{searchQuery}' since it has no scores."); + } + + private class Record + { + public string SearchQuery { get; set; } + public string ID0 { get; set; } + public string S0 { get; set; } + public string ID1 { get; set; } + public string S1 { get; set; } + public string ID2 { get; set; } + public string S2 { get; set; } + public string ID3 { get; set; } + public string S3 { get; set; } + public string ID4 { get; set; } + public string S4 { get; set; } + } + } +} diff --git a/SearchScorer/Common/CuratedSearchQuery.cs b/SearchScorer/Common/CuratedSearchQuery.cs new file mode 100644 index 0000000..af4ceda --- /dev/null +++ b/SearchScorer/Common/CuratedSearchQuery.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace SearchScorer.Common +{ + public class CuratedSearchQuery + { + public CuratedSearchQuery(string searchQuery, IReadOnlyDictionary packageIdToScore) + { + SearchQuery = searchQuery; + PackageIdToScore = packageIdToScore; + } + + public string SearchQuery { get; } + public IReadOnlyDictionary PackageIdToScore { get; } + } +} diff --git a/SearchScorer/Common/FeedbackDisposition.cs b/SearchScorer/Common/FeedbackDisposition.cs new file mode 100644 index 0000000..04aa581 --- /dev/null +++ b/SearchScorer/Common/FeedbackDisposition.cs @@ -0,0 +1,11 @@ +namespace SearchScorer.Common +{ + public enum FeedbackDisposition + { + Unknown, + OldIsBetter, + NeitherIsBetter, + NewIsBetterButNeedsWork, + NewIsGreat, + } +} diff --git a/SearchScorer/Common/FeedbackQueriesCsvReader.cs b/SearchScorer/Common/FeedbackQueriesCsvReader.cs new file mode 100644 index 0000000..f8546c4 --- /dev/null +++ b/SearchScorer/Common/FeedbackQueriesCsvReader.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using CsvHelper; +using CsvHelper.Configuration; +using CsvHelper.TypeConversion; + +namespace SearchScorer.Common +{ + public static class FeedbackSearchQueriesCsvReader + { + public static IReadOnlyList Read(string path) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + csvReader.Configuration.RegisterClassMap(); + + return csvReader + .GetRecords() + .Select(x => new FeedbackSearchQuery( + x.Source, + x.FeedbackDisposition, + x.SearchQuery, + x.Buckets, + x.MostRelevantPackageIds)) + .ToList(); + } + } + + private class Record + { + public SearchQuerySource Source { get; set; } + public FeedbackDisposition FeedbackDisposition { get; set; } + public string SearchQuery { get; set; } + public List Buckets { get; set; } + public List MostRelevantPackageIds { get; set; } + } + + private class RecordMap : ClassMap + { + public RecordMap() + { + Map(x => x.Source); + Map(x => x.FeedbackDisposition); + Map(x => x.SearchQuery); + Map(x => x.Buckets).TypeConverter>(); + Map(x => x.MostRelevantPackageIds).TypeConverter>(); + } + } + + private class PipeDelimitedListConverter : ITypeConverter + { + private static readonly Func _converter; + + static PipeDelimitedListConverter() + { + if (typeof(T).IsEnum) + { + _converter = x => Enum.Parse(typeof(T), x); + } + else if (typeof(T) == typeof(string)) + { + _converter = x => x; + } + } + + public object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData) + { + if (string.IsNullOrEmpty(text)) + { + return new List(); + } + + var output = text + .Split('|') + .Select(x => x.Trim()) + .Where(x => !string.IsNullOrEmpty(x)) + .Select(x => (T)_converter(x)) + .ToList(); + + return output; + } + + public string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + { + return string.Empty; + } + + var sb = new StringBuilder(); + var sequence = (IEnumerable)value; + foreach (var item in sequence) + { + if (sb.Length > 0) + { + sb.Append(" | "); + } + + sb.Append(item?.ToString()); + } + + return sb.ToString(); + } + } + } +} diff --git a/SearchScorer/Common/FeedbackSearchQuery.cs b/SearchScorer/Common/FeedbackSearchQuery.cs new file mode 100644 index 0000000..d1f86e3 --- /dev/null +++ b/SearchScorer/Common/FeedbackSearchQuery.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace SearchScorer.Common +{ + public class FeedbackSearchQuery + { + public FeedbackSearchQuery( + SearchQuerySource source, + FeedbackDisposition feedbackDisposition, + string searchQuery, + IReadOnlyList buckets, + IReadOnlyList mostRelevantPackageIds) + { + Source = source; + FeedbackDisposition = feedbackDisposition; + SearchQuery = searchQuery; + Buckets = buckets; + MostRelevantPackageIds = mostRelevantPackageIds; + } + + public SearchQuerySource Source { get; } + public FeedbackDisposition FeedbackDisposition { get; } + public string SearchQuery { get; } + public IReadOnlyList Buckets { get; } + public IReadOnlyList MostRelevantPackageIds { get; } + + public override string ToString() + { + return $"{SearchQuery} => {string.Join(" | ", MostRelevantPackageIds)}"; + } + } +} diff --git a/SearchScorer/Common/GitHubRepository.cs b/SearchScorer/Common/GitHubRepository.cs new file mode 100644 index 0000000..5d5fd38 --- /dev/null +++ b/SearchScorer/Common/GitHubRepository.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace SearchScorer.Common +{ + public class GitHubRepository + { + [JsonConstructor] + public GitHubRepository(string url, int stars, string id, string description, IReadOnlyList dependencies) + { + Url = url; + Stars = stars; + Id = id; + Description = description; + Dependencies = dependencies; + } + + public string Url { get; } + public int Stars { get; } + public string Id { get; } + public string Description { get; } + public IReadOnlyList Dependencies { get; } + } +} diff --git a/SearchScorer/Common/GitHubUsageCsvWriter.cs b/SearchScorer/Common/GitHubUsageCsvWriter.cs new file mode 100644 index 0000000..f82e1a3 --- /dev/null +++ b/SearchScorer/Common/GitHubUsageCsvWriter.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class GitHubUsageCsvWriter + { + public static void Write(string path, IReadOnlyList repositories) + { + using (var fileStream = new FileStream(path, FileMode.Create)) + using (var streamWriter = new StreamWriter(fileStream)) + using (var csvWriter = new CsvWriter(streamWriter)) + { + var records = repositories + .SelectMany(x => x + .Dependencies + .Select(d => new Record { RepositoryId = x.Id, Stars = x.Stars, Dependency = d })); + + csvWriter.WriteHeader(); + csvWriter.NextRecord(); + csvWriter.WriteRecords(records); + } + } + + private class Record + { + public string RepositoryId { get; set; } + public int Stars { get; set; } + public string Dependency { get; set; } + } + } +} diff --git a/SearchScorer/Common/GitHubUsageJsonReader.cs b/SearchScorer/Common/GitHubUsageJsonReader.cs new file mode 100644 index 0000000..943db60 --- /dev/null +++ b/SearchScorer/Common/GitHubUsageJsonReader.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json; + +namespace SearchScorer.Common +{ + public static class GitHubUsageJsonReader + { + public static IReadOnlyList Read(string path) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var jsonReader = new JsonTextReader(streamReader)) + { + return new JsonSerializer().Deserialize>(jsonReader); + } + } + } +} diff --git a/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs b/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs new file mode 100644 index 0000000..467a514 --- /dev/null +++ b/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Web; +using CsvHelper; + +namespace SearchScorer.Common +{ + public class GoogleAnalyticsSearchReferralsCsvReader + { + public static IReadOnlyDictionary Read(string path) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + csvReader.Configuration.HasHeaderRecord = true; + csvReader.Configuration.IgnoreBlankLines = true; + + var output = new Dictionary(); + + csvReader.Read(); // comment + csvReader.Read(); // comment + csvReader.Read(); // comment + csvReader.Read(); // comment + csvReader.Read(); // comment + csvReader.Read(); // empty line + csvReader.ReadHeader(); + + while (csvReader.Read()) + { + var landingPage = csvReader.GetField("Landing Page"); + var landingUri = new Uri("http://example" + landingPage); + var queryString = HttpUtility.ParseQueryString(landingUri.Query); + + // Skip queries where we are not hitting the first page. + if (int.TryParse(queryString["page"], out var page) && page != 1) + { + continue; + } + + var searchTerm = csvReader.GetField("Search Term"); + var sessions = int.Parse(csvReader.GetField("Sessions").Replace(",", string.Empty)); + + if (output.TryGetValue(searchTerm, out var existingSessions)) + { + output[searchTerm] += sessions; + } + else + { + output.Add(searchTerm, sessions); + } + } + + return output; + } + } + + private class Record + { + public string LandingPage { get; set; } + public string SearcTerm { get; set; } + public int Sessions { get; set; } + } + } +} diff --git a/SearchScorer/Common/HashedSearchQueryCsvWriter.cs b/SearchScorer/Common/HashedSearchQueryCsvWriter.cs new file mode 100644 index 0000000..8406c49 --- /dev/null +++ b/SearchScorer/Common/HashedSearchQueryCsvWriter.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class HashedSearchQueryCsvWriter + { + public static void Write(string key, string path, IReadOnlyDictionary searchQueries) + { + using (var fileStream = new FileStream(path, FileMode.Create)) + using (var streamWriter = new StreamWriter(fileStream)) + using (var csvWriter = new CsvWriter(streamWriter)) + { + csvWriter.WriteField("Query"); + csvWriter.WriteField("HashedQuery"); + csvWriter.WriteField("Count"); + csvWriter.NextRecord(); + + var additional = new[] { string.Empty, " ", " ", " " }; + var localSearchQueries = new Dictionary(); + foreach (var pair in searchQueries) + { + localSearchQueries[pair.Key] = pair.Value; + } + + foreach (var a in additional) + { + if (!localSearchQueries.ContainsKey(a)) + { + localSearchQueries[a] = 0; + } + } + + var hasher = new Hasher(key); + foreach (var pair in localSearchQueries.OrderByDescending(x => x.Value)) + { + csvWriter.WriteField(pair.Key); + csvWriter.WriteField(hasher.Hash(pair.Key)); + csvWriter.WriteField(pair.Value); + csvWriter.NextRecord(); + } + } + } + } +} diff --git a/SearchScorer/Common/Hasher.cs b/SearchScorer/Common/Hasher.cs new file mode 100644 index 0000000..aaba9be --- /dev/null +++ b/SearchScorer/Common/Hasher.cs @@ -0,0 +1,31 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace SearchScorer.Common +{ + public class Hasher + { + private class FipsHMACSHA256 : HMAC + { + public FipsHMACSHA256(byte[] key) + { + HashName = typeof(SHA256CryptoServiceProvider).AssemblyQualifiedName; + HashSizeValue = 256; + Key = key; + } + } + + private readonly HashAlgorithm _encrypter; + + public Hasher(string key) + { + _encrypter = new FipsHMACSHA256(Encoding.UTF8.GetBytes(key)); + } + + public string Hash(string value) + { + return BitConverter.ToString(_encrypter.ComputeHash(Encoding.UTF8.GetBytes(value))).Replace("-", string.Empty); + } + } +} diff --git a/SearchScorer/Common/PackageIdPatternValidator.cs b/SearchScorer/Common/PackageIdPatternValidator.cs new file mode 100644 index 0000000..27ee1fa --- /dev/null +++ b/SearchScorer/Common/PackageIdPatternValidator.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NuGet.Packaging; + +namespace SearchScorer.Common +{ + public class PackageIdPatternValidator + { + private static readonly char[] Separators = new[] { '.', '-', '_' }; + + private readonly SearchClient _searchClient; + + public PackageIdPatternValidator(SearchClient searchClient) + { + _searchClient = searchClient; + } + + public async Task> GetNonExistentPackageIdsAsync(IEnumerable packageIds, SearchScorerSettings settings) + { + var distinct = packageIds.Distinct(StringComparer.OrdinalIgnoreCase); + var work = new ConcurrentBag(distinct); + var output = new ConcurrentBag(); + + var workers = Enumerable + .Range(0, 16) + .Select(async workerId => + { + while (work.TryTake(out var packageIdPattern)) + { + var exists = await DoesPackageIdExistAsync(packageIdPattern, settings); + Console.Write("."); + if (!exists) + { + output.Add(packageIdPattern); + } + } + }) + .ToList(); + + await Task.WhenAll(workers); + + return output + .OrderBy(x => x, StringComparer.OrdinalIgnoreCase) + .ToList(); + } + + public async Task DoesPackageIdExistAsync( + string packageIdPattern, + SearchScorerSettings settings) + { + Task controlExistsTask; + Task treatmentExistsTask; + + if (PackageIdValidator.IsValidPackageId(packageIdPattern)) + { + var query = $"packageid:{packageIdPattern}"; + controlExistsTask = DoesPackageIdExistInQueryAsync(packageIdPattern, settings.ControlBaseUrl, query, take: 1); + treatmentExistsTask = DoesPackageIdExistInQueryAsync(packageIdPattern, settings.TreatmentBaseUrl, query, take: 1); + + } + else if (packageIdPattern.EndsWith("*")) + { + var prefix = packageIdPattern.Substring(0, packageIdPattern.Length - 1).TrimEnd(Separators); + if (!PackageIdValidator.IsValidPackageId(prefix)) + { + throw new ArgumentException($"The package ID '{packageIdPattern}' looks like a pattern but the part before the wildcard is not a valid package ID."); + } + + var pieces = prefix + .Split(Separators) + .Where(x => !string.IsNullOrWhiteSpace(x)); + var query = string.Join(" ", pieces); + controlExistsTask = DoesPackageIdExistInQueryAsync(packageIdPattern, settings.ControlBaseUrl, query, take: 1000); + treatmentExistsTask = DoesPackageIdExistInQueryAsync(packageIdPattern, settings.TreatmentBaseUrl, query, take: 1000); + } + else + { + throw new NotSupportedException(); + } + + await Task.WhenAll(controlExistsTask, treatmentExistsTask); + + if (controlExistsTask.Result != treatmentExistsTask.Result) + { + throw new ArgumentNullException( + $"The package ID '{packageIdPattern}' has inconsistent availability. " + + $"Exists in control: {controlExistsTask.Result}. " + + $"Exists in treatment: {treatmentExistsTask.Result}."); + } + + return controlExistsTask.Result; + } + + private async Task DoesPackageIdExistInQueryAsync( + string packageId, + string baseUrl, + string query, + int take) + { + var response = await _searchClient.SearchAsync(baseUrl, query, take); + return response.Data.Any(x => WildcardUtility.Matches(x.Id, packageId)); + } + } +} diff --git a/SearchScorer/Common/SearchClient.cs b/SearchScorer/Common/SearchClient.cs new file mode 100644 index 0000000..82bb00d --- /dev/null +++ b/SearchScorer/Common/SearchClient.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Concurrent; +using System.Net.Http; +using System.Threading.Tasks; +using System.Web; +using Newtonsoft.Json; + +namespace SearchScorer.Common +{ + public class SearchClient + { + private readonly HttpClient _httpClient; + private readonly ConcurrentDictionary>> _cache = new ConcurrentDictionary>>(); + + public SearchClient(HttpClient httpClient) + { + _httpClient = httpClient; + } + + public async Task SearchAsync(string baseUrl, string query, int take) + { + var queryString = HttpUtility.ParseQueryString(string.Empty); + queryString["q"] = query; + queryString["prerelease"] = "true"; + queryString["semVerLevel"] = "2.0.0"; + queryString["debug"] = "true"; + queryString["take"] = take.ToString(); + + var uriBuilder = new UriBuilder(baseUrl) + { + Path = "/query", + Query = queryString.ToString(), + }; + + var requestUri = uriBuilder.Uri; + + var lazyTask = _cache.GetOrAdd(requestUri, _ => new Lazy>( + async () => + { + var attempt = 0; + while (true) + { + attempt++; + try + { + using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri)) + using (var response = await _httpClient.SendAsync(request)) + { + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(json); + } + } + catch (Exception ex) when (attempt < 3) + { + Console.WriteLine($"[ WARN ] Search query '{query}' failed: " + ex.Message); + await Task.Delay(TimeSpan.FromSeconds(1)); + } + } + })); + + return await lazyTask.Value; + } + } +} diff --git a/SearchScorer/Common/SearchProbesCsvWriter.cs b/SearchScorer/Common/SearchProbesCsvWriter.cs new file mode 100644 index 0000000..5c73a91 --- /dev/null +++ b/SearchScorer/Common/SearchProbesCsvWriter.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.IO; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class SearchProbesCsvWriter + { + public static void Append(string path, SearchProbesRecord score) + { + var exists = File.Exists(path); + + using (var streamWriter = new StreamWriter(path, append: true)) + using (var csvWriter = new CsvWriter(streamWriter)) + { + if (!exists) + { + csvWriter.WriteHeader(); + csvWriter.NextRecord(); + } + + csvWriter.WriteRecord(score); + streamWriter.WriteLine(); + } + } + } + + public class SearchProbeTest + { + public double PackageIdWeight { get; set; } + public double TokenizedPackageIdWeight { get; set; } + public double TagsWeight { get; set; } + public double DownloadScoreBoost { get; set; } + } + + public class SearchProbesRecord : SearchProbeTest + { + public double CuratedSearchScore { get; set; } + public double ClientCuratedSearchScore { get; set; } + public double FeedbackScore { get; set; } + } +} diff --git a/SearchScorer/Common/SearchQuerySource.cs b/SearchScorer/Common/SearchQuerySource.cs new file mode 100644 index 0000000..5a666cd --- /dev/null +++ b/SearchScorer/Common/SearchQuerySource.cs @@ -0,0 +1,15 @@ +namespace SearchScorer.Common +{ + public enum SearchQuerySource + { + NuGetPartnersInternal, + InternalAdHoc, + Mvps, + V3Internal, + V2Internal, + GitHubOrTwitter, + TopQuery, + V5External, + Hats, + } +} diff --git a/SearchScorer/Common/SearchQueryWithSelections.cs b/SearchScorer/Common/SearchQueryWithSelections.cs new file mode 100644 index 0000000..0b4ad9b --- /dev/null +++ b/SearchScorer/Common/SearchQueryWithSelections.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace SearchScorer.Common +{ + public class SearchQueryWithSelections + { + public SearchQueryWithSelections(string searchQuery, IReadOnlyList selections) + { + SearchQuery = searchQuery; + Selections = selections; + } + + public string SearchQuery { get; } + public IReadOnlyList Selections { get; } + } +} diff --git a/SearchScorer/Common/SearchResponse.cs b/SearchScorer/Common/SearchResponse.cs new file mode 100644 index 0000000..0047871 --- /dev/null +++ b/SearchScorer/Common/SearchResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SearchScorer.Common +{ + public class SearchResponse + { + public int TotalHits { get; set; } + public List Data { get; set; } + } +} diff --git a/SearchScorer/Common/SearchResult.cs b/SearchScorer/Common/SearchResult.cs new file mode 100644 index 0000000..7430c1c --- /dev/null +++ b/SearchScorer/Common/SearchResult.cs @@ -0,0 +1,8 @@ +namespace SearchScorer.Common +{ + public class SearchResult + { + public string Id { get; set; } + public SearchResultDebug Debug { get; set; } + } +} diff --git a/SearchScorer/Common/SearchResultDebug.cs b/SearchScorer/Common/SearchResultDebug.cs new file mode 100644 index 0000000..deae9a4 --- /dev/null +++ b/SearchScorer/Common/SearchResultDebug.cs @@ -0,0 +1,8 @@ +namespace SearchScorer.Common +{ + public class SearchResultDebug + { + public double Score { get; set; } + public SearchResultDebugDocument Document { get; set; } + } +} diff --git a/SearchScorer/Common/SearchResultDebugDocument.cs b/SearchScorer/Common/SearchResultDebugDocument.cs new file mode 100644 index 0000000..06df2cb --- /dev/null +++ b/SearchScorer/Common/SearchResultDebugDocument.cs @@ -0,0 +1,7 @@ +namespace SearchScorer.Common +{ + public class SearchResultDebugDocument + { + public long TotalDownloadCount { get; set; } + } +} diff --git a/SearchScorer/Common/SearchSelectionCount.cs b/SearchScorer/Common/SearchSelectionCount.cs new file mode 100644 index 0000000..8a03bdf --- /dev/null +++ b/SearchScorer/Common/SearchSelectionCount.cs @@ -0,0 +1,14 @@ +namespace SearchScorer.Common +{ + public class SearchSelectionCount + { + public SearchSelectionCount(string packageId, int count) + { + PackageId = packageId; + Count = count; + } + + public string PackageId { get; } + public int Count { get; } + } +} diff --git a/SearchScorer/Common/SearchServiceClientExtensions.cs b/SearchScorer/Common/SearchServiceClientExtensions.cs new file mode 100644 index 0000000..8072f59 --- /dev/null +++ b/SearchScorer/Common/SearchServiceClientExtensions.cs @@ -0,0 +1,77 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Azure.Search; +using Microsoft.Azure.Search.Models; +using Index = Microsoft.Azure.Search.Models.Index; + +namespace SearchScorer.Common +{ + public static class SearchServiceClientExtensions + { + private const string ScoringProfileName = "nuget_scoring_profile"; + + private const string PackageIdFieldName = "packageId"; + private const string TokenizedPackageIdFieldName = "tokenizedPackageId"; + private const string TagsFieldName = "tags"; + + private const string DownloadScoreBoostName = "downloadScore"; + + public static async Task GetNuGetSearchIndexAsync(this ISearchServiceClient client, SearchScorerSettings settings) + { + var index = await client.Indexes.GetAsync(settings.AzureSearchIndexName); + index.EnsureValidNuGetSearchIndex(settings); + + return index; + } + + public static async Task UpdateNuGetSearchIndexAsync( + this ISearchServiceClient client, + SearchScorerSettings settings, + Index index, + double packageIdWeight, + double tokenizedPackageIdWeight, + double tagsWeight, + double downloadScoreBoost) + { + Console.WriteLine($"Updating Azure Search service '{settings.AzureSearchServiceName}', index '{settings.AzureSearchIndexName}'"); + + Console.WriteLine($"Package ID weight: {packageIdWeight}"); + Console.WriteLine($"Tokenized package ID weight: {tokenizedPackageIdWeight}"); + Console.WriteLine($"Tags weight: {tagsWeight}"); + Console.WriteLine($"Download score boost: {downloadScoreBoost}"); + + index.EnsureValidNuGetSearchIndex(settings); + + var indexFieldWeights = index.ScoringProfiles[0].TextWeights.Weights; + var downloadScoreFunction = index.ScoringProfiles[0].Functions[0]; + + indexFieldWeights.Clear(); + indexFieldWeights[PackageIdFieldName] = packageIdWeight; + indexFieldWeights[TokenizedPackageIdFieldName] = tokenizedPackageIdWeight; + indexFieldWeights[TagsFieldName] = tagsWeight; + + downloadScoreFunction.Boost = downloadScoreBoost; + + await client.Indexes.CreateOrUpdateAsync(index); + + Console.WriteLine($"Updated Azure Search service '{settings.AzureSearchServiceName}', index '{settings.AzureSearchIndexName}'"); + } + + private static void EnsureValidNuGetSearchIndex(this Index index, SearchScorerSettings settings) + { + if (index.ScoringProfiles.Count != 1 || index.ScoringProfiles[0].Name != ScoringProfileName) + { + throw new InvalidOperationException( + $"Azure Search index '{settings.AzureSearchIndexName}' should have one scoring profile named '{ScoringProfileName}'"); + } + + var scoringProfile = index.ScoringProfiles[0]; + if (scoringProfile.Functions.Count != 1 || scoringProfile.Functions[0].FieldName != DownloadScoreBoostName) + { + throw new InvalidOperationException( + $"Azure Search index '{settings.AzureSearchIndexName}' should have one scoring function on the '{DownloadScoreBoostName}' field"); + } + } + } +} diff --git a/SearchScorer/Common/TopClientSearchQueriesCsvReader.cs b/SearchScorer/Common/TopClientSearchQueriesCsvReader.cs new file mode 100644 index 0000000..8f2e324 --- /dev/null +++ b/SearchScorer/Common/TopClientSearchQueriesCsvReader.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class TopClientSearchQueriesCsvReader + { + /* This is the query that generates the data: + +.drop table LOOKUP_TABLE; + +.create table LOOKUP_TABLE ( + Query: string, + HashedQuery: string, + Count: int +); + +let lookup = materialize (cluster("CLUSTER").database("DATABASE").LOOKUP_TABLE); +RawEventsNuGet +| where AdvancedServerTimestampUtc > ago(45d) +| where EventName == "vs/nuget/search" +| extend HashedQuery = tostring(Properties['vs.nuget.query']) +| join kind=leftouter (lookup) on HashedQuery +| extend Query = iff(isnull(Count), "", Query) +| extend Query = trim("[\\s\\.\\-_]+", Query) +| summarize QueryCount = count() by Query +| order by QueryCount desc +| take 2000 + + */ + + public static IReadOnlyDictionary Read(string path) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + return csvReader + .GetRecords() + .Where(x => !string.IsNullOrEmpty(x.Query)) + .Where(x => x.Query != "") + .ToDictionary(x => x.Query, x => x.QueryCount); + } + } + + private class Record + { + public string Query { get; set; } + public int QueryCount { get; set; } + } + } +} diff --git a/SearchScorer/Common/TopSearchQueriesCsvReader.cs b/SearchScorer/Common/TopSearchQueriesCsvReader.cs new file mode 100644 index 0000000..028ef96 --- /dev/null +++ b/SearchScorer/Common/TopSearchQueriesCsvReader.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class TopSearchQueriesCsvReader + { + /* This is the query that generates the data: + +let minTimestamp = todatetime('2019-07-02T18:57:00Z'); +customMetrics +| where timestamp > minTimestamp +| where name == "BrowserSearchPage" +| where customDimensions.PageIndex == 0 +| extend Query = trim("\\s", tostring(customDimensions.SearchTerm)) +| distinct Query, session_Id +| summarize QueryCount = count() by Query +| order by QueryCount desc +| take 10000 + + This query is an attempt to remove search queries where the first page in the session is the search query + indicating that it was a non-organic search. + +let minTimestamp = todatetime('2019-07-02T18:57:00Z'); +pageViews +| where timestamp > minTimestamp +| where session_Id != "" +| summarize min(timestamp), min(url) by session_Id +| project session_Id, firstPageViewTimestamp = min_timestamp, firstPageViewUrl = min_url +| join kind=inner ( + pageViews + | where timestamp > minTimestamp + | where session_Id != "" + | extend parsedUrl = parse_url(url) + | where parsedUrl.Path == "/packages" + | extend searchQuery = url_decode(trim("\\s", tostring(parsedUrl["Query Parameters"]["q"]))) + | extend page = tostring(parsedUrl["Query Parameters"]["page"]) + | extend prerel = tolower(tostring(parsedUrl["Query Parameters"]["prerel"])) != "false" + | extend page = iff(page == "", 1, toint(page)) + | where page > 0 + | project session_Id, timestamp, searchQuery, page, prerel, url +) on session_Id +| project timestamp, session_Id, firstPageViewTimestamp, firstPageViewUrl, searchQuery, page, prerel, url +| join kind=innerunique ( + customMetrics + | where timestamp > minTimestamp + | where name == "BrowserSearchPage" + | project session_Id +) on session_Id +| project timestamp, session_Id, firstPageViewTimestamp, firstPageViewUrl, searchQuery, page, prerel, url +| where page == 1 +| where searchQuery != "" +| summarize searchCount = count(), nonLandingSearchCount = countif(timestamp != firstPageViewTimestamp) by searchQuery +| order by nonLandingSearchCount desc +| project Query = searchQuery, QueryCount = nonLandingSearchCount +| take 10000 + + */ + + public static IReadOnlyDictionary Read(string path) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + return csvReader + .GetRecords() + .Where(x => !string.IsNullOrEmpty(x.Query)) + .ToDictionary(x => x.Query, x => x.QueryCount); + } + } + + private class Record + { + public string Query { get; set; } + public int QueryCount { get; set; } + } + } +} diff --git a/SearchScorer/Common/TopSearchSelectionsCsvReader.cs b/SearchScorer/Common/TopSearchSelectionsCsvReader.cs new file mode 100644 index 0000000..37c4e6a --- /dev/null +++ b/SearchScorer/Common/TopSearchSelectionsCsvReader.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.IO; +using CsvHelper; +using Newtonsoft.Json; + +namespace SearchScorer.Common +{ + public static class TopSearchSelectionsCsvReader + { + /* This is the query that generates the data: + +let minTimestamp = todatetime('2019-07-02T18:57:00Z'); +customMetrics +| where timestamp > minTimestamp +| where name == "BrowserSearchSelection" +| extend SearchQuery = trim("\\s", tostring(customDimensions.SearchTerm)) +| extend selectedPackageId = tolower(tostring(customDimensions.PackageId)) +| project timestamp, SearchQuery, selectedPackageId +| summarize count() by SearchQuery, selectedPackageId +| extend selectedPackageIdAndCount = strcat(selectedPackageId, ":", count_) +| order by count_ desc +| summarize sum(count_), makelist(selectedPackageIdAndCount) by SearchQuery +| order by sum_count_ +| project SearchQuery, Selections = list_selectedPackageIdAndCount +| take 10000 + + */ + public static IReadOnlyList Read(string path) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + var output = new List(); + foreach (var record in csvReader.GetRecords()) + { + var pairs = JsonConvert.DeserializeObject>(record.Selections); + var selections = new List(); + + foreach (var pair in pairs) + { + var pieces = pair.Split(new[] { ':' }, 2); + selections.Add(new SearchSelectionCount( + pieces[0].Trim(), + int.Parse(pieces[1]))); + } + + output.Add(new SearchQueryWithSelections( + record.SearchQuery, + selections)); + } + + return output; + } + } + + private class Record + { + public string SearchQuery { get; set; } + public string Selections { get; set; } + } + } +} diff --git a/SearchScorer/Common/TopSearchSelectionsV2CsvWriter.cs b/SearchScorer/Common/TopSearchSelectionsV2CsvWriter.cs new file mode 100644 index 0000000..cc0def6 --- /dev/null +++ b/SearchScorer/Common/TopSearchSelectionsV2CsvWriter.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class TopSearchSelectionsV2CsvWriter + { + public static void Write(string path, IEnumerable selections) + { + using (var fileStream = new FileStream(path, FileMode.Create)) + using (var streamWriter = new StreamWriter(fileStream)) + using (var csvWriter = new CsvWriter(streamWriter)) + { + csvWriter.WriteField("SearchQuery"); + csvWriter.WriteField("Total"); + csvWriter.WriteField("ID0"); + csvWriter.WriteField("S0"); + csvWriter.WriteField("ID1"); + csvWriter.WriteField("S1"); + csvWriter.WriteField("ID2"); + csvWriter.WriteField("S2"); + csvWriter.WriteField("ID3"); + csvWriter.WriteField("S3"); + csvWriter.WriteField("ID4"); + csvWriter.WriteField("S4"); + csvWriter.NextRecord(); + + foreach (var ts in selections) + { + csvWriter.WriteField(ts.SearchQuery); + csvWriter.WriteField(ts.Selections.Sum(x => x.Count)); + foreach (var s in ts.Selections.OrderByDescending(x => x.Count).Take(5)) + { + csvWriter.WriteField(s.PackageId); + csvWriter.WriteField(s.Count); + } + + csvWriter.NextRecord(); + } + } + } + } +} diff --git a/SearchScorer/Common/TopV3SearchQueriesCsvReader.cs b/SearchScorer/Common/TopV3SearchQueriesCsvReader.cs new file mode 100644 index 0000000..f4ead0e --- /dev/null +++ b/SearchScorer/Common/TopV3SearchQueriesCsvReader.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.IO; +using CsvHelper; + +namespace SearchScorer.Common +{ + public static class TopV3SearchQueriesCsvReader + { + /* This is the query that generates the data: + + requests + | where timestamp > ago(90d) + | where name == "GET Search/V3SearchAsync" + | where operation_SyntheticSource != "Application Insights Availability Monitoring" + | extend parsedUrl = parse_url(url) + | extend q = tostring(parsedUrl["Query Parameters"]["q"]) + | where (tolower(q) matches regex "^packageid(:|%3a)[\\w\\._-]+$") == false + | summarize sum(itemCount) by q + | order by sum_itemCount desc + // | where sum_itemCount < 296 // Use this filter to get the next "page" of 10,000 + | take 10000 + + */ + + public static Dictionary Read(string pathPattern) + { + var output = new Dictionary(); + + foreach (var path in Directory.EnumerateFiles( + Path.GetDirectoryName(pathPattern), + Path.GetFileName(pathPattern))) + { + using (var fileStream = File.OpenRead(path)) + using (var streamReader = new StreamReader(fileStream)) + using (var csvReader = new CsvReader(streamReader)) + { + foreach (var record in csvReader.GetRecords()) + { + output[record.q] = record.sum_itemCount; + } + } + } + + return output; + } + + private class Record + { + public string q { get; set; } + public int sum_itemCount { get; set; } + } + } +} diff --git a/SearchScorer/Common/WildcardUtility.cs b/SearchScorer/Common/WildcardUtility.cs new file mode 100644 index 0000000..60daea9 --- /dev/null +++ b/SearchScorer/Common/WildcardUtility.cs @@ -0,0 +1,36 @@ +using System; +using System.Text.RegularExpressions; + +namespace SearchScorer.Common +{ + public static class WildcardUtility + { + public static Regex GetPackageIdWildcareRegex(string packageIdPattern) + { + return new Regex(WildcardToRegular(packageIdPattern), RegexOptions.IgnoreCase); + } + + public static bool IsWildcard(string value) + { + return value.Contains("?") || value.Contains("*"); + } + + /// + /// Source: https://stackoverflow.com/a/30300521 + /// + private static string WildcardToRegular(string value) + { + return "^" + Regex.Escape(value).Replace("\\?", ".").Replace("\\*", ".*") + "$"; + } + + public static bool Matches(string packageId, string packageIdPattern) + { + if (!IsWildcard(packageIdPattern)) + { + return StringComparer.OrdinalIgnoreCase.Equals(packageId, packageIdPattern); + } + + return GetPackageIdWildcareRegex(packageIdPattern).IsMatch(packageId); + } + } +} diff --git a/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs b/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs new file mode 100644 index 0000000..2244bbf --- /dev/null +++ b/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using SearchScorer.Common; + +namespace SearchScorer.IREvalutation +{ + public class NormalizedDiscountedCumulativeGain + { + private readonly SearchClient _searchClient; + + public NormalizedDiscountedCumulativeGain(SearchClient searchClient) + { + _searchClient = searchClient; + } + + public async Task> ScoreAsync( + SearchQueryRelevancyScores query, + string baseUrl, + int resultsToEvaluate) + { + var response = await _searchClient.SearchAsync( + baseUrl, + query.SearchQuery, + resultsToEvaluate); + + if (!query.PackageIdToScore.Any() || query.PackageIdToScore.Max(x => x.Value) == 0) + { + return new RelevancyScoreResult( + 0, + query, + response); + } + + var patternToScorePairs = new List>(); + foreach (var pair in query.PackageIdToScore.Where(x => x.Value > 0)) + { + if (WildcardUtility.IsWildcard(pair.Key)) + { + patternToScorePairs.Add(new KeyValuePair( + WildcardUtility.GetPackageIdWildcareRegex(pair.Key), + pair.Value)); + } + } + + // Determine the score for each of the returns package IDs. + var scores = new List(); + for (var i = 0; i < response.Data.Count; i++) + { + var packageId = response.Data[i].Id; + if (query.PackageIdToScore.TryGetValue(packageId, out var score)) + { + scores.Add(score); + } + else + { + // It might be that the score map contains wildcards. Let's try those. Execute them from longest to + // shortest. This is a hueristic to perform the most specific ones first. + var match = false; + foreach (var pair in patternToScorePairs.OrderByDescending(x => x.Key.ToString().Length)) + { + if (pair.Key.IsMatch(packageId)) + { + scores.Add(pair.Value); + patternToScorePairs.Remove(pair); + match = true; + break; + } + } + + if (match) + { + continue; + } + + scores.Add(0); + } + } + + // Determine the ideal scores by taking the top N scores. + var idealScores = query + .PackageIdToScore + .Select(x => x.Value) + .OrderByDescending(x => x) + .Take(resultsToEvaluate); + + // Calculate the NDCG. + var resultScore = NDCG(scores, idealScores); + + if (resultScore > 1.0) + { + throw new InvalidOperationException("An NDCG score cannot be greater than 1.0. There's a bug!"); + } + + return new RelevancyScoreResult( + resultScore, + query, + response); + } + + private static double NDCG(IEnumerable scores, IEnumerable idealScores) + { + return DCG(scores) / DCG(idealScores); + } + + private static double DCG(IEnumerable scores) + { + var sum = 0.0; + var i = 1; + + foreach (var score in scores) + { + sum += score / Math.Log(i + 1, 2); + i++; + } + + return sum; + } + } +} diff --git a/SearchScorer/IREvalutation/RelevancyReport.cs b/SearchScorer/IREvalutation/RelevancyReport.cs new file mode 100644 index 0000000..9fc3f29 --- /dev/null +++ b/SearchScorer/IREvalutation/RelevancyReport.cs @@ -0,0 +1,14 @@ +namespace SearchScorer.IREvalutation +{ + public class RelevancyReport + { + public RelevancyReport(VariantReport controlReport, VariantReport treatmentReport) + { + ControlReport = controlReport; + TreatmentReport = treatmentReport; + } + + public VariantReport ControlReport { get; } + public VariantReport TreatmentReport { get; } + } +} diff --git a/SearchScorer/IREvalutation/RelevancyScoreBuilder.cs b/SearchScorer/IREvalutation/RelevancyScoreBuilder.cs new file mode 100644 index 0000000..9b46913 --- /dev/null +++ b/SearchScorer/IREvalutation/RelevancyScoreBuilder.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SearchScorer.Common; + +namespace SearchScorer.IREvalutation +{ + public static class RelevancyScoreBuilder + { + /// + /// The number possible relevancy scores minus one. There are a lot of options, the simplest being a binary + /// option set: + /// + /// { relevant, not relevant } + /// + /// We'll take a slightly more complex range: + /// + /// { perfect, excellent, good, fair, bad } + /// + /// This is mentioned by Oliver Chapell's "Expected Reciprocal Rank for Graded Relevance" paper. He worked for + /// Yahoo Labs so it's good enough for me. + /// + public const int MaximumRelevancyScore = 4; + + public static IReadOnlyList> FromCuratedSearchQueriesCsv(SearchScorerSettings settings) + { + var queries = CuratedSearchQueriesCsvReader.Read(settings.CuratedSearchQueriesCsvPath); + return FromCuratedSearchQueries(queries); + } + + public static IReadOnlyList> FromClientCuratedSearchQueriesCsv(SearchScorerSettings settings) + { + var queries = CuratedSearchQueriesCsvReader.Read( + settings.ClientCuratedSearchQueriesCsvPath, + settings.CuratedSearchQueriesCsvPath); + return FromCuratedSearchQueries(queries); + } + + private static IReadOnlyList> FromCuratedSearchQueries(IReadOnlyList queries) + { + var output = new List>(); + foreach (var query in queries) + { + output.Add(new SearchQueryRelevancyScores( + query.SearchQuery, + query.PackageIdToScore, + query)); + } + + return output; + } + + public static IReadOnlyList> FromFeedbackSearchQueriesCsv(SearchScorerSettings settings) + { + var output = new List>(); + var feedbackSearchQueries = FeedbackSearchQueriesCsvReader.Read(settings.FeedbackSearchQueriesCsvPath); + foreach (var feedback in feedbackSearchQueries) + { + // Give expected package IDs the maximum relevancy score. + var scores = feedback + .MostRelevantPackageIds + .ToDictionary(x => x, x => MaximumRelevancyScore, StringComparer.OrdinalIgnoreCase);; + + output.Add(new SearchQueryRelevancyScores( + feedback.SearchQuery, + scores, + feedback)); + } + + return output; + } + + public static IReadOnlyList> FromTopSearchSelectionsCsv(string path) + { + // The goal here is to take the frequency that a package ID was clicked for each search query and somehow + // use this frequency compared to other clicked package IDs to assign a relevancy score. This is of course + // only an educated guess since people may be clicking results because today's relevancy algorithm puts + // them at the not because they are actually good results. + // + // This mapping must take a package ID frequency and map it to an integer in the range: + // + // [0, MaximumRelevancyScore] + // + // We do this by taking a ratio of clickCount / maxClickCount where clickCount is the number of times a + // package ID was clicked for a given search query and maxClickCount is the click count of the package ID + // that was clicked the most. We then bucket that ratio into into "MaximumRelevancyScore" + 1 evenly-sized + // buckets covering the range [0.00, 1.00]. + // + // For example, suppose MaximumRelevancyScore is 4, the search query is "nuget", NuGet.Versioning has 601 + // clicks, NuGet.Frameworks has 501 clicks, and NuGet.Core has 79 clicks. The mapping of ratio buckets + // to resulting score are: + // + // [0.00, 0.20) => 0 + // [0.20, 0.40) => 1 + // [0.40, 0.60) => 2 + // [0.60, 0.80) => 3 + // [0.80, 1.00] => 4 + // + // The highest click count is 601. + // + // NuGet.Versioning's score will be: 601 / 601 = 1.00 => 4. + // NuGet.Framework's score will be: 501 / 601 = 0.83 => 4. + // NuGet.Core's score will be: 79 / 601 = 0.13 => 0. + + var firstBucketUpperBound = 1.0 / (MaximumRelevancyScore + 1); + + var output = new List>(); + var topSearchSelections = TopSearchSelectionsCsvReader.Read(path); + foreach (var searchQueryWithSelections in topSearchSelections) + { + var maxClickCount = searchQueryWithSelections.Selections.Max(x => x.Count); + var packageIdToScore = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var selection in searchQueryWithSelections.Selections) + { + var clickCount = selection.Count; + var ratio = (double)clickCount / maxClickCount; + var score = (int)Math.Ceiling(ratio / firstBucketUpperBound) - 1; + packageIdToScore.Add(selection.PackageId, score); + } + + output.Add(new SearchQueryRelevancyScores( + searchQueryWithSelections.SearchQuery, + packageIdToScore, + searchQueryWithSelections)); + } + + return output; + } + } +} diff --git a/SearchScorer/IREvalutation/RelevancyScoreEvaluator.cs b/SearchScorer/IREvalutation/RelevancyScoreEvaluator.cs new file mode 100644 index 0000000..087f9ae --- /dev/null +++ b/SearchScorer/IREvalutation/RelevancyScoreEvaluator.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Xml; +using SearchScorer.Common; + +namespace SearchScorer.IREvalutation +{ + public class RelevancyScoreEvaluator + { + /// + /// This is the number of results to include in the scoring. We use 5 because this is the number of results + /// above the fold. + /// + private const int ResultsToEvaluate = 5; + + private readonly NormalizedDiscountedCumulativeGain _ndcg; + + public RelevancyScoreEvaluator(SearchClient searchClient) + { + _ndcg = new NormalizedDiscountedCumulativeGain(searchClient); + } + + public async Task RunAsync(SearchScorerSettings settings) + { + var report = await GetReportAsync(settings); + + ConsoleUtility.WriteHeading("Curated Search Queries", '='); + WriteBiggestWinnersAndLosersToConsole(report, v => v.CuratedSearchQueries); + + ConsoleUtility.WriteHeading("Client Curated Search Queries", '='); + WriteBiggestWinnersAndLosersToConsole(report, v => v.ClientCuratedSearchQueries); + + ConsoleUtility.WriteHeading("Feedback", '='); + WriteBiggestWinnersAndLosersToConsole(report, v => v.FeedbackSearchQueries); + } + + private static void WriteBiggestWinnersAndLosersToConsole( + RelevancyReport report, + Func> getReport) + { + Console.WriteLine($"Control: {getReport(report.ControlReport).Score}"); + Console.WriteLine($"Treatment: {getReport(report.TreatmentReport).Score}"); + + var toTreatment = getReport(report.TreatmentReport) + .Queries + .GroupBy(x => x.Result.Input.SearchQuery) + .ToDictionary(x => x.Key, x => x.First().Score); + var scoreChanges = getReport(report.ControlReport) + .Queries + .GroupBy(x => x.Result.Input.SearchQuery) + .ToDictionary(x => x.Key, x => toTreatment[x.Key] - x.First().Score) + .OrderBy(x => x.Key) + .ToList(); + WriteSearchQueriesAndScoresToConsole( + "Biggest Winners", + scoreChanges.Where(x => x.Value > 0).OrderByDescending(x => x.Value).Take(10)); + WriteSearchQueriesAndScoresToConsole( + "Biggest Losers", + scoreChanges.Where(x => x.Value < 0).OrderBy(x => x.Value).Take(10)); + + var treatmentFailures = getReport(report.TreatmentReport) + .Queries + .OrderBy(x => x.Score) // Lowest scores first + .ThenByDescending(x => x.Weight) // Most significant first + .Take(10) + .ToList(); + WriteQueryScoreAndWeights("Lowest Treatment Scores", treatmentFailures); + } + + private static void WriteSearchQueriesAndScoresToConsole( + string heading, + IEnumerable> pairs) + { + var pairList = pairs.ToList(); + + ConsoleUtility.WriteHeading($"{heading} ({pairList.Count})", '-'); + if (!pairList.Any()) + { + Console.WriteLine("(none)"); + return; + } + + var longestSearchQuery = pairList.Max(x => x.Key.Length); + foreach (var pair in pairList) + { + Console.WriteLine($"{pair.Key.PadRight(longestSearchQuery)} => {pair.Value:+0.0000;-0.0000;0}"); + } + } + + private static void WriteQueryScoreAndWeights( + string heading, + IReadOnlyList> queries) + { + ConsoleUtility.WriteHeading($"{heading} ({queries.Count})", '-'); + var longestSearchQuery = queries.Max(x => x.Result.Input.SearchQuery.Length); + foreach (var query in queries) + { + Console.WriteLine($"{query.Result.Input.SearchQuery.PadRight(longestSearchQuery)} => {query.Score:+0.0000;-0.0000;0}"); + } + } + + private async Task GetReportAsync(SearchScorerSettings settings) + { + var topQueries = TopSearchQueriesCsvReader.Read(settings.TopSearchQueriesCsvPath); + var topClientQueries = TopClientSearchQueriesCsvReader.Read(settings.TopClientSearchQueriesCsvPath); + var topSearchReferrals = GoogleAnalyticsSearchReferralsCsvReader.Read(settings.GoogleAnalyticsSearchReferralsCsvPath); + + var controlReport = await GetVariantReport( + settings.ControlBaseUrl, + settings, + topQueries, + topClientQueries, + topSearchReferrals); + + var treatmentReport = await GetVariantReport( + settings.TreatmentBaseUrl, + settings, + topQueries, + topClientQueries, + topSearchReferrals); + + return new RelevancyReport( + controlReport, + treatmentReport); + } + + public async Task GetCustomVariantReportAsync( + SearchScorerSettings settings, + string customVariantUrl) + { + var topQueries = TopSearchQueriesCsvReader.Read(settings.TopSearchQueriesCsvPath); + var topClientQueries = TopClientSearchQueriesCsvReader.Read(settings.TopClientSearchQueriesCsvPath); + var topSearchReferrals = GoogleAnalyticsSearchReferralsCsvReader.Read(settings.GoogleAnalyticsSearchReferralsCsvPath); + + return await GetVariantReport( + customVariantUrl, + settings, + topQueries, + topClientQueries, + topSearchReferrals); + } + + private async Task GetVariantReport( + string baseUrl, + SearchScorerSettings settings, + IReadOnlyDictionary topQueries, + IReadOnlyDictionary topClientQueries, + IReadOnlyDictionary topSearchReferrals) + { + var curatedSearchQueriesReport = await GetCuratedSearchQueriesScoreAsync(baseUrl, settings, topQueries, topSearchReferrals); + var clientCuratedSearchQueriesReport = await GetClientCuratedSearchQueriesScoreAsync(baseUrl, settings, topClientQueries); + var feedbackSearchQueriesReport = await GetFeedbackSearchQueriesScoreAsync(baseUrl, settings); + + return new VariantReport( + curatedSearchQueriesReport, + clientCuratedSearchQueriesReport, + feedbackSearchQueriesReport); + } + + private async Task> GetCuratedSearchQueriesScoreAsync( + string baseUrl, + SearchScorerSettings settings, + IReadOnlyDictionary topQueries, + IReadOnlyDictionary topSearchReferrals) + { + var minQueryCount = topQueries.Min(x => x.Value); + var adjustedTopQueries = topQueries.ToDictionary( + x => x.Key, + x => + { + if (topSearchReferrals.TryGetValue(x.Key, out var referrals)) + { + return Math.Max(x.Value - referrals, minQueryCount); + } + + return x.Value; + }); + + var scores = RelevancyScoreBuilder.FromCuratedSearchQueriesCsv(settings); + + var results = await ProcessAsync( + scores, + baseUrl); + + return WeightByTopQueries(adjustedTopQueries, results); + } + + private async Task> GetClientCuratedSearchQueriesScoreAsync( + string baseUrl, + SearchScorerSettings settings, + IReadOnlyDictionary topClientQueries) + { + var scores = RelevancyScoreBuilder.FromClientCuratedSearchQueriesCsv(settings); + + var results = await ProcessAsync( + scores, + baseUrl); + + return WeightByTopQueries(topClientQueries, results); + } + + private async Task> GetFeedbackSearchQueriesScoreAsync( + string baseUrl, + SearchScorerSettings settings) + { + var scores = RelevancyScoreBuilder.FromFeedbackSearchQueriesCsv(settings); + + var results = await ProcessAsync( + scores, + baseUrl); + + return WeightEvently(results); + } + + private static SearchQueriesReport WeightEvently(ConcurrentBag> results) + { + var totalCount = 1.0 * results.Count; + + var weightedResults = results + .Select(x => new WeightedRelevancyScoreResult( + x, + x.ResultScore / totalCount)) + .ToList(); + + return new SearchQueriesReport(weightedResults); + } + + private static SearchQueriesReport WeightByTopQueries( + IReadOnlyDictionary topQueries, + ConcurrentBag> results) + { + // Weight the queries that came from top search selections by their query count. + var totalQueryCount = 0; + var resultsAndWeights = new List, int>>(); + foreach (var result in results) + { + if (!topQueries.TryGetValue(result.Input.SearchQuery, out var queryCount)) + { + queryCount = 0; + } + resultsAndWeights.Add(new KeyValuePair, int>(result, queryCount)); + totalQueryCount += queryCount; + } + + var weightedResults = new List>(); + foreach (var pair in resultsAndWeights) + { + weightedResults.Add(new WeightedRelevancyScoreResult( + pair.Key, + 1.0 * pair.Value / totalQueryCount)); + } + + return new SearchQueriesReport(weightedResults); + } + + private async Task>> ProcessAsync( + IEnumerable> queries, + string baseUrl) + { + var work = new ConcurrentBag>(queries); + var output = new ConcurrentBag>(); + + var workers = Enumerable + .Range(0, 8) + .Select(async x => + { + await Task.Yield(); + + while (work.TryTake(out var query)) + { + try + { + var result = await _ndcg.ScoreAsync(query, baseUrl, ResultsToEvaluate); + Console.WriteLine($"[{baseUrl}] {query.SearchQuery} => {result.ResultScore}"); + output.Add(result); + } + catch (Exception ex) + { + Console.WriteLine($"[{baseUrl}] {query.SearchQuery} => {ex}"); + throw; + } + } + }) + .ToList(); + + await Task.WhenAll(workers); + + return output; + } + } +} diff --git a/SearchScorer/IREvalutation/RelevancyScoreResult.cs b/SearchScorer/IREvalutation/RelevancyScoreResult.cs new file mode 100644 index 0000000..6333da3 --- /dev/null +++ b/SearchScorer/IREvalutation/RelevancyScoreResult.cs @@ -0,0 +1,31 @@ +using SearchScorer.Common; + +namespace SearchScorer.IREvalutation +{ + public class RelevancyScoreResult + { + public RelevancyScoreResult(double resultScore, SearchQueryRelevancyScores input, SearchResponse response) + { + ResultScore = resultScore; + Input = input; + Response = response; + } + + public double ResultScore { get; } + public SearchQueryRelevancyScores Input { get; } + public SearchResponse Response { get; } + } + + public class RelevancyScoreResult : RelevancyScoreResult + { + public RelevancyScoreResult( + double resultScore, + SearchQueryRelevancyScores input, + SearchResponse response) : base(resultScore, input, response) + { + Input = input; + } + + public new SearchQueryRelevancyScores Input { get; } + } +} diff --git a/SearchScorer/IREvalutation/SearchQueriesReport.cs b/SearchScorer/IREvalutation/SearchQueriesReport.cs new file mode 100644 index 0000000..32dde5c --- /dev/null +++ b/SearchScorer/IREvalutation/SearchQueriesReport.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Linq; + +namespace SearchScorer.IREvalutation +{ + public class SearchQueriesReport + { + public SearchQueriesReport(IReadOnlyList> queries) + { + Queries = queries; + } + + public double Score => Queries.Sum(x => x.Score); + public IReadOnlyList> Queries { get; } + } +} diff --git a/SearchScorer/IREvalutation/SearchQueryRelevancyScores.cs b/SearchScorer/IREvalutation/SearchQueryRelevancyScores.cs new file mode 100644 index 0000000..b335b5b --- /dev/null +++ b/SearchScorer/IREvalutation/SearchQueryRelevancyScores.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace SearchScorer.IREvalutation +{ + public class SearchQueryRelevancyScores + { + public SearchQueryRelevancyScores(string searchQuery, IReadOnlyDictionary packageIdToScore) + { + SearchQuery = searchQuery; + PackageIdToScore = packageIdToScore; + } + + public string SearchQuery { get; } + public IReadOnlyDictionary PackageIdToScore { get; } + } + + public class SearchQueryRelevancyScores : SearchQueryRelevancyScores + { + public SearchQueryRelevancyScores( + string searchQuery, + IReadOnlyDictionary packageIdToScore, + TSource source) : base(searchQuery, packageIdToScore) + { + Source = source; + } + + public TSource Source { get; } + } +} diff --git a/SearchScorer/IREvalutation/VariantReport.cs b/SearchScorer/IREvalutation/VariantReport.cs new file mode 100644 index 0000000..3f8d420 --- /dev/null +++ b/SearchScorer/IREvalutation/VariantReport.cs @@ -0,0 +1,21 @@ +using SearchScorer.Common; + +namespace SearchScorer.IREvalutation +{ + public class VariantReport + { + public VariantReport( + SearchQueriesReport curatedSearchQueries, + SearchQueriesReport clientCuratedSearchQueries, + SearchQueriesReport feedbackSearchQueries) + { + CuratedSearchQueries = curatedSearchQueries; + ClientCuratedSearchQueries = clientCuratedSearchQueries; + FeedbackSearchQueries = feedbackSearchQueries; + } + + public SearchQueriesReport CuratedSearchQueries { get; } + public SearchQueriesReport ClientCuratedSearchQueries { get; } + public SearchQueriesReport FeedbackSearchQueries { get; } + } +} diff --git a/SearchScorer/IREvalutation/WeightedRelevancyScoreResult.cs b/SearchScorer/IREvalutation/WeightedRelevancyScoreResult.cs new file mode 100644 index 0000000..7638839 --- /dev/null +++ b/SearchScorer/IREvalutation/WeightedRelevancyScoreResult.cs @@ -0,0 +1,15 @@ +namespace SearchScorer.IREvalutation +{ + public class WeightedRelevancyScoreResult + { + public WeightedRelevancyScoreResult(RelevancyScoreResult result, double weight) + { + Result = result; + Weight = weight; + } + + public double Score => Weight * Result.ResultScore; + public RelevancyScoreResult Result { get; } + public double Weight { get; } + } +} diff --git a/SearchScorer/Program.cs b/SearchScorer/Program.cs new file mode 100644 index 0000000..83fa4f4 --- /dev/null +++ b/SearchScorer/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/SearchScorer/SearchScorer.csproj b/SearchScorer/SearchScorer.csproj new file mode 100644 index 0000000..35a92cc --- /dev/null +++ b/SearchScorer/SearchScorer.csproj @@ -0,0 +1,23 @@ + + + + Exe + net6.0 + enable + + + + + 2.8.26 + + + 9.1.0 + + + 12.0.2 + + + 5.2.0 + + + \ No newline at end of file diff --git a/SearchScorer/SearchScorerSettings.cs b/SearchScorer/SearchScorerSettings.cs new file mode 100644 index 0000000..abebbd9 --- /dev/null +++ b/SearchScorer/SearchScorerSettings.cs @@ -0,0 +1,32 @@ +namespace SearchScorer +{ + public class SearchScorerSettings + { + public string ControlBaseUrl { get; set; } + public string TreatmentBaseUrl { get; set; } + public string FeedbackSearchQueriesCsvPath { get; set; } + public string CuratedSearchQueriesCsvPath { get; set; } + public string ClientCuratedSearchQueriesCsvPath { get; set; } + public string TopSearchQueriesCsvPath { get; set; } + public string TopClientSearchQueriesCsvPath { get; set; } + public string TopSearchSelectionsCsvPath { get; set; } + public string TopSearchSelectionsV2CsvPath { get; set; } + public string GoogleAnalyticsSearchReferralsCsvPath { get; set; } + public string GitHubUsageJsonPath { get; set; } + public string GitHubUsageCsvPath { get; set; } + public string ProbeResultsCsvPath { get; set; } + public string TopV3SearchQueriesPathPattern { get; set; } + public string HashedSearchQueryLookupCsvPath { get; set; } + public string HasherKeyFile { get; set; } + + // The following settings are only necessary for the "probe" command + public string AzureSearchServiceName { get; set; } + public string AzureSearchIndexName { get; set; } + public string AzureSearchApiKey { get; set; } + + public IReadOnlyList PackageIdWeights { get; set; } + public IReadOnlyList TokenizedPackageIdWeights { get; set; } + public IReadOnlyList TagsWeights { get; set; } + public IReadOnlyList DownloadWeights { get; set; } + } +} From 913f800395670e1d57c3aa47ce8dc56c8a155555 Mon Sep 17 00:00:00 2001 From: Prashant Cholachagudda Date: Thu, 17 Mar 2022 15:45:23 +0530 Subject: [PATCH 2/7] VS for Mac cofigs added --- SearchScorer/SearchScorer.csproj | 12 ++++-------- SearchScorer/SearchScorer.sln | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 SearchScorer/SearchScorer.sln diff --git a/SearchScorer/SearchScorer.csproj b/SearchScorer/SearchScorer.csproj index 35a92cc..e9b07bf 100644 --- a/SearchScorer/SearchScorer.csproj +++ b/SearchScorer/SearchScorer.csproj @@ -7,17 +7,13 @@ - - 2.8.26 + - - 9.1.0 + - - 12.0.2 + - - 5.2.0 + \ No newline at end of file diff --git a/SearchScorer/SearchScorer.sln b/SearchScorer/SearchScorer.sln new file mode 100644 index 0000000..5cb1715 --- /dev/null +++ b/SearchScorer/SearchScorer.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 25.0.1700.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchScorer", "SearchScorer.csproj", "{FBF337A7-4B2A-4225-9212-3169B89E8386}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FBF337A7-4B2A-4225-9212-3169B89E8386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBF337A7-4B2A-4225-9212-3169B89E8386}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBF337A7-4B2A-4225-9212-3169B89E8386}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBF337A7-4B2A-4225-9212-3169B89E8386}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8C4FD292-3138-4A3B-8983-C67219968C04} + EndGlobalSection +EndGlobal From 829dae8d4058a7c9bea737b4daebce14b568e324 Mon Sep 17 00:00:00 2001 From: Prashant Cholachagudda Date: Thu, 17 Mar 2022 15:48:48 +0530 Subject: [PATCH 3/7] Configure project for vscode --- SearchScorer/.gitignore | 3 ++- SearchScorer/.vscode/launch.json | 26 ++++++++++++++++++++ SearchScorer/.vscode/tasks.json | 41 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 SearchScorer/.vscode/launch.json create mode 100644 SearchScorer/.vscode/tasks.json diff --git a/SearchScorer/.gitignore b/SearchScorer/.gitignore index f9377d5..1ec9856 100644 --- a/SearchScorer/.gitignore +++ b/SearchScorer/.gitignore @@ -229,4 +229,5 @@ _Pvt_Extensions .paket/paket.exe # FAKE - F# Make -.fake/ \ No newline at end of file +.fake/ +.ionide \ No newline at end of file diff --git a/SearchScorer/.vscode/launch.json b/SearchScorer/.vscode/launch.json new file mode 100644 index 0000000..1d44f0e --- /dev/null +++ b/SearchScorer/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/bin/Debug/net6.0/SearchScorer.dll", + "args": [], + "cwd": "${workspaceFolder}", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/SearchScorer/.vscode/tasks.json b/SearchScorer/.vscode/tasks.json new file mode 100644 index 0000000..fcb4667 --- /dev/null +++ b/SearchScorer/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/SearchScorer.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/SearchScorer.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/SearchScorer.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file From db808ed6bce0d77ed67206e33119098f0b58f96a Mon Sep 17 00:00:00 2001 From: Prashant Cholachagudda Date: Tue, 29 Mar 2022 17:26:10 +0530 Subject: [PATCH 4/7] make it compatible with VSM (partial) --- SearchScorer/Program.cs | 43 +++++++++++++++++++++- SearchScorer/SearchScorer.csproj | 16 ++++---- SearchScorer/SearchScorerSettings.cs | 55 ++++++++++++++-------------- 3 files changed, 76 insertions(+), 38 deletions(-) diff --git a/SearchScorer/Program.cs b/SearchScorer/Program.cs index 83fa4f4..6cdd1fc 100644 --- a/SearchScorer/Program.cs +++ b/SearchScorer/Program.cs @@ -1,2 +1,41 @@ -// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +using SearchScorer.Common; +using SearchScorer.IREvalutation; + +ServicePointManager.DefaultConnectionLimit = 64; + +var assemblyDir = Path.GetDirectoryName(Environment.CurrentDirectory); +assemblyDir = Path.Combine(assemblyDir, "files"); + +var settings = new SearchScorerSettings +{ + ControlBaseUrl = "", //TODO: Add marketplace url + TreatmentBaseUrl = "", + + PackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), + TokenizedPackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), + TagsWeights = CreateRange(lower: 1, upper: 10, increments: 3), + DownloadWeights = CreateRange(lower: 1, upper: 10, increments: 3) +}; + +using (var httpClientHandler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip }) +using (var httpClient = new HttpClient()) +{ + if (args.Length == 0 || args[0] == "score") + await RunScoreCommandAsync(settings, httpClient); +} + +static async Task RunScoreCommandAsync(SearchScorerSettings settings, HttpClient httpClient) +{ + var searchClient = new SearchClient(httpClient); + var scoreEvaluator = new RelevancyScoreEvaluator(searchClient); + await scoreEvaluator.RunAsync(settings); +} + +static IReadOnlyList CreateRange(int lower, int upper, double increments) +{ + var count = (upper - lower) / increments + 1; + return Enumerable + .Range(0, (int)count) + .Select(i => (i * increments + lower)) + .ToList(); +} \ No newline at end of file diff --git a/SearchScorer/SearchScorer.csproj b/SearchScorer/SearchScorer.csproj index e9b07bf..394ba88 100644 --- a/SearchScorer/SearchScorer.csproj +++ b/SearchScorer/SearchScorer.csproj @@ -5,15 +5,15 @@ net6.0 enable + + + + - - - - - - - - + + + + \ No newline at end of file diff --git a/SearchScorer/SearchScorerSettings.cs b/SearchScorer/SearchScorerSettings.cs index abebbd9..2400efa 100644 --- a/SearchScorer/SearchScorerSettings.cs +++ b/SearchScorer/SearchScorerSettings.cs @@ -1,32 +1,31 @@ -namespace SearchScorer + +public class SearchScorerSettings { - public class SearchScorerSettings - { - public string ControlBaseUrl { get; set; } - public string TreatmentBaseUrl { get; set; } - public string FeedbackSearchQueriesCsvPath { get; set; } - public string CuratedSearchQueriesCsvPath { get; set; } - public string ClientCuratedSearchQueriesCsvPath { get; set; } - public string TopSearchQueriesCsvPath { get; set; } - public string TopClientSearchQueriesCsvPath { get; set; } - public string TopSearchSelectionsCsvPath { get; set; } - public string TopSearchSelectionsV2CsvPath { get; set; } - public string GoogleAnalyticsSearchReferralsCsvPath { get; set; } - public string GitHubUsageJsonPath { get; set; } - public string GitHubUsageCsvPath { get; set; } - public string ProbeResultsCsvPath { get; set; } - public string TopV3SearchQueriesPathPattern { get; set; } - public string HashedSearchQueryLookupCsvPath { get; set; } - public string HasherKeyFile { get; set; } + public string ControlBaseUrl { get; set; } + public string TreatmentBaseUrl { get; set; } + public string FeedbackSearchQueriesCsvPath { get; set; } + public string CuratedSearchQueriesCsvPath { get; set; } + public string ClientCuratedSearchQueriesCsvPath { get; set; } + public string TopSearchQueriesCsvPath { get; set; } + public string TopClientSearchQueriesCsvPath { get; set; } + public string TopSearchSelectionsCsvPath { get; set; } + public string TopSearchSelectionsV2CsvPath { get; set; } + public string GoogleAnalyticsSearchReferralsCsvPath { get; set; } + public string GitHubUsageJsonPath { get; set; } + public string GitHubUsageCsvPath { get; set; } + public string ProbeResultsCsvPath { get; set; } + public string TopV3SearchQueriesPathPattern { get; set; } + public string HashedSearchQueryLookupCsvPath { get; set; } + public string HasherKeyFile { get; set; } - // The following settings are only necessary for the "probe" command - public string AzureSearchServiceName { get; set; } - public string AzureSearchIndexName { get; set; } - public string AzureSearchApiKey { get; set; } + // The following settings are only necessary for the "probe" command + public string AzureSearchServiceName { get; set; } + public string AzureSearchIndexName { get; set; } + public string AzureSearchApiKey { get; set; } - public IReadOnlyList PackageIdWeights { get; set; } - public IReadOnlyList TokenizedPackageIdWeights { get; set; } - public IReadOnlyList TagsWeights { get; set; } - public IReadOnlyList DownloadWeights { get; set; } - } + public IReadOnlyList PackageIdWeights { get; set; } + public IReadOnlyList TokenizedPackageIdWeights { get; set; } + public IReadOnlyList TagsWeights { get; set; } + public IReadOnlyList DownloadWeights { get; set; } } + From ba490ac2ba4e002c15fafa03fa46e33bfaae2a0a Mon Sep 17 00:00:00 2001 From: Munish Goyal Date: Sat, 30 Apr 2022 16:14:47 +0530 Subject: [PATCH 5/7] updated search http query to make it work for vsm --- ...GoogleAnalyticsSearchReferralsCsvReader.cs | 1 + SearchScorer/Common/SearchClient.cs | 41 ++++++++++++------- SearchScorer/Program.cs | 15 ++++++- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs b/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs index 467a514..1ef3244 100644 --- a/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs +++ b/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs @@ -25,6 +25,7 @@ public static IReadOnlyDictionary Read(string path) csvReader.Read(); // comment csvReader.Read(); // comment csvReader.Read(); // empty line + csvReader.Read(); csvReader.ReadHeader(); while (csvReader.Read()) diff --git a/SearchScorer/Common/SearchClient.cs b/SearchScorer/Common/SearchClient.cs index 82bb00d..a90acd4 100644 --- a/SearchScorer/Common/SearchClient.cs +++ b/SearchScorer/Common/SearchClient.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Concurrent; using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; using System.Threading.Tasks; using System.Web; using Newtonsoft.Json; @@ -19,20 +21,22 @@ public SearchClient(HttpClient httpClient) public async Task SearchAsync(string baseUrl, string query, int take) { - var queryString = HttpUtility.ParseQueryString(string.Empty); - queryString["q"] = query; - queryString["prerelease"] = "true"; - queryString["semVerLevel"] = "2.0.0"; - queryString["debug"] = "true"; - queryString["take"] = take.ToString(); + //var queryString = HttpUtility.ParseQueryString(string.Empty); + query = "python"; var uriBuilder = new UriBuilder(baseUrl) { - Path = "/query", - Query = queryString.ToString(), + //Path = "/query", + + //Query = "{\"assetTypes\":null,\"filters\":[{\"criteria\":[{\"filterType\":10,\"value\":\"python\"}]," + + //"\"direction\":2,\"pageSize\":100,\"pageNumber\":1,\"sortBy\":0,\"sortOrder\":0,\"pagingToken\":null}],\"flags\":103}" + }; - var requestUri = uriBuilder.Uri; + var queryStr = "{\"filters\":[{\"criteria\":[{\"filterType\":10,\"value\":\"" + query + "\"}, {\"filterType\":8,\"value\":\"Microsoft.VisualStudio.Code\"}]," + + "\"direction\":0,\"pageSize\":50,\"pageNumber\":1,\"sortBy\":6,\"sortOrder\":0,\"pagingToken\":null}],\"flags\":947, \"assetTypes\":[]}"; + + var requestUri = uriBuilder.Uri; //baseUrl;// var lazyTask = _cache.GetOrAdd(requestUri, _ => new Lazy>( async () => @@ -43,12 +47,21 @@ public async Task SearchAsync(string baseUrl, string query, int attempt++; try { - using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri)) - using (var response = await _httpClient.SendAsync(request)) + using (var request = new HttpRequestMessage(HttpMethod.Post, requestUri)) { - response.EnsureSuccessStatusCode(); - var json = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(json); + //request.Headers.Add("Content-Type", "application/json"); + //request.Content = queryStr;// new StringContent(queryStr, Encoding.UTF8, "application/json"); ; + request.Content = new StringContent(queryStr); + //_httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8"); + request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + request.Content.Headers.ContentType.CharSet = "utf-8"; + + using (var response = await _httpClient.SendAsync(request)) + { + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(json); + } } } catch (Exception ex) when (attempt < 3) diff --git a/SearchScorer/Program.cs b/SearchScorer/Program.cs index 6cdd1fc..a64d525 100644 --- a/SearchScorer/Program.cs +++ b/SearchScorer/Program.cs @@ -8,8 +8,16 @@ var settings = new SearchScorerSettings { - ControlBaseUrl = "", //TODO: Add marketplace url - TreatmentBaseUrl = "", + ControlBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery", //TODO: Add marketplace url + TreatmentBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery", + //ControlBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery?api-version=6.0-preview.1", //TODO: Add marketplace url + //TreatmentBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery?api-version=6.0-preview.1", + CuratedSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\curatedqueries.csv", + TopSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\topsearchqueries.csv", + TopSearchSelectionsCsvPath = @"C:\data\SearchScorerData\vsm\topsearchselections.csv", + + TopClientSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\topsearchqueries.csv", + GoogleAnalyticsSearchReferralsCsvPath = @"C:\data\SearchScorerData\vsm\topsearchreferrals.csv", PackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), TokenizedPackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), @@ -21,7 +29,10 @@ using (var httpClient = new HttpClient()) { if (args.Length == 0 || args[0] == "score") + { + httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8"); await RunScoreCommandAsync(settings, httpClient); + } } static async Task RunScoreCommandAsync(SearchScorerSettings settings, HttpClient httpClient) From 0d3386db6ef4aedae16538a3e3e2a8bdd95df069 Mon Sep 17 00:00:00 2001 From: Munish Goyal Date: Sun, 1 May 2022 22:16:25 +0530 Subject: [PATCH 6/7] added required search response classes --- .../ExtensionBadgeConverter.cs | 68 +++ .../ExtensionFileConverter.cs | 93 +++ .../ExtensionVersionConverter.cs | 186 ++++++ .../PublishedExtensionConverter.cs | 123 ++++ .../ServerExtensionVersionConverter.cs | 114 ++++ .../Common/Models/CdnUriPathBuilder.cs | 30 + SearchScorer/Common/Models/ExtensionFile.cs | 38 ++ SearchScorer/Common/Models/ExtensionQuery.cs | 467 +++++++++++++++ .../Common/Models/ExtensionStatistic.cs | 20 + SearchScorer/Common/Models/PackageDetails.cs | 34 ++ .../Common/Models/PublishedExtension.cs | 557 ++++++++++++++++++ SearchScorer/Common/Models/Publisher.cs | 55 ++ .../Models/PublisherAssetConfiguration.cs | 16 + SearchScorer/Common/Models/QueryFilter.cs | 111 ++++ SearchScorer/Common/Models/SearchParams.cs | 256 ++++++++ SearchScorer/Common/Models/SearchRequest.cs | 14 + .../Common/PackageIdPatternValidator.cs | 2 +- SearchScorer/Common/SearchClient.cs | 8 +- SearchScorer/Common/SearchResponse.cs | 2 +- .../Common/SearchService/ArgumentUtility.cs | 81 +++ .../SearchService/AzureSearchDataTypes.cs | 193 ++++++ .../NormalizedDiscountedCumulativeGain.cs | 4 +- .../IREvalutation/RelevancyScoreResult.cs | 6 +- SearchScorer/Program.cs | 5 +- SearchScorer/SearchScorerSettings.cs | 21 +- 25 files changed, 2483 insertions(+), 21 deletions(-) create mode 100644 SearchScorer/Common/CustomConverters/ExtensionBadgeConverter.cs create mode 100644 SearchScorer/Common/CustomConverters/ExtensionFileConverter.cs create mode 100644 SearchScorer/Common/CustomConverters/ExtensionVersionConverter.cs create mode 100644 SearchScorer/Common/CustomConverters/PublishedExtensionConverter.cs create mode 100644 SearchScorer/Common/CustomConverters/ServerExtensionVersionConverter.cs create mode 100644 SearchScorer/Common/Models/CdnUriPathBuilder.cs create mode 100644 SearchScorer/Common/Models/ExtensionFile.cs create mode 100644 SearchScorer/Common/Models/ExtensionQuery.cs create mode 100644 SearchScorer/Common/Models/ExtensionStatistic.cs create mode 100644 SearchScorer/Common/Models/PackageDetails.cs create mode 100644 SearchScorer/Common/Models/PublishedExtension.cs create mode 100644 SearchScorer/Common/Models/Publisher.cs create mode 100644 SearchScorer/Common/Models/PublisherAssetConfiguration.cs create mode 100644 SearchScorer/Common/Models/QueryFilter.cs create mode 100644 SearchScorer/Common/Models/SearchParams.cs create mode 100644 SearchScorer/Common/Models/SearchRequest.cs create mode 100644 SearchScorer/Common/SearchService/ArgumentUtility.cs create mode 100644 SearchScorer/Common/SearchService/AzureSearchDataTypes.cs diff --git a/SearchScorer/Common/CustomConverters/ExtensionBadgeConverter.cs b/SearchScorer/Common/CustomConverters/ExtensionBadgeConverter.cs new file mode 100644 index 0000000..b791d10 --- /dev/null +++ b/SearchScorer/Common/CustomConverters/ExtensionBadgeConverter.cs @@ -0,0 +1,68 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Text.Json; +using System.Text.Json.Serialization; +using SearchScorer.Common; + +namespace SearchScorer.Common +{ + public class ExtensionBadgeConverter : JsonConverter + { + public override ExtensionBadge Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException(); + } + + var extensionFile = new ExtensionBadge(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) + { + return extensionFile; + } + + if (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString().ToLowerInvariant(); + reader.Read(); + switch (propertyName) + { + case "link": + extensionFile.Link = reader.GetString(); + break; + case "imguri": + extensionFile.ImgUri = reader.GetString(); + break; + case "description": + extensionFile.Description = reader.GetString(); + break; + } + } + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, + ExtensionBadge extensionFile, + JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WriteString("link", extensionFile.Link); + writer.WriteString("imgUri", extensionFile.ImgUri); + writer.WriteString("description", extensionFile.Description); + + writer.WriteEndObject(); + } + } +} \ No newline at end of file diff --git a/SearchScorer/Common/CustomConverters/ExtensionFileConverter.cs b/SearchScorer/Common/CustomConverters/ExtensionFileConverter.cs new file mode 100644 index 0000000..f25d76c --- /dev/null +++ b/SearchScorer/Common/CustomConverters/ExtensionFileConverter.cs @@ -0,0 +1,93 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Text.Json; +using System.Text.Json.Serialization; +using SearchScorer.Common; + +namespace SearchScorer.Common +{ + public class ExtensionFileConverter : JsonConverter + { + public override ExtensionFile Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException(); + } + + var extensionFile = new ExtensionFile(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) + { + return extensionFile; + } + + if (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString().ToLowerInvariant(); + reader.Read(); + switch (propertyName) + { + case "assettype": + extensionFile.AssetType = reader.GetString(); + break; + case "language": + extensionFile.Language = reader.GetString(); + break; + case "source": + extensionFile.Source = reader.GetString(); + break; + case "version": + extensionFile.Version = reader.GetString(); + break; + case "contenttype": + extensionFile.ContentType = reader.GetString(); + break; + case "fileid": + extensionFile.FileId = reader.GetInt32(); + break; + case "shortdescription": + extensionFile.ShortDescription = reader.GetString(); + break; + case "isdefault": + extensionFile.IsDefault = reader.GetBoolean(); + break; + case "ispublic": + extensionFile.IsPublic = reader.GetBoolean(); + break; + } + } + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, + ExtensionFile extensionFile, + JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WriteString("assetType", extensionFile.AssetType); + if (extensionFile.Language != null) + { + writer.WriteString("language", extensionFile.Language); + } + + if (extensionFile.Source != null) + { + writer.WriteString("source", extensionFile.Source); + } + + writer.WriteEndObject(); + } + } +} \ No newline at end of file diff --git a/SearchScorer/Common/CustomConverters/ExtensionVersionConverter.cs b/SearchScorer/Common/CustomConverters/ExtensionVersionConverter.cs new file mode 100644 index 0000000..877e8e5 --- /dev/null +++ b/SearchScorer/Common/CustomConverters/ExtensionVersionConverter.cs @@ -0,0 +1,186 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using SearchScorer.Common; + +namespace SearchScorer.Common +{ + public class ExtensionVersionConverter : JsonConverter + { + public override ExtensionVersion Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException(); + } + + var extensionVersion = new ExtensionVersion(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) + { + return extensionVersion; + } + + if (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString().ToLowerInvariant(); + reader.Read(); + switch (propertyName) + { + case "version": + extensionVersion.Version = reader.GetString(); + break; + case "flags": + var extensionVersionFlags = reader.GetString(); + var versionFlags = extensionVersionFlags.Split(",") + .Select(x => x.Trim()) + .ToList(); + ExtensionVersionFlags flags = default(ExtensionVersionFlags); + foreach (var flag in versionFlags) + { + flags = flags | (ExtensionVersionFlags)Enum.Parse(typeof(ExtensionVersionFlags), flag, true); + } + extensionVersion.Flags = flags; + break; + case "lastupdated": + extensionVersion.LastUpdated = reader.GetDateTime(); + break; + case "versiondescription": + extensionVersion.VersionDescription = reader.GetString(); + break; + case "validationresultmessage": + extensionVersion.ValidationResultMessage = reader.GetString(); + break; + case "files": + string files; + using (var jsonDoc = JsonDocument.ParseValue(ref reader)) + { + files = jsonDoc.RootElement.GetRawText(); + } + + extensionVersion.Files = JsonSerializer.Deserialize>(files); + break; + case "properties": + string properties; + using (var jsonDoc = JsonDocument.ParseValue(ref reader)) + { + properties = jsonDoc.RootElement.GetRawText(); + } + extensionVersion.Properties = JsonSerializer.Deserialize>>(properties); + break; + case "badges": + string badges; + using (var jsonDoc = JsonDocument.ParseValue(ref reader)) + { + badges = jsonDoc.RootElement.GetRawText(); + } + extensionVersion.Badges = JsonSerializer.Deserialize>(badges); + break; + case "asseturi": + extensionVersion.AssetUri = reader.GetString(); + break; + case "fallbackasseturi": + extensionVersion.FallbackAssetUri = reader.GetString(); + break; + case "cdndirectory": + extensionVersion.CdnDirectory = reader.GetString(); + break; + case "iscdnenabled": + extensionVersion.IsCdnEnabled = reader.GetBoolean(); + break; + case "targetplatform": + extensionVersion.TargetPlatform = reader.GetString(); + break; + } + } + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, + ExtensionVersion extensionVersion, + JsonSerializerOptions options) + { + writer.WriteStartObject(); + writer.WriteString("version", extensionVersion.Version); + if (extensionVersion.TargetPlatform != null) + { + writer.WriteString("targetPlatform", extensionVersion.TargetPlatform); + } + + writer.WriteString("flags", extensionVersion.Flags.ToString().ConvertFlagsToString()); + writer.WriteString("lastUpdated", extensionVersion.LastUpdated); + if (extensionVersion.VersionDescription != null) + { + writer.WriteString("versionDescription", extensionVersion.VersionDescription); + } + + if (extensionVersion.ValidationResultMessage != null) + { + writer.WriteString("validationResultMessage", extensionVersion.ValidationResultMessage); + } + + if (extensionVersion.Files != null) + { + writer.WriteStartArray("files"); + ExtensionFileConverter extensionFileConverter = new ExtensionFileConverter(); + foreach (var file in extensionVersion.Files) + { + extensionFileConverter.Write(writer, file, options); + } + + writer.WriteEndArray(); + } + + if (extensionVersion.Properties != null) + { + writer.WriteStartArray("properties"); + foreach (var property in extensionVersion.Properties) + { + writer.WriteStartObject(); + writer.WriteString("key", property.Key); + writer.WriteString("value", property.Value); + writer.WriteEndObject(); + } + + writer.WriteEndArray(); + } + + if (extensionVersion.Badges != null) + { + writer.WriteStartArray("badges"); + ExtensionBadgeConverter extensionBadgeConverter = new ExtensionBadgeConverter(); + foreach (var file in extensionVersion.Badges) + { + extensionBadgeConverter.Write(writer, file, options); + } + + writer.WriteEndArray(); + } + + if (extensionVersion.AssetUri != null) + { + writer.WriteString("assetUri", extensionVersion.AssetUri); + } + + if (extensionVersion.FallbackAssetUri != null) + { + writer.WriteString("fallbackAssetUri", extensionVersion.FallbackAssetUri); + } + + writer.WriteEndObject(); + } + } +} diff --git a/SearchScorer/Common/CustomConverters/PublishedExtensionConverter.cs b/SearchScorer/Common/CustomConverters/PublishedExtensionConverter.cs new file mode 100644 index 0000000..32893f2 --- /dev/null +++ b/SearchScorer/Common/CustomConverters/PublishedExtensionConverter.cs @@ -0,0 +1,123 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; +using SearchScorer.Common; + +namespace SearchScorer.Common +{ + public class PublishedExtensionConverter : JsonConverter + { + public override PublishedExtension Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + throw new NotImplementedException(); + } + + public override void Write(Utf8JsonWriter writer, + PublishedExtension publishedExtension, + JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WriteStartObject("publisher"); + writer.WriteString("publisherId", publishedExtension.Publisher.PublisherId); + writer.WriteString("publisherName", publishedExtension.Publisher.PublisherName); + writer.WriteString("displayName", publishedExtension.Publisher.DisplayName); + writer.WriteString("flags", publishedExtension.Publisher.Flags.ToString().ConvertFlagsToString()); + writer.WriteString("domain", publishedExtension.Publisher.Domain); + writer.WriteBoolean("isDomainVerified", publishedExtension.Publisher.IsDomainVerified); + writer.WriteEndObject(); + + writer.WriteString("extensionId", publishedExtension.ExtensionId); + writer.WriteString("extensionName", publishedExtension.ExtensionName); + writer.WriteString("displayName", publishedExtension.DisplayName); + writer.WriteString("flags", publishedExtension.Flags.ToString().ConvertFlagsToString()); + writer.WriteString("lastUpdated", publishedExtension.LastUpdated); + writer.WriteString("publishedDate", publishedExtension.PublishedDate); + if (publishedExtension.ReleaseDate != null) + { + writer.WriteString("releaseDate", publishedExtension.ReleaseDate); + } + + if (publishedExtension.ShortDescription != null) + { + writer.WriteString("shortDescription", publishedExtension.ShortDescription); + } + + if (publishedExtension.LongDescription != null) + { + writer.WriteString("longDescription", publishedExtension.LongDescription); + } + + if (publishedExtension.Versions != null) + { + writer.WriteStartArray("versions"); + foreach (var version in publishedExtension.Versions) + { + ExtensionVersionConverter evc = new ExtensionVersionConverter(); + evc.Write(writer, version, options); + } + + writer.WriteEndArray(); + } + + if (publishedExtension.Categories != null) + { + writer.WriteStartArray("categories"); + foreach (var category in publishedExtension.Categories) + { + writer.WriteStringValue(category); + } + + writer.WriteEndArray(); + } + + if (publishedExtension.Tags != null) + { + writer.WriteStartArray("tags"); + foreach (var tag in publishedExtension.Tags) + { + writer.WriteStringValue(tag); + } + + writer.WriteEndArray(); + } + + if (publishedExtension.Statistics != null) + { + writer.WriteStartArray("statistics"); + foreach (var statistics in publishedExtension.Statistics) + { + writer.WriteStartObject(); + writer.WriteString("statisticName", statistics.StatisticName); + writer.WriteNumber("value", statistics.Value); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + if (publishedExtension.InstallationTargets != null) + { + writer.WriteStartArray("installationTargets"); + foreach (var installationTarget in publishedExtension.InstallationTargets) + { + writer.WriteStartObject(); + writer.WriteString("target", installationTarget.Target); + writer.WriteString("targetVersion", installationTarget.TargetVersion); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + writer.WriteNumber("deploymentType", (int)publishedExtension.DeploymentType); + writer.WriteEndObject(); + } + } +} \ No newline at end of file diff --git a/SearchScorer/Common/CustomConverters/ServerExtensionVersionConverter.cs b/SearchScorer/Common/CustomConverters/ServerExtensionVersionConverter.cs new file mode 100644 index 0000000..7df6a53 --- /dev/null +++ b/SearchScorer/Common/CustomConverters/ServerExtensionVersionConverter.cs @@ -0,0 +1,114 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using SearchScorer.Common; + +namespace SearchScorer.Common +{ + public class ServerExtensionVersionConverter : JsonConverter + { + public override ServerExtensionVersion Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException(); + } + + var serverExtensionVersion = new ServerExtensionVersion(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) + { + return serverExtensionVersion; + } + + if (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString().ToLowerInvariant(); + reader.Read(); + switch (propertyName) + { + case "version": + serverExtensionVersion.Version = reader.GetString(); + break; + case "flags": + string extensionVersionFlags = reader.GetString(); + ExtensionVersionFlags flags = default(ExtensionVersionFlags); + var versionFlags = extensionVersionFlags.Split(",") + .Select(x => x.Trim()) + .ToList(); + + foreach (var flag in versionFlags) + { + flags = flags | (ExtensionVersionFlags)Enum.Parse(typeof(ExtensionVersionFlags), flag, true); + } + + serverExtensionVersion.Flags = flags; + break; + case "lastupdated": + serverExtensionVersion.LastUpdated = reader.GetDateTime(); + break; + case "versiondescription": + serverExtensionVersion.VersionDescription = reader.GetString(); + break; + case "validationresultmessage": + serverExtensionVersion.ValidationResultMessage = reader.GetString(); + break; + case "files": + string files; + using (var jsonDoc = JsonDocument.ParseValue(ref reader)) + { + files = jsonDoc.RootElement.GetRawText(); + } + + serverExtensionVersion.Files = JsonSerializer.Deserialize>(files); + break; + case "properties": + string properties; + using (var jsonDoc = JsonDocument.ParseValue(ref reader)) + { + properties = jsonDoc.RootElement.GetRawText(); + } + + serverExtensionVersion.Properties = JsonSerializer.Deserialize>>(properties); + break; + case "badges": + string badges; + using (var jsonDoc = JsonDocument.ParseValue(ref reader)) + { + badges = jsonDoc.RootElement.GetRawText(); + } + serverExtensionVersion.Badges = JsonSerializer.Deserialize>(badges); + break; + case "asseturi": + serverExtensionVersion.AssetUri = reader.GetString(); + break; + case "fallbackasseturi": + serverExtensionVersion.FallbackAssetUri = reader.GetString(); + break; + case "targetplatform": + serverExtensionVersion.TargetPlatform = reader.GetString(); + break; + } + } + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, ServerExtensionVersion value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } + } +} diff --git a/SearchScorer/Common/Models/CdnUriPathBuilder.cs b/SearchScorer/Common/Models/CdnUriPathBuilder.cs new file mode 100644 index 0000000..5616a1c --- /dev/null +++ b/SearchScorer/Common/Models/CdnUriPathBuilder.cs @@ -0,0 +1,30 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; + +namespace SearchScorer.Common +{ + public class CdnUriPathBuilder + { + public string PublisherName { get; set; } + public string ExtensionName { get; set; } + public string ExtensionVersion { get; set; } + public string AssetRoot { get; set; } + + public const string CdnUrlFormat = "{0}/{1}/{2}/{3}"; + + public static string GetExtensionAssetUploadPath(string publisherName, + string extensionName, + string extensionVersion, + string assetRoot) + { + return string.Format(CdnUrlFormat, + Uri.EscapeDataString(publisherName.ToLowerInvariant()), + Uri.EscapeDataString(extensionName.ToLowerInvariant()), + Uri.EscapeDataString(extensionVersion.ToLowerInvariant()), + assetRoot != null ? Uri.EscapeDataString(assetRoot) : string.Empty); + } + } +} \ No newline at end of file diff --git a/SearchScorer/Common/Models/ExtensionFile.cs b/SearchScorer/Common/Models/ExtensionFile.cs new file mode 100644 index 0000000..e18a31d --- /dev/null +++ b/SearchScorer/Common/Models/ExtensionFile.cs @@ -0,0 +1,38 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Text.Json.Serialization; + +namespace SearchScorer.Common +{ + [JsonConverter(typeof(ExtensionFileConverter))] + public class ExtensionFile + { + internal Guid ReferenceId { get; set; } + + public String AssetType { get; set; } + + public String Language { get; set; } + + public String Source { get; set; } + + public String Version { get; set; } + + public String ContentType { get; set; } + + public Int32 FileId { get; set; } + + public String ShortDescription { get; set; } + + public Boolean IsDefault { get; set; } + + public Boolean IsPublic { get; set; } + + internal ExtensionFile ShallowCopy() + { + return (ExtensionFile)this.MemberwiseClone(); + } + } +} diff --git a/SearchScorer/Common/Models/ExtensionQuery.cs b/SearchScorer/Common/Models/ExtensionQuery.cs new file mode 100644 index 0000000..e8fbde7 --- /dev/null +++ b/SearchScorer/Common/Models/ExtensionQuery.cs @@ -0,0 +1,467 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SearchScorer.Common +{ + public static class WellKnownTags + { + public const String Tag_BuiltIn = "$BuiltIn"; + public const String Tag_Featured = "$Featured"; + public const String Tag_FromMS = "$FromMS"; + public const String Tag_TopFree = "$TopFree"; + public const String Tag_TopPaid = "$TopPaid"; + public const String Tag_TopRated = "$TopRated"; + } + + /// + /// Type of extension filters that are supported in the queries. + /// + [DataContract] + public enum ExtensionQueryFilterType + { + /// + /// The values are used as tags. All tags are treated as "OR" conditions + /// with each other. There may be some value put on the number of matched + /// tags from the query. + /// + [DataMember] + Tag = 1, + + /// + /// The Values are an ExtensionName or fragment that is used to match other + /// extension names. + /// + [DataMember] + DisplayName = 2, + + /// + /// The Filter is one or more tokens that define what scope to return + /// private extensions for. + /// + [DataMember] + Private = 3, + + /// + /// Retrieve a set of extensions based on their id's. The values should be + /// the extension id's encoded as strings. + /// + [DataMember] + Id = 4, + + /// + /// The category is unlike other filters. It is AND'd with the other filters + /// instead of being a separate query. + /// + [DataMember] + Category = 5, + + /// + /// Certain contribution types may be indexed to allow for query by type. + /// User defined types can't be indexed at the moment. + /// + [DataMember] + ContributionType = 6, + + /// + /// Retrieve an set extension based on the name based identifier. This + /// differs from the internal id (which is being deprecated). + /// + [DataMember] + Name = 7, + + /// + /// The InstallationTarget for an extension defines the target consumer + /// for the extension. This may be something like VS, VSOnline, or VSCode + /// + [DataMember] + InstallationTarget = 8, + + /// + /// Query for featured extensions, no value is allowed when using the + /// query type. + /// + [DataMember] + Featured = 9, + + /// + /// The SearchText provided by the user to search for extensions + /// + [DataMember] + SearchText = 10, + + /// + /// Query for extensions that are featured in their own category, The filterValue + /// for this is name of category of extensions. + /// + [DataMember] + FeaturedInCategory = 11, + + /// + /// When retrieving extensions from a query, exclude the extensions which are + /// having the given flags. The value specified for this filter should be a string + /// representing the integer values of the flags to be excluded. In case of multiple flags + /// to be specified, a logical OR of the interger values should be given as value for this filter + /// This should be at most one filter of this type. + /// This only acts as a restrictive filter after. + /// In case of having a particular flag in both IncludeWithFlags and ExcludeWithFlags, + /// excludeFlags will remove the included extensions giving empty result for that flag. + /// + [DataMember] + ExcludeWithFlags = 12, + + /// + /// When retrieving extensions from a query, include the extensions which are + /// having the given flags. The value specified for this filter should be a string + /// representing the integer values of the flags to be included. In case of multiple flags + /// to be specified, a logical OR of the integer values should be given as value for this filter + /// This should be at most one filter of this type. + /// This only acts as a restrictive filter after. + /// In case of having a particular flag in both IncludeWithFlags and ExcludeWithFlags, + /// excludeFlags will remove the included extensions giving empty result for that flag. + /// In case of multiple flags given in IncludeWithFlags in ORed fashion, extensions having any of the given flags will be included. + /// + [DataMember] + IncludeWithFlags = 13, + + /// + /// Filter the extensions based on the LCID values applicable. Any extensions which are not having any LCID values + /// will also be filtered. This is currently only supported for VS extensions. + /// + [DataMember] + Lcid = 14, + + /// + /// Filter to provide the version of the installation target. This filter will be used along with InstallationTarget filter. + /// The value should be a valid version string. Currently supported only if search text is provided. + /// + [DataMember] + InstallationTargetVersion = 15, + + /// + /// Filter type for specifying a range of installation target version. The filter will be used along with InstallationTarget filter. + /// The value should be a pair of well formed version values separated by hyphen(-). Currently supported only if search text is provided. + /// + [DataMember] + InstallationTargetVersionRange = 16, + + /// + /// Filter type for specifying metadata key and value to be used for filtering. + /// + [DataMember] + VsixMetadata = 17, + + /// + /// Filter to get extensions published by a publisher having supplied internal name + /// + [DataMember] + PublisherName = 18, + + /// + /// Filter to get extensions published by all publishers having supplied display name + /// + [DataMember] + PublisherDisplayName = 19, + + /// + /// When retrieving extensions from a query, include the extensions which have a publisher + /// having the given flags. The value specified for this filter should be a string + /// representing the integer values of the flags to be included. In case of multiple flags + /// to be specified, a logical OR of the integer values should be given as value for this filter + /// There should be at most one filter of this type. + /// This only acts as a restrictive filter after. + /// In case of multiple flags given in IncludeWithFlags in ORed fashion, extensions having any of the given flags will be included. + /// + [DataMember] + IncludeWithPublisherFlags = 20, + + /// + /// Filter to get extensions shared with particular organization + /// + [DataMember] + [Obsolete] + OrganizationSharedWith = 21, + + /// + /// Filter to get VS IDE extensions by Product Architecture + /// + [DataMember] + ProductArchitecture = 22, + + /// + /// Filter to get VS Code extensions by target platform. + /// + [DataMember] + TargetPlatform = 23 + } + + /// + /// Defines the sort order that can be defined for Extensions query + /// + [DataContract] + public enum SortByType + { + /// + /// The results will be sorted by relevance in case search query is given, if no search query resutls will be provided as is + /// + [DataMember] + Relevance = 0, + + /// + /// The results will be sorted as per Last Updated date of the extensions with recently updated at the top + /// + [DataMember] + LastUpdatedDate = 1, + + /// + /// Results will be sorted Alphabetically as per the title of the extension + /// + [DataMember] + Title = 2, + + /// + /// Results will be sorted Alphabetically as per Publisher title + /// + [DataMember] + Publisher = 3, + + /// + /// Results will be sorted by Install Count + /// + [DataMember] + InstallCount = 4, + + /// + /// The results will be sorted as per Published date of the extensions + /// + [DataMember] + PublishedDate = 5, + + /// + /// The results will be sorted as per Average ratings of the extensions + /// + [DataMember] + AverageRating = 6, + + /// + /// The results will be sorted as per Trending Daily Score of the extensions + /// + [DataMember] + TrendingDaily = 7, + + /// + /// The results will be sorted as per Trending weekly Score of the extensions + /// + [DataMember] + TrendingWeekly = 8, + + /// + /// The results will be sorted as per Trending monthly Score of the extensions + /// + [DataMember] + TrendingMonthly = 9, + + /// + /// The results will be sorted as per ReleaseDate of the extensions (date on which the extension first went public) + /// + [DataMember] + ReleaseDate = 10, + + /// + /// The results will be sorted as per Author defined in the VSix/Metadata. If not defined, publisher name is used + /// This is specifically needed by VS IDE, other (new and old) clients are not encouraged to use this + /// + [DataMember] + Author = 11, + + /// + /// The results will be sorted as per Weighted Rating of the extension. + /// + [DataMember] + WeightedRating = 12 + } + + /// + /// Defines the sort order that can be defined for Extensions query + /// + [DataContract] + public enum SortOrderType + { + /// + /// Results will be sorted in the default order as per the sorting type defined. + /// The default varies for each type, e.g. for Relevance, default is Descending, for Title default is Ascending etc. + /// + [DataMember] + Default = 0, + + /// + /// The results will be sorted in Ascending order + /// + [DataMember] + Ascending = 1, + + /// + /// The results will be sorted in Descending order + /// + [DataMember] + Descending = 2 + } + + /// + /// An ExtensionQuery is used to search the gallery for a set of + /// extensions that match one of many filter values. + /// + public class ExtensionQuery + { + /// + /// Each filter is a unique query and will have matching set of extensions + /// returned from the request. Each result will have the same index in the + /// resulting array that the filter had in the incoming query. + /// + public List Filters { get; set; } + + /// + /// The Flags are used to determine which set of information the caller would + /// like returned for the matched extensions. + /// + public ExtensionQueryFlags Flags { get; set; } + + /// + /// When retrieving extensions with a query; frequently the caller only + /// needs a small subset of the assets. The caller may specify a list + /// of asset types that should be returned if the extension contains it. + /// All other assets will not be returned. + /// + public List AssetTypes { get; set; } + + /// + /// The flags are used to determine what metadata is to be sent along with the + /// query response. This works only for SearchExtensions query and not for QueryExtensions. + /// + // internal ExtensionQueryResultMetadataFlags? MetadataFlags { get; set; } + public ExtensionQueryResultMetadataFlags? MetadataFlags { get; set; } + } + + /// + /// This is the set of extensions that matched a supplied query through the + /// filters given. + /// + public class ExtensionQueryResult + { + /// + /// For each filter supplied in the query, a filter result will be returned + /// in the query result. + /// + public List Results { get; set; } + } + + /// + /// The FilterResult is the set of extensions that matched a particular + /// query filter. + /// + public class ExtensionFilterResult + { + /// + /// This is the set of applications that matched the query filter + /// supplied. + /// + public List Extensions { get; set; } + + /// + /// The PagingToken is returned from a request when more records exist + /// that match the result than were requested or could be returned. A + /// follow-up query with this paging token can be used to retrieve + /// more results. + /// + public String PagingToken { get; set; } + + /// + /// This is the additional optional metadata for the given result. + /// E.g. Total count of results which is useful in case of paged results + /// + public List ResultMetadata { get; set; } + } + + /// + /// ExtensionFilterResultMetadata is one set of metadata for the result e.g. Total count. + /// There can be multiple metadata items for one metadata. + /// + public class ExtensionFilterResultMetadata + { + /// + /// Defines the category of metadata items + /// + public String MetadataType { get; set; } + + /// + /// The metadata items for the category + /// + public List MetadataItems { get; set; } + } + + /// + /// MetadataItem is one value of metadata under a given category of metadata + /// + public class MetadataItem + { + /// + /// The name of the metadata item + /// + public String Name { get; set; } + + /// + /// The count of the metadata item + /// + public int Count { get; set; } + } + + /// + /// Parameters which can be given as part of search query + /// All parameters restrict the result set by default. + /// Multiple params of same type means OR for the given values + /// + public static class EqlParams + { + /// + /// Name parameter to restrict the results matching extension name only to the given value following the parameter + /// If nothing else is given all extension names matching the given value are returned. + /// Multiple params of name within same query means extensions matching any one of the given values + /// + public const string Name = "name:"; + + /// + /// Publisher parameter to restrict the results matching publisher name only to the given value following the parameter + /// If nothing else is given all extension by publishers whose name is matching the given value are returned. + /// Multiple params of publisher within same query means extensions' publisher name matching any one of the given values + /// + public const string Publisher = "publisher:"; + + /// + /// Tag parameter to restrict the results matching tag name only to the given value following the parameter + /// If nothing else is given all extension with tag name matching the given value are returned. + /// Multiple params of tag within same query means extensions' having tag name matching any one of the given values + /// + public const string Tag = "tag:"; + + /// + /// Category parameter to restrict the results matching "Exact" category name only to the given value following the parameter + /// If nothing else is given all extension having category name matching the given value are returned. + /// Multiple params of category within same query means extensions' belonging to any one of the given values + /// + public const string Category = "category:"; + + /// + /// Installation target parameter to restrict the results matching "Exact" installation target name only to the given value + /// following the parameter. + /// If nothing else is given all extension having installation target matching the given value are returned. + /// Multiple params of installation target within same query means extensions' belonging to any one of the given values + /// The installation targets should be encloseed in double quotes as it may contain '.'s and search query will not interpret + /// the dots without double quotes. + /// + public const string Target = "target:"; + } +} diff --git a/SearchScorer/Common/Models/ExtensionStatistic.cs b/SearchScorer/Common/Models/ExtensionStatistic.cs new file mode 100644 index 0000000..9330a26 --- /dev/null +++ b/SearchScorer/Common/Models/ExtensionStatistic.cs @@ -0,0 +1,20 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; + +namespace SearchScorer.Common +{ + public class ExtensionStatistic + { + public String StatisticName { get; set; } + + public Double Value { get; set; } + + public ExtensionStatistic ShallowCopy() + { + return (ExtensionStatistic)this.MemberwiseClone(); + } + } +} diff --git a/SearchScorer/Common/Models/PackageDetails.cs b/SearchScorer/Common/Models/PackageDetails.cs new file mode 100644 index 0000000..519be9b --- /dev/null +++ b/SearchScorer/Common/Models/PackageDetails.cs @@ -0,0 +1,34 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Text.Json.Serialization; + +namespace SearchScorer.Common +{ + [JsonConverter(typeof(ExtensionBadgeConverter))] + public class ExtensionBadge + { + public String Link { get; set; } + + public String ImgUri { get; set; } + + public String Description { get; set; } + } + + public class InstallationTarget + { + public String Target { get; set; } + + public String TargetVersion { get; set; } + + public Version MinVersion { get; set; } + + public Version MaxVersion { get; set; } + + public bool MinInclusive { get; set; } + + public bool MaxInclusive { get; set; } + } +} diff --git a/SearchScorer/Common/Models/PublishedExtension.cs b/SearchScorer/Common/Models/PublishedExtension.cs new file mode 100644 index 0000000..990f2fc --- /dev/null +++ b/SearchScorer/Common/Models/PublishedExtension.cs @@ -0,0 +1,557 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace SearchScorer.Common +{ + /// + /// Set of flags that can be associated with a given extension. These flags + /// apply to all versions of the extension and not to a specific version. + /// + [Flags] + public enum PublishedExtensionFlags + { + /// + /// No flags exist for this extension. + /// + None = 0x0000, + + /// + /// The Disabled flag for an extension means the extension can't be + /// changed and won't be used by consumers. The disabled flag is managed + /// by the service and can't be supplied by the Extension Developers. + /// + Disabled = 0x0001, + + /// + /// BuiltIn Extension are available to all Tenants. An explicit registration + /// is not required. This attribute is reserved and can't be supplied by + /// Extension Developers. + /// + /// BuiltIn extensions are by definition Public. There is no need to set + /// the public flag for extensions marked BuiltIn. + /// + BuiltIn = 0x0002, + + /// + /// This extension has been validated by the service. The extension + /// meets the requirements specified. This attribute is reserved and can't + /// be supplied by the Extension Developers. Validation is a process + /// that ensures that all contributions are well formed. They meet the + /// requirements defined by the contribution type they are extending. + /// Note this attribute will be updated asynchronously as the extension + /// is validated by the developer of the contribution type. There will + /// be restricted access to the extension while this process is performed. + /// + Validated = 0x0004, + + /// + /// Trusted extensions are ones that are given special capabilities. These + /// tend to come from Microsoft and can't be published by the general + /// public. + /// + /// Note: BuiltIn extensions are always trusted. + /// + Trusted = 0x0008, + + /// + /// The Paid flag indicates that the commerce can be enabled for this extension. + /// Publisher needs to setup Offer/Pricing plan in Azure. If Paid flag is set and a corresponding Offer is not available, + /// the extension will automatically be marked as Preview. If the publisher intends to make the extension Paid in the future, + /// it is mandatory to set the Preview flag. This is currently available only for VSTS extensions only. + /// + Paid = 0x0010, + + /// + /// This extension registration is public, making its visibility open + /// to the public. This means all tenants have the ability to install + /// this extension. Without this flag the extension will be private and + /// will need to be shared with the tenants that can install it. + /// + Public = 0x0100, + + /// + /// This extension has multiple versions active at one time and version + /// discovery should be done using the defined "Version Discovery" protocol + /// to determine the version available to a specific user or tenant. + /// + /// @TODO: Link to Version Discovery Protocol. + /// + MultiVersion = 0x0200, + + /// + /// The system flag is reserved, and cant be used by publishers. + /// + System = 0x0400, + + /// + /// The Preview flag indicates that the extension is still under preview (not yet of "release" quality). + /// These extensions may be decorated differently in the gallery and may have different policies applied to them. + /// + Preview = 0x0800, + + /// + /// The Unpublished flag indicates that the extension can't be installed/downloaded. + /// Users who have installed such an extension can continue to use the extension. + /// + Unpublished = 0x1000, + + /// + /// The Trial flag indicates that the extension is in Trial version. + /// The flag is right now being used only with respect to Visual Studio extensions. + /// + Trial = 0x2000, + + /// + /// The Locked flag indicates that extension has been locked from Marketplace. + /// Further updates/acquisitions are not allowed on the extension until this is present. + /// This should be used along with making the extension private/unpublished. + /// + Locked = 0x4000, + + /// + /// This flag is set for extensions we want to hide from Marketplace home and search pages. + /// This will be used to override the exposure of builtIn flags. + /// + Hidden = 0x8000 + } + + /// + /// Set of flags that can be associated with a given extension version. These flags + /// apply to a specific version of the extension. + /// + [Flags] + public enum ExtensionVersionFlags + { + /// + /// No flags exist for this version. + /// + None = 0x0000, + + /// + /// The Validated flag for a version means the extension version + /// has passed validation and can be used.. + /// + Validated = 0x0001 + } + + + /// + /// + public enum ExtensionDeploymentTechnology + { + Exe = 1, + + Msi, + + Vsix, + + ReferralLink + } + + /// + /// Set of flags used to determine which set of information is retrieved + /// when reading published extensions + /// + [Flags] + public enum ExtensionQueryFlags + { + /// + /// None is used to retrieve only the basic extension details. + /// + None = 0x0, + + /// + /// IncludeVersions will return version information for extensions returned + /// + IncludeVersions = 0x1, + + /// + /// IncludeFiles will return information about which files were found + /// within the extension that were stored independent of the manifest. + /// When asking for files, versions will be included as well since files + /// are returned as a property of the versions. + /// + /// These files can be retrieved using the path to the file without + /// requiring the entire manifest be downloaded. + /// + IncludeFiles = 0x2, + + /// + /// Include the Categories and Tags that were added to the extension definition. + /// + IncludeCategoryAndTags = 0x4, + + /// + /// Include the details about which accounts the extension has been shared + /// with if the extension is a private extension. + /// + // IncludeSharedAccounts = 0x8, + + /// + /// Include properties associated with versions of the extension + /// + IncludeVersionProperties = 0x10, + + /// + /// Excluding non-validated extensions will remove any extension versions that + /// either are in the process of being validated or have failed validation. + /// + ExcludeNonValidated = 0x20, + + /// + /// Include the set of installation targets the extension has requested. + /// + IncludeInstallationTargets = 0x40, + + /// + /// Include the base uri for assets of this extension + /// + IncludeAssetUri = 0x80, + + /// + /// Include the statistics associated with this extension + /// + IncludeStatistics = 0x100, + + /// + /// When retrieving versions from a query, only include the latest + /// version of the extensions that matched. This is useful when the + /// caller doesn't need all the published versions. It will save a + /// significant size in the returned payload. + /// + IncludeLatestVersionOnly = 0x200, + + /// + /// This flag switches the asset uri to use GetAssetByName instead of CDN + /// When this is used, values of base asset uri and base asset uri fallback are switched + /// When this is used, source of asset files are pointed to Gallery service always even if CDN is available + /// + UseFallbackAssetUri = 0x400, + + /// + /// This flag is used to get all the metadata values associated with the extension. This is not applicable to VSTS or + /// VSCode extensions and usage is only internal. + /// + IncludeMetadata = 0x800, + + /// + /// This flag is used to indicate to return very small data for extension required by VS IDE. This flag is only compatible + /// when querying is done by VS IDE + /// + IncludeMinimalPayloadForVsIde = 0x1000, + + /// + /// This flag is used to get Lcid values associated with the extension. This is not applicable to VSTS + /// or VSCode extensions and usage is only internal + /// + IncludeLcids = 0x2000, + + /// + /// AllAttributes is designed to be a mask that defines all sub-elements of + /// the extension should be returned. + /// + /// NOTE: This is not actually All flags. This is now locked to the set + /// defined since changing this enum would be a breaking change and would + /// change the behavior of anyone using it. Try not to use this value when + /// making calls to the service, instead be explicit about the options + /// required. + /// + // AllAttributes = IncludeVersions | IncludeFiles | IncludeCategoryAndTags | IncludeSharedAccounts | IncludeVersionProperties | IncludeInstallationTargets | IncludeAssetUri | IncludeStatistics | IncludeSharedOrganizations, + AllAttributes = IncludeVersions | IncludeFiles | IncludeCategoryAndTags | IncludeVersionProperties | IncludeInstallationTargets | IncludeAssetUri | IncludeStatistics, + } + + [Flags] + // internal enum ExtensionQueryResultMetadataFlags + public enum ExtensionQueryResultMetadataFlags + { + /// + /// No metadata will be returned + /// + None = 0x0, + + /// + /// Include the result total count metadata + /// + IncludeResultCount = 0x1, + + /// + /// Include Categories metadata before applying any category filtering. This is useful to show the counts of other categories + /// even though the user has filtered on one of the category + /// + IncludePreCategoryFilterCategories = 0x2, + + /// + /// Include Categories metadata of the final result set + /// + IncludeResultSetCategories = 0x4, + + /// + /// Include ProjectType metadata of the final result set. This is required for Programming Language Filter in Visual Studio IDE integration. + /// + IncludeResultSetProjectType = 0x8, + + /// + /// Include the target platforms metadata. This is useful to show the counts of each TargetPlatform on the target platforms filter while searching VSCode extensions. + /// + IncludeTargetPlatforms = 0x10 + } + + /// + /// Class to hold extension metadata value + /// Currently this is internal. We may not want to make every metadata value public. + /// + // internal class ExtensionMetadata + public class ExtensionMetadata + { + public String Key { get; set; } + + public String Value { get; set; } + + public ExtensionMetadata ShallowCopy() + { + return (ExtensionMetadata)this.MemberwiseClone(); + } + } + + /// + /// High-level information about the publisher, like id's and names + /// + public class PublisherFacts + { + public Guid PublisherId { get; set; } + + public String PublisherName { get; set; } + + public String DisplayName { get; set; } + + public PublisherFlags Flags { get; set; } + + public String Domain { get; set; } + + public Boolean IsDomainVerified { get; set; } + } + + /// + /// + /// + [JsonConverter(typeof(PublishedExtensionConverter))] + public class PublishedExtension + { + public PublisherFacts Publisher { get; set; } + + public Guid ExtensionId { get; set; } + + public String ExtensionName { get; set; } + + public String DisplayName { get; set; } + + public PublishedExtensionFlags Flags { get; set; } + + public DateTime LastUpdated { get; set; } + + /// + /// Date on which the extension was first uploaded. + /// + public DateTime PublishedDate { get; set; } + + /// + /// Date on which the extension first went public. + /// + public DateTime ReleaseDate { get; set; } + + public String ShortDescription { get; set; } + + public String LongDescription { get; set; } + + public List Versions { get; set; } + + public List Categories { get; set; } + + public List Tags { get; set; } + + + public List Statistics { get; set; } + + public List InstallationTargets { get; set; } + + public List Metadata { get; set; } + + public List Lcids { get; set; } + + public ExtensionDeploymentTechnology DeploymentType { get; set; } + + public String GetProperty( + String version, + String propertyName) + { + if (!String.IsNullOrEmpty(version) && Versions != null && Versions.Count > 0) + { + ExtensionVersion extensionVersion = null; + + if (version.Equals("latest")) + { + extensionVersion = Versions[0]; + } + else + { + foreach (ExtensionVersion ev in Versions) + { + if (ev.Version.Equals(version)) + { + extensionVersion = ev; + break; + } + } + } + + if (extensionVersion != null && extensionVersion.Properties != null) + { + foreach (KeyValuePair kvp in extensionVersion.Properties) + { + if (kvp.Key.Equals(propertyName)) + { + return kvp.Value; + } + } + } + } + + return null; + } + + public PublishedExtension ShallowCopy() + { + return (PublishedExtension)this.MemberwiseClone(); + } + } + + /// + /// + /// + /// Note: We have created a copy of ExtensionVersion named ServerExtensionVersion. + /// If you are doing any change in ExtensionVersion, please make sure that it should be added to ServerExtensionVersion too. + [JsonConverter(typeof(ExtensionVersionConverter))] + public class ExtensionVersion + { + internal Guid ExtensionId { get; set; } + + public String Version { get; set; } + + public String TargetPlatform { get; set; } + + public ExtensionVersionFlags Flags { get; set; } + + public DateTime LastUpdated { get; set; } + + public String VersionDescription { get; set; } + + public String ValidationResultMessage { get; set; } + + public List Files { get; set; } + + public List> Properties { get; set; } + + public List Badges { get; set; } + + public String AssetUri { get; set; } + + public String FallbackAssetUri { get; set; } + + public string CdnDirectory { get; set; } + + public bool IsCdnEnabled { get; set; } + + public ExtensionVersion ShallowCopy() + { + return (ExtensionVersion)this.MemberwiseClone(); + } + + public string GetCdnDirectory() + { + return CdnDirectory; + } + } + + /// + public class ExtensionCategory + { + /// + /// This is the internal name for a category + /// + public String CategoryName { get; set; } + + /// + /// This is the internal name of the parent if this is associated with a parent + /// + public String ParentCategoryName { get; set; } + + /// + /// The name of the products with which this category is associated to. + /// + public List AssociatedProducts { get; set; } + + internal int MigratedId { get; set; } + internal int ParentId { get; set; } + public ExtensionCategory Parent { get; set; } + + /// + /// This parameter is obsolete. Refer to LanguageTitles for language specific titles + /// + public String Language { get; set; } + + public Int32 CategoryId { get; set; } + + /// + /// The list of all the titles of this category in various languages + /// + public List LanguageTitles { get; set; } + + internal ExtensionCategory ShallowCopy() + { + return (ExtensionCategory)this.MemberwiseClone(); + } + + public string GetCategoryTitleForLanguage(string language) + { + if (LanguageTitles != null && LanguageTitles.Count > 0) + { + foreach (CategoryLanguageTitle categoryLanguageTitle in LanguageTitles) + { + if (categoryLanguageTitle.Lang != null && + categoryLanguageTitle.Lang.Equals(language, StringComparison.OrdinalIgnoreCase)) + { + return categoryLanguageTitle.Title; + } + } + } + + return null; + } + } + + /// + /// Definition of one title of a category + /// + public class CategoryLanguageTitle + { + /// + /// The language for which the title is applicable + /// + public string Lang { get; set; } + /// + /// Actual title to be shown on the UI + /// + public string Title { get; set; } + /// + /// The language culture id of the lang parameter + /// + public int Lcid { get; set; } + } +} diff --git a/SearchScorer/Common/Models/Publisher.cs b/SearchScorer/Common/Models/Publisher.cs new file mode 100644 index 0000000..0c9ab52 --- /dev/null +++ b/SearchScorer/Common/Models/Publisher.cs @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; + +namespace SearchScorer.Common +{ + [Flags] + public enum PublisherFlags + { + /// + /// This should never be returned, it is used to represent a publisher + /// who's flags haven't changed during update calls. + /// + UnChanged = 0x40000000, + + /// + /// No flags exist for this publisher. + /// + None = 0x0000, + + /// + /// The Disabled flag for a publisher means the publisher can't be changed + /// and won't be used by consumers, this extends to extensions owned by + /// the publisher as well. The disabled flag is managed by the service and + /// can't be supplied by the Extension Developers. + /// + Disabled = 0x0001, + + /// + /// A verified publisher is one that Microsoft has done some review of + /// and ensured the publisher meets a set of requirements. The + /// requirements to become a verified publisher are not listed here. + /// + /// They can be found in public documentation (TBD). + /// + Verified = 0x0002, + + /// + /// A Certified publisher is one that is Microsoft verified and in addition + /// meets a set of requirements for its published extensions. The + /// requirements to become a certified publisher are not listed here. + /// + /// They can be found in public documentation (TBD). + /// + Certified = 0x0004, + + /// + /// This is the set of flags that can't be supplied by the developer and + /// is managed by the service itself. + /// + ServiceFlags = (Disabled | Verified | Certified) + } +} diff --git a/SearchScorer/Common/Models/PublisherAssetConfiguration.cs b/SearchScorer/Common/Models/PublisherAssetConfiguration.cs new file mode 100644 index 0000000..6d7ce47 --- /dev/null +++ b/SearchScorer/Common/Models/PublisherAssetConfiguration.cs @@ -0,0 +1,16 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; + +namespace SearchScorer.Common +{ + public class PublisherAssetConfiguration + { + public String Host { get; set; } + public String CdnHost { get; set; } + public String ChinaCdnHost { get; set; } + public String VirtualPath { get; set; } = "/"; + } +} \ No newline at end of file diff --git a/SearchScorer/Common/Models/QueryFilter.cs b/SearchScorer/Common/Models/QueryFilter.cs new file mode 100644 index 0000000..a2d8d71 --- /dev/null +++ b/SearchScorer/Common/Models/QueryFilter.cs @@ -0,0 +1,111 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; + +namespace SearchScorer.Common +{ + /// + /// PagingDirection is used to define which set direction to move the returned + /// result set based on a previous query. + /// + public enum PagingDirection + { + /// + /// Backward will return results from earlier in the resultset. + /// + Backward = 1, + + /// + /// Forward will return results from later in the resultset. + /// + Forward = 2, + } + + /// + /// One condition in a QueryFilter. + /// + public class FilterCriteria + { + /// The FilterType defines how the filters are to be applied to the + /// extensions. See the documentation on the filter type to understand + /// how the filters are matched. + /// + public Int32 FilterType { get; set; } + + /// + /// The value used in the match based on the filter type. + /// + public String Value { get; set; } + } + + /// + /// A filter used to define a set of extensions to return during a query. + /// + public class QueryFilter + { + /// + /// The filter values define the set of values in this query. They are + /// applied based on the QueryFilterType. + /// + public List Criteria { get; set; } + + /// + /// The page size defines the number of results the caller wants for this + /// filter. The count can't exceed the overall query size limits. + /// + public Int32 PageSize { get; set; } + + /// + /// The page number requested by the user. If not provided 1 is assumed by default. + /// + public Int32 PageNumber { get; set; } + + /// + /// Defines the type of sorting to be applied on the results. + /// The page slice is cut of the sorted results only. + /// + public Int32 SortBy { get; set; } + + /// + /// Defines the order of sorting, 1 for Ascending, 2 for Descending, else default ordering based on the SortBy value + /// + public Int32 SortOrder { get; set; } + + /// + /// The paging token is a distinct type of filter and the other filter + /// fields are ignored. The paging token represents the continuation of + /// a previously executed query. The information about where in the result + /// and what fields are being filtered are embedded in the token. + /// + public String PagingToken { get; set; } + + /// + /// The PagingDirection is applied to a paging token if one exists. If + /// not the direction is ignored, and Forward from the start of the + /// resultset is used. Direction should be left out of the request unless + /// a paging token is used to help prevent future issues. + /// + public PagingDirection Direction { get; set; } + + /// + /// This is an internal identifier used to correlate results back to the + /// result from the SQL Query. + /// + // internal Int32 QueryIndex { get; set; } + + /// + /// This is an internal parameter to not apply max page size restriction to the + /// query + /// + // internal bool ForcePageSize { get; set; } + + /// + /// This is an internal parameter to specify that if true, cache should not be used to + /// provide the results of the query + /// + // internal bool DoNotUseCache { get; set; } + } +} diff --git a/SearchScorer/Common/Models/SearchParams.cs b/SearchScorer/Common/Models/SearchParams.cs new file mode 100644 index 0000000..ac42ee3 --- /dev/null +++ b/SearchScorer/Common/Models/SearchParams.cs @@ -0,0 +1,256 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; + +namespace SearchScorer.Common +{ + internal class ExtensionSearchResult + { + public List Results { get; set; } + + public List ResultMetadata { get; set; } + } + + public enum SearchFilterType + { + /// + /// SearchPhrase defines the search string provided by the user + /// + SearchPhrase = 0, + + /// + /// Separate words to be searched for prefixes. + /// This covers the cases where the given word is a pharase and individual words can act as a matching prefix for an extension + /// name e.g. Sonar Qube will be divided to Sonar and Qube and both will also be checked for prefix matches. + /// + SearchWord = 1, + + /// + /// Filter for targets. The search results will be restricted based on given values. + /// + InstallationTarget = 2, + + /// + /// Filters for categories. The search results will be restricted to only the defined categories. + /// + Category = 3, + + /// + /// Filters for extension tags. The search results will be restricted to only the extesnions containing the given tags. + /// + Tag = 4, + + /// + /// Filters for extension flags. The search results will be restricted to only the extesnions not containing the given flags. + /// In case of having a particular flag in both IncludeWithFlags and ExcludeWithFlags, + /// excludeFlags will remove the included extensions giving empty result for that flag. + /// + ExcludeExtensionsWithFlags = 5, + + /// + /// Filter type to search for given value in extension name and restrict search results + /// + Name = 6, + + /// + /// Filter type to search for given value in publisher names and restrict the search results + /// + Publisher = 7, + + /// + /// Filter type to search for given value only in tags names + /// + TagName = 8, + + /// + /// Filter type to signify actual user query given by user + /// + UserQuery = 9, + + /// + /// Filters for extension flags. The search results will be restricted to only the extesnions containing the given flags. + /// In case of having a particular flag in both IncludeWithFlags and ExcludeWithFlags, + /// excludeFlags will remove the included extensions giving empty result for that flag. + /// In case of multiple flags given in IncludeWithFlags in ORed fashion, extensions having any of the given flags will be included. + /// + IncludeExtensionsWithFlags = 10, + + /// + /// Filters the result extensions based on the LCID value specified. This can be given multiple times. + /// The extensions matching any one of them will be selected + /// Only applicable for VS Extensions. + /// + Lcid = 11, + + /// + /// Filtering based on the metadata for the extensions. + /// The filter value should be of the form : + /// This can be provided multiple times. Multiple filters with the same keyname will act as OR + /// Different key names will act as AND + /// The final filtered extensions will contain all the key names and matching values at least one of filter value among same + /// key names. + /// The matching operator supported are Equal Or NotEqual only. + /// Only applicable for VS Extensions + /// + Metadata = 12, + + /// Filter type for specifying the target version. This filter will be used along with InstallationTarget filter. + /// The value should be a valid version string + /// + InstallationTargetVersion = 13, + + /// + /// Filter type for specifying a range of installation target version. The filter will be used along with InstallationTarget filter. + /// The value should be a pair of well formed version values separated by hyphen(-) + /// + InstallationTargetVersionRange = 14, + + /// + /// This flag ensures that even private extensions are not excluded from the search results. + /// This is internal and cannot be used from outside. + /// + IncludePrivateExtensions = 15, + + /// + /// Filter type to search for exact match of publisher display names and restrict the search results + /// + ExactPublisherDisplayName = 16, + + /// + /// Filters for extension publisher's flags. The search results will be restricted to only the extesnions from + /// publishers containing the given flags. + /// In case of multiple flags given in IncludeWithFlags in ORed fashion, extensions with publishers having any of the given flags will be included. + /// + IncludeExtensionsWithPublisherFlags = 17, + + /// + /// This flag ensures that private extensions shared with organization are included in the search results. + /// + [Obsolete] + OrganizationSharedWith = 18, + + /// + /// Filter for product architecture for VS IDE extensions. The search results will be restricted based on given values. + /// + ProductArchitecture = 19, + + /// + /// Filter type for specifying target platform for VS Code extensions. The search result will be restricted to VS Code extensions supporting given target platform. + /// + TargetPlatform = 20 + } + + [Flags] + internal enum SearchFeatureFlags + { + UseRatingsDownloadsForRelevance = 0x02, + UseNewRelevanceForVSTS = 0x04, + DoNotUseInternalNameForSearch = 0x08 + } + + public enum SearchFilterOperatorType + { + /// + /// The filter adds the matching values to the result + /// + Or = 0, + + /// + /// The filter restrict the result only to the matching values + /// + And = 1, + + /// + /// Will check for equality for the given filter value. Applicable only for Metadata type filter + /// + Equal = 2, + + /// + /// Will check for not equality for the given filter value. Applicable only for Metadata type filter + /// + NotEqual = 3 + } + + public class SearchCriteria + { + public SearchFilterType FilterType { get; set; } + + public String FilterValue { get; set; } + + public SearchFilterOperatorType OperatorType { get; set; } + } + + /// + /// ExtensionSearchParams defines the various parameters needed for search + /// This is an internal structure and is filled based on given inputs by the caller of the API + /// + // internal class ExtensionSearchParams + public class ExtensionSearchParams + { + public List CriteriaList { get; set; } + + /// + /// The page size that the user wants. Should be less than or equal to max supported page size. + /// + public Int32 PageSize { get; set; } + + /// + /// The page number requested by the user. If not provided 1 is assumed by default. + /// + public Int32 PageNumber { get; set; } + + /// + /// Defines the type of sorting to be applied on the results. + /// The page slice is cut of the sorted results only. + /// + public Int32 SortBy { get; set; } + + /// + /// Defines the order of sorting, 1 for Ascending, 2 for Descending, else default ordering based on the SortBy value + /// + public Int32 SortOrder { get; set; } + + /// + /// This is internal field to record the actual unsanitized query which was provided by the user + /// + internal string RawQuery { get; set; } + + /// + /// These define the metadata that will be returned along with the query result. + /// + public ExtensionQueryResultMetadataFlags MetadataFlags { get; set; } + + /// + /// Product type for which the query extensions is being called. + /// This is used for calculating the weighted average. + /// + public string Product { get; set; } + + /// + /// Way to pass feature flags for selective functionality + /// + internal SearchFeatureFlags FeatureFlags { get; set; } + } + + [Flags] + public enum SearchOverrideFlags + { + None = 0x0, + DoNotTranslateCategoryFilter = 0x1, + // IncludePrivate = 0x2, + // UseDbForSearch = 0x4 + } + + internal class QueryMetadataConstants + { + public static readonly string Categories = "Categories"; + public static readonly string TotalCount = "TotalCount"; + public static readonly string ResultCount = "ResultCount"; + public static readonly string ResultSetCategories = "ResultSetCategories"; + public static readonly string ResultSetProjectTypes = "ResultSetProjectTypes"; + public static readonly string TargetPlatforms = "TargetPlatforms"; + } +} diff --git a/SearchScorer/Common/Models/SearchRequest.cs b/SearchScorer/Common/Models/SearchRequest.cs new file mode 100644 index 0000000..ebfce5f --- /dev/null +++ b/SearchScorer/Common/Models/SearchRequest.cs @@ -0,0 +1,14 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using Microsoft.Azure.Search.Models; + +namespace SearchScorer.Common +{ + public class SearchRequest + { + public string SearchText { get; set; } + public SearchParameters SearchParams { get; set; } + } +} diff --git a/SearchScorer/Common/PackageIdPatternValidator.cs b/SearchScorer/Common/PackageIdPatternValidator.cs index 27ee1fa..ca7922f 100644 --- a/SearchScorer/Common/PackageIdPatternValidator.cs +++ b/SearchScorer/Common/PackageIdPatternValidator.cs @@ -101,7 +101,7 @@ private async Task DoesPackageIdExistInQueryAsync( int take) { var response = await _searchClient.SearchAsync(baseUrl, query, take); - return response.Data.Any(x => WildcardUtility.Matches(x.Id, packageId)); + return response.Results[0].Extensions.Any(x => WildcardUtility.Matches(x.ExtensionName, packageId)); } } } diff --git a/SearchScorer/Common/SearchClient.cs b/SearchScorer/Common/SearchClient.cs index a90acd4..e33ff2e 100644 --- a/SearchScorer/Common/SearchClient.cs +++ b/SearchScorer/Common/SearchClient.cs @@ -12,14 +12,14 @@ namespace SearchScorer.Common public class SearchClient { private readonly HttpClient _httpClient; - private readonly ConcurrentDictionary>> _cache = new ConcurrentDictionary>>(); + private readonly ConcurrentDictionary>> _cache = new ConcurrentDictionary>>(); public SearchClient(HttpClient httpClient) { _httpClient = httpClient; } - public async Task SearchAsync(string baseUrl, string query, int take) + public async Task SearchAsync(string baseUrl, string query, int take) { //var queryString = HttpUtility.ParseQueryString(string.Empty); query = "python"; @@ -38,7 +38,7 @@ public async Task SearchAsync(string baseUrl, string query, int var requestUri = uriBuilder.Uri; //baseUrl;// - var lazyTask = _cache.GetOrAdd(requestUri, _ => new Lazy>( + var lazyTask = _cache.GetOrAdd(requestUri, _ => new Lazy>( async () => { var attempt = 0; @@ -60,7 +60,7 @@ public async Task SearchAsync(string baseUrl, string query, int { response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(json); + return JsonConvert.DeserializeObject(json); } } } diff --git a/SearchScorer/Common/SearchResponse.cs b/SearchScorer/Common/SearchResponse.cs index 0047871..3ac07f5 100644 --- a/SearchScorer/Common/SearchResponse.cs +++ b/SearchScorer/Common/SearchResponse.cs @@ -2,7 +2,7 @@ namespace SearchScorer.Common { - public class SearchResponse + public class Search1Response { public int TotalHits { get; set; } public List Data { get; set; } diff --git a/SearchScorer/Common/SearchService/ArgumentUtility.cs b/SearchScorer/Common/SearchService/ArgumentUtility.cs new file mode 100644 index 0000000..b8cd814 --- /dev/null +++ b/SearchScorer/Common/SearchService/ArgumentUtility.cs @@ -0,0 +1,81 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace SearchScorer.Common +{ + [EditorBrowsable(EditorBrowsableState.Never)] + public static class ArgumentUtility + { + /// + /// Throw an exception if the object is null. + /// + /// the object to check + /// the variable or parameter name to display + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void CheckForNull(object var, string varName) + { + if (var == null) + { + throw new ArgumentNullException(varName); + } + } + + /// + /// Throw an exception if a string is null or empty. + /// + /// string to check + /// the variable or parameter name to display + public static void CheckStringForNullOrEmpty(string stringVar, string stringVarName) + { + CheckForNull(stringVar, stringVarName); + if (stringVar.Length == 0) + { + throw new ArgumentException("The string must have at least one character.", stringVarName); + } + } + + //******************************************************************************************** + /// + /// Throw an exception if a string is null, empty, or consists only of white-space characters. + /// + /// string to check + /// the variable or parameter name to display + //******************************************************************************************** + public static void CheckStringForNullOrWhiteSpace(string stringVar, string stringVarName) + { + CheckForNull(stringVar, stringVarName); + if (string.IsNullOrWhiteSpace(stringVar) == true) + { + throw new ArgumentException("The string must have at least one non-white-space character.", stringVarName); + } + } + + /// + /// Converts comma separated values to camelcase comma separated value + /// Example: ConvertFlagsToString("Public, BuiltIn") to + /// "public, builtIn" + /// + /// + /// + public static string ConvertFlagsToString(this string s) + { + List response = new List(); + var flags = s.Split(",") + .Select(x => x.Trim()); + + foreach (var flag in flags) + { + response.Add(flag[0].ToString().ToLowerInvariant() + flag.Substring(1)); + } + + return String.Join(", ", response.ToArray()); + } + } +} diff --git a/SearchScorer/Common/SearchService/AzureSearchDataTypes.cs b/SearchScorer/Common/SearchService/AzureSearchDataTypes.cs new file mode 100644 index 0000000..ad8b72f --- /dev/null +++ b/SearchScorer/Common/SearchService/AzureSearchDataTypes.cs @@ -0,0 +1,193 @@ +// ----------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Microsoft.Azure.Search; + +namespace SearchScorer.Common +{ + public class AzureIndexDocument + { + [System.ComponentModel.DataAnnotations.Key] + [IsSearchable, IsFilterable] + public string ExtensionId { get; set; } + + [IsSearchable, IsSortable, IndexAnalyzer("DefaultIndexAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string ExtensionName { get; set; } + + [IsSearchable, IsFilterable, IsSortable, IndexAnalyzer("DefaultIndexAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string ExtensionDisplayName { get; set; } + + [IsSearchable, IsFilterable, IsSortable, IndexAnalyzer("PrefixAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string ExtensionDisplayNameForPrefixMatch { get; set; } + + [IsSearchable, IndexAnalyzer("DefaultIndexAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string ShortDescription { get; set; } + + [IsSearchable, IndexAnalyzer("PrefixAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string ShortDescriptionForPrefixMatch { get; set; } + + public string PublisherName { get; set; } + + [IsSearchable, IsFilterable, IsSortable, IndexAnalyzer("DefaultIndexAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string PublisherDisplayName { get; set; } + + [IsSearchable, IsFilterable, IsSortable, IndexAnalyzer("PrefixAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public string PublisherDisplayNameForPrefixMatch { get; set; } + + [IsSearchable, IsRetrievable(false), Analyzer("KeywordIndexAnalyzer")] + public string PublisherDisplayNameForExactMatch { get; set; } + + [IsSearchable, IsRetrievable(false), Analyzer("KeywordIndexAnalyzer")] + public string ExtensionFullyQualifiedNameForExactMatch { get; set; } + + [IsSearchable, IsRetrievable(false), Analyzer("KeywordIndexAnalyzer")] + public string ExtensionNameForExactMatch { get; set; } + + [IsSearchable, IsRetrievable(false), Analyzer("KeywordIndexAnalyzer")] + public string PublisherNameForExactMatch { get; set; } + + [IsSearchable, IsRetrievable(false), Analyzer("KeywordIndexAnalyzer")] + public string ExtensionDisplayNameForExactMatch { get; set; } + + [IsFilterable] + public List ExtensionFlags { get; set; } + + [IsFilterable, IsRetrievable(false)] + public List PublisherFlags { get; set; } + + public string Publisher { get; set; } + + [IsFilterable] + public Boolean? IsDomainVerified { get; set; } + + [IsSortable] + public DateTime? LastUpdated { get; set; } + + public DateTime? PublishedDate { get; set; } + + [IsSortable] + public DateTime? ReleasedDate { get; set; } + + public List Tags { get; set; } + + [IsRetrievable(false), IsSearchable, IsFilterable, IndexAnalyzer("PrefixAnalyzer"), SearchAnalyzer("SearchTermAnalyzer")] + public List SearchableTags { get; set; } + + [IsFilterable, IsFacetable] + public List Categories { get; set; } + + [IsFilterable, IsFacetable, IsRetrievable(false)] + public List TargetPlatforms { get; set; } + + /// + /// The total number of installs, including updates. + /// This is deprecated, use InstallCount for sorting. + /// + [IsSortable, IsFilterable] + public double DownloadCount { get; set; } + + /// + /// The number of unique installations, not including updates. + /// Used to support to sort by InstallCount. + /// + [IsSortable, IsFilterable] + public double? InstallCount { get; set; } + + [IsSortable, IsFilterable, IsRetrievable(false)] + public double WeightedRating { get; set; } + + [IsSortable] + public double TrendingScore { get; set; } + + [IsFilterable, IsRetrievable(false)] + public List InstallationTargetList { get; set; } + + [IsFilterable, IsRetrievable(false)] + public List SearchableMetadata { get; set; } + + public string Metadata { get; set; } + + public string DeploymentType { get; set; } + + public string ValidatedVersions { get; set; } + + public string AllVersions { get; set; } + + public string Statistics { get; set; } + + public string SharedWith { get; set; } + + public string InstallationTargets { get; set; } + + [IsFilterable, IsRetrievable(false)] + public List EnterpriseSharedWithIds { get; set; } + + [IsFilterable, IsRetrievable(false)] + public List OrgSharedWithIds { get; set; } + + [IsFilterable] + public List Lcids { get; set; } + + // This field is currently used only for VS index. + // However for sake of simplicity, keeping this field for all index types. + // In case we see in future that the number of independent values are increasing, + // we can split accordingly. + [IsFilterable, IsFacetable, IsRetrievable(false)] + public string ProjectType { get; set; } + + public AzureIndexDocument ShallowCopy() + { + return (AzureIndexDocument)this.MemberwiseClone(); + } + } + + public class ServerExtensionFile : ExtensionFile + { + public Int32 SerializableFileId { get; set; } + } + + /// + /// We are creating a new type here, FileId was not serializable in ExtensionFile + /// + [JsonConverter(typeof(ServerExtensionVersionConverter))] + public class ServerExtensionVersion + { + internal Guid ExtensionId { get; set; } + + public String Version { get; set; } + + public String TargetPlatform { get; set; } + + public ExtensionVersionFlags Flags { get; set; } + + public DateTime LastUpdated { get; set; } + + public String VersionDescription { get; set; } + + public String ValidationResultMessage { get; set; } + + public List Files { get; set; } + + public List> Properties { get; set; } + + public List Badges { get; set; } + + public String AssetUri { get; set; } + + public String FallbackAssetUri { get; set; } + internal string CdnDirectory { get; set; } + internal bool IsCdnEnabled { get; set; } + public ServerExtensionVersion ShallowCopy() + { + return (ServerExtensionVersion)this.MemberwiseClone(); + } + public string GetCdnDirectory() + { + return CdnDirectory; + } + } +} diff --git a/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs b/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs index 2244bbf..7d8e793 100644 --- a/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs +++ b/SearchScorer/IREvalutation/NormalizedDiscountedCumulativeGain.cs @@ -48,9 +48,9 @@ public async Task> ScoreAsync( // Determine the score for each of the returns package IDs. var scores = new List(); - for (var i = 0; i < response.Data.Count; i++) + for (var i = 0; i < response.Results[0].Extensions.Count; i++) { - var packageId = response.Data[i].Id; + var packageId = response.Results[0].Extensions[i].ExtensionName; if (query.PackageIdToScore.TryGetValue(packageId, out var score)) { scores.Add(score); diff --git a/SearchScorer/IREvalutation/RelevancyScoreResult.cs b/SearchScorer/IREvalutation/RelevancyScoreResult.cs index 6333da3..da09bf5 100644 --- a/SearchScorer/IREvalutation/RelevancyScoreResult.cs +++ b/SearchScorer/IREvalutation/RelevancyScoreResult.cs @@ -4,7 +4,7 @@ namespace SearchScorer.IREvalutation { public class RelevancyScoreResult { - public RelevancyScoreResult(double resultScore, SearchQueryRelevancyScores input, SearchResponse response) + public RelevancyScoreResult(double resultScore, SearchQueryRelevancyScores input, ExtensionQueryResult response) { ResultScore = resultScore; Input = input; @@ -13,7 +13,7 @@ public RelevancyScoreResult(double resultScore, SearchQueryRelevancyScores input public double ResultScore { get; } public SearchQueryRelevancyScores Input { get; } - public SearchResponse Response { get; } + public ExtensionQueryResult Response { get; } } public class RelevancyScoreResult : RelevancyScoreResult @@ -21,7 +21,7 @@ public class RelevancyScoreResult : RelevancyScoreResult public RelevancyScoreResult( double resultScore, SearchQueryRelevancyScores input, - SearchResponse response) : base(resultScore, input, response) + ExtensionQueryResult response) : base(resultScore, input, response) { Input = input; } diff --git a/SearchScorer/Program.cs b/SearchScorer/Program.cs index a64d525..b44d88c 100644 --- a/SearchScorer/Program.cs +++ b/SearchScorer/Program.cs @@ -19,6 +19,9 @@ TopClientSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\topsearchqueries.csv", GoogleAnalyticsSearchReferralsCsvPath = @"C:\data\SearchScorerData\vsm\topsearchreferrals.csv", + ClientCuratedSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\curatedqueries.csv", + FeedbackSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\feedbackcuratedqueries.csv", + PackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), TokenizedPackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), TagsWeights = CreateRange(lower: 1, upper: 10, increments: 3), @@ -28,7 +31,7 @@ using (var httpClientHandler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip }) using (var httpClient = new HttpClient()) { - if (args.Length == 0 || args[0] == "score") + //if (args.Length == 0 || args[0] == "score") { httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8"); await RunScoreCommandAsync(settings, httpClient); diff --git a/SearchScorer/SearchScorerSettings.cs b/SearchScorer/SearchScorerSettings.cs index 2400efa..ebc2258 100644 --- a/SearchScorer/SearchScorerSettings.cs +++ b/SearchScorer/SearchScorerSettings.cs @@ -3,19 +3,22 @@ public class SearchScorerSettings { public string ControlBaseUrl { get; set; } public string TreatmentBaseUrl { get; set; } - public string FeedbackSearchQueriesCsvPath { get; set; } public string CuratedSearchQueriesCsvPath { get; set; } - public string ClientCuratedSearchQueriesCsvPath { get; set; } public string TopSearchQueriesCsvPath { get; set; } - public string TopClientSearchQueriesCsvPath { get; set; } public string TopSearchSelectionsCsvPath { get; set; } - public string TopSearchSelectionsV2CsvPath { get; set; } + public string TopClientSearchQueriesCsvPath { get; set; } public string GoogleAnalyticsSearchReferralsCsvPath { get; set; } - public string GitHubUsageJsonPath { get; set; } - public string GitHubUsageCsvPath { get; set; } - public string ProbeResultsCsvPath { get; set; } - public string TopV3SearchQueriesPathPattern { get; set; } - public string HashedSearchQueryLookupCsvPath { get; set; } + public string ClientCuratedSearchQueriesCsvPath { get; set; } + public string FeedbackSearchQueriesCsvPath { get; set; } + + //public string TopSearchSelectionsV2CsvPath { get; set; } + //public string GitHubUsageJsonPath { get; set; } + //public string GitHubUsageCsvPath { get; set; } + //public string ProbeResultsCsvPath { get; set; } + //public string TopV3SearchQueriesPathPattern { get; set; } + //public string HashedSearchQueryLookupCsvPath { get; set; } + + public string HasherKeyFile { get; set; } // The following settings are only necessary for the "probe" command From e05b00116e0f32aab4f7a4d972e7e70c12c67ce9 Mon Sep 17 00:00:00 2001 From: sagund Date: Tue, 17 May 2022 18:54:06 +0530 Subject: [PATCH 7/7] adding the required data files and fixing few issues --- ...GoogleAnalyticsSearchReferralsCsvReader.cs | 1 - SearchScorer/Common/SearchClient.cs | 3 +- SearchScorer/Common/SearchQuerySource.cs | 1 + SearchScorer/CuratedSearchQueries.csv | 3 + SearchScorer/FeedbackSearchQueries.csv | 3 + .../GoogleAnalyticsSearchReferrals.csv | 5007 +++++++++++++++++ SearchScorer/Program.cs | 17 +- SearchScorer/TopClientSearchQueries.csv | 3 + SearchScorer/TopSearchQueries.csv | 3 + SearchScorer/TopSearchSelections.csv | 3 + 10 files changed, 5033 insertions(+), 11 deletions(-) create mode 100644 SearchScorer/CuratedSearchQueries.csv create mode 100644 SearchScorer/FeedbackSearchQueries.csv create mode 100644 SearchScorer/GoogleAnalyticsSearchReferrals.csv create mode 100644 SearchScorer/TopClientSearchQueries.csv create mode 100644 SearchScorer/TopSearchQueries.csv create mode 100644 SearchScorer/TopSearchSelections.csv diff --git a/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs b/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs index 1ef3244..467a514 100644 --- a/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs +++ b/SearchScorer/Common/GoogleAnalyticsSearchReferralsCsvReader.cs @@ -25,7 +25,6 @@ public static IReadOnlyDictionary Read(string path) csvReader.Read(); // comment csvReader.Read(); // comment csvReader.Read(); // empty line - csvReader.Read(); csvReader.ReadHeader(); while (csvReader.Read()) diff --git a/SearchScorer/Common/SearchClient.cs b/SearchScorer/Common/SearchClient.cs index e33ff2e..c3bb6dc 100644 --- a/SearchScorer/Common/SearchClient.cs +++ b/SearchScorer/Common/SearchClient.cs @@ -22,7 +22,6 @@ public SearchClient(HttpClient httpClient) public async Task SearchAsync(string baseUrl, string query, int take) { //var queryString = HttpUtility.ParseQueryString(string.Empty); - query = "python"; var uriBuilder = new UriBuilder(baseUrl) { @@ -34,7 +33,7 @@ public async Task SearchAsync(string baseUrl, string query }; var queryStr = "{\"filters\":[{\"criteria\":[{\"filterType\":10,\"value\":\"" + query + "\"}, {\"filterType\":8,\"value\":\"Microsoft.VisualStudio.Code\"}]," + - "\"direction\":0,\"pageSize\":50,\"pageNumber\":1,\"sortBy\":6,\"sortOrder\":0,\"pagingToken\":null}],\"flags\":947, \"assetTypes\":[]}"; + "\"direction\":2,\"pageSize\":50,\"pageNumber\":1,\"sortBy\":0,\"sortOrder\":0,\"pagingToken\":null}],\"flags\":947, \"assetTypes\":[]}"; var requestUri = uriBuilder.Uri; //baseUrl;// diff --git a/SearchScorer/Common/SearchQuerySource.cs b/SearchScorer/Common/SearchQuerySource.cs index 5a666cd..5d7a1cd 100644 --- a/SearchScorer/Common/SearchQuerySource.cs +++ b/SearchScorer/Common/SearchQuerySource.cs @@ -11,5 +11,6 @@ public enum SearchQuerySource TopQuery, V5External, Hats, + VSMPartnersInternal } } diff --git a/SearchScorer/CuratedSearchQueries.csv b/SearchScorer/CuratedSearchQueries.csv new file mode 100644 index 0000000..256f458 --- /dev/null +++ b/SearchScorer/CuratedSearchQueries.csv @@ -0,0 +1,3 @@ +Batch,User,SearchQuery,Number,ID0,S0,ID1,S1,ID2,S2,ID3,S3,ID4,S4 +0,loshar,java,1,vscode-maven,4,vscode-tomcat,4,vscode-gradle,3,java-fill,2,, +1,jver,mysql,1,vscode-mysql-client2,4,vscode-mysql,4,sqlite-snippet,4,vscode-postgresql-client2,3,, diff --git a/SearchScorer/FeedbackSearchQueries.csv b/SearchScorer/FeedbackSearchQueries.csv new file mode 100644 index 0000000..9d613e0 --- /dev/null +++ b/SearchScorer/FeedbackSearchQueries.csv @@ -0,0 +1,3 @@ +Source,FeedbackDisposition,SearchQuery,Buckets,MostRelevantPackageIds,Result,Control Result Bucket,Treatment Result Bucket,Control Result Index,Treatment Result Index,Result Index Delta +VSMPartnersInternal,OldIsBetter,java,Tags,vscode-maven,BothFixed,AboveFold,AboveFold,0,0,0 +VSMPartnersInternal,NewIsGreat,mysql,PartialId,vscode-mysql-client2,BothBroken,BelowFold,BelowFold,0,0,0 diff --git a/SearchScorer/GoogleAnalyticsSearchReferrals.csv b/SearchScorer/GoogleAnalyticsSearchReferrals.csv new file mode 100644 index 0000000..44cd6eb --- /dev/null +++ b/SearchScorer/GoogleAnalyticsSearchReferrals.csv @@ -0,0 +1,5007 @@ +# ---------------------------------------- +# All Web Site Data +# Search Referrals +# 20190703-20190804 +# ---------------------------------------- + +Landing Page,Search Term,Sessions +/packages?q=windowsazureofficial,windowsazureofficial,"1,586" +"/packages?q=Tags:""aws-sdk-v3""","Tags:""aws-sdk-v3""","1,221" +/packages?q=accord.net,accord.net,452 +"/packages?q=Tags:""SharpDX""","Tags:""SharpDX""",322 +"/packages?q=Tags:""serilog""","Tags:""serilog""",314 +"/packages?q=Owner:""Autofac""+Autofac*","Owner:""Autofac"" Autofac*",306 +/packages?q=skin,skin,279 +"/packages?q=Tags:""pdf-to-image""","Tags:""pdf-to-image""",271 +"/packages?q=Tags:""word-to-pdf""","Tags:""word-to-pdf""",203 +"/packages?q=Tags:""System.Web.Script.Serialization""","Tags:""System.Web.Script.Serialization""",179 +/packages?q=oxyplot,oxyplot,165 +/packages?q=ZPL,ZPL,165 +/packages?q=DotNetty,DotNetty,160 +"/packages?q=Tags:""Excel""","Tags:""Excel""",157 +"/packages?q=Tags:""html-to-image""","Tags:""html-to-image""",157 +/packages?q=Random+Name+Generator,Random Name Generator,154 +/packages?q=accord,accord,143 +/packages?q=Author:SimpleInjector-Contributors&sortOrder=package-download-count,Author:SimpleInjector-Contributors,141 +/packages?q=google.apis&prerelease=true&sortOrder=relevance,google.apis,141 +/packages?q=RTF,RTF,138 +/packages?q=Microsoft.ReportViewer,Microsoft.ReportViewer,133 +"/packages?q=Tags:""OCR""","Tags:""OCR""",133 +/packages?q=XLSX,XLSX,125 +/packages?q=AForge.NET,AForge.NET,119 +/packages?q=system.web,system.web,119 +"/packages?q=Tags:""excel-to-pdf""","Tags:""excel-to-pdf""",119 +/packages?q=sftp,sftp,114 +/packages?q=dapper,dapper,111 +/packages?q=NSwag,NSwag,111 +/packages?q=pdf,pdf,108 +/packages?q=socket.io,socket.io,108 +/packages?q=System.Drawing,System.Drawing,108 +/packages?q=facebook,facebook,103 +/packages?q=Google.Apis.drive&prerelease=true&sortOrder=relevance,Google.Apis.drive,103 +/packages?q=gpio,gpio,103 +"/packages?q=Tags:""rtsp""","Tags:""rtsp""",103 +/packages?q=CatFactory,CatFactory,100 +/packages?q=epplus,epplus,100 +/packages?q=Google.Apis.oauth2&prerelease=true&sortOrder=relevance,Google.Apis.oauth2,100 +/packages?q=socket,socket,100 +/packages?q=system.windows.forms,system.windows.forms,97 +/packages?q=smarttests,smarttests,95 +"/packages?q=Tags:""seq-app""","Tags:""seq-app""",95 +/packages?q=2007+Office+System+Driver:+Data+Connectivity+Components,2007 Office System Driver: Data Connectivity Components,92 +/packages?q=GDAL,GDAL,92 +/packages?q=Google.Apis.sheets&prerelease=true&sortOrder=relevance,Google.Apis.sheets,92 +/packages?q=nlog,nlog,92 +"/packages?q=Tags:""AndroidX""+Authors:""Microsoft""","Tags:""AndroidX"" Authors:""Microsoft""",92 +/packages?q=CSV,CSV,89 +/packages?q=Google.Apis.firestore&prerelease=true&sortOrder=relevance,Google.Apis.firestore,89 +/packages?q=QRCode,QRCode,89 +/packages?q=helixtoolkit,helixtoolkit,87 +/packages?q=javascriptserializer,javascriptserializer,87 +/packages?q=Nethereum,Nethereum,87 +"/packages?q=Tags:""syncfusion.xamarin""","Tags:""syncfusion.xamarin""",87 +/packages?q=Levenshtein,Levenshtein,84 +/packages?q=email,email,78 +/packages?q=groupdocs,groupdocs,78 +/packages?q=Oracle.DataAccess,Oracle.DataAccess,78 +/packages?q=SAML,SAML,78 +/packages?q=DataMatrix,DataMatrix,76 +/packages?q=TeamFoundation,TeamFoundation,76 +/packages?q=xbim,xbim,76 +/packages?q=Microsoft.AspNet.WebHooks.Receivers,Microsoft.AspNet.WebHooks.Receivers,73 +/packages?q=WebRTC,WebRTC,73 +/packages?q=zip,zip,73 +/packages?q=ioc.configuration,ioc.configuration,70 +/packages?q=OpenStreetMap,OpenStreetMap,70 +/packages?q=Firebase.Notification,Firebase.Notification,68 +/packages?q=Microsoft.ReportViewer.WebForms,Microsoft.ReportViewer.WebForms,68 +/packages?q=System.Net.Http.Formatting,System.Net.Http.Formatting,68 +"/packages?q=Tags:""html-to-pdf""","Tags:""html-to-pdf""",68 +/packages?q=DataGridView,DataGridView,65 +/packages?q=npoi,npoi,65 +"/packages?q=Tags:""Argon2""","Tags:""Argon2""",65 +"/packages?q=Tags:""pdfviewer""","Tags:""pdfviewer""",65 +/packages?q=dbf,dbf,62 +"/packages?q=Tags:""ffmpeg""","Tags:""ffmpeg""",62 +/packages?q=Google.Apis.analyticsreporting&prerelease=true&sortOrder=relevance,Google.Apis.analyticsreporting,60 +/packages?q=Google.Apis.calendar&prerelease=true&sortOrder=relevance,Google.Apis.calendar,60 +/packages?q=Persian,Persian,60 +/packages?q=R.NET.Community,R.NET.Community,60 +/packages?q=ssh,ssh,60 +"/packages?q=Tags:""Blazor""","Tags:""Blazor""",60 +"/packages?q=Tags:""IBAN""","Tags:""IBAN""",60 +/packages?q=ColorPicker,ColorPicker,57 +/packages?q=Google.Apis.youtube&prerelease=true&sortOrder=relevance,Google.Apis.youtube,57 +/packages?q=Hangfire,Hangfire,57 +"/packages?q=Id:""Firebase""+Authors:""Microsoft""+Tags:""Xamarin.Android""","Id:""Firebase"" Authors:""Microsoft"" Tags:""Xamarin.Android""",57 +/packages?q=predicatebuilder,predicatebuilder,57 +/packages?q=PriorityQueue,PriorityQueue,57 +/packages?q=SharePoint+PnP+Core+Library,SharePoint PnP Core Library,57 +"/packages?q=Tags:""dotnet-core""","Tags:""dotnet-core""",57 +/packages?q=barcode,barcode,54 +/packages?q=Bluetooth,Bluetooth,54 +/packages?q=DOCX,DOCX,54 +/packages?q=Google.Apis.analytics&prerelease=true&sortOrder=relevance,Google.Apis.analytics,54 +/packages?q=Serilog.sinks.azure,Serilog.sinks.azure,54 +/packages?q=WebBrowser,WebBrowser,54 +/packages?q=websocket,websocket,54 +/packages?q=DefinitelyTyped,DefinitelyTyped,51 +/packages?q=excel,excel,51 +/packages?q=iso8583,iso8583,51 +/packages?q=keyboard,keyboard,51 +/packages?q=parse xml,parse xml,51 +/packages?q=PDF417,PDF417,51 +/packages?q=R.NET,R.NET,51 +"/packages?q=Tags:""serilog""""","Tags:""serilog""""",51 +"/packages?q=Tags:""socks5""","Tags:""socks5""",51 +/packages?q=Google.Apis.speech&prerelease=true&sortOrder=relevance,Google.Apis.speech,49 +/packages?q=json,json,49 +/packages?q=OCR,OCR,49 +/packages?q=owners:aspnet-contrib+title:OAuth,owners:aspnet-contrib title:OAuth,49 +/packages?q=RADARE2,RADARE2,49 +/packages?q=search,search,49 +/packages?q=SSE,SSE,49 +/packages?q=telerik,telerik,49 +/packages?q=xslt,xslt,49 +/packages?q=Docking,Docking,46 +/packages?q=GPX,GPX,46 +/packages?q=MJPEG,MJPEG,46 +/packages?q=PostScript,PostScript,46 +/packages?q=pubsub,pubsub,46 +"/packages?q=Tags:""rtf-to-pdf""","Tags:""rtf-to-pdf""",46 +/packages?q=XBRL,XBRL,46 +/packages?q=Google.Apis.translate&prerelease=true&sortOrder=relevance,Google.Apis.translate,43 +/packages?q=GSM,GSM,43 +/packages?q=httpcontext,httpcontext,43 +/packages?q=MailMerge,MailMerge,43 +/packages?q=Microsoft.ML.Probabilistic,Microsoft.ML.Probabilistic,43 +/packages?q=openblas,openblas,43 +/packages?q=spell-checker,spell-checker,43 +/packages?q=Syslog,Syslog,43 +"/packages?q=Tags:""FCM""","Tags:""FCM""",43 +"/packages?q=Tags:""RDLC""","Tags:""RDLC""",43 +"/packages?q=Tags:""url-shortener""","Tags:""url-shortener""",43 +"/packages?q=Tags:""wkhtmltopdf""","Tags:""wkhtmltopdf""",43 +/packages?q=TIFF,TIFF,43 +/packages?q=webcam,webcam,43 +/packages?q=couchdb,couchdb,41 +/packages?q=Google.Apis.gmail&prerelease=true&sortOrder=relevance,Google.Apis.gmail,41 +/packages?q=ics,ics,41 +/packages?q=scss,scss,41 +/packages?q=Stemmer,Stemmer,41 +/packages?q=Sybase,Sybase,41 +/packages?q=system.web.mvc,system.web.mvc,41 +"/packages?q=Tags:""svg-to-image""","Tags:""svg-to-image""",41 +"/packages?q=Tags:""tabcontrol""","Tags:""tabcontrol""",41 +/packages?q=ThinkGeo,ThinkGeo,41 +/packages?q=TWAIN,TWAIN,41 +/packages?q=antixss,antixss,38 +/packages?q=Com.Ctrip.Framework.Apollo,Com.Ctrip.Framework.Apollo,38 +/packages?q=command-line-parser,command-line-parser,38 +/packages?q=cron,cron,38 +/packages?q=etl,etl,38 +/packages?q=FTP,FTP,38 +/packages?q=id:morelinq,id:morelinq,38 +/packages?q=Krypton,Krypton,38 +/packages?q=Matlab,Matlab,38 +/packages?q=RDLC,RDLC,38 +/packages?q=System.Data.SQLite,System.Data.SQLite,38 +"/packages?q=Tags:""Fixed-Width""","Tags:""Fixed-Width""",38 +"/packages?q=Tags:""richtexteditor""","Tags:""richtexteditor""",38 +/packages?q=WKT,WKT,38 +/packages?q=7zip,7zip,35 +/packages?q=base32,base32,35 +/packages?q=dotnet,dotnet,35 +/packages?q=hangfire,hangfire,35 +/packages?q=ldap,ldap,35 +/packages?q=NMEA,NMEA,35 +/packages?q=npgsql,npgsql,35 +/packages?q=Ocaramba,Ocaramba,35 +/packages?q=oledb,oledb,35 +/packages?q=powershell,powershell,35 +/packages?q=RichTextBox,RichTextBox,35 +/packages?q=roslyn,roslyn,35 +/packages?q=Shopify,Shopify,35 +/packages?q=Syncfusion.EJ2.MVC,Syncfusion.EJ2.MVC,35 +"/packages?q=Tags:""dicom""","Tags:""dicom""",35 +"/packages?q=Tags:""RTF""","Tags:""RTF""",35 +/packages?q=tar,tar,35 +/packages?q=UserAgent,UserAgent,35 +/packages?q=xls,xls,35 +/packages?q=asterisk,asterisk,32 +/packages?q=chart,chart,32 +/packages?q=Google.Apis.dialogflow&prerelease=true&sortOrder=relevance,Google.Apis.dialogflow,32 +/packages?q=GS1-128,GS1-128,32 +"/packages?q=Id:""Xamarin.GooglePlayServices""+Authors:""Microsoft""+Tags:""Xamarin.Android","Id:""Xamarin.GooglePlayServices"" Authors:""Microsoft"" Tags:""Xamarin.Android",32 +/packages?q=lazziya,lazziya,32 +/packages?q=Microsoft.AspNet.WebHooks.Common,Microsoft.AspNet.WebHooks.Common,32 +/packages?q=Microsoft.EntityFrameworkCore,Microsoft.EntityFrameworkCore,32 +/packages?q=Newtonsoft.Json,Newtonsoft.Json,32 +/packages?q=nunit,nunit,32 +/packages?q=sitemap,sitemap,32 +"/packages?q=Tags:""date-picker""","Tags:""date-picker""",32 +"/packages?q=Tags:""DOCX""","Tags:""DOCX""",32 +"/packages?q=Tags:""DXF""","Tags:""DXF""",32 +"/packages?q=Tags:""HttpClient""","Tags:""HttpClient""",32 +"/packages?q=Tags:""Instagram""","Tags:""Instagram""",32 +"/packages?q=Tags:""JPEG2000""","Tags:""JPEG2000""",32 +"/packages?q=Tags:""progressbar""","Tags:""progressbar""",32 +"/packages?q=Tags:""winforms""","Tags:""winforms""",32 +/packages?q=usps,usps,32 +/packages?q=winforms,winforms,32 +/packages?q=wsdl,wsdl,32 +/packages?q=XPS,XPS,32 +/packages?q=BITBUCKET,BITBUCKET,30 +/packages?q=consulta,consulta,30 +/packages?q=DateTimePicker,DateTimePicker,30 +/packages?q=dependency-injection,dependency-injection,30 +/packages?q=diff,diff,30 +/packages?q=dotnetify,dotnetify,30 +/packages?q=exif,exif,30 +/packages?q=fedex,fedex,30 +/packages?q=Google.Apis.androidpublisher&prerelease=true&sortOrder=relevance,Google.Apis.androidpublisher,30 +/packages?q=Google.Apis.vision&prerelease=true&sortOrder=relevance,Google.Apis.vision,30 +/packages?q=grpc,grpc,30 +/packages?q=ImageProcessing,ImageProcessing,30 +/packages?q=imap,imap,30 +/packages?q=JSON-RPC,JSON-RPC,30 +/packages?q=log4net,log4net,30 +/packages?q=OpenCL,OpenCL,30 +/packages?q=REST,REST,30 +/packages?q=snmp,snmp,30 +/packages?q=Subversion,Subversion,30 +"/packages?q=Tags:""clipboard""","Tags:""clipboard""",30 +"/packages?q=Tags:""Code128""","Tags:""Code128""",30 +"/packages?q=Tags:""emoji""","Tags:""emoji""",30 +"/packages?q=Tags:""free-html-to-pdf""","Tags:""free-html-to-pdf""",30 +"/packages?q=Tags:""http-server""","Tags:""http-server""",30 +"/packages?q=Tags:""print""","Tags:""print""",30 +"/packages?q=Tags:""query-builder""","Tags:""query-builder""",30 +"/packages?q=Tags:""SmtpClient""","Tags:""SmtpClient""",30 +"/packages?q=Tags:""speech""","Tags:""speech""",30 +"/packages?q=Tags:""syncfusion.windowsforms""","Tags:""syncfusion.windowsforms""",30 +"/packages?q=Tags:""webp""","Tags:""webp""",30 +/packages?q=TreeView,TreeView,30 +/packages?q=browser,browser,27 +/packages?q=captcha,captcha,27 +/packages?q=Cropper,Cropper,27 +/packages?q=Definitelytyped,Definitelytyped,27 +/packages?q=Google.Apis.people&prerelease=true&sortOrder=relevance,Google.Apis.people,27 +/packages?q=Instagram,Instagram,27 +/packages?q=LZMA,LZMA,27 +/packages?q=Microsoft.AspNet.WebHooks,Microsoft.AspNet.WebHooks,27 +/packages?q=Microsoft.AspNet.WebHooks.Receivers.Custom,Microsoft.AspNet.WebHooks.Receivers.Custom,27 +/packages?q=OAuth-1.0a,OAuth-1.0a,27 +/packages?q=OOXML,OOXML,27 +/packages?q=pop3,pop3,27 +/packages?q=rebus,rebus,27 +/packages?q=SAP,SAP,27 +/packages?q=sltoolkit,sltoolkit,27 +"/packages?q=Tags:""Calendar""","Tags:""Calendar""",27 +"/packages?q=Tags:""fab""","Tags:""fab""",27 +"/packages?q=Tags:""Fuzzy""","Tags:""Fuzzy""",27 +"/packages?q=Tags:""ListView""","Tags:""ListView""",27 +"/packages?q=Tags:""Notification""","Tags:""Notification""",27 +"/packages?q=Tags:""OpenOffice""","Tags:""OpenOffice""",27 +"/packages?q=Tags:""pdf-to-text""","Tags:""pdf-to-text""",27 +"/packages?q=Tags:""System.Windows.Automation""","Tags:""System.Windows.Automation""",27 +"/packages?q=Tags:""user-agent""","Tags:""user-agent""",27 +"/packages?q=Tags:""vCard""","Tags:""vCard""",27 +"/packages?q=Tags:""wpf""","Tags:""wpf""",27 +"/packages?q=Tags:""Zebra""","Tags:""Zebra""",27 +/packages?q=vs2008,vs2008,27 +/packages?q=vxsdk,vxsdk,27 +/packages?q=webm,webm,27 +/packages?q=XSL-FO,XSL-FO,27 +/packages?q=EWS,EWS,24 +/packages?q=ftp,ftp,24 +/packages?q=GPIO,GPIO,24 +/packages?q=Intellisense,Intellisense,24 +/packages?q=kafka,kafka,24 +/packages?q=MediaElement,MediaElement,24 +/packages?q=Microsoft.Extensions,Microsoft.Extensions,24 +/packages?q=mpxj,mpxj,24 +/packages?q=pdfsharp,pdfsharp,24 +/packages?q=radiobutton,radiobutton,24 +/packages?q=report+viewer+control,report viewer control,24 +/packages?q=Scraping,Scraping,24 +/packages?q=soap,soap,24 +"/packages?q=Tags:"".xlsb""","Tags:"".xlsb""",24 +"/packages?q=Tags:""badge""","Tags:""badge""",24 +"/packages?q=Tags:""Bluetooth""","Tags:""Bluetooth""",24 +"/packages?q=Tags:""chromium""","Tags:""chromium""",24 +"/packages?q=Tags:""Chromium""","Tags:""Chromium""",24 +"/packages?q=Tags:""Code-128""","Tags:""Code-128""",24 +"/packages?q=Tags:""datetimepicker""","Tags:""datetimepicker""",24 +"/packages?q=Tags:""Encryption""","Tags:""Encryption""",24 +"/packages?q=Tags:""h264""","Tags:""h264""",24 +"/packages?q=Tags:""HL7""","Tags:""HL7""",24 +"/packages?q=Tags:""ID3""","Tags:""ID3""",24 +"/packages?q=Tags:""modbus""","Tags:""modbus""",24 +"/packages?q=Tags:""pdf-to-html""","Tags:""pdf-to-html""",24 +"/packages?q=Tags:""pgp""","Tags:""pgp""",24 +"/packages?q=Tags:""screen-capture""","Tags:""screen-capture""",24 +"/packages?q=Tags:""System.Web.Http.Filters""","Tags:""System.Web.Http.Filters""",24 +"/packages?q=Tags:""tensorflow""","Tags:""tensorflow""",24 +"/packages?q=Tags:""USB""","Tags:""USB""",24 +"/packages?q=Tags:""WIA""","Tags:""WIA""",24 +"/packages?q=Tags:""windows-service""","Tags:""windows-service""",24 +/packages?q=tags:native,tags:native,24 +/packages?q=uml,uml,24 +/packages?q=Yunpian.Sdk,Yunpian.Sdk,24 +/packages?q=activedirectory,activedirectory,22 +/packages?q=ado.net,ado.net,22 +/packages?q=aes,aes,22 +/packages?q=avscan,avscan,22 +/packages?q=Chat,Chat,22 +/packages?q=Documentation,Documentation,22 +/packages?q=dotmim.sync,dotmim.sync,22 +/packages?q=DynamoVisualProgramming,DynamoVisualProgramming,22 +/packages?q=Encrypt,Encrypt,22 +/packages?q=Google.Apis.chat&prerelease=true&sortOrder=relevance,Google.Apis.chat,22 +/packages?q=Google.Apis.content&prerelease=true&sortOrder=relevance,Google.Apis.content,22 +/packages?q=Google.Apis.customsearch&prerelease=true&sortOrder=relevance,Google.Apis.customsearch,22 +/packages?q=Google.Apis.urlshortener&prerelease=true&sortOrder=relevance,Google.Apis.urlshortener,22 +/packages?q=Google.Apis.webmasters&prerelease=true&sortOrder=relevance,Google.Apis.webmasters,22 +/packages?q=google+login,google login,22 +/packages?q=IEDriver,IEDriver,22 +/packages?q=ini,ini,22 +/packages?q=Microsoft.AspNet.WebHooks.Custom,Microsoft.AspNet.WebHooks.Custom,22 +/packages?q=Microsoft.Extensions.Configuration,Microsoft.Extensions.Configuration,22 +/packages?q=newtonsoft.json,newtonsoft.json,22 +"/packages?q=ODAC,","ODAC,",22 +/packages?q=opc,opc,22 +/packages?q=orleans,orleans,22 +/packages?q=selenium,selenium,22 +/packages?q=seq-app,seq-app,22 +/packages?q=System.Web.Http,System.Web.Http,22 +"/packages?q=Tags:""7-Zip""","Tags:""7-Zip""",22 +"/packages?q=Tags:""ASN.1""","Tags:""ASN.1""",22 +"/packages?q=Tags:""Barcode""","Tags:""Barcode""",22 +"/packages?q=Tags:""DeepClone""","Tags:""DeepClone""",22 +"/packages?q=Tags:""EventAggregator""","Tags:""EventAggregator""",22 +"/packages?q=Tags:""Gantt""","Tags:""Gantt""",22 +"/packages?q=Tags:""GS1-128""","Tags:""GS1-128""",22 +"/packages?q=Tags:""longpress""","Tags:""longpress""",22 +"/packages?q=Tags:""materialdesign""","Tags:""materialdesign""",22 +"/packages?q=Tags:""MetroFramework""","Tags:""MetroFramework""",22 +"/packages?q=Tags:""mime-type""","Tags:""mime-type""",22 +"/packages?q=Tags:""mp4""","Tags:""mp4""",22 +"/packages?q=Tags:""MTProto""","Tags:""MTProto""",22 +"/packages?q=Tags:""OPC-UA""","Tags:""OPC-UA""",22 +"/packages?q=Tags:""pdf-converter""","Tags:""pdf-converter""",22 +"/packages?q=Tags:""PDF417""","Tags:""PDF417""",22 +"/packages?q=Tags:""progress-bar""","Tags:""progress-bar""",22 +"/packages?q=Tags:""ProgressBar""","Tags:""ProgressBar""",22 +"/packages?q=Tags:""Qna""","Tags:""Qna""",22 +"/packages?q=Tags:""rating""","Tags:""rating""",22 +"/packages?q=Tags:""replace""","Tags:""replace""",22 +"/packages?q=Tags:""RichTextEditor""","Tags:""RichTextEditor""",22 +"/packages?q=Tags:""rtp""","Tags:""rtp""",22 +"/packages?q=Tags:""Shapefile""","Tags:""Shapefile""",22 +"/packages?q=Tags:""template-engine""","Tags:""template-engine""",22 +"/packages?q=Tags:""Thermal""","Tags:""Thermal""",22 +/packages?q=tstack,tstack,22 +/packages?q=WebView,WebView,22 +/packages?q=WIA,WIA,22 +/packages?q=Xamarin+Google+Play+Services,Xamarin Google Play Services,22 +/packages?q=XmlSerializer,XmlSerializer,22 +/packages?q=3D,3D,19 +/packages?q=bar-code,bar-code,19 +/packages?q=Blowfish,Blowfish,19 +/packages?q=bluetooth+low+energy,bluetooth low energy,19 +/packages?q=bzip2,bzip2,19 +/packages?q=chinook,chinook,19 +/packages?q=cpprestsdk.v120,cpprestsdk.v120,19 +/packages?q=Credential,Credential,19 +/packages?q=csv,csv,19 +/packages?q=Datepicker+thai,Datepicker thai,19 +/packages?q=delimited,delimited,19 +/packages?q=device-detection,device-detection,19 +/packages?q=DirectShow,DirectShow,19 +"/packages?q=expander,","expander,",19 +"/packages?q=FileUpload,","FileUpload,",19 +/packages?q=Google.Apis.firebasedynamiclinks&prerelease=true&sortOrder=relevance,Google.Apis.firebasedynamiclinks,19 +/packages?q=HTMLEditor,HTMLEditor,19 +/packages?q=HttpRequest,HttpRequest,19 +/packages?q=interpolation,interpolation,19 +/packages?q=JWT,JWT,19 +/packages?q=magick.net.core,magick.net.core,19 +/packages?q=Microsoft.EntityFrameworkCore.Tools,Microsoft.EntityFrameworkCore.Tools,19 +/packages?q=MP3,MP3,19 +/packages?q=mt940,mt940,19 +/packages?q=nathanaeljones,nathanaeljones,19 +/packages?q=nuget,nuget,19 +/packages?q=ODS,ODS,19 +/packages?q=ODT,ODT,19 +/packages?q=paging,paging,19 +/packages?q=PDF/A,PDF/A,19 +/packages?q=Print,Print,19 +/packages?q=regex,regex,19 +/packages?q=RestClient,RestClient,19 +/packages?q=saea,saea,19 +/packages?q=samsung+xamarin,samsung xamarin,19 +/packages?q=SASS,SASS,19 +/packages?q=smtp,smtp,19 +/packages?q=SQL,SQL,19 +/packages?q=sqlite,sqlite,19 +/packages?q=Swagger,Swagger,19 +/packages?q=System.IdentityModel.Tokens.Jwt,System.IdentityModel.Tokens.Jwt,19 +"/packages?q=Tags:""delimited""","Tags:""delimited""",19 +"/packages?q=Tags:""Deribit""","Tags:""Deribit""",19 +"/packages?q=Tags:""EAN13""","Tags:""EAN13""",19 +"/packages?q=Tags:""email-validation""","Tags:""email-validation""",19 +"/packages?q=Tags:""Gauges""","Tags:""Gauges""",19 +"/packages?q=Tags:""Hex""","Tags:""Hex""",19 +"/packages?q=Tags:""html-parser""","Tags:""html-parser""",19 +"/packages?q=Tags:""latex""","Tags:""latex""",19 +"/packages?q=Tags:""map""","Tags:""map""",19 +"/packages?q=Tags:""material-design""","Tags:""material-design""",19 +"/packages?q=Tags:""psd""","Tags:""psd""",19 +"/packages?q=Tags:""Roslyn","Tags:""Roslyn",19 +"/packages?q=Tags:""SAML2""","Tags:""SAML2""",19 +"/packages?q=Tags:""soundex""","Tags:""soundex""",19 +"/packages?q=Tags:""Speech-Recognition""","Tags:""Speech-Recognition""",19 +"/packages?q=Tags:""TWAIN.NET""","Tags:""TWAIN.NET""",19 +/packages?q=thumbnails,thumbnails,19 +/packages?q=Trie,Trie,19 +/packages?q=ups,ups,19 +/packages?q=vb.net,vb.net,19 +/packages?q=XAML,XAML,19 +/packages?q=XLSM,XLSM,19 +/packages?q=+aws-sdk-v3,aws-sdk-v3,16 +/packages?q=actionresult,actionresult,16 +/packages?q=Angular&page=7,Angular,16 +/packages?q=AspNetCore.HealthChecks,AspNetCore.HealthChecks,16 +/packages?q=audio,audio,16 +/packages?q=Autofac,Autofac,16 +/packages?q=automapper,automapper,16 +/packages?q=Bonjour,Bonjour,16 +/packages?q=combobox,combobox,16 +/packages?q=coordinates,coordinates,16 +/packages?q=Costura.Fody,Costura.Fody,16 +/packages?q=Crop,Crop,16 +/packages?q=DateRange,DateRange,16 +/packages?q=DGML,DGML,16 +/packages?q=dos.orm,dos.orm,16 +/packages?q=Elastic.apm,Elastic.apm,16 +/packages?q=enterprise+library+6,enterprise library 6,16 +/packages?q=Filepicker,Filepicker,16 +/packages?q=geojson,geojson,16 +/packages?q=geolocation,geolocation,16 +/packages?q=getopt,getopt,16 +/packages?q=Google.Apis.blogger&prerelease=true&sortOrder=relevance,Google.Apis.blogger,16 +/packages?q=Google.Apis.texttospeech&prerelease=true&sortOrder=relevance,Google.Apis.texttospeech,16 +/packages?q=GZIP,GZIP,16 +/packages?q=HttpClient,HttpClient,16 +/packages?q=informix,informix,16 +/packages?q=linq-to-sql,linq-to-sql,16 +/packages?q=Linux,Linux,16 +/packages?q=math,math,16 +/packages?q=MediaTypeFormatter,MediaTypeFormatter,16 +/packages?q=MessageBox,MessageBox,16 +/packages?q=MetroUI,MetroUI,16 +/packages?q=Microsoft.VisualStudio.Web.CodeGeneration.Design,Microsoft.VisualStudio.Web.CodeGeneration.Design,16 +/packages?q=mongodb,mongodb,16 +/packages?q=monogame.extended,monogame.extended,16 +/packages?q=moq,moq,16 +/packages?q=NLog,NLog,16 +/packages?q=openssl,openssl,16 +/packages?q=openxml,openxml,16 +/packages?q=postgres,postgres,16 +/packages?q=powerappswebapiutils,powerappswebapiutils,16 +/packages?q=progressbar,progressbar,16 +/packages?q=qrcode,qrcode,16 +/packages?q=rar,rar,16 +/packages?q=RTF&page=2,RTF,16 +/packages?q=servicestack+ormlite,servicestack ormlite,16 +/packages?q=SharePointPnPCore*,SharePointPnPCore*,16 +/packages?q=shiny,shiny,16 +/packages?q=SMTP,SMTP,16 +/packages?q=SonarLint,SonarLint,16 +/packages?q=SqlBulkCopy,SqlBulkCopy,16 +/packages?q=Stanford.NLP,Stanford.NLP,16 +/packages?q=Swashbuckle.AspNetCore,Swashbuckle.AspNetCore,16 +/packages?q=System.Web.Routing,System.Web.Routing,16 +"/packages?q=Tags:""3d-chart""","Tags:""3d-chart""",16 +"/packages?q=Tags:""Analyzers""","Tags:""Analyzers""",16 +"/packages?q=Tags:""BulkInsert""","Tags:""BulkInsert""",16 +"/packages?q=Tags:""button""","Tags:""button""",16 +"/packages?q=Tags:""Chatbot""","Tags:""Chatbot""",16 +"/packages?q=Tags:""Cmd""","Tags:""Cmd""",16 +"/packages?q=Tags:""CometD""","Tags:""CometD""",16 +"/packages?q=Tags:""credit-card""","Tags:""credit-card""",16 +"/packages?q=Tags:""CRUD""","Tags:""CRUD""",16 +"/packages?q=Tags:""datetime""","Tags:""datetime""",16 +"/packages?q=Tags:""DNG""","Tags:""DNG""",16 +"/packages?q=Tags:""Docker""","Tags:""Docker""",16 +"/packages?q=Tags:""Full-Text""","Tags:""Full-Text""",16 +"/packages?q=Tags:""glTF""","Tags:""glTF""",16 +"/packages?q=Tags:""GS1""","Tags:""GS1""",16 +"/packages?q=Tags:""heatmap""","Tags:""heatmap""",16 +"/packages?q=Tags:""imdb""","Tags:""imdb""",16 +"/packages?q=Tags:""java""","Tags:""java""",16 +"/packages?q=Tags:""kalman""","Tags:""kalman""",16 +"/packages?q=Tags:""keccak""","Tags:""keccak""",16 +"/packages?q=Tags:""keyboard-hook""","Tags:""keyboard-hook""",16 +"/packages?q=Tags:""LibreOffice""","Tags:""LibreOffice""",16 +"/packages?q=Tags:""Moles""","Tags:""Moles""",16 +"/packages?q=Tags:""Multipart""","Tags:""Multipart""",16 +"/packages?q=Tags:""NumericUpDown""","Tags:""NumericUpDown""",16 +"/packages?q=Tags:""PDF-To-Image""","Tags:""PDF-To-Image""",16 +"/packages?q=Tags:""pdf""","Tags:""pdf""",16 +"/packages?q=Tags:""picker""","Tags:""picker""",16 +"/packages?q=Tags:""plotly""","Tags:""plotly""",16 +"/packages?q=Tags:""RatingBar""","Tags:""RatingBar""",16 +"/packages?q=Tags:""ReportViewer""","Tags:""ReportViewer""",16 +"/packages?q=Tags:""rules-engine""","Tags:""rules-engine""",16 +"/packages?q=Tags:""scaffolding""","Tags:""scaffolding""",16 +"/packages?q=Tags:""screenshot""","Tags:""screenshot""",16 +"/packages?q=Tags:""serialport""","Tags:""serialport""",16 +"/packages?q=Tags:""smb""","Tags:""smb""",16 +"/packages?q=Tags:""SSRS""","Tags:""SSRS""",16 +"/packages?q=Tags:""syncfusion.aspnet""","Tags:""syncfusion.aspnet""",16 +"/packages?q=Tags:""ThreadPool""","Tags:""ThreadPool""",16 +"/packages?q=Tags:""throttle""","Tags:""throttle""",16 +"/packages?q=Tags:""TIFF""","Tags:""TIFF""",16 +"/packages?q=Tags:""Translator""","Tags:""Translator""",16 +"/packages?q=Tags:""video-streaming""","Tags:""video-streaming""",16 +"/packages?q=Tags:""Word""","Tags:""Word""",16 +/packages?q=Thermal,Thermal,16 +/packages?q=wcf,wcf,16 +/packages?q=WebDAV,WebDAV,16 +/packages?q=webp,webp,16 +/packages?q=websocketrpc,websocketrpc,16 +/packages?q=Windows-Forms,Windows-Forms,16 +/packages?q=wysiwyg,wysiwyg,16 +/packages?q=yandex maps,yandex maps,16 +/packages?q=51degrees,51degrees,14 +/packages?q=apirio,apirio,14 +/packages?q=appdynamics,appdynamics,14 +/packages?q=AssemblyVersion,AssemblyVersion,14 +/packages?q=autocomplete,autocomplete,14 +/packages?q=autofac,autofac,14 +/packages?q=AutoMapper.Extensions.Microsoft.DependencyInjection,AutoMapper.Extensions.Microsoft.DependencyInjection,14 +/packages?q=Azure+Media+Services+.NET+SDK,Azure Media Services .NET SDK,14 +/packages?q=badge,badge,14 +/packages?q=Bar-Chart,Bar-Chart,14 +/packages?q=bcrypt,bcrypt,14 +/packages?q=BingMaps,BingMaps,14 +/packages?q=BitCoin,BitCoin,14 +/packages?q=bulk,bulk,14 +/packages?q=cameras,cameras,14 +/packages?q=Chinese,Chinese,14 +/packages?q=circuit+breaker,circuit breaker,14 +/packages?q=codeer,codeer,14 +/packages?q=core.net zip,core.net zip,14 +/packages?q=crc16,crc16,14 +/packages?q=currency,currency,14 +/packages?q=DbContext,DbContext,14 +/packages?q=delete,delete,14 +/packages?q=discriminated+unions,discriminated unions,14 +/packages?q=dotnetrdf,dotnetrdf,14 +/packages?q=Elastic.Apm,Elastic.Apm,14 +/packages?q=embedded-resources,embedded-resources,14 +/packages?q=entity,entity,14 +/packages?q=EZNEW,EZNEW,14 +/packages?q=FaceDetection,FaceDetection,14 +/packages?q=ffmpeg,ffmpeg,14 +/packages?q=flags,flags,14 +/packages?q=fody,fody,14 +/packages?q=Freitas,Freitas,14 +/packages?q=geospatial,geospatial,14 +/packages?q=Glass.Mapper.Sc.91,Glass.Mapper.Sc.91,14 +/packages?q=Google.Apis.iam&prerelease=true&sortOrder=relevance,Google.Apis.iam,14 +/packages?q=Google.Apis.tagmanager&prerelease=true&sortOrder=relevance,Google.Apis.tagmanager,14 +/packages?q=grid,grid,14 +/packages?q=Grpc.Auth.Google,Grpc.Auth.Google,14 +/packages?q=HLSL,HLSL,14 +/packages?q=httpcontextbase,httpcontextbase,14 +/packages?q=identityserver4,identityserver4,14 +/packages?q=Logstash,Logstash,14 +/packages?q=mailchimp,mailchimp,14 +/packages?q=mailkit,mailkit,14 +/packages?q=mapsurfer.net,mapsurfer.net,14 +/packages?q=markdown,markdown,14 +/packages?q=Microsoft.AI,Microsoft.AI,14 +/packages?q=Microsoft.ApplicationInsights,Microsoft.ApplicationInsights,14 +/packages?q=Microsoft.AspNet.WebApi.Client,Microsoft.AspNet.WebApi.Client,14 +/packages?q=Microsoft.AspNet.WebHooks.Receivers.GitHub,Microsoft.AspNet.WebHooks.Receivers.GitHub,14 +/packages?q=Microsoft.AspNetCore.App,Microsoft.AspNetCore.App,14 +/packages?q=microsoft.azure.kusto,microsoft.azure.kusto,14 +/packages?q=Microsoft.Configuration.ConfigurationBuilders,Microsoft.Configuration.ConfigurationBuilders,14 +/packages?q=Microsoft.Extensions.DependencyInjection,Microsoft.Extensions.DependencyInjection,14 +/packages?q=Microsoft.Practices.Unity,Microsoft.Practices.Unity,14 +/packages?q=Microsoft.SourceLink,Microsoft.SourceLink,14 +/packages?q=Microsoft.VisualStudio.Services.NuGet.Bootstrap,Microsoft.VisualStudio.Services.NuGet.Bootstrap,14 +/packages?q=Microsoft.VisualStudio.TestTools.UnitTesting,Microsoft.VisualStudio.TestTools.UnitTesting,14 +/packages?q=mime,mime,14 +/packages?q=Moq,Moq,14 +/packages?q=MPP,MPP,14 +/packages?q=mysql,mysql,14 +/packages?q=Ninject&sortOrder=package-download-count,Ninject,14 +/packages?q=Office365,Office365,14 +/packages?q=ogg,ogg,14 +/packages?q=OWASP,OWASP,14 +/packages?q=owin,owin,14 +/packages?q=Parallax,Parallax,14 +/packages?q=PDS,PDS,14 +"/packages?q=Places,","Places,",14 +/packages?q=png,png,14 +/packages?q=price,price,14 +/packages?q=printer,printer,14 +/packages?q=ProgressDialog,ProgressDialog,14 +/packages?q=python,python,14 +/packages?q=qt,qt,14 +/packages?q=receipt,receipt,14 +/packages?q=recurring,recurring,14 +/packages?q=RFID,RFID,14 +/packages?q=rhino3dmio,rhino3dmio,14 +/packages?q=serilog,serilog,14 +/packages?q=signalr,signalr,14 +/packages?q=Skype,Skype,14 +/packages?q=solr,solr,14 +/packages?q=SQLRSNuget,SQLRSNuget,14 +/packages?q=SSDT,SSDT,14 +/packages?q=StoredProcedure,StoredProcedure,14 +/packages?q=swashbuckle,swashbuckle,14 +/packages?q=syncfusion.ej2.wordeditor,syncfusion.ej2.wordeditor,14 +"/packages?q=Tags:"".ods""","Tags:"".ods""",14 +"/packages?q=Tags:""acmesharp""","Tags:""acmesharp""",14 +"/packages?q=Tags:""APNS""","Tags:""APNS""",14 +"/packages?q=Tags:""Balloon""","Tags:""Balloon""",14 +"/packages?q=Tags:""datatable""","Tags:""datatable""",14 +"/packages?q=Tags:""Document-Viewer""","Tags:""Document-Viewer""",14 +"/packages?q=Tags:""embedded-database""","Tags:""embedded-database""",14 +"/packages?q=Tags:""Encryption.Decryption""","Tags:""Encryption.Decryption""",14 +"/packages?q=Tags:""fingerprint""","Tags:""fingerprint""",14 +"/packages?q=Tags:""floating-action-button""","Tags:""floating-action-button""",14 +"/packages?q=Tags:""gauge""&page=3","Tags:""gauge""",14 +"/packages?q=Tags:""health-check""","Tags:""health-check""",14 +"/packages?q=Tags:""Honeywell""","Tags:""Honeywell""",14 +"/packages?q=Tags:""hotkey""","Tags:""hotkey""",14 +"/packages?q=Tags:""HttpWebRequest""","Tags:""HttpWebRequest""",14 +"/packages?q=Tags:""ibeacon""","Tags:""ibeacon""",14 +"/packages?q=Tags:""IFC""","Tags:""IFC""",14 +"/packages?q=Tags:""image-resizing""","Tags:""image-resizing""",14 +"/packages?q=Tags:""Luhn""","Tags:""Luhn""",14 +"/packages?q=Tags:""MASK""","Tags:""MASK""",14 +"/packages?q=Tags:""MD5""","Tags:""MD5""",14 +"/packages?q=Tags:""MongoDB-Repository""","Tags:""MongoDB-Repository""",14 +"/packages?q=Tags:""MTP""","Tags:""MTP""",14 +"/packages?q=Tags:""OPC-DA""","Tags:""OPC-DA""",14 +"/packages?q=Tags:""OpenGL""","Tags:""OpenGL""",14 +"/packages?q=Tags:""pdf-to-png""","Tags:""pdf-to-png""",14 +"/packages?q=Tags:""Pdf417""","Tags:""Pdf417""",14 +"/packages?q=Tags:""PDFium""","Tags:""PDFium""",14 +"/packages?q=Tags:""PersianCalendar""","Tags:""PersianCalendar""",14 +"/packages?q=Tags:""PPTX""","Tags:""PPTX""",14 +"/packages?q=Tags:""RADIUS""","Tags:""RADIUS""",14 +"/packages?q=Tags:""Repository-Pattern""","Tags:""Repository-Pattern""",14 +"/packages?q=Tags:""ResX""","Tags:""ResX""",14 +"/packages?q=Tags:""RFID""","Tags:""RFID""",14 +"/packages?q=Tags:""sexy-proxy""","Tags:""sexy-proxy""",14 +"/packages?q=Tags:""SHA512""","Tags:""SHA512""",14 +"/packages?q=Tags:""sound""","Tags:""sound""",14 +"/packages?q=Tags:""SPSite""","Tags:""SPSite""",14 +"/packages?q=Tags:""Stepper""","Tags:""Stepper""",14 +"/packages?q=Tags:""swipe""","Tags:""swipe""",14 +"/packages?q=Tags:""Sybase""","Tags:""Sybase""",14 +"/packages?q=Tags:""syncfusion.wpf""","Tags:""syncfusion.wpf""",14 +"/packages?q=Tags:""TCP""","Tags:""TCP""",14 +"/packages?q=Tags:""Telemetry""","Tags:""Telemetry""",14 +"/packages?q=Tags:""textbox""","Tags:""textbox""",14 +"/packages?q=Tags:""toast""","Tags:""toast""",14 +"/packages?q=Tags:""Tree""","Tags:""Tree""",14 +"/packages?q=Tags:""WebDAV""","Tags:""WebDAV""",14 +"/packages?q=Tags:""winforms-controls""","Tags:""winforms-controls""",14 +"/packages?q=Tags:""x12""","Tags:""x12""",14 +"/packages?q=Tags:""Zoom""","Tags:""Zoom""",14 +/packages?q=Thumbnail,Thumbnail,14 +/packages?q=Tidy,Tidy,14 +/packages?q=timeline,timeline,14 +/packages?q=timeout,timeout,14 +/packages?q=TimePicker,TimePicker,14 +/packages?q=tor,tor,14 +/packages?q=treeview,treeview,14 +/packages?q=unity,unity,14 +/packages?q=unzip,unzip,14 +/packages?q=VTK,VTK,14 +/packages?q=webclient,webclient,14 +/packages?q=WindowsAPICodePack,WindowsAPICodePack,14 +/packages?q=x64,x64,14 +/packages?q=XtremeDocumentStudio,XtremeDocumentStudio,14 +/packages?q=ya,ya,14 +/packages?q=zlib,zlib,14 +/packages?q=zoho,zoho,14 +/packages?q=zxing.net.bindings,zxing.net.bindings,14 +"/packages?q=""playfab+party""","""playfab party""",11 +/packages?q=ajaxcontroltoolkit,ajaxcontroltoolkit,11 +/packages?q=Amazon.CDK,Amazon.CDK,11 +/packages?q=Amazon.Lambda,Amazon.Lambda,11 +/packages?q=android,android,11 +/packages?q=ApiController,ApiController,11 +/packages?q=aspnetcore,aspnetcore,11 +"/packages?q=Auto-Update,","Auto-Update,",11 +/packages?q=Bitbucket,Bitbucket,11 +/packages?q=buttplug,buttplug,11 +/packages?q=Cinchoo,Cinchoo,11 +/packages?q=Common.logging,Common.logging,11 +/packages?q=compare,compare,11 +/packages?q=crop,crop,11 +/packages?q=csla,csla,11 +/packages?q=curl,curl,11 +/packages?q=dashboard,dashboard,11 +/packages?q=database-migrations,database-migrations,11 +/packages?q=DataContract,DataContract,11 +/packages?q=Datagrid,Datagrid,11 +/packages?q=DHL,DHL,11 +/packages?q=Digest,Digest,11 +/packages?q=dropdown,dropdown,11 +/packages?q=ELMAH,ELMAH,11 +/packages?q=enterpriselibrary,enterpriselibrary,11 +/packages?q=EntityFramework.SqlServer,EntityFramework.SqlServer,11 +/packages?q=ethernet/ip,ethernet/ip,11 +/packages?q=event-sourcing,event-sourcing,11 +/packages?q=ExtractText,ExtractText,11 +/packages?q=Firebase,Firebase,11 +/packages?q=forum,forum,11 +/packages?q=FtpClient,FtpClient,11 +/packages?q=fxcop,fxcop,11 +/packages?q=geckofx,geckofx,11 +/packages?q=ghpr,ghpr,11 +/packages?q=Glass.Mapper.Sc.82,Glass.Mapper.Sc.82,11 +/packages?q=Google.Apis.cloudfunctions&prerelease=true&sortOrder=relevance,Google.Apis.cloudfunctions,11 +/packages?q=Google.Apis.discovery&prerelease=true&sortOrder=relevance,Google.Apis.discovery,11 +/packages?q=Google.Apis.fitness&prerelease=true&sortOrder=relevance,Google.Apis.fitness,11 +/packages?q=google+translate,google translate,11 +/packages?q=Graylog2,Graylog2,11 +/packages?q=gridview,gridview,11 +/packages?q=HAL,HAL,11 +"/packages?q=Highcharts,","Highcharts,",11 +/packages?q=Hpcsharp,Hpcsharp,11 +/packages?q=html,html,11 +"/packages?q=Id:""cef.redist"",""cef.sdk""","Id:""cef.redist"",""cef.sdk""",11 +/packages?q=indexeddb,indexeddb,11 +/packages?q=interop,interop,11 +/packages?q=ipsum,ipsum,11 +/packages?q=jpeg,jpeg,11 +/packages?q=jquery,jquery,11 +/packages?q=jquery.ui,jquery.ui,11 +/packages?q=json-api,json-api,11 +/packages?q=json.net,json.net,11 +/packages?q=kendo,kendo,11 +/packages?q=Linq2Sql,Linq2Sql,11 +"/packages?q=loading,","loading,",11 +/packages?q=log4net.appender,log4net.appender,11 +/packages?q=lupusa87,lupusa87,11 +/packages?q=MDB,MDB,11 +/packages?q=Microsoft.AspNet.WebApi.Core,Microsoft.AspNet.WebApi.Core,11 +/packages?q=Microsoft.AspNetCore,Microsoft.AspNetCore,11 +/packages?q=Microsoft.Bcl,Microsoft.Bcl,11 +/packages?q=Microsoft.EntityFrameworkCore.Design,Microsoft.EntityFrameworkCore.Design,11 +/packages?q=Microsoft.Extensions.Configuration.Binder,Microsoft.Extensions.Configuration.Binder,11 +/packages?q=Microsoft.InformationProtection,Microsoft.InformationProtection,11 +/packages?q=Microsoft.ReportViewer&page=2,Microsoft.ReportViewer,11 +/packages?q=mouse,mouse,11 +/packages?q=MVVM,MVVM,11 +/packages?q=NEST,NEST,11 +/packages?q=netmq,netmq,11 +"/packages?q=nfc,","nfc,",11 +/packages?q=NLP,NLP,11 +/packages?q=notification,notification,11 +/packages?q=NTP,NTP,11 +/packages?q=odp.net,odp.net,11 +/packages?q=office,office,11 +/packages?q=OLAP,OLAP,11 +/packages?q=OpenAL,OpenAL,11 +/packages?q=opencv,opencv,11 +/packages?q=oracle,oracle,11 +/packages?q=orchard,orchard,11 +/packages?q=phantomjs,phantomjs,11 +/packages?q=POCO,POCO,11 +/packages?q=PowerCollections,PowerCollections,11 +/packages?q=Pub/Sub,Pub/Sub,11 +/packages?q=QR,QR,11 +/packages?q=querybuilder,querybuilder,11 +/packages?q=rating,rating,11 +/packages?q=rebex,rebex,11 +/packages?q=Renci,Renci,11 +/packages?q=ReportViewer&page=2,ReportViewer,11 +/packages?q=ReportViewer&page=3,ReportViewer,11 +/packages?q=restsharp,restsharp,11 +/packages?q=Rhino3dmIo,Rhino3dmIo,11 +/packages?q=Ribbon,Ribbon,11 +/packages?q=RoslynPad,RoslynPad,11 +/packages?q=RSA,RSA,11 +/packages?q=SEO,SEO,11 +/packages?q=Serilog.Enrichers,Serilog.Enrichers,11 +/packages?q=signalr+aspnetcore,signalr aspnetcore,11 +/packages?q=sitecore,sitecore,11 +/packages?q=SMO,SMO,11 +/packages?q=sms,sms,11 +/packages?q=STUN,STUN,11 +/packages?q=StyleCop,StyleCop,11 +/packages?q=SVG,SVG,11 +/packages?q=System.Net.Http,System.Net.Http,11 +/packages?q=system.net.mail,system.net.mail,11 +/packages?q=System.Web.Mvc,System.Web.Mvc,11 +/packages?q=System.Web.routing,System.Web.routing,11 +"/packages?q=Tags:""autoupdate""","Tags:""autoupdate""",11 +"/packages?q=Tags:""BarCode""","Tags:""BarCode""",11 +"/packages?q=Tags:""Base58""","Tags:""Base58""",11 +"/packages?q=Tags:""calendar""","Tags:""calendar""",11 +"/packages?q=Tags:""CEF""","Tags:""CEF""",11 +"/packages?q=Tags:""central""","Tags:""central""",11 +"/packages?q=Tags:""Chart""","Tags:""Chart""",11 +"/packages?q=Tags:""circular-progress""","Tags:""circular-progress""",11 +"/packages?q=Tags:""cldr""","Tags:""cldr""",11 +"/packages?q=Tags:""ColorPicker""","Tags:""ColorPicker""",11 +"/packages?q=Tags:""combobox""","Tags:""combobox""",11 +"/packages?q=Tags:""ComboBox""","Tags:""ComboBox""",11 +"/packages?q=Tags:""Compression""","Tags:""Compression""",11 +"/packages?q=Tags:""CoreScanner""","Tags:""CoreScanner""",11 +"/packages?q=Tags:""CPF""","Tags:""CPF""",11 +"/packages?q=Tags:""database""","Tags:""database""",11 +"/packages?q=Tags:""DependencyService""","Tags:""DependencyService""",11 +"/packages?q=Tags:""Diagram""","Tags:""Diagram""",11 +"/packages?q=Tags:""Dictionary""","Tags:""Dictionary""",11 +"/packages?q=Tags:""DirectX""","Tags:""DirectX""",11 +"/packages?q=Tags:""EAN-13""","Tags:""EAN-13""",11 +"/packages?q=Tags:""EPL""","Tags:""EPL""",11 +"/packages?q=Tags:""EWS""","Tags:""EWS""",11 +"/packages?q=Tags:""EXPORT-EXCEL""","Tags:""EXPORT-EXCEL""",11 +"/packages?q=Tags:""EZPL""","Tags:""EZPL""",11 +"/packages?q=Tags:""ffmpeg-wrapper""","Tags:""ffmpeg-wrapper""",11 +"/packages?q=Tags:""FFMpeg""","Tags:""FFMpeg""",11 +"/packages?q=Tags:""ftps""","Tags:""ftps""",11 +"/packages?q=Tags:""gamepad""","Tags:""gamepad""",11 +"/packages?q=Tags:""graph""","Tags:""graph""",11 +"/packages?q=Tags:""image-processing""","Tags:""image-processing""",11 +"/packages?q=Tags:""Intermec""","Tags:""Intermec""",11 +"/packages?q=Tags:""iwshruntimelibrary""","Tags:""iwshruntimelibrary""",11 +"/packages?q=Tags:""kanban""","Tags:""kanban""",11 +"/packages?q=Tags:""Kerberos""","Tags:""Kerberos""",11 +"/packages?q=Tags:""kubernetes""","Tags:""kubernetes""",11 +"/packages?q=Tags:""localization""","Tags:""localization""",11 +"/packages?q=Tags:""message-queue""","Tags:""message-queue""",11 +"/packages?q=Tags:""minify""","Tags:""minify""",11 +"/packages?q=Tags:""Mocking""","Tags:""Mocking""",11 +"/packages?q=Tags:""MSBuild""","Tags:""MSBuild""",11 +"/packages?q=Tags:""named-pipes""","Tags:""named-pipes""",11 +"/packages?q=Tags:""netsh""","Tags:""netsh""",11 +"/packages?q=Tags:""ObservableDictionary""","Tags:""ObservableDictionary""",11 +"/packages?q=Tags:""ODT""","Tags:""ODT""",11 +"/packages?q=Tags:""OpenApi""","Tags:""OpenApi""",11 +"/packages?q=Tags:""OpenXml""","Tags:""OpenXml""",11 +"/packages?q=Tags:""password-hashing""","Tags:""password-hashing""",11 +"/packages?q=Tags:""pdf-to-tiff""","Tags:""pdf-to-tiff""",11 +"/packages?q=Tags:""PDF/A""","Tags:""PDF/A""",11 +"/packages?q=Tags:""Picker""","Tags:""Picker""",11 +"/packages?q=Tags:""Pinterest""","Tags:""Pinterest""",11 +"/packages?q=Tags:""PPT""","Tags:""PPT""",11 +"/packages?q=Tags:""qr-code""","Tags:""qr-code""",11 +"/packages?q=Tags:""RBAC""","Tags:""RBAC""",11 +"/packages?q=Tags:""recyclerview""","Tags:""recyclerview""",11 +"/packages?q=Tags:""Rtmp""","Tags:""Rtmp""",11 +"/packages?q=Tags:""scp""","Tags:""scp""",11 +"/packages?q=Tags:""serial""","Tags:""serial""",11 +"/packages?q=Tags:""Siemens""","Tags:""Siemens""",11 +"/packages?q=Tags:""Slide""","Tags:""Slide""",11 +"/packages?q=Tags:""smartcard""","Tags:""smartcard""",11 +"/packages?q=Tags:""smpp""","Tags:""smpp""",11 +"/packages?q=Tags:""spreadsheet""","Tags:""spreadsheet""",11 +"/packages?q=Tags:""sql-query-builder""","Tags:""sql-query-builder""",11 +"/packages?q=Tags:""SqlBulkCopy""","Tags:""SqlBulkCopy""",11 +"/packages?q=Tags:""SSH""","Tags:""SSH""",11 +"/packages?q=Tags:""ssl""","Tags:""ssl""",11 +"/packages?q=Tags:""sunrise""","Tags:""sunrise""",11 +"/packages?q=Tags:""syncfusion.uwp""","Tags:""syncfusion.uwp""",11 +"/packages?q=Tags:""TCPClient""","Tags:""TCPClient""",11 +"/packages?q=Tags:""Theme""","Tags:""Theme""",11 +"/packages?q=Tags:""TitleBar""","Tags:""TitleBar""",11 +"/packages?q=Tags:""TSV""","Tags:""TSV""",11 +"/packages?q=Tags:""UiPath""","Tags:""UiPath""",11 +"/packages?q=Tags:""UML""","Tags:""UML""",11 +"/packages?q=Tags:""unit-test""","Tags:""unit-test""",11 +"/packages?q=Tags:""Upload""","Tags:""Upload""",11 +"/packages?q=Tags:""vb.net""","Tags:""vb.net""",11 +"/packages?q=Tags:""Vimeo""","Tags:""Vimeo""",11 +"/packages?q=Tags:""VS2017""","Tags:""VS2017""",11 +"/packages?q=Tags:""VSIX""","Tags:""VSIX""",11 +"/packages?q=Tags:""Webhooks""","Tags:""Webhooks""",11 +"/packages?q=Tags:""websocket-server""","Tags:""websocket-server""",11 +"/packages?q=Tags:""wia""","Tags:""wia""",11 +"/packages?q=Tags:""youtube-dl""","Tags:""youtube-dl""",11 +/packages?q=tesseract,tesseract,11 +/packages?q=timer,timer,11 +/packages?q=TLS,TLS,11 +/packages?q=Unity,Unity,11 +/packages?q=Visio,Visio,11 +/packages?q=vlc,vlc,11 +/packages?q=weak+event+manager&prerel=false,weak event manager,11 +/packages?q=web.config,web.config,11 +/packages?q=Webkit,Webkit,11 +/packages?q=WIC,WIC,11 +/packages?q=wiki,wiki,11 +/packages?q=wizard,wizard,11 +/packages?q=Xamarin.Firebase.ML,Xamarin.Firebase.ML,11 +/packages?q=xlabs.ioc,xlabs.ioc,11 +/packages?q=XMPP,XMPP,11 +/packages?q=xsd,xsd,11 +/packages?q=XSD,XSD,11 +/packages?q=xss,xss,11 +/packages?q=xunit,xunit,11 +/packages?q=yandex,yandex,11 +/packages?q=ZLIB,ZLIB,11 +/packages?q=Accord.NET,Accord.NET,8 +"/packages?q=AdMob,","AdMob,",8 +/packages?q=Adobe,Adobe,8 +/packages?q=AForge,AForge,8 +/packages?q=AMap,AMap,8 +/packages?q=amp,amp,8 +/packages?q=AMQP,AMQP,8 +/packages?q=androidx,androidx,8 +/packages?q=Angular+core,Angular core,8 +/packages?q=animated,animated,8 +/packages?q=AOP,AOP,8 +/packages?q=Apache.Ignite,Apache.Ignite,8 +/packages?q=arabic,arabic,8 +/packages?q=argparse,argparse,8 +/packages?q=AspNetCore.HealthChecks&source=post_page---------------------------,AspNetCore.HealthChecks,8 +/packages?q=Autocomplete,Autocomplete,8 +/packages?q=Autocomplete&page=2,Autocomplete,8 +/packages?q=AWSXRayRecorder,AWSXRayRecorder,8 +/packages?q=Aztec,Aztec,8 +"/packages?q=barcode,","barcode,",8 +"/packages?q=barcode,&page=8","barcode,",8 +/packages?q=Barcode&page=4,Barcode,8 +/packages?q=basic-authentication,basic-authentication,8 +/packages?q=Bittorrent,Bittorrent,8 +/packages?q=boost,boost,8 +/packages?q=Bot.Builder.RealTimeMediaCalling,Bot.Builder.RealTimeMediaCalling,8 +/packages?q=BusyIndicator,BusyIndicator,8 +/packages?q=calendars,calendars,8 +/packages?q=Camera,Camera,8 +/packages?q=cameras&page=2,cameras,8 +/packages?q=campaign,campaign,8 +/packages?q=Cdbc,Cdbc,8 +/packages?q=Certificate,Certificate,8 +/packages?q=charts,charts,8 +/packages?q=Checkbox,Checkbox,8 +/packages?q=chrome,chrome,8 +/packages?q=cinchoo,cinchoo,8 +/packages?q=cloudscribe.Core,cloudscribe.Core,8 +/packages?q=Comparison,Comparison,8 +/packages?q=ComputerVision,ComputerVision,8 +/packages?q=Cordova,Cordova,8 +/packages?q=core,core,8 +/packages?q=Crc32,Crc32,8 +/packages?q=Cropping,Cropping,8 +/packages?q=CRUD,CRUD,8 +"/packages?q=Datepicker,","Datepicker,",8 +/packages?q=detection,detection,8 +/packages?q=directx,directx,8 +/packages?q=dns,dns,8 +/packages?q=doc,doc,8 +/packages?q=DotNext,DotNext,8 +/packages?q=EAN13,EAN13,8 +/packages?q=entityframework,entityframework,8 +/packages?q=epub,epub,8 +/packages?q=exporting,exporting,8 +/packages?q=fhir,fhir,8 +/packages?q=flipview,flipview,8 +/packages?q=gelf,gelf,8 +/packages?q=geometric,geometric,8 +/packages?q=GIT,GIT,8 +/packages?q=Google.Apis.cloudbilling&prerelease=true&sortOrder=relevance,Google.Apis.cloudbilling,8 +/packages?q=Google.Apis.indexing&prerelease=true&sortOrder=relevance,Google.Apis.indexing,8 +/packages?q=Google.Apis.pagespeedonline&prerelease=true&sortOrder=relevance,Google.Apis.pagespeedonline,8 +/packages?q=Google.Apis.searchconsole&prerelease=true&sortOrder=relevance,Google.Apis.searchconsole,8 +/packages?q=Google.Apis.storage&prerelease=true&sortOrder=relevance,Google.Apis.storage,8 +/packages?q=Google.Protobuf,Google.Protobuf,8 +/packages?q=hangfire+storage,hangfire storage,8 +/packages?q=hashing,hashing,8 +/packages?q=hid,hid,8 +/packages?q=hl7.fhir.stu3,hl7.fhir.stu3,8 +/packages?q=HockeySDK&prerelease=true&sortOrder=relevance,HockeySDK,8 +/packages?q=httppost,httppost,8 +/packages?q=HttpServer,HttpServer,8 +/packages?q=hue,hue,8 +/packages?q=IBM,IBM,8 +/packages?q=idependencyresolver,idependencyresolver,8 +"/packages?q=ILMerge,","ILMerge,",8 +/packages?q=INI,INI,8 +/packages?q=ini-file,ini-file,8 +/packages?q=integration+services,integration services,8 +/packages?q=ipaddress,ipaddress,8 +/packages?q=irc,irc,8 +/packages?q=ironpython,ironpython,8 +/packages?q=iseries,iseries,8 +/packages?q=IServiceProvider,IServiceProvider,8 +/packages?q=iso3166,iso3166,8 +/packages?q=jamesmontemagno,jamesmontemagno,8 +/packages?q=jira,jira,8 +/packages?q=Json.NET,Json.NET,8 +/packages?q=Label,Label,8 +/packages?q=Line-Chart,Line-Chart,8 +/packages?q=lti,lti,8 +/packages?q=Mac,Mac,8 +/packages?q=mail,mail,8 +/packages?q=MailMessage,MailMessage,8 +/packages?q=Maxicode,Maxicode,8 +/packages?q=MembershipProvider LDAP,MembershipProvider LDAP,8 +/packages?q=mesh,mesh,8 +/packages?q=metatrader,metatrader,8 +/packages?q=Microsoft.ApplicationInsights.,Microsoft.ApplicationInsights.,8 +/packages?q=Microsoft.AspNetCore.All,Microsoft.AspNetCore.All,8 +/packages?q=microsoft.aspnetcore.app,microsoft.aspnetcore.app,8 +/packages?q=Microsoft.AspNetCore.Identity.EntityFrameworkCore,Microsoft.AspNetCore.Identity.EntityFrameworkCore,8 +/packages?q=Microsoft.AspNetCore.Mvc,Microsoft.AspNetCore.Mvc,8 +/packages?q=Microsoft.AspNetCore.Mvc.NewtonsoftJson,Microsoft.AspNetCore.Mvc.NewtonsoftJson,8 +/packages?q=Microsoft.Azure.Devices,Microsoft.Azure.Devices,8 +/packages?q=Microsoft.Azure.Management.DataLake,Microsoft.Azure.Management.DataLake,8 +/packages?q=Microsoft.Azure.WebJobs.Extensions.ServiceBus,Microsoft.Azure.WebJobs.Extensions.ServiceBus,8 +/packages?q=Microsoft.CSharp,Microsoft.CSharp,8 +/packages?q=Microsoft.EntityFrameworkCore.SqlServer,Microsoft.EntityFrameworkCore.SqlServer,8 +/packages?q=Microsoft.Extensions.Caching,Microsoft.Extensions.Caching,8 +/packages?q=Microsoft.Extensions.Logging,Microsoft.Extensions.Logging,8 +/packages?q=Microsoft.NET.Test.Sdk,Microsoft.NET.Test.Sdk,8 +/packages?q=microsoft.netcore.app,microsoft.netcore.app,8 +/packages?q=Microsoft.SourceLink.*,Microsoft.SourceLink.*,8 +/packages?q=Microsoft.WindowsAzure.ServiceRuntime,Microsoft.WindowsAzure.ServiceRuntime,8 +/packages?q=modal,modal,8 +/packages?q=mono,mono,8 +/packages?q=month,month,8 +/packages?q=mp3,mp3,8 +/packages?q=mp4,mp4,8 +/packages?q=mqtt,mqtt,8 +/packages?q=nakedobjects,nakedobjects,8 +/packages?q=neodynamic,neodynamic,8 +/packages?q=newtonsoft,newtonsoft,8 +/packages?q=newtonsoft+json,newtonsoft json,8 +/packages?q=nhibernate,nhibernate,8 +/packages?q=ninject,ninject,8 +/packages?q=Node.js,Node.js,8 +/packages?q=nodejs,nodejs,8 +/packages?q=Npgsql,Npgsql,8 +/packages?q=Npgsql.EntityFrameworkCore.PostgreSQL,Npgsql.EntityFrameworkCore.PostgreSQL,8 +/packages?q=obfuscator,obfuscator,8 +/packages?q=OBJ,OBJ,8 +/packages?q=ObservableCollection,ObservableCollection,8 +/packages?q=observablecollection&page=2,observablecollection,8 +/packages?q=OCR&page=3,OCR,8 +/packages?q=ORM,ORM,8 +/packages?q=pagedlist,pagedlist,8 +/packages?q=Payments&page=4,Payments,8 +/packages?q=PdfSharp,PdfSharp,8 +/packages?q=persian,persian,8 +"/packages?q=Pie,","Pie,",8 +/packages?q=pinyin,pinyin,8 +/packages?q=pivot,pivot,8 +/packages?q=polly,polly,8 +/packages?q=powerpoint,powerpoint,8 +/packages?q=PPT,PPT,8 +/packages?q=PrettyPrint,PrettyPrint,8 +/packages?q=priority+queue,priority queue,8 +/packages?q=Prism,Prism,8 +/packages?q=profanity,profanity,8 +/packages?q=protobuf,protobuf,8 +"/packages?q=provider,","provider,",8 +/packages?q=PST,PST,8 +/packages?q=Pyton,Pyton,8 +/packages?q=quartz,quartz,8 +/packages?q=Raspberrypi,Raspberrypi,8 +/packages?q=rbac,rbac,8 +/packages?q=ReportViewer,ReportViewer,8 +/packages?q=rollbar,rollbar,8 +/packages?q=rss,rss,8 +/packages?q=sass,sass,8 +/packages?q=Scanner,Scanner,8 +/packages?q=scheduler,scheduler,8 +/packages?q=SendGrid,SendGrid,8 +/packages?q=Serilog,Serilog,8 +/packages?q=SharpSvn,SharpSvn,8 +/packages?q=sharpziplib,sharpziplib,8 +/packages?q=Signature,Signature,8 +/packages?q=similarity,similarity,8 +/packages?q=simpleinjector,simpleinjector,8 +/packages?q=Sin.Net,Sin.Net,8 +/packages?q=skiasharp,skiasharp,8 +/packages?q=slider,slider,8 +/packages?q=Snippets,Snippets,8 +/packages?q=Socks,Socks,8 +/packages?q=SpatiaLite,SpatiaLite,8 +/packages?q=specflow,specflow,8 +/packages?q=sqlite-net-pcl,sqlite-net-pcl,8 +/packages?q=steema,steema,8 +/packages?q=StringUtils,StringUtils,8 +/packages?q=Stylecop.Analyzers,Stylecop.Analyzers,8 +/packages?q=Syncfusion,Syncfusion,8 +/packages?q=System.ComponentModel.DataAnnotations,System.ComponentModel.DataAnnotations,8 +/packages?q=System.IO.Compression,System.IO.Compression,8 +/packages?q=System.IO.Pipelines,System.IO.Pipelines,8 +/packages?q=system.memory,system.memory,8 +/packages?q=system.net.http,system.net.http,8 +/packages?q=System.Web.Optimization,System.Web.Optimization,8 +/packages?q=System.Windows.Interactivity,System.Windows.Interactivity,8 +/packages?q=system.xml,system.xml,8 +/packages?q=Tagbuilder,Tagbuilder,8 +"/packages?q=Tags:"".xlsm""","Tags:"".xlsm""",8 +"/packages?q=Tags:""2fa""","Tags:""2fa""",8 +"/packages?q=Tags:""7Zip""","Tags:""7Zip""",8 +"/packages?q=Tags:""AAMVA""","Tags:""AAMVA""",8 +"/packages?q=Tags:""American""","Tags:""American""",8 +"/packages?q=Tags:""angular-cli""","Tags:""angular-cli""",8 +"/packages?q=Tags:""async-await""","Tags:""async-await""",8 +"/packages?q=Tags:""audio""","Tags:""audio""",8 +"/packages?q=Tags:""aws-sdk-v3""&refid=s3-gs","Tags:""aws-sdk-v3""",8 +"/packages?q=Tags:""Aztec""","Tags:""Aztec""",8 +"/packages?q=Tags:""Azure-DevOps""","Tags:""Azure-DevOps""",8 +"/packages?q=Tags:""Bar-code""","Tags:""Bar-code""",8 +"/packages?q=Tags:""barcode-scanner""","Tags:""barcode-scanner""",8 +"/packages?q=Tags:""base64""","Tags:""base64""",8 +"/packages?q=Tags:""BI""","Tags:""BI""",8 +"/packages?q=Tags:""bit""","Tags:""bit""",8 +"/packages?q=Tags:""BPMN""","Tags:""BPMN""",8 +"/packages?q=Tags:""CAB""","Tags:""CAB""",8 +"/packages?q=Tags:""caching""","Tags:""caching""",8 +"/packages?q=Tags:""caldav""","Tags:""caldav""",8 +"/packages?q=Tags:""CAML""","Tags:""CAML""",8 +"/packages?q=Tags:""candlestick""","Tags:""candlestick""",8 +"/packages?q=Tags:""CardView""","Tags:""CardView""",8 +"/packages?q=Tags:""circle""","Tags:""circle""",8 +"/packages?q=Tags:""ClosedXML""","Tags:""ClosedXML""",8 +"/packages?q=Tags:""clustering""","Tags:""clustering""",8 +"/packages?q=Tags:""code-generator""","Tags:""code-generator""",8 +"/packages?q=Tags:""color-picker""","Tags:""color-picker""",8 +"/packages?q=Tags:""Color""","Tags:""Color""",8 +"/packages?q=Tags:""compress""","Tags:""compress""",8 +"/packages?q=Tags:""config-transform""","Tags:""config-transform""",8 +"/packages?q=Tags:""CR2""","Tags:""CR2""",8 +"/packages?q=Tags:""crc32""","Tags:""crc32""",8 +"/packages?q=Tags:""Cropper""","Tags:""Cropper""",8 +"/packages?q=Tags:""CSV""","Tags:""CSV""",8 +"/packages?q=Tags:""curve25519""","Tags:""curve25519""",8 +"/packages?q=Tags:""data-access-layer""","Tags:""data-access-layer""",8 +"/packages?q=Tags:""data-generation""","Tags:""data-generation""",8 +"/packages?q=Tags:""DataGridView""","Tags:""DataGridView""",8 +"/packages?q=Tags:""DateTimePicker""","Tags:""DateTimePicker""",8 +"/packages?q=Tags:""DICOM""","Tags:""DICOM""",8 +"/packages?q=Tags:""document-viewer""","Tags:""document-viewer""",8 +"/packages?q=Tags:""Drawing""","Tags:""Drawing""",8 +"/packages?q=Tags:""DWG""","Tags:""DWG""",8 +"/packages?q=Tags:""e.164""","Tags:""e.164""",8 +"/packages?q=Tags:""email""","Tags:""email""",8 +"/packages?q=Tags:""ENCRYPTED""","Tags:""ENCRYPTED""",8 +"/packages?q=Tags:""Entry""","Tags:""Entry""",8 +"/packages?q=Tags:""eps""","Tags:""eps""",8 +"/packages?q=Tags:""Ethereum""","Tags:""Ethereum""",8 +"/packages?q=Tags:""eval""","Tags:""eval""",8 +"/packages?q=Tags:""Exception-Handling""","Tags:""Exception-Handling""",8 +"/packages?q=Tags:""extract""","Tags:""extract""",8 +"/packages?q=Tags:""ffprobe""","Tags:""ffprobe""",8 +"/packages?q=Tags:""FlexCel""","Tags:""FlexCel""",8 +"/packages?q=Tags:""Formatting""","Tags:""Formatting""",8 +"/packages?q=Tags:""forum""","Tags:""forum""",8 +"/packages?q=Tags:""FTP""","Tags:""FTP""",8 +"/packages?q=Tags:""git""","Tags:""git""",8 +"/packages?q=Tags:""google-analytics""","Tags:""google-analytics""",8 +"/packages?q=Tags:""gradient""","Tags:""gradient""",8 +"/packages?q=Tags:""hotkeys""","Tags:""hotkeys""",8 +"/packages?q=Tags:""html-to-pdf-converter""","Tags:""html-to-pdf-converter""",8 +"/packages?q=Tags:""HTTP/2""","Tags:""HTTP/2""",8 +"/packages?q=Tags:""HTTP2""","Tags:""HTTP2""",8 +"/packages?q=Tags:""HttpContext""","Tags:""HttpContext""",8 +"/packages?q=Tags:""Icons""","Tags:""Icons""",8 +"/packages?q=Tags:""idisposable""","Tags:""idisposable""",8 +"/packages?q=Tags:""IFTTT""","Tags:""IFTTT""",8 +"/packages?q=Tags:""IHostedService""","Tags:""IHostedService""",8 +"/packages?q=Tags:""image-editor""","Tags:""image-editor""",8 +"/packages?q=Tags:""image-resize""","Tags:""image-resize""",8 +"/packages?q=Tags:""Image-Viewer""","Tags:""Image-Viewer""",8 +"/packages?q=Tags:""ipaddress""","Tags:""ipaddress""",8 +"/packages?q=Tags:""jQueryUI""","Tags:""jQueryUI""",8 +"/packages?q=Tags:""jws""","Tags:""jws""",8 +"/packages?q=Tags:""leader-election""","Tags:""leader-election""",8 +"/packages?q=Tags:""libimobiledevice""","Tags:""libimobiledevice""",8 +"/packages?q=Tags:""license""","Tags:""license""",8 +"/packages?q=Tags:""line-chart""","Tags:""line-chart""",8 +"/packages?q=Tags:""Logstash""","Tags:""Logstash""",8 +"/packages?q=Tags:""MailMessage""","Tags:""MailMessage""",8 +"/packages?q=Tags:""marshal""","Tags:""marshal""",8 +"/packages?q=Tags:""matrix""","Tags:""matrix""",8 +"/packages?q=Tags:""mdns""","Tags:""mdns""",8 +"/packages?q=Tags:""MessageBox""","Tags:""MessageBox""",8 +"/packages?q=Tags:""mhtml""","Tags:""mhtml""",8 +"/packages?q=Tags:""MICR""","Tags:""MICR""",8 +"/packages?q=Tags:""migrations""","Tags:""migrations""",8 +"/packages?q=Tags:""MIME""","Tags:""MIME""",8 +"/packages?q=Tags:""mqtt""","Tags:""mqtt""",8 +"/packages?q=Tags:""MSAL""","Tags:""MSAL""",8 +"/packages?q=Tags:""msi""","Tags:""msi""",8 +"/packages?q=Tags:""MSTest""","Tags:""MSTest""",8 +"/packages?q=Tags:""natural-sort""","Tags:""natural-sort""",8 +"/packages?q=Tags:""Networking""","Tags:""Networking""",8 +"/packages?q=Tags:""NFC""","Tags:""NFC""",8 +"/packages?q=Tags:""Notifications""","Tags:""Notifications""",8 +"/packages?q=Tags:""ntlm""","Tags:""ntlm""",8 +"/packages?q=Tags:""ntp""","Tags:""ntp""",8 +"/packages?q=Tags:""ODP.NET""","Tags:""ODP.NET""",8 +"/packages?q=Tags:""OPC""","Tags:""OPC""",8 +"/packages?q=Tags:""opus""","Tags:""opus""",8 +"/packages?q=Tags:""orgchart""","Tags:""orgchart""",8 +"/packages?q=Tags:""pathfinding""","Tags:""pathfinding""",8 +"/packages?q=Tags:""pdf-generation""","Tags:""pdf-generation""",8 +"/packages?q=Tags:""pdf-to-bmp""","Tags:""pdf-to-bmp""",8 +"/packages?q=Tags:""Pdfium""","Tags:""Pdfium""",8 +"/packages?q=Tags:""PDFViewer""","Tags:""PDFViewer""",8 +"/packages?q=Tags:""playlist""","Tags:""playlist""",8 +"/packages?q=Tags:""poppler""","Tags:""poppler""",8 +"/packages?q=Tags:""principalcontext""","Tags:""principalcontext""",8 +"/packages?q=Tags:""Printer""","Tags:""Printer""",8 +"/packages?q=Tags:""printing""","Tags:""printing""",8 +"/packages?q=Tags:""push-notifications""","Tags:""push-notifications""",8 +"/packages?q=Tags:""recognition""","Tags:""recognition""",8 +"/packages?q=Tags:""Redis""","Tags:""Redis""",8 +"/packages?q=Tags:""rounded-button""","Tags:""rounded-button""",8 +"/packages?q=Tags:""S7""","Tags:""S7""",8 +"/packages?q=Tags:""sankakuchannel""","Tags:""sankakuchannel""",8 +"/packages?q=Tags:""SapHana""","Tags:""SapHana""",8 +"/packages?q=Tags:""Scraping""","Tags:""Scraping""",8 +"/packages?q=Tags:""Scripting""","Tags:""Scripting""",8 +"/packages?q=Tags:""search""","Tags:""search""",8 +"/packages?q=Tags:""shimmer""","Tags:""shimmer""",8 +"/packages?q=Tags:""SOAP""","Tags:""SOAP""",8 +"/packages?q=Tags:""spectrum""","Tags:""spectrum""",8 +"/packages?q=Tags:""Speech-To-Text""","Tags:""Speech-To-Text""",8 +"/packages?q=Tags:""sql-parser""","Tags:""sql-parser""",8 +"/packages?q=Tags:""SqlDataReader""","Tags:""SqlDataReader""",8 +"/packages?q=Tags:""sqlmembershipprovider""","Tags:""sqlmembershipprovider""",8 +"/packages?q=Tags:""SSIS""","Tags:""SSIS""",8 +"/packages?q=Tags:""sunat""","Tags:""sunat""",8 +"/packages?q=Tags:""syncfusion.javascript""","Tags:""syncfusion.javascript""",8 +"/packages?q=Tags:""syntax-highlighting""","Tags:""syntax-highlighting""",8 +"/packages?q=Tags:""system.data.entity.spatial""","Tags:""system.data.entity.spatial""",8 +"/packages?q=Tags:""system.windows.forms""","Tags:""system.windows.forms""",8 +"/packages?q=Tags:""t4""","Tags:""t4""",8 +"/packages?q=Tags:""TabbedPage""","Tags:""TabbedPage""",8 +"/packages?q=Tags:""tabs""","Tags:""tabs""",8 +"/packages?q=Tags:""TCPServer""","Tags:""TCPServer""",8 +"/packages?q=Tags:""teamcity""","Tags:""teamcity""",8 +"/packages?q=Tags:""Template""","Tags:""Template""",8 +"/packages?q=Tags:""Tesseract""","Tags:""Tesseract""",8 +"/packages?q=Tags:""TextFieldParser""","Tags:""TextFieldParser""",8 +"/packages?q=Tags:""Three.js""","Tags:""Three.js""",8 +"/packages?q=Tags:""timezone""","Tags:""timezone""",8 +"/packages?q=Tags:""toml""","Tags:""toml""",8 +"/packages?q=Tags:""TraceListener""","Tags:""TraceListener""",8 +"/packages?q=Tags:""TransactionScope""","Tags:""TransactionScope""",8 +"/packages?q=Tags:""transform""","Tags:""transform""",8 +"/packages?q=Tags:""Trello""","Tags:""Trello""",8 +"/packages?q=Tags:""Trx""","Tags:""Trx""",8 +"/packages?q=Tags:""twitter""","Tags:""twitter""",8 +"/packages?q=Tags:""Udp""","Tags:""Udp""",8 +"/packages?q=Tags:""viewpager""","Tags:""viewpager""",8 +"/packages?q=Tags:""virtual-keyboard""","Tags:""virtual-keyboard""",8 +"/packages?q=Tags:""Visio""","Tags:""Visio""",8 +"/packages?q=Tags:""VPN""","Tags:""VPN""",8 +"/packages?q=Tags:""VSTS""","Tags:""VSTS""",8 +"/packages?q=Tags:""WebView""","Tags:""WebView""",8 +"/packages?q=Tags:""whois""","Tags:""whois""",8 +"/packages?q=Tags:""Windows-Forms""","Tags:""Windows-Forms""",8 +"/packages?q=Tags:""Windows.Forms""","Tags:""Windows.Forms""",8 +"/packages?q=Tags:""WkHtmlToImage""","Tags:""WkHtmlToImage""",8 +"/packages?q=Tags:""WMF""","Tags:""WMF""",8 +"/packages?q=Tags:""word""","Tags:""word""",8 +"/packages?q=Tags:""wpf-chart""","Tags:""wpf-chart""",8 +"/packages?q=Tags:""wysiwyg""","Tags:""wysiwyg""",8 +"/packages?q=Tags:""Xamarin.iOS""","Tags:""Xamarin.iOS""",8 +"/packages?q=Tags:""xfa""","Tags:""xfa""",8 +"/packages?q=Tags:""XLS""","Tags:""XLS""",8 +"/packages?q=Tags:""XPS""","Tags:""XPS""",8 +"/packages?q=Tags:""Zipkin""","Tags:""Zipkin""",8 +/packages?q=taskbar,taskbar,8 +/packages?q=Transitions,Transitions,8 +/packages?q=translation,translation,8 +/packages?q=Turkish,Turkish,8 +/packages?q=unit-test,unit-test,8 +/packages?q=visioforge,visioforge,8 +/packages?q=vmware,vmware,8 +/packages?q=watermark,watermark,8 +/packages?q=WEBFORMS,WEBFORMS,8 +/packages?q=WebPush,WebPush,8 +/packages?q=wgs84,wgs84,8 +/packages?q=Win2D,Win2D,8 +/packages?q=Windows+10+IoT+Extension+SDK,Windows 10 IoT Extension SDK,8 +/packages?q=winform,winform,8 +/packages?q=wix,wix,8 +/packages?q=wmf,wmf,8 +"/packages?q=workbook,","workbook,",8 +/packages?q=WorkItemTracking,WorkItemTracking,8 +/packages?q=worksheet,worksheet,8 +/packages?q=Xamarin forms labs&page=3,Xamarin forms labs,8 +/packages?q=xamarin.forms,xamarin.forms,8 +/packages?q=xmlrpc,xmlrpc,8 +/packages?q=youtube,youtube,8 +/packages?q= LP,LP,5 +/packages?q=.net35,.net35,5 +/packages?q=+Microsoft.ReportingServices.ReportViewerControl,Microsoft.ReportingServices.ReportViewerControl,5 +/packages?q=+SD.LLBLGen.Pro.ORMSupportClasses&prerel=false,SD.LLBLGen.Pro.ORMSupportClasses,5 +/packages?q=404,404,5 +/packages?q=404-not-found,404-not-found,5 +/packages?q=7-Zip,7-Zip,5 +/packages?q=Accenture,Accenture,5 +/packages?q=Actipro,Actipro,5 +/packages?q=address,address,5 +/packages?q=ADFS,ADFS,5 +/packages?q=ADHA,ADHA,5 +/packages?q=admin,admin,5 +/packages?q=admob,admob,5 +/packages?q=amap.xamarin,amap.xamarin,5 +/packages?q=amf,amf,5 +/packages?q=android+video,android video,5 +/packages?q=animation,animation,5 +/packages?q=Animation&page=2,Animation,5 +/packages?q=app.config,app.config,5 +/packages?q=appcenter,appcenter,5 +/packages?q=ASCII,ASCII,5 +/packages?q=asp,asp,5 +/packages?q=aspark,aspark,5 +/packages?q=AspNetCore.HealthChecks.UI.Client,AspNetCore.HealthChecks.UI.Client,5 +/packages?q=async-await,async-await,5 +/packages?q=Atom+Feed,Atom Feed,5 +"/packages?q=Author:""DwayneNeed""","Author:""DwayneNeed""",5 +/packages?q=Autofac.Integration.Mvc,Autofac.Integration.Mvc,5 +/packages?q=autofixture,autofixture,5 +/packages?q=aws,aws,5 +/packages?q=AWSSDK.Core,AWSSDK.Core,5 +/packages?q=AWSSDK.CORE,AWSSDK.CORE,5 +/packages?q=awssdk&page=1,awssdk,5 +/packages?q=azure+iot,azure iot,5 +/packages?q=AzureSiteExtension,AzureSiteExtension,5 +/packages?q=BackgroundWorker,BackgroundWorker,5 +"/packages?q=barcode,&page=5","barcode,",5 +/packages?q=barcode+scanner+uwp,barcode scanner uwp,5 +/packages?q=base64,base64,5 +/packages?q=Bayeux,Bayeux,5 +/packages?q=BCrypt.Net-Next+3.1.3,BCrypt.Net-Next 3.1.3,5 +/packages?q=bitcoin,bitcoin,5 +/packages?q=blend,blend,5 +/packages?q=Bluetooth&page=2,Bluetooth,5 +/packages?q=blur,blur,5 +/packages?q=brightness,brightness,5 +/packages?q=bubble,bubble,5 +/packages?q=button,button,5 +/packages?q=C++/CX,C /CX,5 +/packages?q=cache,cache,5 +/packages?q=cake,cake,5 +/packages?q=cdbc,cdbc,5 +/packages?q=cefsharp,cefsharp,5 +/packages?q=checkbox,checkbox,5 +"/packages?q=Checkout,","Checkout,",5 +/packages?q=ckeditor,ckeditor,5 +/packages?q=clamav,clamav,5 +/packages?q=CocosSharp,CocosSharp,5 +/packages?q=Code-Coverage,Code-Coverage,5 +/packages?q=Code128,Code128,5 +/packages?q=CodeAnalysis,CodeAnalysis,5 +/packages?q=CodedUI,CodedUI,5 +/packages?q=CodeJam.PerfTests,CodeJam.PerfTests,5 +/packages?q=codes,codes,5 +/packages?q=com.google.firebase:firebase-messaging,com.google.firebase:firebase-messaging,5 +/packages?q=combobox&page=2,combobox,5 +/packages?q=common.logging,common.logging,5 +/packages?q=CommonServiceLocator,CommonServiceLocator,5 +/packages?q=consul,consul,5 +/packages?q=Contrast,Contrast,5 +/packages?q=control,control,5 +/packages?q=Controller,Controller,5 +/packages?q=convention,convention,5 +/packages?q=Corners,Corners,5 +/packages?q=counters,counters,5 +/packages?q=cpprestsdk,cpprestsdk,5 +/packages?q=crossgen,crossgen,5 +/packages?q=csom,csom,5 +/packages?q=csv+linq,csv linq,5 +/packages?q=Dapper,Dapper,5 +/packages?q=Dapper&page=7,Dapper,5 +/packages?q=dark theme wpf,dark theme wpf,5 +/packages?q=dashboards,dashboards,5 +/packages?q=datagrid,datagrid,5 +/packages?q=DataGrid,DataGrid,5 +/packages?q=DataReader,DataReader,5 +/packages?q=DataTable,DataTable,5 +/packages?q=DataTables.AspNet.AspNetCore,DataTables.AspNet.AspNetCore,5 +/packages?q=DatePicker,DatePicker,5 +/packages?q=Decoder&page=3,Decoder,5 +/packages?q=Decompiler,Decompiler,5 +/packages?q=decryption,decryption,5 +/packages?q=DependencyResolver,DependencyResolver,5 +/packages?q=deprecated,deprecated,5 +/packages?q=deserialization,deserialization,5 +/packages?q=DisplayAttribute,DisplayAttribute,5 +/packages?q=dnsrlvr,dnsrlvr,5 +/packages?q=DOC,DOC,5 +/packages?q=documentdb,documentdb,5 +/packages?q=Dolittle.AspNetCore.Debugging,Dolittle.AspNetCore.Debugging,5 +/packages?q=dotcover,dotcover,5 +/packages?q=download,download,5 +/packages?q=DropDown,DropDown,5 +/packages?q=dynamic+linq,dynamic linq,5 +/packages?q=Eeplus,Eeplus,5 +/packages?q=ef+core,ef core,5 +/packages?q=effort,effort,5 +/packages?q=elasticsearch,elasticsearch,5 +/packages?q=electron,electron,5 +"/packages?q=Elevation,","Elevation,",5 +/packages?q=elmahr,elmahr,5 +/packages?q=ensure.that,ensure.that,5 +/packages?q=entity+framework,entity framework,5 +/packages?q=entity+framework+core,entity framework core,5 +/packages?q=entityframeworkcore,entityframeworkcore,5 +/packages?q=entlib,entlib,5 +/packages?q=envdte,envdte,5 +/packages?q=EPL,EPL,5 +/packages?q=EPPlus,EPPlus,5 +/packages?q=error-handling,error-handling,5 +/packages?q=ETW,ETW,5 +/packages?q=Excel,Excel,5 +/packages?q=exchange,exchange,5 +/packages?q=export,export,5 +/packages?q=export&page=3,export,5 +/packages?q=extended,extended,5 +/packages?q=extjs,extjs,5 +/packages?q=Face,Face,5 +/packages?q=Faceit,Faceit,5 +/packages?q=farshid,farshid,5 +/packages?q=feature-flags,feature-flags,5 +/packages?q=FFmpeg,FFmpeg,5 +/packages?q=fft,fft,5 +/packages?q=Firewall,Firewall,5 +/packages?q=fixed-length,fixed-length,5 +/packages?q=flatfile,flatfile,5 +"/packages?q=Fluent-API,","Fluent-API,",5 +/packages?q=fluentassertions,fluentassertions,5 +/packages?q=FluentAssertions,FluentAssertions,5 +/packages?q=FluentValidation,FluentValidation,5 +/packages?q=flurl,flurl,5 +/packages?q=flyout,flyout,5 +/packages?q=font,font,5 +/packages?q=fontawesome,fontawesome,5 +/packages?q=FontAwesome,FontAwesome,5 +/packages?q=FontAwesome&page=3,FontAwesome,5 +/packages?q=free,free,5 +/packages?q=FtpProxyType,FtpProxyType,5 +/packages?q=fulltext,fulltext,5 +/packages?q=FullText,FullText,5 +/packages?q=fuzzy string,fuzzy string,5 +/packages?q=Gaussian,Gaussian,5 +/packages?q=gecko,gecko,5 +/packages?q=Gecko,Gecko,5 +/packages?q=geocode,geocode,5 +/packages?q=geocoding,geocoding,5 +/packages?q=geofencing,geofencing,5 +/packages?q=geoip,geoip,5 +/packages?q=ghostscript,ghostscript,5 +/packages?q=glob,glob,5 +/packages?q=gmap.net.windows+4,gmap.net.windows 4,5 +/packages?q=gocardless&sortOrder=package-download-count,gocardless,5 +/packages?q=google maps,google maps,5 +/packages?q=Google.Apis.admin.directory&prerelease=true&sortOrder=relevance,Google.Apis.admin.directory,5 +/packages?q=Google.Apis.admin.reports&prerelease=true&sortOrder=relevance,Google.Apis.admin.reports,5 +/packages?q=Google.Apis.books&prerelease=true&sortOrder=relevance,Google.Apis.books,5 +/packages?q=Google.Apis.cloudbuild&prerelease=true&sortOrder=relevance,Google.Apis.cloudbuild,5 +/packages?q=Google.Apis.cloudresourcemanager&prerelease=true&sortOrder=relevance,Google.Apis.cloudresourcemanager,5 +/packages?q=Google.Apis.dataflow&prerelease=true&sortOrder=relevance,Google.Apis.dataflow,5 +/packages?q=Google.Apis.HangoutsChat&prerelease=true&sortOrder=relevance,Google.Apis.HangoutsChat,5 +/packages?q=Google.Apis.iamcredentials&prerelease=true&sortOrder=relevance,Google.Apis.iamcredentials,5 +/packages?q=Google.Apis.identitytoolkit&prerelease=true&sortOrder=relevance,Google.Apis.identitytoolkit,5 +/packages?q=Google.Apis.plusDomains&prerelease=true&sortOrder=relevance,Google.Apis.plusDomains,5 +/packages?q=Google.Apis.proximitybeacon&prerelease=true&sortOrder=relevance,Google.Apis.proximitybeacon,5 +/packages?q=Google.Apis.safebrowsing&prerelease=true&sortOrder=relevance,Google.Apis.safebrowsing,5 +/packages?q=Google.Apis.streetviewpublish&prerelease=true&sortOrder=relevance,Google.Apis.streetviewpublish,5 +/packages?q=google.protobuf,google.protobuf,5 +/packages?q=grapecity.documents,grapecity.documents,5 +/packages?q=graphviz,graphviz,5 +/packages?q=Gravatar,Gravatar,5 +/packages?q=GridView,GridView,5 +"/packages?q=Hebrew,","Hebrew,",5 +/packages?q=hedgehog experimental&sortOrder=package-download-count,hedgehog experimental,5 +/packages?q=Hive,Hive,5 +/packages?q=HockeySDK,HockeySDK,5 +/packages?q=hostedservice,hostedservice,5 +/packages?q=HSM,HSM,5 +/packages?q=html+to+pdf,html to pdf,5 +/packages?q=HTML5,HTML5,5 +/packages?q=httpget,httpget,5 +"/packages?q=HttpWebRequest,","HttpWebRequest,",5 +/packages?q=IDataReader,IDataReader,5 +/packages?q=identityserver,identityserver,5 +/packages?q=IdentityServer4,IdentityServer4,5 +/packages?q=IdentityServer4.EntityFramework,IdentityServer4.EntityFramework,5 +/packages?q=IISExpress,IISExpress,5 +/packages?q=Imageflow.NativeRuntime,Imageflow.NativeRuntime,5 +/packages?q=ImageSharp,ImageSharp,5 +"/packages?q=IndexedDB,","IndexedDB,",5 +/packages?q=InputBox,InputBox,5 +/packages?q=InsightHQCore.Messaging,InsightHQCore.Messaging,5 +/packages?q=Instabug,Instabug,5 +/packages?q=instrumentation,instrumentation,5 +/packages?q=Instrumentation,Instrumentation,5 +/packages?q=InterProcess,InterProcess,5 +/packages?q=intersection,intersection,5 +/packages?q=itext,itext,5 +/packages?q=itextsharp,itextsharp,5 +/packages?q=Jenkins,Jenkins,5 +/packages?q=JPEG,JPEG,5 +"/packages?q=jQuery,&page=35","jQuery,",5 +/packages?q=Jsish,Jsish,5 +/packages?q=JSON,JSON,5 +/packages?q=KML,KML,5 +/packages?q=kusto,kusto,5 +/packages?q=lemmatizer,lemmatizer,5 +/packages?q=linkedin,linkedin,5 +/packages?q=linqbuilder,linqbuilder,5 +/packages?q=LinqToSql,LinqToSql,5 +/packages?q=log4net appender&page=2,log4net appender,5 +/packages?q=Long-Polling,Long-Polling,5 +/packages?q=lorem,lorem,5 +/packages?q=machine+learning,machine learning,5 +/packages?q=MacOS,MacOS,5 +/packages?q=mapguide-api-web,mapguide-api-web,5 +/packages?q=masstransit,masstransit,5 +/packages?q=Mdi,Mdi,5 +/packages?q=MembershipProvider LDAP&page=2,MembershipProvider LDAP,5 +/packages?q=MemoryCache,MemoryCache,5 +/packages?q=metroframework,metroframework,5 +/packages?q=Microsoft,Microsoft,5 +/packages?q=Microsoft.AI.Agent.Intercept,Microsoft.AI.Agent.Intercept,5 +/packages?q=Microsoft.AI.Skills,Microsoft.AI.Skills,5 +/packages?q=Microsoft.AnalysisServices.Core,Microsoft.AnalysisServices.Core,5 +/packages?q=Microsoft.ApplicationInsights.Extensibility,Microsoft.ApplicationInsights.Extensibility,5 +/packages?q=Microsoft.AspNet.Identity,Microsoft.AspNet.Identity,5 +/packages?q=Microsoft.AspNet.Identity.Core,Microsoft.AspNet.Identity.Core,5 +/packages?q=Microsoft.AspNetCore.Blazor,Microsoft.AspNetCore.Blazor,5 +/packages?q=Microsoft.AspNetCore.Blazor.Server,Microsoft.AspNetCore.Blazor.Server,5 +/packages?q=Microsoft.AspNetCore.Components,Microsoft.AspNetCore.Components,5 +/packages?q=Microsoft.AspNetCore.Connections.Abstractions,Microsoft.AspNetCore.Connections.Abstractions,5 +/packages?q=Microsoft.AspNetCore.SignalR.Client,Microsoft.AspNetCore.SignalR.Client,5 +/packages?q=Microsoft.AspNetCore.SpaServices.Extensions,Microsoft.AspNetCore.SpaServices.Extensions,5 +/packages?q=Microsoft.Azure.CognitiveServices.Vision,Microsoft.Azure.CognitiveServices.Vision,5 +/packages?q=Microsoft.Azure.Webjobs.Extensions,Microsoft.Azure.Webjobs.Extensions,5 +/packages?q=Microsoft.CodeAnalysis,Microsoft.CodeAnalysis,5 +/packages?q=microsoft.csharp,microsoft.csharp,5 +/packages?q=Microsoft.Data,Microsoft.Data,5 +/packages?q=Microsoft.Diagnostics.EventFlow,Microsoft.Diagnostics.EventFlow,5 +/packages?q=Microsoft.EntityFrameWorkCore,Microsoft.EntityFrameWorkCore,5 +/packages?q=microsoft.entityframeworkcore.design,microsoft.entityframeworkcore.design,5 +/packages?q=Microsoft.EntityFrameworkCore.Metadata,Microsoft.EntityFrameworkCore.Metadata,5 +/packages?q=Microsoft.EntityFrameworkCore.Tools.DotNet,Microsoft.EntityFrameworkCore.Tools.DotNet,5 +/packages?q=Microsoft.Extensions.Logging.Abstractions,Microsoft.Extensions.Logging.Abstractions,5 +/packages?q=microsoft.extensions.logging.debug,microsoft.extensions.logging.debug,5 +/packages?q=Microsoft.IdentityModel.Clients.ActiveDirectory,Microsoft.IdentityModel.Clients.ActiveDirectory,5 +/packages?q=microsoft.informationprotection,microsoft.informationprotection,5 +/packages?q=Microsoft.NET.Sdk,Microsoft.NET.Sdk,5 +/packages?q=Microsoft.NETCore.App,Microsoft.NETCore.App,5 +/packages?q=Microsoft.NETCore.UniversalWindowsPlatform,Microsoft.NETCore.UniversalWindowsPlatform,5 +/packages?q=Microsoft.Office.Interop,Microsoft.Office.Interop,5 +/packages?q=Microsoft.OpenApi,Microsoft.OpenApi,5 +/packages?q=Microsoft.Packaging.Tools.Trimming,Microsoft.Packaging.Tools.Trimming,5 +/packages?q=microsoft.practices,microsoft.practices,5 +/packages?q=Microsoft.ProjectOxford,Microsoft.ProjectOxford,5 +/packages?q=Microsoft.TeamFoundation.Common,Microsoft.TeamFoundation.Common,5 +/packages?q=migrations&page=6,migrations,5 +/packages?q=mimekit,mimekit,5 +/packages?q=mindscape.raygun4net,mindscape.raygun4net,5 +/packages?q=minify,minify,5 +/packages?q=miris,miris,5 +/packages?q=mkl,mkl,5 +/packages?q=Mobile+scanner,Mobile scanner,5 +/packages?q=Momentjs,Momentjs,5 +/packages?q=mongo,mongo,5 +/packages?q=MongoDB,MongoDB,5 +/packages?q=MongoDB.Driver,MongoDB.Driver,5 +/packages?q=monitor,monitor,5 +/packages?q=MonoGame.Extended,MonoGame.Extended,5 +/packages?q=monotouch,monotouch,5 +/packages?q=msdeploy,msdeploy,5 +/packages?q=MSDeploy,MSDeploy,5 +/packages?q=MSI,MSI,5 +/packages?q=msmq,msmq,5 +/packages?q=mstest,mstest,5 +/packages?q=MSTest,MSTest,5 +/packages?q=mustache,mustache,5 +/packages?q=MVVM+wpf,MVVM wpf,5 +/packages?q=MySql.Data,MySql.Data,5 +/packages?q=net&page=25,net,5 +/packages?q=netstandard,netstandard,5 +/packages?q=netstandard.library,netstandard.library,5 +/packages?q=NETStandard.Library,NETStandard.Library,5 +/packages?q=network,network,5 +/packages?q=neural,neural,5 +/packages?q=newrelic,newrelic,5 +/packages?q=NEwton,NEwton,5 +/packages?q=Newtonsoft,Newtonsoft,5 +/packages?q=Newtonsoft.json,Newtonsoft.json,5 +/packages?q=Nlog,Nlog,5 +/packages?q=NLog.Web.AspNetCore,NLog.Web.AspNetCore,5 +/packages?q=node.extend,node.extend,5 +/packages?q=noise,noise,5 +/packages?q=notepad,notepad,5 +/packages?q=nuget.server,nuget.server,5 +/packages?q=nuget+explorer,nuget explorer,5 +/packages?q=nugetvss,nugetvss,5 +/packages?q=oauth1,oauth1,5 +"/packages?q=OAuth2,","OAuth2,",5 +/packages?q=OAuth2&page=3,OAuth2,5 +/packages?q=objectcache,objectcache,5 +/packages?q=ocr,ocr,5 +/packages?q=odata,odata,5 +/packages?q=ODBC,ODBC,5 +"/packages?q=opencv,","opencv,",5 +/packages?q=OpenDocument,OpenDocument,5 +/packages?q=Openswan,Openswan,5 +/packages?q=Optimizer,Optimizer,5 +/packages?q=Oracle,Oracle,5 +/packages?q=Oracleclient,Oracleclient,5 +/packages?q=orchardcore,orchardcore,5 +/packages?q=orm,orm,5 +/packages?q=Outlook,Outlook,5 +/packages?q=panglib,panglib,5 +/packages?q=parsec,parsec,5 +/packages?q=paypal&page=3,paypal,5 +/packages?q=PDB,PDB,5 +/packages?q=PDFsharp,PDFsharp,5 +/packages?q=picker&page=8,picker,5 +/packages?q=Pipelines.Sockets.Unofficial,Pipelines.Sockets.Unofficial,5 +/packages?q=plex,plex,5 +/packages?q=plugin for xamarin&page=47,plugin for xamarin,5 +/packages?q=POS,POS,5 +/packages?q=prism.mvvm,prism.mvvm,5 +/packages?q=Probability+Distributions,Probability Distributions,5 +/packages?q=project-management,project-management,5 +/packages?q=propertygrid,propertygrid,5 +/packages?q=Push,Push,5 +/packages?q=quartz.net,quartz.net,5 +/packages?q=queue,queue,5 +/packages?q=Queue,Queue,5 +/packages?q=QuickOPC,QuickOPC,5 +/packages?q=rabbitmq,rabbitmq,5 +/packages?q=ras,ras,5 +/packages?q=ratings,ratings,5 +/packages?q=RawRabbit.*.*,RawRabbit.*.*,5 +/packages?q=razorengine,razorengine,5 +/packages?q=reactjs,reactjs,5 +/packages?q=redirect,redirect,5 +/packages?q=refit,refit,5 +/packages?q=reflection,reflection,5 +/packages?q=rename,rename,5 +/packages?q=REPL,REPL,5 +/packages?q=report,report,5 +/packages?q=restart,restart,5 +/packages?q=restore,restore,5 +/packages?q=resx,resx,5 +/packages?q=retry,retry,5 +/packages?q=RFC,RFC,5 +/packages?q=roleprovider,roleprovider,5 +/packages?q=rsa,rsa,5 +/packages?q=ruby,ruby,5 +/packages?q=saga,saga,5 +/packages?q=scaffold,scaffold,5 +/packages?q=scanning,scanning,5 +/packages?q=schema,schema,5 +/packages?q=screen,screen,5 +/packages?q=SD.LLBLGen.Pro.&prerel=false,SD.LLBLGen.Pro.,5 +/packages?q=SD.LLBLGen.Pro.ORMSupportClasses&prerel=false,SD.LLBLGen.Pro.ORMSupportClasses,5 +/packages?q=seleniumlog,seleniumlog,5 +/packages?q=serialize+object+to+string,serialize object to string,5 +/packages?q=Serilog.AspNetCore,Serilog.AspNetCore,5 +/packages?q=ServiceBus.AttachmentPlugin.KeyVaultProvider,ServiceBus.AttachmentPlugin.KeyVaultProvider,5 +/packages?q=sessionstate,sessionstate,5 +/packages?q=Shapes,Shapes,5 +/packages?q=sharepoint,sharepoint,5 +/packages?q=Sharepoint,Sharepoint,5 +/packages?q=SharePoint,SharePoint,5 +/packages?q=sharpdx,sharpdx,5 +/packages?q=sitemap&page=5,sitemap,5 +/packages?q=Skin,Skin,5 +/packages?q=smsc,smsc,5 +/packages?q=Socket PCL&source=post_page---------------------------,Socket PCL,5 +/packages?q=Socket+PCL,Socket PCL,5 +/packages?q=sockets,sockets,5 +/packages?q=Sockets,Sockets,5 +/packages?q=Sonar,Sonar,5 +/packages?q=SpecFlow.Tools.MsBuild.Generation,SpecFlow.Tools.MsBuild.Generation,5 +/packages?q=speech,speech,5 +/packages?q=spreadsheet,spreadsheet,5 +/packages?q=Spreadsheet,Spreadsheet,5 +/packages?q=sprite,sprite,5 +/packages?q=sql-server,sql-server,5 +/packages?q=SqlClient,SqlClient,5 +/packages?q=StackExchange.Redis,StackExchange.Redis,5 +/packages?q=state-machine,state-machine,5 +/packages?q=Steeltoe.Discovery.ClientCore,Steeltoe.Discovery.ClientCore,5 +/packages?q=stratis+smart+contracts,stratis smart contracts,5 +/packages?q=super+speed+usb,super speed usb,5 +/packages?q=SuperWebSocket,SuperWebSocket,5 +/packages?q=surging,surging,5 +/packages?q=svg&page=7,svg,5 +/packages?q=swashbuckle.aspnetcore,swashbuckle.aspnetcore,5 +/packages?q=swf,swf,5 +/packages?q=syncfusion.xamarin,syncfusion.xamarin,5 +/packages?q=synchronization,synchronization,5 +/packages?q=System.Buffers,System.Buffers,5 +/packages?q=System.ComponentModel.Annotations,System.ComponentModel.Annotations,5 +/packages?q=System.Data,System.Data,5 +/packages?q=System.Data.Entity.Spatial,System.Data.Entity.Spatial,5 +/packages?q=System.DirectoryServices,System.DirectoryServices,5 +/packages?q=System.IO,System.IO,5 +/packages?q=system.net.http.formatting,system.net.http.formatting,5 +/packages?q=System.Net.Http.WebRequest,System.Net.Http.WebRequest,5 +/packages?q=System.Reactive,System.Reactive,5 +/packages?q=System.Runtime,System.Runtime,5 +/packages?q=System.Runtime.Serialization,System.Runtime.Serialization,5 +/packages?q=system.text.json,system.text.json,5 +/packages?q=System.Text.Json,System.Text.Json,5 +/packages?q=System.ValueTuple,System.ValueTuple,5 +/packages?q=System.Web,System.Web,5 +/packages?q=system.web.http,system.web.http,5 +/packages?q=System.web.Providers,System.web.Providers,5 +/packages?q=System.Web.Script.Serialization,System.Web.Script.Serialization,5 +/packages?q=System.Web.WebPages,System.Web.WebPages,5 +/packages?q=t4,t4,5 +"/packages?q=Tags:"".docx""","Tags:"".docx""",5 +"/packages?q=Tags:"".nupkg","Tags:"".nupkg",5 +"/packages?q=Tags:""10mail""","Tags:""10mail""",5 +"/packages?q=Tags:""2.122.1.0""","Tags:""2.122.1.0""",5 +"/packages?q=Tags:""aes""","Tags:""aes""",5 +"/packages?q=Tags:""Ajax""","Tags:""Ajax""",5 +"/packages?q=Tags:""angular2""","Tags:""angular2""",5 +"/packages?q=Tags:""API""","Tags:""API""",5 +"/packages?q=Tags:""app.config""","Tags:""app.config""",5 +"/packages?q=Tags:""appsettings.json""","Tags:""appsettings.json""",5 +"/packages?q=Tags:""AppSettings""","Tags:""AppSettings""",5 +"/packages?q=Tags:""arguments""","Tags:""arguments""",5 +"/packages?q=Tags:""ARP""","Tags:""ARP""",5 +"/packages?q=Tags:""asp.net-core""","Tags:""asp.net-core""",5 +"/packages?q=Tags:""AssemblyInfo""","Tags:""AssemblyInfo""",5 +"/packages?q=Tags:""async""","Tags:""async""",5 +"/packages?q=Tags:""Authorize""","Tags:""Authorize""",5 +"/packages?q=Tags:""AutoComplete""&page=2","Tags:""AutoComplete""",5 +"/packages?q=Tags:""aws-sdk-v3""&refid=gs_card","Tags:""aws-sdk-v3""",5 +"/packages?q=Tags:""B2C""","Tags:""B2C""",5 +"/packages?q=Tags:""BinaryReader""","Tags:""BinaryReader""",5 +"/packages?q=Tags:""BottomSheet""","Tags:""BottomSheet""",5 +"/packages?q=Tags:""box2d""","Tags:""box2d""",5 +"/packages?q=Tags:""BrokeredMessage""","Tags:""BrokeredMessage""",5 +"/packages?q=Tags:""cache""","Tags:""cache""",5 +"/packages?q=Tags:""CAD""","Tags:""CAD""",5 +"/packages?q=Tags:""camera""","Tags:""camera""",5 +"/packages?q=Tags:""capture""","Tags:""capture""",5 +"/packages?q=Tags:""cardview""","Tags:""cardview""",5 +"/packages?q=Tags:""cart""","Tags:""cart""",5 +"/packages?q=Tags:""Chart.js""","Tags:""Chart.js""",5 +"/packages?q=Tags:""CheckBox""","Tags:""CheckBox""",5 +"/packages?q=Tags:""checkedComboBox""","Tags:""checkedComboBox""",5 +"/packages?q=Tags:""checksum""","Tags:""checksum""",5 +"/packages?q=Tags:""Chromecast""","Tags:""Chromecast""",5 +"/packages?q=Tags:""circuit-breaker""","Tags:""circuit-breaker""",5 +"/packages?q=Tags:""cloudflare""","Tags:""cloudflare""",5 +"/packages?q=Tags:""CLR""","Tags:""CLR""",5 +"/packages?q=Tags:""cmake""","Tags:""cmake""",5 +"/packages?q=Tags:""code-analysis""","Tags:""code-analysis""",5 +"/packages?q=Tags:""codec""","Tags:""codec""",5 +"/packages?q=Tags:""collectionview""","Tags:""collectionview""",5 +"/packages?q=Tags:""combination""","Tags:""combination""",5 +"/packages?q=Tags:""Compress""","Tags:""Compress""",5 +"/packages?q=Tags:""Console""","Tags:""Console""",5 +"/packages?q=Tags:""Consul.NET""","Tags:""Consul.NET""",5 +"/packages?q=Tags:""Coreldraw""","Tags:""Coreldraw""",5 +"/packages?q=Tags:""correlationid""","Tags:""correlationid""",5 +"/packages?q=Tags:""cqs""","Tags:""cqs""",5 +"/packages?q=Tags:""Crawler""","Tags:""Crawler""",5 +"/packages?q=Tags:""crontab""","Tags:""crontab""",5 +"/packages?q=Tags:""Cryptography""","Tags:""Cryptography""",5 +"/packages?q=Tags:""CrystalReports""","Tags:""CrystalReports""",5 +"/packages?q=Tags:""csproj""","Tags:""csproj""",5 +"/packages?q=Tags:""DACPAC""","Tags:""DACPAC""",5 +"/packages?q=Tags:""data-mining""","Tags:""data-mining""",5 +"/packages?q=Tags:""DataMatrix""","Tags:""DataMatrix""",5 +"/packages?q=Tags:""DbContext""","Tags:""DbContext""",5 +"/packages?q=Tags:""dbf""","Tags:""dbf""",5 +"/packages?q=Tags:""DbGeography""","Tags:""DbGeography""",5 +"/packages?q=Tags:""DDE""","Tags:""DDE""",5 +"/packages?q=Tags:""DDTek""","Tags:""DDTek""",5 +"/packages?q=Tags:""decimal""","Tags:""decimal""",5 +"/packages?q=Tags:""dependencies""","Tags:""dependencies""",5 +"/packages?q=Tags:""design-patterns""","Tags:""design-patterns""",5 +"/packages?q=Tags:""diff""","Tags:""diff""",5 +"/packages?q=Tags:""DllImport""","Tags:""DllImport""",5 +"/packages?q=Tags:""docx""","Tags:""docx""",5 +"/packages?q=Tags:""domain-driven-design""","Tags:""domain-driven-design""",5 +"/packages?q=Tags:""DotCode""","Tags:""DotCode""",5 +"/packages?q=Tags:""dotnet-cli""","Tags:""dotnet-cli""",5 +"/packages?q=Tags:""DPL""","Tags:""DPL""",5 +"/packages?q=Tags:""DTO""","Tags:""DTO""",5 +"/packages?q=Tags:""dwg""","Tags:""dwg""",5 +"/packages?q=Tags:""EDIFACT""","Tags:""EDIFACT""",5 +"/packages?q=Tags:""elf""","Tags:""elf""",5 +"/packages?q=Tags:""EntityFrameworkCore""","Tags:""EntityFrameworkCore""",5 +"/packages?q=Tags:""epson""","Tags:""epson""",5 +"/packages?q=Tags:""Equals""","Tags:""Equals""",5 +"/packages?q=Tags:""ESB""","Tags:""ESB""",5 +"/packages?q=Tags:""expandable""","Tags:""expandable""",5 +"/packages?q=Tags:""expressions""","Tags:""expressions""",5 +"/packages?q=Tags:""extension-methods""","Tags:""extension-methods""",5 +"/packages?q=Tags:""fbx""","Tags:""fbx""",5 +"/packages?q=Tags:""filestream""","Tags:""filestream""",5 +"/packages?q=Tags:""filesystemwatcher""","Tags:""filesystemwatcher""",5 +"/packages?q=Tags:""Fileupload""","Tags:""Fileupload""",5 +"/packages?q=Tags:""FileUpload""","Tags:""FileUpload""",5 +"/packages?q=Tags:""filter""","Tags:""filter""",5 +"/packages?q=Tags:""FineUploader""","Tags:""FineUploader""",5 +"/packages?q=Tags:""fire-and-forget""","Tags:""fire-and-forget""",5 +"/packages?q=Tags:""firebase-client""","Tags:""firebase-client""",5 +"/packages?q=Tags:""firebase""","Tags:""firebase""",5 +"/packages?q=Tags:""fixer.io""","Tags:""fixer.io""",5 +"/packages?q=Tags:""flipview""","Tags:""flipview""",5 +"/packages?q=Tags:""flowchart""","Tags:""flowchart""",5 +"/packages?q=Tags:""ForEachAsync""","Tags:""ForEachAsync""",5 +"/packages?q=Tags:""formula""","Tags:""formula""",5 +"/packages?q=Tags:""functional-programming""","Tags:""functional-programming""",5 +"/packages?q=Tags:""FurryBooru""","Tags:""FurryBooru""",5 +"/packages?q=Tags:""GeoCoordinateWatcher""","Tags:""GeoCoordinateWatcher""",5 +"/packages?q=Tags:""GeoHash""","Tags:""GeoHash""",5 +"/packages?q=Tags:""geoip""","Tags:""geoip""",5 +"/packages?q=Tags:""Gettext""","Tags:""Gettext""",5 +"/packages?q=Tags:""glob""","Tags:""glob""",5 +"/packages?q=Tags:""godot""","Tags:""godot""",5 +"/packages?q=Tags:""Google-Maps""","Tags:""Google-Maps""",5 +"/packages?q=Tags:""google""","Tags:""google""",5 +"/packages?q=Tags:""Google""","Tags:""Google""",5 +"/packages?q=Tags:""GPIO""","Tags:""GPIO""",5 +"/packages?q=Tags:""GraphServiceClient""","Tags:""GraphServiceClient""",5 +"/packages?q=Tags:""GridView""","Tags:""GridView""",5 +"/packages?q=Tags:""gRPC""","Tags:""gRPC""",5 +"/packages?q=Tags:""grunt""","Tags:""grunt""",5 +"/packages?q=Tags:""gtmp""","Tags:""gtmp""",5 +"/packages?q=Tags:""hashcode""","Tags:""hashcode""",5 +"/packages?q=Tags:""HATEOAS""","Tags:""HATEOAS""",5 +"/packages?q=Tags:""healthcheck""","Tags:""healthcheck""",5 +"/packages?q=Tags:""HID""","Tags:""HID""",5 +"/packages?q=Tags:""highlight""","Tags:""highlight""",5 +"/packages?q=Tags:""highlighter""","Tags:""highlighter""",5 +"/packages?q=Tags:""HOCR""","Tags:""HOCR""",5 +"/packages?q=Tags:""html-minifier""","Tags:""html-minifier""",5 +"/packages?q=Tags:""html-to-pdf-c#""","Tags:""html-to-pdf-c",5 +"/packages?q=Tags:""html2canvas""","Tags:""html2canvas""",5 +"/packages?q=Tags:""html2pdf""","Tags:""html2pdf""",5 +"/packages?q=Tags:""HTMLAGILITYPACK""","Tags:""HTMLAGILITYPACK""",5 +"/packages?q=Tags:""httppostedfilebase""","Tags:""httppostedfilebase""",5 +"/packages?q=Tags:""HttpResponseException""","Tags:""HttpResponseException""",5 +"/packages?q=Tags:""iana""","Tags:""iana""",5 +"/packages?q=Tags:""IConfiguration""","Tags:""IConfiguration""",5 +"/packages?q=Tags:""id-generator""","Tags:""id-generator""",5 +"/packages?q=Tags:""IdentityManager""","Tags:""IdentityManager""",5 +"/packages?q=Tags:""image-picker""","Tags:""image-picker""",5 +"/packages?q=Tags:""Image""","Tags:""Image""",5 +"/packages?q=Tags:""import""","Tags:""import""",5 +"/packages?q=Tags:""infinite""","Tags:""infinite""",5 +"/packages?q=Tags:""Informix""","Tags:""Informix""",5 +"/packages?q=Tags:""IntelliSense""","Tags:""IntelliSense""",5 +"/packages?q=Tags:""Interpreter""","Tags:""Interpreter""",5 +"/packages?q=Tags:""Inversion-Of-Control""","Tags:""Inversion-Of-Control""",5 +"/packages?q=Tags:""Invoice""","Tags:""Invoice""",5 +"/packages?q=Tags:""IP""","Tags:""IP""",5 +"/packages?q=Tags:""IPP""","Tags:""IPP""",5 +"/packages?q=Tags:""jar""","Tags:""jar""",5 +"/packages?q=Tags:""JavaScriptSerializer""","Tags:""JavaScriptSerializer""",5 +"/packages?q=Tags:""json-ld""","Tags:""json-ld""",5 +"/packages?q=Tags:""Kendo""","Tags:""Kendo""",5 +"/packages?q=Tags:""keyboard"",""hook""","Tags:""keyboard"",""hook""",5 +"/packages?q=Tags:""kml""","Tags:""kml""",5 +"/packages?q=Tags:""Lexer""","Tags:""Lexer""",5 +"/packages?q=Tags:""libcurl""","Tags:""libcurl""",5 +"/packages?q=Tags:""linq-expression""","Tags:""linq-expression""",5 +"/packages?q=Tags:""Loading""","Tags:""Loading""",5 +"/packages?q=Tags:""LocalDB""","Tags:""LocalDB""",5 +"/packages?q=Tags:""Logger""","Tags:""Logger""",5 +"/packages?q=Tags:""login""","Tags:""login""",5 +"/packages?q=Tags:""lru-cache""","Tags:""lru-cache""",5 +"/packages?q=Tags:""lru""","Tags:""lru""",5 +"/packages?q=Tags:""lzo""","Tags:""lzo""",5 +"/packages?q=Tags:""machine-learning""","Tags:""machine-learning""",5 +"/packages?q=Tags:""mail-merge""","Tags:""mail-merge""",5 +"/packages?q=Tags:""mailgun""","Tags:""mailgun""",5 +"/packages?q=Tags:""Maps""&page=2","Tags:""Maps""",5 +"/packages?q=Tags:""MariaDB""","Tags:""MariaDB""",5 +"/packages?q=Tags:""memoization""","Tags:""memoization""",5 +"/packages?q=Tags:""memory-leak""","Tags:""memory-leak""",5 +"/packages?q=Tags:""MetaData""","Tags:""MetaData""",5 +"/packages?q=Tags:""MimeType""","Tags:""MimeType""",5 +"/packages?q=Tags:""mindmap""","Tags:""mindmap""",5 +"/packages?q=Tags:""Minecraft""","Tags:""Minecraft""",5 +"/packages?q=Tags:""minification""","Tags:""minification""",5 +"/packages?q=Tags:""Minify""","Tags:""Minify""",5 +"/packages?q=Tags:""mkl""","Tags:""mkl""",5 +"/packages?q=Tags:""ModelState""","Tags:""ModelState""",5 +"/packages?q=Tags:""mrz""","Tags:""mrz""",5 +"/packages?q=Tags:""mshtml""","Tags:""mshtml""",5 +"/packages?q=Tags:""Multicast""","Tags:""Multicast""",5 +"/packages?q=Tags:""Multilanguage""","Tags:""Multilanguage""",5 +"/packages?q=Tags:""multipart/form-data""","Tags:""multipart/form-data""",5 +"/packages?q=Tags:""multiselect""","Tags:""multiselect""",5 +"/packages?q=Tags:""mvc5""","Tags:""mvc5""",5 +"/packages?q=Tags:""MXGraph""","Tags:""MXGraph""",5 +"/packages?q=Tags:""natural-language""","Tags:""natural-language""",5 +"/packages?q=Tags:""NAudio""","Tags:""NAudio""",5 +"/packages?q=Tags:""NEF""","Tags:""NEF""",5 +"/packages?q=Tags:""netstandard2.0""","Tags:""netstandard2.0""",5 +"/packages?q=Tags:""NumPy""","Tags:""NumPy""",5 +"/packages?q=Tags:""OBJ""","Tags:""OBJ""",5 +"/packages?q=Tags:""ODBC""","Tags:""ODBC""",5 +"/packages?q=Tags:""OfficeOpenXML""","Tags:""OfficeOpenXML""",5 +"/packages?q=Tags:""olap""","Tags:""olap""",5 +"/packages?q=Tags:""omron""","Tags:""omron""",5 +"/packages?q=Tags:""Onvif""","Tags:""Onvif""",5 +"/packages?q=Tags:""ooxml""","Tags:""ooxml""",5 +"/packages?q=Tags:""OpenCL""","Tags:""OpenCL""",5 +"/packages?q=Tags:""opencv""","Tags:""opencv""",5 +"/packages?q=Tags:""OpenDocument""","Tags:""OpenDocument""",5 +"/packages?q=Tags:""openxml""","Tags:""openxml""",5 +"/packages?q=Tags:""Pandas""","Tags:""Pandas""",5 +"/packages?q=Tags:""parser-generator""","Tags:""parser-generator""",5 +"/packages?q=Tags:""password-generator""","Tags:""password-generator""",5 +"/packages?q=Tags:""password-hash""","Tags:""password-hash""",5 +"/packages?q=Tags:""pdf-print""","Tags:""pdf-print""",5 +"/packages?q=Tags:""pdf-split""","Tags:""pdf-split""",5 +"/packages?q=Tags:""PDF""","Tags:""PDF""",5 +"/packages?q=Tags:""peer-to-peer""","Tags:""peer-to-peer""",5 +"/packages?q=Tags:""Perforce""","Tags:""Perforce""",5 +"/packages?q=Tags:""pkcs11""","Tags:""pkcs11""",5 +"/packages?q=Tags:""Places""","Tags:""Places""",5 +"/packages?q=Tags:""PlantUML""","Tags:""PlantUML""",5 +"/packages?q=Tags:""PLC""","Tags:""PLC""",5 +"/packages?q=Tags:""polyline""","Tags:""polyline""",5 +"/packages?q=Tags:""Popup""","Tags:""Popup""",5 +"/packages?q=Tags:""producer-consumer""","Tags:""producer-consumer""",5 +"/packages?q=Tags:""proxy""","Tags:""proxy""",5 +"/packages?q=Tags:""PUSH""","Tags:""PUSH""",5 +"/packages?q=Tags:""RadialMenu""","Tags:""RadialMenu""",5 +"/packages?q=Tags:""ragemp""","Tags:""ragemp""",5 +"/packages?q=Tags:""random-number""","Tags:""random-number""",5 +"/packages?q=Tags:""random-string""","Tags:""random-string""",5 +"/packages?q=Tags:""razor-components""","Tags:""razor-components""",5 +"/packages?q=Tags:""red-black""","Tags:""red-black""",5 +"/packages?q=Tags:""Redistributable""","Tags:""Redistributable""",5 +"/packages?q=Tags:""Refresh""","Tags:""Refresh""",5 +"/packages?q=Tags:""registry""","Tags:""registry""",5 +"/packages?q=Tags:""RelayCommand""","Tags:""RelayCommand""",5 +"/packages?q=Tags:""render""","Tags:""render""",5 +"/packages?q=Tags:""reniec""","Tags:""reniec""",5 +"/packages?q=Tags:""reportviewer""","Tags:""reportviewer""",5 +"/packages?q=Tags:""retry""","Tags:""retry""",5 +"/packages?q=Tags:""Rfc2898DeriveBytes""","Tags:""Rfc2898DeriveBytes""",5 +"/packages?q=Tags:""rfid""","Tags:""rfid""",5 +"/packages?q=Tags:""rijndael""","Tags:""rijndael""",5 +"/packages?q=Tags:""robotframework""","Tags:""robotframework""",5 +"/packages?q=Tags:""RSACryptoServiceProvider""","Tags:""RSACryptoServiceProvider""",5 +"/packages?q=Tags:""rtf""","Tags:""rtf""",5 +"/packages?q=Tags:""saga""","Tags:""saga""",5 +"/packages?q=Tags:""salesforce""","Tags:""salesforce""",5 +"/packages?q=Tags:""SBPL""","Tags:""SBPL""",5 +"/packages?q=Tags:""Scheduler""&page=2","Tags:""Scheduler""",5 +"/packages?q=Tags:""schema-org""","Tags:""schema-org""",5 +"/packages?q=Tags:""SCSS""","Tags:""SCSS""",5 +"/packages?q=Tags:""seekbar""","Tags:""seekbar""",5 +"/packages?q=Tags:""Segmented""","Tags:""Segmented""",5 +"/packages?q=Tags:""sftp""","Tags:""sftp""",5 +"/packages?q=Tags:""sha512""","Tags:""sha512""",5 +"/packages?q=Tags:""similarity""","Tags:""similarity""",5 +"/packages?q=Tags:""SingleInstance""","Tags:""SingleInstance""",5 +"/packages?q=Tags:""sitemap.xml""","Tags:""sitemap.xml""",5 +"/packages?q=Tags:""sln""","Tags:""sln""",5 +"/packages?q=Tags:""Slug""","Tags:""Slug""",5 +"/packages?q=Tags:""SMPP""","Tags:""SMPP""",5 +"/packages?q=Tags:""Smtp""","Tags:""Smtp""",5 +"/packages?q=Tags:""socket""","Tags:""socket""",5 +"/packages?q=Tags:""Sort""","Tags:""Sort""",5 +"/packages?q=Tags:""Sorting""","Tags:""Sorting""",5 +"/packages?q=Tags:""source-code""","Tags:""source-code""",5 +"/packages?q=Tags:""sparkline""","Tags:""sparkline""",5 +"/packages?q=Tags:""specflow""","Tags:""specflow""",5 +"/packages?q=Tags:""SplashScreen""","Tags:""SplashScreen""",5 +"/packages?q=Tags:""SpreadSheet""","Tags:""SpreadSheet""",5 +"/packages?q=Tags:""SQLCE""","Tags:""SQLCE""",5 +"/packages?q=Tags:""SqlCommand""","Tags:""SqlCommand""",5 +"/packages?q=Tags:""SqlDataAdapter""","Tags:""SqlDataAdapter""",5 +"/packages?q=Tags:""sqlgeometry""","Tags:""sqlgeometry""",5 +"/packages?q=Tags:""SQLHelper""","Tags:""SQLHelper""",5 +"/packages?q=Tags:""SSAS""","Tags:""SSAS""",5 +"/packages?q=Tags:""ssdp""","Tags:""ssdp""",5 +"/packages?q=Tags:""statistics""","Tags:""statistics""",5 +"/packages?q=Tags:""sunburst""","Tags:""sunburst""",5 +"/packages?q=Tags:""Svf""","Tags:""Svf""",5 +"/packages?q=Tags:""Swagger""","Tags:""Swagger""",5 +"/packages?q=Tags:""switch-button""","Tags:""switch-button""",5 +"/packages?q=Tags:""Sync""","Tags:""Sync""",5 +"/packages?q=Tags:""syncfusion.aspnetcore""","Tags:""syncfusion.aspnetcore""",5 +"/packages?q=Tags:""System.Configuration""","Tags:""System.Configuration""",5 +"/packages?q=Tags:""System.Drawing""","Tags:""System.Drawing""",5 +"/packages?q=Tags:""table""","Tags:""table""",5 +"/packages?q=Tags:""TagHelper""","Tags:""TagHelper""",5 +"/packages?q=Tags:""TCP/IP""","Tags:""TCP/IP""",5 +"/packages?q=Tags:""Telephony""","Tags:""Telephony""",5 +"/packages?q=Tags:""Telerik""","Tags:""Telerik""",5 +"/packages?q=Tags:""Terraform""","Tags:""Terraform""",5 +"/packages?q=Tags:""tfs""","Tags:""tfs""",5 +"/packages?q=Tags:""thermal-printer""","Tags:""thermal-printer""",5 +"/packages?q=Tags:""thumbnail""","Tags:""thumbnail""",5 +"/packages?q=Tags:""Thumbnail""","Tags:""Thumbnail""",5 +"/packages?q=Tags:""time-picker""","Tags:""time-picker""",5 +"/packages?q=Tags:""timepicker""","Tags:""timepicker""",5 +"/packages?q=Tags:""timespan""","Tags:""timespan""",5 +"/packages?q=Tags:""TLS1.2""","Tags:""TLS1.2""",5 +"/packages?q=Tags:""Toast""","Tags:""Toast""",5 +"/packages?q=Tags:""toastr""","Tags:""toastr""",5 +"/packages?q=Tags:""torrent""","Tags:""torrent""",5 +"/packages?q=Tags:""transliteration""","Tags:""transliteration""",5 +"/packages?q=Tags:""TSP""","Tags:""TSP""",5 +"/packages?q=Tags:""tts""","Tags:""tts""",5 +"/packages?q=Tags:""tween""","Tags:""tween""",5 +"/packages?q=Tags:""UIAutomation""","Tags:""UIAutomation""",5 +"/packages?q=Tags:""unit-of-work""","Tags:""unit-of-work""",5 +"/packages?q=Tags:""ups""","Tags:""ups""",5 +"/packages?q=Tags:""UserAgent""","Tags:""UserAgent""",5 +"/packages?q=Tags:""UTF8""","Tags:""UTF8""",5 +"/packages?q=Tags:""uuid""","Tags:""uuid""",5 +"/packages?q=Tags:""Visa""","Tags:""Visa""",5 +"/packages?q=Tags:""Visualization""","Tags:""Visualization""",5 +"/packages?q=Tags:""vs2005""","Tags:""vs2005""",5 +"/packages?q=Tags:""vs2010""","Tags:""vs2010""",5 +"/packages?q=Tags:""Watchdog""","Tags:""Watchdog""",5 +"/packages?q=Tags:""WAV""","Tags:""WAV""",5 +"/packages?q=Tags:""WCF""","Tags:""WCF""",5 +"/packages?q=Tags:""Weather""","Tags:""Weather""",5 +"/packages?q=Tags:""WebDeploy""","Tags:""WebDeploy""",5 +"/packages?q=Tags:""WebGL""","Tags:""WebGL""",5 +"/packages?q=Tags:""WebP""","Tags:""WebP""",5 +"/packages?q=Tags:""wf""","Tags:""wf""",5 +"/packages?q=Tags:""Wildcard""","Tags:""Wildcard""",5 +"/packages?q=Tags:""WKB""","Tags:""WKB""",5 +"/packages?q=Tags:""WordML""","Tags:""WordML""",5 +"/packages?q=Tags:""workflow-engine""","Tags:""workflow-engine""",5 +"/packages?q=Tags:""WPF""","Tags:""WPF""",5 +"/packages?q=Tags:""XAML""","Tags:""XAML""",5 +"/packages?q=Tags:""xls""","Tags:""xls""",5 +"/packages?q=Tags:""XMP""","Tags:""XMP""",5 +"/packages?q=Tags:""xsd""","Tags:""xsd""",5 +"/packages?q=Tags:""xslt""","Tags:""xslt""",5 +"/packages?q=Tags:""xss""","Tags:""xss""",5 +"/packages?q=Tags:""xxHash""","Tags:""xxHash""",5 +"/packages?q=Tags:""XZ""","Tags:""XZ""",5 +"/packages?q=Tags:""YouTube""","Tags:""YouTube""",5 +"/packages?q=Tags:""zebra""","Tags:""zebra""",5 +"/packages?q=Tags:""zipcode""","Tags:""zipcode""",5 +"/packages?q=Tags:""ZKTeco""","Tags:""ZKTeco""",5 +/packages?q=tail,tail,5 +/packages?q=task+dialog,task dialog,5 +/packages?q=tcp,tcp,5 +/packages?q=tensorflow,tensorflow,5 +/packages?q=theme,theme,5 +/packages?q=Thrift,Thrift,5 +/packages?q=thycotic,thycotic,5 +/packages?q=timepicker,timepicker,5 +/packages?q=timezone,timezone,5 +/packages?q=token,token,5 +/packages?q=topshelf,topshelf,5 +/packages?q=Topshelf,Topshelf,5 +/packages?q=tray,tray,5 +/packages?q=TrueType,TrueType,5 +/packages?q=tuple,tuple,5 +/packages?q=TWAIN&page=2,TWAIN,5 +/packages?q=Tweetinvi,Tweetinvi,5 +/packages?q=Umbrella Project&page=41,Umbrella Project,5 +"/packages?q=unit-testing,","unit-testing,",5 +/packages?q=unity.mvc,unity.mvc,5 +/packages?q=unity+mvc,unity mvc,5 +/packages?q=Unity3d,Unity3d,5 +/packages?q=unityengine,unityengine,5 +"/packages?q=unzip,","unzip,",5 +/packages?q=updater,updater,5 +/packages?q=utm,utm,5 +/packages?q=UWP.SDKforGoogleAnalytics,UWP.SDKforGoogleAnalytics,5 +/packages?q=video,video,5 +/packages?q=Viewer,Viewer,5 +/packages?q=vim,vim,5 +"/packages?q=vkontakte,","vkontakte,",5 +/packages?q=vsix,vsix,5 +/packages?q=VSSDK,VSSDK,5 +/packages?q=wcf+data+services,wcf data services,5 +/packages?q=WebActivator,WebActivator,5 +/packages?q=webapi.client,webapi.client,5 +/packages?q=WebRequest,WebRequest,5 +/packages?q=webserver,webserver,5 +/packages?q=wifi,wifi,5 +/packages?q=Windows-Service,Windows-Service,5 +/packages?q=windows+form,windows form,5 +/packages?q=WindowsAzure.Storage,WindowsAzure.Storage,5 +/packages?q=windowsazureofficial+servicefabric&prerel=false,windowsazureofficial servicefabric,5 +"/packages?q=WinForms,&page=13","WinForms,",5 +/packages?q=wkt,wkt,5 +/packages?q=Wordnet,Wordnet,5 +/packages?q=wpf+converters,wpf converters,5 +/packages?q=wpf+input&sortOrder=package-download-count,wpf input,5 +/packages?q=ws-federation,ws-federation,5 +/packages?q=wse,wse,5 +/packages?q=WYSIWYG,WYSIWYG,5 +/packages?q=xamarians,xamarians,5 +/packages?q=Xamarin.OneDrive,Xamarin.OneDrive,5 +/packages?q=Xamarin.UITest,Xamarin.UITest,5 +/packages?q=xlsx,xlsx,5 +/packages?q=xml-rpc,xml-rpc,5 +/packages?q=Xps+read+with+formating,Xps read with formating,5 +/packages?q=xUnit.net,xUnit.net,5 +/packages?q=yaml,yaml,5 +/packages?q=zookeeper,zookeeper,5 +/packages?q=zxing,zxing,5 +/packages?q=ZXing,ZXing,5 +/packages?q=zxing.portable,zxing.portable,5 +/packages?q= MSBuild NUnit Task Project,MSBuild NUnit Task Project,3 +/packages?q=.EntityFrameworkCore.Tools.DotNet,.EntityFrameworkCore.Tools.DotNet,3 +/packages?q=.Net Framework 4.6.2,.Net Framework 4.6.2,3 +/packages?q=.NET HTTP Abstractions Working Group&page=605,.NET HTTP Abstractions Working Group,3 +"/packages?q=.net,&page=405",".net,",3 +"/packages?q=.NET,&page=456",".NET,",3 +"/packages?q=.NET,&page=754",".NET,",3 +"/packages?q=.NET,&sortOrder=package-download-count&page=35",".NET,",3 +/packages?q=.Net&page=193,.Net,3 +/packages?q=.NET&page=338,.NET,3 +/packages?q=.NET&sortOrder=package-download-count&page=53&prerelease=False,.NET,3 +/packages?q=.net+core,.net core,3 +/packages?q=.net+httpclient,.net httpclient,3 +/packages?q=.net4&page=12,.net4,3 +/packages?q=.NET4&page=202,.NET4,3 +/packages?q=.NET4&page=68,.NET4,3 +/packages?q=.net462+++System.Runtime.CompilerServices.Unsafe&prerel=false,.net462 System.Runtime.CompilerServices.Unsafe,3 +/packages?q=.netcore+dapper+extentions,.netcore dapper extentions,3 +/packages?q=.netcoreapp2.1,.netcoreapp2.1,3 +/packages?q='Microsoft.NET.Sdk.Web,'Microsoft.NET.Sdk.Web,3 +"/packages?q='System.Runtime,+Version=4.0.20.0","'System.Runtime, Version=4.0.20.0",3 +"/packages?q="";",""";",3 +"/packages?q=""Application Insights""&page=6","""Application Insights""",3 +"/packages?q=""Newtonsoft.Json""+Version=""10.0.3""","""Newtonsoft.Json"" Version=""10.0.3""",3 +"/packages?q=""unit&page=22","""unit",3 +"/packages?q=""unit&page=37","""unit",3 +/packages?q=[BBCode Helper - John Katsiotis]&sortOrder=relevance&page=24&prerelease=False,[BBCode Helper - John Katsiotis],3 +/packages?q=[GraffitiCMS - Telligent and GraffitiCMS Open Source Team]&page=72,[GraffitiCMS - Telligent and GraffitiCMS Open Source Team],3 +/packages?q=\MSTest.TestAdapter.1.1.18,\MSTest.TestAdapter.1.1.18,3 +/packages?q=+Abp.AspNetZeroCore.Fixed,Abp.AspNetZeroCore.Fixed,3 +/packages?q=+FakeItEasy.Analyzer.VisualBasic,FakeItEasy.Analyzer.VisualBasic,3 +/packages?q=+Fluent+NHibernate,Fluent NHibernate,3 +/packages?q=+ILMerge,ILMerge,3 +/packages?q=+java.io.IOException,java.io.IOException,3 +/packages?q=+Kendo.Mvc.UI.Fluent,Kendo.Mvc.UI.Fluent,3 +/packages?q=+Microsoft.AspNet+core,Microsoft.AspNet core,3 +/packages?q=+Microsoft.AspNetCore.Mvc.NewtonsoftJson,Microsoft.AspNetCore.Mvc.NewtonsoftJson,3 +/packages?q=+Microsoft.EntityFrameworkCore,Microsoft.EntityFrameworkCore,3 +/packages?q=+MySql.Data.Entity.EF6,MySql.Data.Entity.EF6,3 +/packages?q=+scanner,scanner,3 +/packages?q=+Swagger+definitions,Swagger definitions,3 +/packages?q=+Syncfusion.Pdf.WinForms,Syncfusion.Pdf.WinForms,3 +/packages?q=+System.Text,System.Text,3 +/packages?q=+Xamarin.Android.Support.AppCompat,Xamarin.Android.Support.AppCompat,3 +/packages?q=+Xander-+ul+Framework,Xander- ul Framework,3 +/packages?q=1.1&page=2,1.1,3 +/packages?q=13.0.24.2970,13.0.24.2970,3 +/packages?q=2D,2D,3 +/packages?q=3.3.100.0,3.3.100.0,3 +/packages?q=3D&page=6,3D,3 +/packages?q=3DS,3DS,3 +"/packages?q=4.0,&page=3","4.0,",3 +/packages?q=4.0&page=9,4.0,3 +/packages?q=4.7.2,4.7.2,3 +/packages?q=4&sortOrder=relevance&page=36&prerelease=False,4,3 +/packages?q=404&sortOrder=package-download-count&page=1,404,3 +/packages?q=5 Limes,5 Limes,3 +/packages?q=5 Limes&page=99,5 Limes,3 +/packages?q=6,6,3 +/packages?q=7.5&page=1,7.5,3 +/packages?q=7z,7z,3 +/packages?q=A/B,A/B,3 +/packages?q=A2v10.Web.Runtime,A2v10.Web.Runtime,3 +/packages?q=abp,abp,3 +/packages?q=Abp.Zero,Abp.Zero,3 +/packages?q=access&page=60,access,3 +/packages?q=Accord.Video.FFMPEG.x64+for+nuget+2.8.6,Accord.Video.FFMPEG.x64 for nuget 2.8.6,3 +/packages?q=Accordion&page=2,Accordion,3 +/packages?q=Active Home&page=2,Active Home,3 +/packages?q=active-directory&page=7,active-directory,3 +/packages?q=activemq,activemq,3 +/packages?q=adal,adal,3 +/packages?q=adb,adb,3 +/packages?q=Add-In&page=29,Add-In,3 +/packages?q=add-migration,add-migration,3 +/packages?q=Add-Migration,Add-Migration,3 +/packages?q=add&page=30,add,3 +/packages?q=add+migration,add migration,3 +/packages?q=AddIn&page=31,AddIn,3 +/packages?q=adfast,adfast,3 +/packages?q=adminlte&sortOrder=package-download-count,adminlte,3 +/packages?q=ado,ado,3 +/packages?q=ADO.NET&page=11,ADO.NET,3 +/packages?q=ADO.net&prerel=false,ADO.net,3 +/packages?q=ads,ads,3 +/packages?q=advanceddocclean,advanceddocclean,3 +/packages?q=aero,aero,3 +/packages?q=aerospike-client-c,aerospike-client-c,3 +/packages?q=aforge,aforge,3 +/packages?q=aforge.net,aforge.net,3 +/packages?q=AForge.NET&page=3,AForge.NET,3 +/packages?q=agility.web,agility.web,3 +/packages?q=ajax,ajax,3 +/packages?q=ajaxmin,ajaxmin,3 +/packages?q=Akavache,Akavache,3 +/packages?q=akka,akka,3 +/packages?q=akka.serialization,akka.serialization,3 +/packages?q=aktiv,aktiv,3 +"/packages?q=alert,&page=3","alert,",3 +"/packages?q=alerts,","alerts,",3 +/packages?q=Alex Sabchyshyn,Alex Sabchyshyn,3 +/packages?q=algebra,algebra,3 +/packages?q=Algorithms&page=3,Algorithms,3 +/packages?q=algorithms&page=9,algorithms,3 +/packages?q=alias,alias,3 +/packages?q=alipay,alipay,3 +/packages?q=aliyun-net-sdk-core,aliyun-net-sdk-core,3 +/packages?q=aliyun+oss,aliyun oss,3 +/packages?q=all&page=89,all,3 +/packages?q=alphafs,alphafs,3 +/packages?q=altazion,altazion,3 +/packages?q=Alturos.Yolo,Alturos.Yolo,3 +/packages?q=Amazon Web Services&page=184,Amazon Web Services,3 +/packages?q=Amazon Web Services&page=3,Amazon Web Services,3 +/packages?q=Amazon.CDK.AWS.ECS,Amazon.CDK.AWS.ECS,3 +/packages?q=Amazon.CDK.AWS.SNS,Amazon.CDK.AWS.SNS,3 +/packages?q=Amazon.Jsii,Amazon.Jsii,3 +/packages?q=Amazon.Lambda.SNSEvent,Amazon.Lambda.SNSEvent,3 +/packages?q=analytics,analytics,3 +/packages?q=analytics&page=3,analytics,3 +/packages?q=and&page=1007,and,3 +/packages?q=and&page=2329,and,3 +/packages?q=and&page=373,and,3 +/packages?q=and&page=776,and,3 +/packages?q=and&page=783,and,3 +/packages?q=Android&page=28,Android,3 +/packages?q=Android&page=40,Android,3 +/packages?q=AndroidX.EXIF,AndroidX.EXIF,3 +/packages?q=angular,angular,3 +/packages?q=angular-strap.TypeScript.DefinitelyTyped,angular-strap.TypeScript.DefinitelyTyped,3 +/packages?q=angular+2,angular 2,3 +/packages?q=angular+animate+1.6.10,angular animate 1.6.10,3 +/packages?q=anima,anima,3 +"/packages?q=animation,&page=3","animation,",3 +"/packages?q=animation,&page=5","animation,",3 +/packages?q=animation&page=5,animation,3 +/packages?q=Annotation,Annotation,3 +/packages?q=annotations,annotations,3 +/packages?q=Annotations&page=3,Annotations,3 +/packages?q=ansl,ansl,3 +/packages?q=anti&page=2,anti,3 +/packages?q=Antlr,Antlr,3 +/packages?q=Antlr.3.4.1.9004,Antlr.3.4.1.9004,3 +/packages?q=AnySerializer,AnySerializer,3 +/packages?q=Anywhere,Anywhere,3 +/packages?q=Apache Software Foundation&page=38,Apache Software Foundation,3 +"/packages?q=API,&page=126","API,",3 +"/packages?q=API,&page=159","API,",3 +"/packages?q=api,&page=36","api,",3 +/packages?q=API&page=211,API,3 +/packages?q=api&page=258,api,3 +/packages?q=API&page=264,API,3 +/packages?q=api&page=269,api,3 +/packages?q=api+key,api key,3 +/packages?q=API+Key,API Key,3 +/packages?q=apigateway,apigateway,3 +/packages?q=apm,apm,3 +/packages?q=APO+Key,APO Key,3 +"/packages?q=app,&page=52","app,",3 +/packages?q=app.metrics,app.metrics,3 +/packages?q=App.net,App.net,3 +/packages?q=AppCente,AppCente,3 +/packages?q=appd,appd,3 +/packages?q=appdomain,appdomain,3 +/packages?q=AppDomain,AppDomain,3 +/packages?q=AppDynamics,AppDynamics,3 +/packages?q=appium,appium,3 +/packages?q=Apple&page=2,Apple,3 +/packages?q=applicationinsights,applicationinsights,3 +/packages?q=appsettings,appsettings,3 +/packages?q=arctocore,arctocore,3 +/packages?q=arcus,arcus,3 +/packages?q=Ardalis,Ardalis,3 +/packages?q=ardalis.guradclauses,ardalis.guradclauses,3 +/packages?q=AreasRazorPages,AreasRazorPages,3 +/packages?q=argu,argu,3 +/packages?q=ARM,ARM,3 +/packages?q=asky,asky,3 +/packages?q=asn1,asn1,3 +/packages?q=asn1sharp,asn1sharp,3 +/packages?q=asp-net&page=211,asp-net,3 +"/packages?q=Asp,&page=8","Asp,",3 +/packages?q=asp:Image&page=12,asp:Image,3 +/packages?q=asp:Image&sortOrder=package-download-count&page=1&prerelease=False,asp:Image,3 +/packages?q=ASP.NET-MVC&page=6,ASP.NET-MVC,3 +/packages?q=ASP.NET-MVC&sortOrder=package-download-count&page=6,ASP.NET-MVC,3 +"/packages?q=ASP.NET,&page=14","ASP.NET,",3 +/packages?q=ASP.NET+Core+CDN+helpers,ASP.NET Core CDN helpers,3 +/packages?q=asp.net+core+identity,asp.net core identity,3 +/packages?q=asp.netcore+jsonpatch,asp.netcore jsonpatch,3 +/packages?q=aspec,aspec,3 +/packages?q=aspectcore,aspectcore,3 +/packages?q=AspectCore,AspectCore,3 +/packages?q=aspnet_compiler,aspnet_compiler,3 +/packages?q=aspnet-codegenerator,aspnet-codegenerator,3 +/packages?q=aspnet.core,aspnet.core,3 +/packages?q=aspnet.mvc,aspnet.mvc,3 +/packages?q=aspnet.signalr,aspnet.signalr,3 +/packages?q=aspnet.webpages,aspnet.webpages,3 +/packages?q=aspnetcore-runtime,aspnetcore-runtime,3 +/packages?q=aspnetcore.abstractions,aspnetcore.abstractions,3 +/packages?q=aspnetcore.all,aspnetcore.all,3 +/packages?q=aspnetcore.app,aspnetcore.app,3 +/packages?q=aspnetcore.dataprotection,aspnetcore.dataprotection,3 +/packages?q=Aspnetcore.healthchecks,Aspnetcore.healthchecks,3 +/packages?q=AspNetCore.HealthChecks.UI,AspNetCore.HealthChecks.UI,3 +/packages?q=AspNetCore.Sca,AspNetCore.Sca,3 +/packages?q=AspNetCore.SwaggerUI,AspNetCore.SwaggerUI,3 +/packages?q=AspNetCore.SwaggerUI+Version,AspNetCore.SwaggerUI Version,3 +/packages?q=aspnetmvc&page=12,aspnetmvc,3 +/packages?q=AspNetMvc&page=62,AspNetMvc,3 +/packages?q=aspose,aspose,3 +/packages?q=aspose.cells+,aspose.cells,3 +/packages?q=aspose.pdf,aspose.pdf,3 +/packages?q=Aspose.Slides,Aspose.Slides,3 +/packages?q=Aspose.Word,Aspose.Word,3 +/packages?q=aspose.words,aspose.words,3 +/packages?q=aspose.worlds,aspose.worlds,3 +/packages?q=AssemblyInfo,AssemblyInfo,3 +/packages?q=assemblyinfo&page=2,assemblyinfo,3 +/packages?q=assert,assert,3 +/packages?q=AssessmentClient,AssessmentClient,3 +/packages?q=ast,ast,3 +/packages?q=Async,Async,3 +/packages?q=async&page=18,async,3 +/packages?q=at+modem,at modem,3 +/packages?q=athena,athena,3 +/packages?q=ATLASSIAN,ATLASSIAN,3 +/packages?q=ATLFTPLib,ATLFTPLib,3 +/packages?q=atom,atom,3 +/packages?q=attributes&sortOrder=package-download-count&page=6&prerelease=False,attributes,3 +/packages?q=Audit,Audit,3 +/packages?q=aurelia,aurelia,3 +/packages?q=auth0,auth0,3 +/packages?q=Auth0&page=14,Auth0,3 +/packages?q=authentication,authentication,3 +"/packages?q=Author:"" S.A.""","Author:"" S.A.""",3 +"/packages?q=Author:""&page=1518","Author:""",3 +"/packages?q=Author:""&page=3378","Author:""",3 +"/packages?q=Author:""Dave Gandy""","Author:""Dave Gandy""",3 +"/packages?q=Author:""Mike Hadlow""","Author:""Mike Hadlow""",3 +"/packages?q=Author:""Remi Caput""","Author:""Remi Caput""",3 +"/packages?q=Author:""Serilog Contributors""&page=3","Author:""Serilog Contributors""",3 +"/packages?q=Author:""Telerik""","Author:""Telerik""",3 +/packages?q=Author:Microsoft Tags:dotnetcore,Author:Microsoft Tags:dotnetcore,3 +/packages?q=authorization,authorization,3 +/packages?q=Authorization,Authorization,3 +/packages?q=authorization&page=13,authorization,3 +/packages?q=Authorize.NET,Authorize.NET,3 +/packages?q=auto-ss,auto-ss,3 +/packages?q=auto+mapper,auto mapper,3 +/packages?q=AutoFac,AutoFac,3 +/packages?q=Autofac.Configuration,Autofac.Configuration,3 +/packages?q=Autofac.Extensions.DependencyInjection,Autofac.Extensions.DependencyInjection,3 +/packages?q=Autofac.Integration.Mef,Autofac.Integration.Mef,3 +/packages?q=autofac.mvc,autofac.mvc,3 +/packages?q=Autofac.MVC4,Autofac.MVC4,3 +/packages?q=Autofac.Signalr2,Autofac.Signalr2,3 +/packages?q=autofac+moq+html,autofac moq html,3 +/packages?q=AutoFixture,AutoFixture,3 +/packages?q=AutoMapper,AutoMapper,3 +/packages?q=automatically&page=4,automatically,3 +/packages?q=automationmanagement,automationmanagement,3 +/packages?q=autosuggest,autosuggest,3 +/packages?q=AutoUpdate,AutoUpdate,3 +/packages?q=Autoupdater+,Autoupdater,3 +/packages?q=avalon,avalon,3 +/packages?q=AvalonDock,AvalonDock,3 +/packages?q=avalonia,avalonia,3 +/packages?q=avanti-schema,avanti-schema,3 +/packages?q=avif,avif,3 +/packages?q=Awerson,Awerson,3 +/packages?q=AWS&page=1,AWS,3 +/packages?q=aws+dynmo,aws dynmo,3 +/packages?q=aws+sdk,aws sdk,3 +/packages?q=AWSPowerShell,AWSPowerShell,3 +/packages?q=awssdk,awssdk,3 +/packages?q=awssdk.core,awssdk.core,3 +/packages?q=AWSSDK.Extensions.NETCore.Setup,AWSSDK.Extensions.NETCore.Setup,3 +/packages?q=AWSSDK.Extensions.NETCore.SetUp,AWSSDK.Extensions.NETCore.SetUp,3 +/packages?q=awssdk+AmazonSimpleSystemsManagement,awssdk AmazonSimpleSystemsManagement,3 +/packages?q=axe+windows,axe windows,3 +/packages?q=Azure tools for Powershell&page=111,Azure tools for Powershell,3 +/packages?q=Azure-Table-Storage,Azure-Table-Storage,3 +"/packages?q=Azure,&page=70","Azure,",3 +/packages?q=Azure.Functions.v2.DI.Services,Azure.Functions.v2.DI.Services,3 +/packages?q=Azure.Security.KeyVault.Keys,Azure.Security.KeyVault.Keys,3 +/packages?q=azure.servicebus,azure.servicebus,3 +/packages?q=Azure.Storage,Azure.Storage,3 +/packages?q=azure+queue,azure queue,3 +/packages?q=Azure+Stroage,Azure Stroage,3 +/packages?q=b,b,3 +/packages?q=babel+-+a+compiler+for+writing+next+generation+javascript,babel - a compiler for writing next generation javascript,3 +/packages?q=background,background,3 +/packages?q=bank,bank,3 +/packages?q=Bar,Bar,3 +/packages?q=bar&page=5,bar,3 +/packages?q=BarCode,BarCode,3 +"/packages?q=barcode,&page=3","barcode,",3 +"/packages?q=barcode,&page=7","barcode,",3 +/packages?q=barcode+Scanner,barcode Scanner,3 +/packages?q=baresip,baresip,3 +/packages?q=BasicAuthentication&page=2,BasicAuthentication,3 +/packages?q=BC.UnblockedPlatform,BC.UnblockedPlatform,3 +/packages?q=BD.Core.ExceptionHandling+version+1.0.1,BD.Core.ExceptionHandling version 1.0.1,3 +/packages?q=BDD,BDD,3 +/packages?q=Be.Vlaanderen.Basisregisters.DataDog.Tracing,Be.Vlaanderen.Basisregisters.DataDog.Tracing,3 +/packages?q=benchmark,benchmark,3 +/packages?q=benchmarkdotnet,benchmarkdotnet,3 +/packages?q=BenchmarkDotNet,BenchmarkDotNet,3 +/packages?q=benchmarkdotnet&sortOrder=package-download-count,benchmarkdotnet,3 +/packages?q=BerkeleyDB,BerkeleyDB,3 +/packages?q=BigDecimal,BigDecimal,3 +/packages?q=biginteger,biginteger,3 +/packages?q=bikeman868,bikeman868,3 +/packages?q=bin&page=5,bin,3 +/packages?q=binance.net,binance.net,3 +/packages?q=Binance.Net,Binance.Net,3 +/packages?q=binary tree&page=25,binary tree,3 +/packages?q=BinaryFormatter,BinaryFormatter,3 +/packages?q=Binder,Binder,3 +/packages?q=Binding.Salesforce.MarketingCloud,Binding.Salesforce.MarketingCloud,3 +/packages?q=bingo.valida,bingo.valida,3 +/packages?q=bitmap,bitmap,3 +/packages?q=Bitmap&page=1,Bitmap,3 +/packages?q=bitmap&page=3,bitmap,3 +/packages?q=blackfox commandline&sortOrder=package-download-count,blackfox commandline,3 +/packages?q=BLAS,BLAS,3 +/packages?q=blazor,blazor,3 +/packages?q=Blazor.Extensions.SignalR,Blazor.Extensions.SignalR,3 +/packages?q=Blazor.GoogleMap,Blazor.GoogleMap,3 +/packages?q=blazor+,blazor,3 +/packages?q=Blazor+indexeddb,Blazor indexeddb,3 +/packages?q=Blazor+Toast,Blazor Toast,3 +"/packages?q=blizzard,","blizzard,",3 +/packages?q=Blob,Blob,3 +/packages?q=BlueBooth+,BlueBooth,3 +/packages?q=bluefin,bluefin,3 +/packages?q=BMP&page=2,BMP,3 +/packages?q=bodi,bodi,3 +/packages?q=bolero&sortOrder=package-download-count,bolero,3 +/packages?q=boom,boom,3 +/packages?q=boost-python,boost-python,3 +/packages?q=boost-vc142,boost-vc142,3 +/packages?q=boots,boots,3 +/packages?q=bootstrap,bootstrap,3 +/packages?q=Bootstrap,Bootstrap,3 +"/packages?q=Bootstrap,&page=20","Bootstrap,",3 +/packages?q=Bootstrap&page=3,Bootstrap,3 +/packages?q=Bootstrap&sortOrder=relevance&page=4,Bootstrap,3 +/packages?q=Bot&page=3,Bot,3 +/packages?q=Bouncy Castle Project Contributors&page=75,Bouncy Castle Project Contributors,3 +/packages?q=Bouncy Castle Project Contributors&sortOrder=relevance&page=10,Bouncy Castle Project Contributors,3 +/packages?q=Bouncycastle,Bouncycastle,3 +/packages?q=BouncyCastle,BouncyCastle,3 +/packages?q=BouncyCastle.Crypto,BouncyCastle.Crypto,3 +/packages?q=BouncyCastle.NetCore,BouncyCastle.NetCore,3 +/packages?q=BouncyCastle+1.8.3.0,BouncyCastle 1.8.3.0,3 +/packages?q=box+api,box api,3 +/packages?q=Boyer,Boyer,3 +/packages?q=braintree,braintree,3 +/packages?q=breadcrumb,breadcrumb,3 +/packages?q=Brian Lagunas,Brian Lagunas,3 +/packages?q=bucket,bucket,3 +"/packages?q=Build,&sortOrder=relevance&page=15&prerelease=False","Build,",3 +/packages?q=BuildWebCompiler,BuildWebCompiler,3 +/packages?q=bullseye,bullseye,3 +/packages?q=Bundler,Bundler,3 +/packages?q=BundlerMinifier,BundlerMinifier,3 +"/packages?q=Button,&page=4","Button,",3 +/packages?q=Button&page=8,Button,3 +/packages?q=Bytescout.PDFExtractor,Bytescout.PDFExtractor,3 +"/packages?q=c#,&page=61",c,3 +/packages?q=C#;&page=295,C,3 +"/packages?q=C#.NET,&page=6",C,3 +/packages?q=C#&page=107,C,3 +/packages?q=C#&page=56,C,3 +/packages?q=c#&page=81,c,3 +/packages?q=C#+mdb,C,3 +/packages?q=C1.C1Excel,C1.C1Excel,3 +/packages?q=c1.web.api,c1.web.api,3 +"/packages?q=CAB,","CAB,",3 +/packages?q=caching&page=9,caching,3 +/packages?q=Cake.AzureStorage,Cake.AzureStorage,3 +/packages?q=Cake.cmakebuild,Cake.cmakebuild,3 +/packages?q=Cake.CoreCLR,Cake.CoreCLR,3 +/packages?q=Cake.Deploy.Azure.Management.WebSites,Cake.Deploy.Azure.Management.WebSites,3 +/packages?q=cake.filehelpers,cake.filehelpers,3 +/packages?q=Cake.Json,Cake.Json,3 +/packages?q=calamara,calamara,3 +/packages?q=calamari,calamari,3 +/packages?q=calendar,calendar,3 +/packages?q=Calendar,Calendar,3 +"/packages?q=Calendar,&page=7","Calendar,",3 +/packages?q=caliburn.micro,caliburn.micro,3 +"/packages?q=Caliburn.Micro,","Caliburn.Micro,",3 +/packages?q=caliburn.micro&page=4,caliburn.micro,3 +/packages?q=Caliburn+Micro,Caliburn Micro,3 +/packages?q=cam+scanner,cam scanner,3 +/packages?q=camera+android,camera android,3 +/packages?q=camera+integrata,camera integrata,3 +/packages?q=cannorin,cannorin,3 +/packages?q=Canvas,Canvas,3 +/packages?q=canvas+js,canvas js,3 +/packages?q=capableobjects,capableobjects,3 +/packages?q=Captcha,Captcha,3 +/packages?q=capture,capture,3 +/packages?q=Card&page=7,Card,3 +"/packages?q=cards,","cards,",3 +/packages?q=cardsuit,cardsuit,3 +/packages?q=carousel,carousel,3 +/packages?q=CarouselView.FormsPlugin,CarouselView.FormsPlugin,3 +/packages?q=Cassandra,Cassandra,3 +/packages?q=cassia,cassia,3 +/packages?q=castle.core,castle.core,3 +/packages?q=Castle.Core,Castle.Core,3 +/packages?q=Castle.DynamicProxy,Castle.DynamicProxy,3 +/packages?q=Castle.Windsor,Castle.Windsor,3 +/packages?q=castle+windsor,castle windsor,3 +/packages?q=Castle+Windsor,Castle Windsor,3 +/packages?q=catcherwong,catcherwong,3 +/packages?q=CCOW,CCOW,3 +/packages?q=cef,cef,3 +/packages?q=cef.redist.x86+3.3578.1870,cef.redist.x86 3.3578.1870,3 +/packages?q=central,central,3 +/packages?q=Central.Business,Central.Business,3 +/packages?q=Central+Dogma,Central Dogma,3 +/packages?q=cep,cep,3 +/packages?q=certificate,certificate,3 +/packages?q=change-tracking,change-tracking,3 +/packages?q=Chart&page=4,Chart,3 +/packages?q=Chart&page=9,Chart,3 +/packages?q=charting,charting,3 +/packages?q=charting&page=5,charting,3 +/packages?q=charts&page=3,charts,3 +/packages?q=charts&page=7,charts,3 +/packages?q=Chat&page=7,Chat,3 +/packages?q=checkboxlist,checkboxlist,3 +/packages?q=checkpoint,checkpoint,3 +/packages?q=chem,chem,3 +/packages?q=chilkat,chilkat,3 +/packages?q=chocole,chocole,3 +/packages?q=ChromeDevTools,ChromeDevTools,3 +/packages?q=chromedriver,chromedriver,3 +/packages?q=CImg,CImg,3 +/packages?q=Cisco,Cisco,3 +/packages?q=citrix,citrix,3 +/packages?q=CKEditor,CKEditor,3 +/packages?q=Classes&page=22,Classes,3 +/packages?q=ClickHouse Net,ClickHouse Net,3 +/packages?q=ClientScript,ClientScript,3 +/packages?q=clock,clock,3 +/packages?q=Clone,Clone,3 +/packages?q=closedxml,closedxml,3 +/packages?q=Cloudcraft,Cloudcraft,3 +/packages?q=cloudevents,cloudevents,3 +/packages?q=CloudWatch,CloudWatch,3 +/packages?q=CMD,CMD,3 +"/packages?q=Cmdlet,","Cmdlet,",3 +/packages?q=CMS,CMS,3 +/packages?q=cnn,cnn,3 +/packages?q=cntk,cntk,3 +/packages?q=Code Gecko Developments Ltd.&page=133,Code Gecko Developments Ltd.,3 +/packages?q=Code&page=4,Code,3 +/packages?q=CODE+BEHIND+FILE+GERERATION,CODE BEHIND FILE GERERATION,3 +/packages?q=code+generation,code generation,3 +/packages?q=Code39&page=232,Code39,3 +/packages?q=codeanalysis.analyzers,codeanalysis.analyzers,3 +/packages?q=codec,codec,3 +/packages?q=CodeCoverage&page=1,CodeCoverage,3 +/packages?q=codedom,codedom,3 +/packages?q=Codeplex Foundation&page=13,Codeplex Foundation,3 +/packages?q=Cofoundry,Cofoundry,3 +/packages?q=coim,coim,3 +/packages?q=collsoft,collsoft,3 +/packages?q=color,color,3 +/packages?q=ColoredConsoleAppender,ColoredConsoleAppender,3 +/packages?q=colorful.console&sortOrder=package-download-count,colorful.console,3 +/packages?q=com.squareup.okhttp3,com.squareup.okhttp3,3 +/packages?q=combinator,combinator,3 +/packages?q=comma,comma,3 +/packages?q=command,command,3 +/packages?q=command line argument parser&page=19,command line argument parser,3 +/packages?q=command-line,command-line,3 +/packages?q=commandline,commandline,3 +/packages?q=commandlineparser,commandlineparser,3 +/packages?q=CommandLineParser,CommandLineParser,3 +/packages?q=Commerce,Commerce,3 +/packages?q=Common.Logging,Common.Logging,3 +/packages?q=common.logginG.log4net,common.logginG.log4net,3 +/packages?q=common+service+locator+adapter,common service locator adapter,3 +/packages?q=CommonDomain,CommonDomain,3 +/packages?q=commonmark.net,commonmark.net,3 +/packages?q=commonServiceLocator,commonServiceLocator,3 +/packages?q=community.nservicebus,community.nservicebus,3 +/packages?q=Compact,Compact,3 +/packages?q=comparer&page=3,comparer,3 +/packages?q=compass,compass,3 +/packages?q=compile&page=6,compile,3 +/packages?q=Compiled Experience&page=6,Compiled Experience,3 +/packages?q=compiler+warning,compiler warning,3 +/packages?q=component,component,3 +/packages?q=Component&page=16,Component,3 +/packages?q=compress,compress,3 +/packages?q=configuration.entityframework,configuration.entityframework,3 +/packages?q=Configuration&page=7,Configuration,3 +/packages?q=configurationmanager,configurationmanager,3 +/packages?q=configurationoptions,configurationoptions,3 +/packages?q=configurationSection,configurationSection,3 +/packages?q=confluent,confluent,3 +/packages?q=Confluent,Confluent,3 +/packages?q=console+notification,console notification,3 +/packages?q=console+wpf,console wpf,3 +/packages?q=ConsoleTables,ConsoleTables,3 +"/packages?q=Constraint,","Constraint,",3 +/packages?q=contains&page=78,contains,3 +/packages?q=ContinuousIntegration&page=2,ContinuousIntegration,3 +/packages?q=Control&page=36,Control,3 +"/packages?q=Controls,&page=9","Controls,",3 +"/packages?q=controls,&sortOrder=package-download-count&page=3","controls,",3 +/packages?q=controls&page=23,controls,3 +/packages?q=convert&page=15,convert,3 +/packages?q=convert&page=17,convert,3 +/packages?q=convert&page=19,convert,3 +/packages?q=convert&page=9,convert,3 +/packages?q=Convert&sortOrder=package-download-count&page=6&prerelease=False,Convert,3 +/packages?q=convert&sortOrder=relevance&page=2&prerelease=False,convert,3 +/packages?q=Converter&page=4,Converter,3 +/packages?q=coordinates&page=2,coordinates,3 +/packages?q=Core,Core,3 +/packages?q=corecompat.system.drawingv2,corecompat.system.drawingv2,3 +/packages?q=corelibrary.pieroviano,corelibrary.pieroviano,3 +/packages?q=correlation albumprinter,correlation albumprinter,3 +/packages?q=cors,cors,3 +/packages?q=Cors,Cors,3 +/packages?q=cosmos.table,cosmos.table,3 +/packages?q=Couchbase Inc for couchbase-aspnet,Couchbase Inc for couchbase-aspnet,3 +/packages?q=couchbase&sortOrder=package-download-count,couchbase,3 +/packages?q=counter,counter,3 +/packages?q=Counting,Counting,3 +/packages?q=Coverage,Coverage,3 +/packages?q=coveralls,coveralls,3 +/packages?q=coverlet,coverlet,3 +/packages?q=coverlet.collector,coverlet.collector,3 +/packages?q=crash,crash,3 +/packages?q=crawler,crawler,3 +/packages?q=crc16+crc32,crc16 crc32,3 +/packages?q=create&page=66,create,3 +/packages?q=CreateNewNuGetPackageFromProjectAfterEachBuild,CreateNewNuGetPackageFromProjectAfterEachBuild,3 +/packages?q=crm.sdk,crm.sdk,3 +/packages?q=CRM&page=1,CRM,3 +/packages?q=crm&page=15,crm,3 +/packages?q=cronos,cronos,3 +/packages?q=Cropping&sortOrder=relevance&page=1,Cropping,3 +/packages?q=CrossGeolocator,CrossGeolocator,3 +/packages?q=crypto,crypto,3 +/packages?q=crystal,crystal,3 +/packages?q=Crystal,Crystal,3 +/packages?q=CrystalDecisions,CrystalDecisions,3 +/packages?q=CrystalDecisions.CrystalReports.Engine,CrystalDecisions.CrystalReports.Engine,3 +/packages?q=CrystalDecisions.Shared,CrystalDecisions.Shared,3 +/packages?q=CrystalDesicions,CrystalDesicions,3 +/packages?q=crystalquartz,crystalquartz,3 +/packages?q=CrystalQuartz,CrystalQuartz,3 +/packages?q=cscript,cscript,3 +/packages?q=csharp&page=9,csharp,3 +/packages?q=csharp8583,csharp8583,3 +/packages?q=csom+,csom,3 +/packages?q=csp,csp,3 +/packages?q=CSRedisClient+,CSRedisClient,3 +/packages?q=CSS&page=35,CSS,3 +/packages?q=csv c,csv c,3 +/packages?q=csv&page=17,csv,3 +/packages?q=CSV&sortOrder=relevance&page=2,CSV,3 +/packages?q=csvhelper,csvhelper,3 +/packages?q=CsvHelper,CsvHelper,3 +/packages?q=ctrader,ctrader,3 +/packages?q=cucumber,cucumber,3 +/packages?q=cuda,cuda,3 +/packages?q=CUDA,CUDA,3 +/packages?q=currency&page=2,currency,3 +/packages?q=cyrillic,cyrillic,3 +/packages?q=Daniel Mohl&page=20,Daniel Mohl,3 +/packages?q=Daniel Palme&page=10,Daniel Palme,3 +/packages?q=dannycabrera,dannycabrera,3 +/packages?q=dapper.Common,dapper.Common,3 +/packages?q=Dapper.Common,Dapper.Common,3 +/packages?q=dapper.fluentmap.dommel,dapper.fluentmap.dommel,3 +/packages?q=Dapper.Oracle,Dapper.Oracle,3 +/packages?q=dapper.oracle.strongname,dapper.oracle.strongname,3 +/packages?q=Dapper+,Dapper,3 +/packages?q=dapper+1.42,dapper 1.42,3 +/packages?q=dapper+builk,dapper builk,3 +/packages?q=Dapper+Plus,Dapper Plus,3 +/packages?q=DapperExtensions.NetCore,DapperExtensions.NetCore,3 +/packages?q=DAQNavi,DAQNavi,3 +/packages?q=data-access,data-access,3 +/packages?q=data&sortOrder=relevance&page=47&prerelease=False,data,3 +/packages?q=data+movement,data movement,3 +/packages?q=dataaccessfactory,dataaccessfactory,3 +/packages?q=DataAnnotation,DataAnnotation,3 +/packages?q=DataAnnotationsExtensions,DataAnnotationsExtensions,3 +/packages?q=DataBase,DataBase,3 +/packages?q=Datadog.Trace.ClrProfiler.Managed,Datadog.Trace.ClrProfiler.Managed,3 +/packages?q=dataflow,dataflow,3 +"/packages?q=datagrid,&page=4","datagrid,",3 +/packages?q=dataGridView+desctop+C,dataGridView desctop C,3 +/packages?q=datalayer,datalayer,3 +"/packages?q=DataLayer,&page=2","DataLayer,",3 +/packages?q=datastreams,datastreams,3 +/packages?q=datatable,datatable,3 +/packages?q=datatable+view,datatable view,3 +/packages?q=datatables,datatables,3 +/packages?q=Datatables,Datatables,3 +/packages?q=DataVisualization,DataVisualization,3 +/packages?q=DateTime,DateTime,3 +"/packages?q=DateTime,&page=8","DateTime,",3 +/packages?q=datetime&page=3,datetime,3 +/packages?q=datetime+picker,datetime picker,3 +/packages?q=David Hall&sortOrder=relevance&page=4,David Hall,3 +/packages?q=Dawn,Dawn,3 +/packages?q=db2,db2,3 +/packages?q=DB2,DB2,3 +/packages?q=DbContext&page=7,DbContext,3 +/packages?q=DbGrid,DbGrid,3 +/packages?q=DbProvider,DbProvider,3 +/packages?q=DbSet,DbSet,3 +/packages?q=dbupgrade,dbupgrade,3 +/packages?q=dcuapihelper,dcuapihelper,3 +/packages?q=deb,deb,3 +/packages?q=Debugger,Debugger,3 +/packages?q=debugging&page=4,debugging,3 +/packages?q=decompiler,decompiler,3 +/packages?q=decorator,decorator,3 +/packages?q=definitelytyped,definitelytyped,3 +/packages?q=DelegateDecompiler,DelegateDecompiler,3 +/packages?q=DelegatingHandler,DelegatingHandler,3 +/packages?q=dependency.,dependency.,3 +/packages?q=dependencyinjection,dependencyinjection,3 +/packages?q=DependencyInjection,DependencyInjection,3 +"/packages?q=deploy,&page=10","deploy,",3 +/packages?q=deployment,deployment,3 +/packages?q=deserialize,deserialize,3 +/packages?q=deserializer,deserializer,3 +/packages?q=detech+signature,detech signature,3 +"/packages?q=detection,&page=6","detection,",3 +/packages?q=Deusty Designs and the .NET Community&page=562,Deusty Designs and the .NET Community,3 +/packages?q=devart.data.oracle,devart.data.oracle,3 +/packages?q=developerforce.force,developerforce.force,3 +/packages?q=DevExpress,DevExpress,3 +/packages?q=devexpress xamarin,devexpress xamarin,3 +/packages?q=DevExpress.AspNetCore.Reporting,DevExpress.AspNetCore.Reporting,3 +/packages?q=Devexpress.WPF,Devexpress.WPF,3 +/packages?q=devextreme,devextreme,3 +/packages?q=DevExtreme.AspNet.Core.19.1.4,DevExtreme.AspNet.Core.19.1.4,3 +/packages?q=DevExtreme.AspNet.Mvc,DevExtreme.AspNet.Mvc,3 +/packages?q=DevExtreme+,DevExtreme,3 +/packages?q=device&page=4,device,3 +/packages?q=DevOps,DevOps,3 +"/packages?q=DI,&page=15","DI,",3 +"/packages?q=diagnostics,","diagnostics,",3 +/packages?q=Dialogflow,Dialogflow,3 +/packages?q=dictionary,dictionary,3 +"/packages?q=dictionary,","dictionary,",3 +/packages?q=diff-match-patch,diff-match-patch,3 +/packages?q=diff+editor,diff editor,3 +/packages?q=digest&page=2,digest,3 +/packages?q=DinkToPdf,DinkToPdf,3 +/packages?q=DinkToPDF,DinkToPDF,3 +/packages?q=directed,directed,3 +/packages?q=directory,directory,3 +/packages?q=directory&page=1,directory,3 +/packages?q=DirectWrite,DirectWrite,3 +/packages?q=Discord.Addons.Interactive,Discord.Addons.Interactive,3 +/packages?q=dispatcher,dispatcher,3 +/packages?q=distance,distance,3 +/packages?q=Distributed&page=12,Distributed,3 +/packages?q=djangorestframework,djangorestframework,3 +/packages?q=dll&page=27,dll,3 +/packages?q=docker,docker,3 +/packages?q=dockpanel,dockpanel,3 +/packages?q=documentDB,documentDB,3 +/packages?q=documentdb.core,documentdb.core,3 +/packages?q=DocumentFormat.OpenXml,DocumentFormat.OpenXml,3 +/packages?q=documentformat+html,documentformat html,3 +"/packages?q=DOCX+,+Pdf","DOCX , Pdf",3 +/packages?q=docx+html,docx html,3 +/packages?q=DOM,DOM,3 +/packages?q=domain-driven,domain-driven,3 +/packages?q=Domino,Domino,3 +/packages?q=donut,donut,3 +/packages?q=dos.common,dos.common,3 +/packages?q=dosbox,dosbox,3 +/packages?q=dotCover,dotCover,3 +/packages?q=Dotless,Dotless,3 +/packages?q=dotliquid,dotliquid,3 +/packages?q=dotmcs,dotmcs,3 +/packages?q=dotnet-sdk,dotnet-sdk,3 +/packages?q=dotnet-serve,dotnet-serve,3 +/packages?q=DotNet.Xdt,DotNet.Xdt,3 +/packages?q=DotNetCompilerPlatform,DotNetCompilerPlatform,3 +/packages?q=DotNetCore.NPOI+,DotNetCore.NPOI,3 +/packages?q=dotnetnuke.core,dotnetnuke.core,3 +"/packages?q=dotnetzip,","dotnetzip,",3 +/packages?q=dotras,dotras,3 +/packages?q=dottrace,dottrace,3 +/packages?q=download&page=6,download,3 +/packages?q=DPI,DPI,3 +/packages?q=DPL,DPL,3 +"/packages?q=dropdown,&page=1","dropdown,",3 +"/packages?q=dropdown,&page=4","dropdown,",3 +/packages?q=dryioc,dryioc,3 +/packages?q=dryioczero,dryioczero,3 +/packages?q=dto,dto,3 +/packages?q=dto&page=6,dto,3 +/packages?q=dump,dump,3 +/packages?q=Dump,Dump,3 +/packages?q=duoweb,duoweb,3 +/packages?q=dupfinder,dupfinder,3 +/packages?q=DwayneNeed,DwayneNeed,3 +/packages?q=DWG,DWG,3 +/packages?q=Dymo,Dymo,3 +/packages?q=dynamicquery,dynamicquery,3 +"/packages?q=Dynamics,CRM&page=6","Dynamics,CRM",3 +/packages?q=dynamics&page=4,dynamics,3 +/packages?q=dynamo,dynamo,3 +/packages?q=Dynamo visual programming&page=55,Dynamo visual programming,3 +/packages?q=Dynamo visual programming&page=69,Dynamo visual programming,3 +/packages?q=Dynomite,Dynomite,3 +/packages?q=e-mail,e-mail,3 +"/packages?q=ean-13,","ean-13,",3 +"/packages?q=ean,","ean,",3 +/packages?q=EAN128,EAN128,3 +/packages?q=EasyCrud,EasyCrud,3 +/packages?q=easymodbus,easymodbus,3 +/packages?q=eBay,eBay,3 +/packages?q=eBay.com,eBay.com,3 +/packages?q=eBay.Service,eBay.Service,3 +/packages?q=echarts,echarts,3 +/packages?q=eCommerce,eCommerce,3 +/packages?q=eddlonzanida,eddlonzanida,3 +/packages?q=EdgePageLoadStrategy,EdgePageLoadStrategy,3 +/packages?q=EDi,EDi,3 +/packages?q=editable,editable,3 +/packages?q=editor,editor,3 +/packages?q=editor.md,editor.md,3 +/packages?q=editor&page=3,editor,3 +/packages?q=EditorTemplates,EditorTemplates,3 +/packages?q=edmx,edmx,3 +/packages?q=edtFTPnet-PRO,edtFTPnet-PRO,3 +/packages?q=EFCore,EFCore,3 +/packages?q=egonsoft,egonsoft,3 +/packages?q=eigen,eigen,3 +/packages?q=elasticsearch+in+memory+server,elasticsearch in memory server,3 +/packages?q=ElasticsearchQuery,ElasticsearchQuery,3 +/packages?q=elcamino,elcamino,3 +/packages?q=ellipses,ellipses,3 +/packages?q=elmah,elmah,3 +/packages?q=ELMAH&sortOrder=relevance&page=2&prerelease=False,ELMAH,3 +/packages?q=elmish,elmish,3 +/packages?q=elmish.streams,elmish.streams,3 +"/packages?q=Email,&page=19","Email,",3 +/packages?q=embeded,embeded,3 +/packages?q=Ember.js,Ember.js,3 +/packages?q=emdk,emdk,3 +/packages?q=EMF,EMF,3 +/packages?q=emgu+cv,emgu cv,3 +/packages?q=EML,EML,3 +/packages?q=emotes,emotes,3 +/packages?q=empira Software GmbH&page=43,empira Software GmbH,3 +/packages?q=encoding,encoding,3 +/packages?q=encryption,encryption,3 +"/packages?q=Endian,","Endian,",3 +/packages?q=EnergyPlus,EnergyPlus,3 +/packages?q=enigmatry,enigmatry,3 +/packages?q=enigmatry&prerel=false,enigmatry,3 +/packages?q=enterprise library&page=2,enterprise library,3 +/packages?q=enterprise library&page=229,enterprise library,3 +/packages?q=EnterpriseLibrary,EnterpriseLibrary,3 +/packages?q=EnterpriseLibrary.TransientFaultHandling,EnterpriseLibrary.TransientFaultHandling,3 +/packages?q=entity framework&page=15,entity framework,3 +/packages?q=entity+framework+4.4.0.0,entity framework 4.4.0.0,3 +/packages?q=Entity+Framework+Core,Entity Framework Core,3 +/packages?q=entity+framework+core+Bulk,entity framework core Bulk,3 +/packages?q=Entity+framework+effort,Entity framework effort,3 +/packages?q=entity+framework+extension,entity framework extension,3 +/packages?q=Entity+Framework+tools,Entity Framework tools,3 +/packages?q=EntityFramework,EntityFramework,3 +/packages?q=EntityFrameWork,EntityFrameWork,3 +/packages?q=Entityframework.core,Entityframework.core,3 +/packages?q=EntityFramework.Extended,EntityFramework.Extended,3 +/packages?q=EntityFramework&page=47,EntityFramework,3 +/packages?q=EntityFramework+6.2.0,EntityFramework 6.2.0,3 +/packages?q=EntityFramework+bulk+insert+ef+4.5.2,EntityFramework bulk insert ef 4.5.2,3 +/packages?q=entityframework+core+design,entityframework core design,3 +/packages?q=EntityFroameowrk,EntityFroameowrk,3 +/packages?q=entlib6,entlib6,3 +/packages?q=EntotyFramework,EntotyFramework,3 +/packages?q=Enum,Enum,3 +/packages?q=environmentVariables,environmentVariables,3 +/packages?q=EPPLUS,EPPLUS,3 +/packages?q=EPPlus+,EPPlus,3 +/packages?q=epplus+mvc,epplus mvc,3 +/packages?q=eqtec,eqtec,3 +/packages?q=equin.applicationframework.bin,equin.applicationframework.bin,3 +/packages?q=ERP,ERP,3 +/packages?q=esc/pos+,esc/pos,3 +/packages?q=escape,escape,3 +/packages?q=esent,esent,3 +/packages?q=Eshopworld.Generators,Eshopworld.Generators,3 +/packages?q=esia.net,esia.net,3 +/packages?q=Etl,Etl,3 +"/packages?q=etl,","etl,",3 +/packages?q=etl&prerel=false,etl,3 +/packages?q=eto,eto,3 +/packages?q=Etsy,Etsy,3 +/packages?q=ETW&page=2,ETW,3 +/packages?q=European,European,3 +/packages?q=evaluator&page=2,evaluator,3 +/packages?q=Event&sortOrder=relevance&page=1&prerelease=False,Event,3 +/packages?q=EventAggregator,EventAggregator,3 +/packages?q=eventlog,eventlog,3 +/packages?q=EventLogNotFoundException,EventLogNotFoundException,3 +/packages?q=eventstore&sortOrder=package-download-count,eventstore,3 +/packages?q=everdroid.activity.core,everdroid.activity.core,3 +/packages?q=Evernote,Evernote,3 +/packages?q=evoleap,evoleap,3 +/packages?q=evopdf,evopdf,3 +/packages?q=excel&page=11,excel,3 +/packages?q=excel+html,excel html,3 +/packages?q=ExcelData,ExcelData,3 +/packages?q=exceldna,exceldna,3 +/packages?q=ExcelFinancialFunctions,ExcelFinancialFunctions,3 +/packages?q=ExcelNumberFormat+,ExcelNumberFormat,3 +/packages?q=ExcelReport,ExcelReport,3 +/packages?q=exception,exception,3 +/packages?q=Exclude,Exclude,3 +/packages?q=Executable&page=3,Executable,3 +/packages?q=execute,execute,3 +/packages?q=execute+timed+task,execute timed task,3 +/packages?q=expandframework,expandframework,3 +/packages?q=expat,expat,3 +/packages?q=expecto,expecto,3 +/packages?q=expertpdf,expertpdf,3 +/packages?q=expressioncache,expressioncache,3 +/packages?q=ExpressionVisitor,ExpressionVisitor,3 +/packages?q=ext,ext,3 +/packages?q=Extended&page=2,Extended,3 +/packages?q=extension-method,extension-method,3 +/packages?q=extension-methods,extension-methods,3 +/packages?q=extensions.configuration.memory,extensions.configuration.memory,3 +/packages?q=extensions.http,extensions.http,3 +/packages?q=F#+excelwrite,F,3 +/packages?q=fable,fable,3 +/packages?q=Fable.Browser.Websocket,Fable.Browser.Websocket,3 +/packages?q=Fable.Electron,Fable.Electron,3 +/packages?q=fable.elmish.nile,fable.elmish.nile,3 +/packages?q=fable.fontawesome,fable.fontawesome,3 +/packages?q=fable.localstorage,fable.localstorage,3 +/packages?q=fable.promise,fable.promise,3 +/packages?q=Facebook,Facebook,3 +/packages?q=Fairway Technologies,Fairway Technologies,3 +/packages?q=fake,fake,3 +/packages?q=Faker.Portable,Faker.Portable,3 +/packages?q=Farseer Physics Engine&page=2,Farseer Physics Engine,3 +/packages?q=faster,faster,3 +/packages?q=Fasterflect,Fasterflect,3 +/packages?q=FastMember+,FastMember,3 +/packages?q=FastZip,FastZip,3 +/packages?q=FB,FB,3 +/packages?q=feature toggle&page=9,feature toggle,3 +/packages?q=FeatureToggle&page=2,FeatureToggle,3 +/packages?q=feed,feed,3 +/packages?q=feliz,feliz,3 +/packages?q=fiddler,fiddler,3 +/packages?q=FIDO,FIDO,3 +/packages?q=FIFO+Queue+sqlserver+,FIFO Queue sqlserver,3 +/packages?q=file+encrpyt,file encrpyt,3 +/packages?q=file+helper,file helper,3 +/packages?q=file+pattern+exclude,file pattern exclude,3 +/packages?q=filepicker,filepicker,3 +/packages?q=Files&page=56,Files,3 +/packages?q=filesystemwatcher,filesystemwatcher,3 +/packages?q=FileZilla,FileZilla,3 +/packages?q=Filter&page=4,Filter,3 +/packages?q=fingerprint,fingerprint,3 +/packages?q=firebase,firebase,3 +/packages?q=Firebase-Auth,Firebase-Auth,3 +/packages?q=firestore,firestore,3 +/packages?q=Fix,Fix,3 +/packages?q=flac,flac,3 +/packages?q=flat+files+xml+,flat files xml,3 +/packages?q=Fleck,Fleck,3 +/packages?q=flow&page=6,flow,3 +/packages?q=Fluent,Fluent,3 +/packages?q=Fluent+Validation,Fluent Validation,3 +/packages?q=fluentlayout,fluentlayout,3 +/packages?q=fluentMigrator,fluentMigrator,3 +/packages?q=FluentMigrator,FluentMigrator,3 +/packages?q=fluentmigrator.runner,fluentmigrator.runner,3 +/packages?q=fluentvalidation,fluentvalidation,3 +/packages?q=FluentValidation.Results,FluentValidation.Results,3 +/packages?q=fluid.core,fluid.core,3 +/packages?q=flurl.http,flurl.http,3 +/packages?q=fo-dicom,fo-dicom,3 +/packages?q=fo+dicom,fo dicom,3 +/packages?q=Fody,Fody,3 +/packages?q=FodyWeavers,FodyWeavers,3 +/packages?q=font+awesom,font awesom,3 +/packages?q=font+awesone,font awesone,3 +/packages?q=foolproofcore,foolproofcore,3 +/packages?q=formatting,formatting,3 +"/packages?q=formula,","formula,",3 +/packages?q=foundatio+redis,foundatio redis,3 +/packages?q=FParser,FParser,3 +/packages?q=framwork+windform,framwork windform,3 +/packages?q=free chat api&page=169,free chat api,3 +/packages?q=free chat api&page=171,free chat api,3 +/packages?q=free+barcode,free barcode,3 +/packages?q=free+chat+api,free chat api,3 +/packages?q=free+spphire,free spphire,3 +/packages?q=freeimage,freeimage,3 +/packages?q=freetype6,freetype6,3 +/packages?q=fscheck,fscheck,3 +/packages?q=FSharp.Compiler.Services,FSharp.Compiler.Services,3 +/packages?q=fsharp.core,fsharp.core,3 +/packages?q=Fsharp.Core,Fsharp.Core,3 +/packages?q=fsharp.data.graphql,fsharp.data.graphql,3 +/packages?q=fsharp+core+data,fsharp core data,3 +/packages?q=FSharpLint.Core,FSharpLint.Core,3 +/packages?q=FTCAPI.dll,FTCAPI.dll,3 +/packages?q=Ftp&page=4,Ftp,3 +/packages?q=Ftp&page=6,Ftp,3 +/packages?q=FTpClient,FTpClient,3 +/packages?q=ftps,ftps,3 +/packages?q=FTPS,FTPS,3 +/packages?q=ftps&page=3,ftps,3 +/packages?q=Fullcalendar,Fullcalendar,3 +/packages?q=functions.extensions,functions.extensions,3 +/packages?q=funq,funq,3 +/packages?q=gabriel,gabriel,3 +/packages?q=game,game,3 +/packages?q=gamedev,gamedev,3 +/packages?q=gatt,gatt,3 +/packages?q=gauge+screenshot,gauge screenshot,3 +/packages?q=GaussNewton,GaussNewton,3 +/packages?q=GCC,GCC,3 +/packages?q=gcode,gcode,3 +/packages?q=GDAL+binary+32+1500,GDAL binary 32 1500,3 +/packages?q=gdata,gdata,3 +/packages?q=gelf4net,gelf4net,3 +/packages?q=Gemini,Gemini,3 +/packages?q=Gemini.Modules,Gemini.Modules,3 +/packages?q=generic+database+factory,generic database factory,3 +/packages?q=GenericRepository&page=4,GenericRepository,3 +/packages?q=geneticsharp,geneticsharp,3 +/packages?q=Geo&page=7,Geo,3 +/packages?q=Geocoding.Here,Geocoding.Here,3 +/packages?q=GeoHeights,GeoHeights,3 +/packages?q=germstone,germstone,3 +/packages?q=getit,getit,3 +/packages?q=getlatest,getlatest,3 +/packages?q=gfkeogh,gfkeogh,3 +/packages?q=gherkin,gherkin,3 +/packages?q=Ghostscript.NET,Ghostscript.NET,3 +"/packages?q=Gif,","Gif,",3 +/packages?q=giraffe,giraffe,3 +/packages?q=GIS,GIS,3 +"/packages?q=GitHub,&page=20","GitHub,",3 +/packages?q=GitSharp,GitSharp,3 +/packages?q=Glass.Mapper,Glass.Mapper,3 +/packages?q=Glass.Mapper.Sc.81,Glass.Mapper.Sc.81,3 +/packages?q=Glass.Mapper.Sc.90,Glass.Mapper.Sc.90,3 +/packages?q=glimpse,glimpse,3 +/packages?q=glm,glm,3 +/packages?q=Global,Global,3 +/packages?q=Globalization&page=5,Globalization,3 +/packages?q=Globals.LoggedInUser+=+t.Result.Profile,Globals.LoggedInUser = t.Result.Profile,3 +/packages?q=GlobalStore,GlobalStore,3 +/packages?q=glog,glog,3 +/packages?q=Gmail,Gmail,3 +/packages?q=GMap,GMap,3 +/packages?q=gmaps,gmaps,3 +/packages?q=gnuboard5,gnuboard5,3 +/packages?q=gnupg,gnupg,3 +/packages?q=gofer.net,gofer.net,3 +/packages?q=gong,gong,3 +/packages?q=Google.Api.Gax.Gr,Google.Api.Gax.Gr,3 +/packages?q=Google.Api.Gax.Grpc,Google.Api.Gax.Grpc,3 +/packages?q=google.apis,google.apis,3 +/packages?q=Google.Apis,Google.Apis,3 +/packages?q=Google.APis,Google.APis,3 +/packages?q=Google.Apis.acceleratedmobilepageurl&prerelease=true&sortOrder=relevance,Google.Apis.acceleratedmobilepageurl,3 +/packages?q=Google.Apis.adexchangebuyer&prerelease=true&sortOrder=relevance,Google.Apis.adexchangebuyer,3 +/packages?q=Google.Apis.Admin.Directory.directory_v1,Google.Apis.Admin.Directory.directory_v1,3 +/packages?q=Google.Apis.adsense&prerelease=true&sortOrder=relevance,Google.Apis.adsense,3 +/packages?q=Google.Apis.adsensehost&prerelease=true&sortOrder=relevance,Google.Apis.adsensehost,3 +/packages?q=Google.Apis.alertcenter&prerelease=true&sortOrder=relevance,Google.Apis.alertcenter,3 +/packages?q=Google.Apis.androidmanagement&prerelease=true&sortOrder=relevance,Google.Apis.androidmanagement,3 +/packages?q=Google.Apis.bigquery&prerelease=true&sortOrder=relevance,Google.Apis.bigquery,3 +/packages?q=Google.Apis.classroom&prerelease=true&sortOrder=relevance,Google.Apis.classroom,3 +/packages?q=Google.Apis.cloudkms&prerelease=true&sortOrder=relevance,Google.Apis.cloudkms,3 +/packages?q=Google.Apis.CloudNaturalLanguageAPI&prerelease=true&sortOrder=relevance,Google.Apis.CloudNaturalLanguageAPI,3 +/packages?q=Google.Apis.compute&prerelease=true&sortOrder=relevance,Google.Apis.compute,3 +/packages?q=Google.Apis.Core,Google.Apis.Core,3 +/packages?q=Google.Apis.dfareporting&prerelease=true&sortOrder=relevance,Google.Apis.dfareporting,3 +/packages?q=Google.Apis.Dfareporting&prerelease=true&sortOrder=relevance,Google.Apis.Dfareporting,3 +/packages?q=Google.Apis.dlp&prerelease=true&sortOrder=relevance,Google.Apis.dlp,3 +/packages?q=Google.Apis.doubleclickbidmanager&prerelease=true&sortOrder=relevance,Google.Apis.doubleclickbidmanager,3 +/packages?q=google.apis.drive&prerelease=true&sortOrder=relevance,google.apis.drive,3 +/packages?q=Google.Apis.file&prerelease=true&sortOrder=relevance,Google.Apis.file,3 +/packages?q=Google.Apis.firebaserules&prerelease=true&sortOrder=relevance,Google.Apis.firebaserules,3 +/packages?q=Google.Apis.fusiontables&prerelease=true&sortOrder=relevance,Google.Apis.fusiontables,3 +/packages?q=Google.Apis.games&prerelease=true&sortOrder=relevance,Google.Apis.games,3 +/packages?q=Google.Apis.iap&prerelease=true&sortOrder=relevance,Google.Apis.iap,3 +/packages?q=Google.Apis.playcustomapp&prerelease=true&sortOrder=relevance,Google.Apis.playcustomapp,3 +/packages?q=Google.Apis.sqladmin&prerelease=true&sortOrder=relevance,Google.Apis.sqladmin,3 +/packages?q=Google.Apis.tasks&prerelease=true&sortOrder=relevance,Google.Apis.tasks,3 +/packages?q=Google.Apis.webfonts&prerelease=true&sortOrder=relevance,Google.Apis.webfonts,3 +/packages?q=Google.Apis.youtubeAnalytics&prerelease=true&sortOrder=relevance,Google.Apis.youtubeAnalytics,3 +/packages?q=google.apis&prerel=false,google.apis,3 +/packages?q=Google.Cloud,Google.Cloud,3 +/packages?q=Google.Cloud.AspNetCore&source=post_page---------------------------,Google.Cloud.AspNetCore,3 +/packages?q=Google.OR.Tools,Google.OR.Tools,3 +"/packages?q=Google.Visualization,","Google.Visualization,",3 +/packages?q=google+apis,google apis,3 +/packages?q=google+calendar,google calendar,3 +/packages?q=google+free+api,google free api,3 +/packages?q=google+maps,google maps,3 +/packages?q=Google+Play+Services,Google Play Services,3 +/packages?q=google+speech+to+text,google speech to text,3 +/packages?q=googleIMA+ios,googleIMA ios,3 +/packages?q=GooglePlayServices+Ads,GooglePlayServices Ads,3 +/packages?q=GoServicePro.Webservices+1.2.0+GoServicePro+Webservices+GoServicePro+Webservices++Package+Manager+.NET+CLI+PackageReference+Paket+CLI+Install-Package+GoServicePro.Webservices+-Version+1.2.0++Dependencies++GitHub+Usage++Version+History,GoServicePro.Webservices 1.2.0 GoServicePro Webservices GoServicePro Webservices Package Manager .NET CLI PackageReference Paket CLI Install-Package GoServicePro.Webservices -Version 1.2.0 Dependencies GitHub Usage Version History,3 +/packages?q=gpstools.net,gpstools.net,3 +/packages?q=GrapeCity.Documents,GrapeCity.Documents,3 +/packages?q=graphic&page=2,graphic,3 +/packages?q=graphics,graphics,3 +/packages?q=graphml,graphml,3 +/packages?q=graphql,graphql,3 +/packages?q=graphql-dotnet,graphql-dotnet,3 +/packages?q=graphql.client,graphql.client,3 +/packages?q=graphql+builder+.net+core,graphql builder .net core,3 +/packages?q=graphql+dynamic,graphql dynamic,3 +/packages?q=grayscale,grayscale,3 +/packages?q=Grayscale&page=1,Grayscale,3 +/packages?q=greenvile+near+indiana,greenvile near indiana,3 +/packages?q=Greg Young,Greg Young,3 +"/packages?q=Grid,&page=5","Grid,",3 +"/packages?q=grid,&page=7","grid,",3 +/packages?q=gridview&page=1,gridview,3 +/packages?q=GridView&page=2,GridView,3 +/packages?q=gRPC,gRPC,3 +/packages?q=Grpc.AspNetCore.Server,Grpc.AspNetCore.Server,3 +/packages?q=Grpc.Core,Grpc.Core,3 +/packages?q=Grpc.Net.Client,Grpc.Net.Client,3 +/packages?q=gtk,gtk,3 +/packages?q=Gtk,Gtk,3 +/packages?q=gtk-sharp,gtk-sharp,3 +/packages?q=Gu.Wpf.PropertyGrid,Gu.Wpf.PropertyGrid,3 +"/packages?q=gui,","gui,",3 +/packages?q=guid,guid,3 +/packages?q=guilherme+caixeta,guilherme caixeta,3 +/packages?q=hadoop,hadoop,3 +/packages?q=handle&page=12,handle,3 +/packages?q=hangfire storage&page=5,hangfire storage,3 +/packages?q=Hangfire.Dashboard.Authorization,Hangfire.Dashboard.Authorization,3 +/packages?q=hangfire.rabbit,hangfire.rabbit,3 +/packages?q=Hangfire.Sqlite,Hangfire.Sqlite,3 +/packages?q=hardware,hardware,3 +/packages?q=Hardware,Hardware,3 +/packages?q=hashwords,hashwords,3 +/packages?q=hbase,hbase,3 +/packages?q=HDF5DotNet,HDF5DotNet,3 +/packages?q=health&page=10,health,3 +/packages?q=heap,heap,3 +/packages?q=hedgehog-experimental&sortOrder=package-download-count,hedgehog-experimental,3 +/packages?q=hedgehog&sortOrder=package-download-count,hedgehog,3 +/packages?q=HelixToolkit,HelixToolkit,3 +/packages?q=hello.js,hello.js,3 +/packages?q=helper,helper,3 +/packages?q=HeyCoder.AspNetCore.MvcPager,HeyCoder.AspNetCore.MvcPager,3 +/packages?q=hiera,hiera,3 +/packages?q=highlight,highlight,3 +/packages?q=history,history,3 +/packages?q=hmac&page=3,hmac,3 +/packages?q=Holiday,Holiday,3 +/packages?q=Hololens+,Hololens,3 +/packages?q=hot+towel,hot towel,3 +/packages?q=Hotcache,Hotcache,3 +/packages?q=HotChocolate.AspNetCore,HotChocolate.AspNetCore,3 +/packages?q=how+to+remove+advertising+windows+phone+lumia,how to remove advertising windows phone lumia,3 +/packages?q=hpsocket&tdsourcetag=s_pcqq_aiomsg,hpsocket,3 +/packages?q=hpsocket&tdsourcetag=s_pctim_aiomsg,hpsocket,3 +/packages?q=HSL,HSL,3 +/packages?q=HTML&page=11,HTML,3 +/packages?q=Html&page=46,Html,3 +/packages?q=html+agilit,html agilit,3 +/packages?q=html+pdf,html pdf,3 +/packages?q=html+to+pdf+,html to pdf,3 +/packages?q=html5-boilerplate,html5-boilerplate,3 +"/packages?q=html5,&page=33","html5,",3 +"/packages?q=Html5,&page=9","Html5,",3 +/packages?q=html5&page=14,html5,3 +/packages?q=HtmlHelper,HtmlHelper,3 +"/packages?q=HtmlHelper,","HtmlHelper,",3 +/packages?q=HttoContent+net+core,HttoContent net core,3 +"/packages?q=http,&page=76","http,",3 +/packages?q=HttpContext.Current,HttpContext.Current,3 +"/packages?q=HttpModule,","HttpModule,",3 +/packages?q=HTTPS&page=127,HTTPS,3 +/packages?q=HttpServerChannel,HttpServerChannel,3 +/packages?q=Hubble.Core,Hubble.Core,3 +/packages?q=hyperscan,hyperscan,3 +/packages?q=i18N,i18N,3 +/packages?q=i18N&page=3,i18N,3 +/packages?q=i18n&sortOrder=package-download-count,i18n,3 +/packages?q=i18next,i18next,3 +/packages?q=ib,ib,3 +/packages?q=IBAN,IBAN,3 +/packages?q=IBM WebSphere MQ,IBM WebSphere MQ,3 +/packages?q=IBM.Data,IBM.Data,3 +/packages?q=ibm.data.db2,ibm.data.db2,3 +/packages?q=IBM.Data.DB2.dll,IBM.Data.DB2.dll,3 +/packages?q=IBundleTransform,IBundleTransform,3 +"/packages?q=iCal,","iCal,",3 +/packages?q=ical.net,ical.net,3 +/packages?q=ICO,ICO,3 +/packages?q=ICommunicationListeners,ICommunicationListeners,3 +/packages?q=icon,icon,3 +/packages?q=ICSharpCode,ICSharpCode,3 +/packages?q=icu+net,icu net,3 +/packages?q=ID3,ID3,3 +/packages?q=idbconnection,idbconnection,3 +/packages?q=IDbContext,IDbContext,3 +/packages?q=identity&page=22,identity,3 +/packages?q=identity+core+,identity core,3 +/packages?q=IdentityExpress.Manager.Api.Community,IdentityExpress.Manager.Api.Community,3 +/packages?q=identitymodel,identitymodel,3 +/packages?q=IdentityModel,IdentityModel,3 +/packages?q=IdentityModel.OidcClient,IdentityModel.OidcClient,3 +/packages?q=IdentityModel&page=4,IdentityModel,3 +/packages?q=identityserver3,identityserver3,3 +/packages?q=IdentityServer4.2.3.2,IdentityServer4.2.3.2,3 +/packages?q=IdentityServer4.AccessTokenValidation,IdentityServer4.AccessTokenValidation,3 +/packages?q=IdentityServer4.AspNetIdentity,IdentityServer4.AspNetIdentity,3 +/packages?q=idintity,idintity,3 +/packages?q=iedriver,iedriver,3 +/packages?q=IEnumerable,IEnumerable,3 +"/packages?q=If+this+error+persists,+it+is+possible+that+this+site+uses+an+unsupported+protocol+or+cipher+suite+such+as+RC4","If this error persists, it is possible that this site uses an unsupported protocol or cipher suite such as RC4",3 +/packages?q=iGrid,iGrid,3 +/packages?q=il&page=3,il,3 +/packages?q=ILLink.Tasks,ILLink.Tasks,3 +/packages?q=ILSpy+decompile+vb,ILSpy decompile vb,3 +"/packages?q=Image,&page=35","Image,",3 +/packages?q=Image&page=15,Image,3 +/packages?q=image+recognition,image recognition,3 +/packages?q=imagemagic,imagemagic,3 +/packages?q=ImageMagick,ImageMagick,3 +/packages?q=imageresizer,imageresizer,3 +"/packages?q=images,&page=15","images,",3 +/packages?q=include&page=16,include,3 +/packages?q=Indicator,Indicator,3 +/packages?q=Indicator&page=2,Indicator,3 +/packages?q=indigo,indigo,3 +/packages?q=inflector,inflector,3 +/packages?q=information&page=35,information,3 +/packages?q=Informix,Informix,3 +/packages?q=Infragistics,Infragistics,3 +/packages?q=ini file&page=5,ini file,3 +/packages?q=ini+file,ini file,3 +/packages?q=init&sortOrder=package-download-count&page=2,init,3 +/packages?q=injection&page=34,injection,3 +/packages?q=InjectNetCoreFrameworkBlockIfLockFileExists,InjectNetCoreFrameworkBlockIfLockFileExists,3 +/packages?q=InlineKeyboardButton,InlineKeyboardButton,3 +"/packages?q=INotifyDataErrorInfo,","INotifyDataErrorInfo,",3 +/packages?q=inotifypropertychanged,inotifypropertychanged,3 +"/packages?q=INotifyPropertyChanged,","INotifyPropertyChanged,",3 +/packages?q=Instagram&prerel=false,Instagram,3 +/packages?q=Install-Package+Auth0.AuthenticationApi,Install-Package Auth0.AuthenticationApi,3 +/packages?q=Install-Package+Microsoft.AspNet.WebApi+-IncludePrerelease,Install-Package Microsoft.AspNet.WebApi -IncludePrerelease,3 +/packages?q=Install-Package+Microsoft.AspNetCore.All,Install-Package Microsoft.AspNetCore.All,3 +/packages?q=Install-Package+Microsoft.EntityFrameworkCore.SqlServer,Install-Package Microsoft.EntityFrameworkCore.SqlServer,3 +/packages?q=install+package+override+dependency,install package override dependency,3 +"/packages?q=Installation,","Installation,",3 +/packages?q=Installer&page=5,Installer,3 +/packages?q=instant+client,instant client,3 +/packages?q=Intellisense&sortOrder=relevance&page=2&prerelease=False,Intellisense,3 +/packages?q=intelmkl,intelmkl,3 +/packages?q=interactive,interactive,3 +/packages?q=Interface,Interface,3 +"/packages?q=interface,&page=47","interface,",3 +/packages?q=Interop.LabelManager2,Interop.LabelManager2,3 +/packages?q=Interop.WIA,Interop.WIA,3 +/packages?q=interop&page=18,interop,3 +/packages?q=interprocess-communication,interprocess-communication,3 +/packages?q=Intuit,Intuit,3 +/packages?q=inventpr,inventpr,3 +/packages?q=Invoice,Invoice,3 +/packages?q=Ionic.Zip,Ionic.Zip,3 +/packages?q=iOS,iOS,3 +/packages?q=ip+camera,ip camera,3 +/packages?q=IPAddress,IPAddress,3 +/packages?q=IPL,IPL,3 +/packages?q=IPNetwork2,IPNetwork2,3 +/packages?q=ironocr+languages,ironocr languages,3 +/packages?q=IronPDF,IronPDF,3 +/packages?q=Irony.Core,Irony.Core,3 +"/packages?q=ISO,","ISO,",3 +/packages?q=iso&prerel=false,iso,3 +/packages?q=iso3166&page=1,iso3166,3 +/packages?q=IsolatedStorage,IsolatedStorage,3 +/packages?q=Isolation,Isolation,3 +/packages?q=Itext7,Itext7,3 +/packages?q=iTextAsian,iTextAsian,3 +/packages?q=iTextSharp,iTextSharp,3 +/packages?q=iTextSharp+Core,iTextSharp Core,3 +/packages?q=ithit,ithit,3 +/packages?q=ithit&fbclid=IwAR1p30ILz1lHqv1Xftebl_uhYkHLhl-oDo4ScyQVdvOyPOTzv1Ga_pI3HQ0,ithit,3 +/packages?q=ivinf13,ivinf13,3 +/packages?q=IVSPackagemetadata,IVSPackagemetadata,3 +/packages?q=IWebHostEnvironment,IWebHostEnvironment,3 +/packages?q=iXBRL,iXBRL,3 +/packages?q=jabber,jabber,3 +/packages?q=Jan Kallman,Jan Kallman,3 +/packages?q=Japanese,Japanese,3 +/packages?q=Java,Java,3 +/packages?q=Javascript .Net,Javascript .Net,3 +/packages?q=Javascript .Net&page=1144,Javascript .Net,3 +/packages?q=Javascript .Net&page=831,Javascript .Net,3 +/packages?q=JavaScript&page=16,JavaScript,3 +/packages?q=JavaScriptEngineSwitcher,JavaScriptEngineSwitcher,3 +/packages?q=JavaScriptSerializer,JavaScriptSerializer,3 +/packages?q=Jcrop,Jcrop,3 +/packages?q=Jeff Doolittle,Jeff Doolittle,3 +/packages?q=Jeff Heaton&page=43,Jeff Heaton,3 +/packages?q=jellequin,jellequin,3 +/packages?q=jeremyansel.directx,jeremyansel.directx,3 +/packages?q=jetbrains annotations&sortOrder=package-download-count,jetbrains annotations,3 +/packages?q=JetBrains.Annotations.2018.3.0,JetBrains.Annotations.2018.3.0,3 +/packages?q=JetBrains+,JetBrains,3 +/packages?q=jeylabs,jeylabs,3 +/packages?q=JMeter,JMeter,3 +"/packages?q=Jonathan ""Peli"" de Halleux&page=48","Jonathan ""Peli"" de Halleux",3 +/packages?q=JonSkeet.MiscUtil+,JonSkeet.MiscUtil,3 +/packages?q=Josh Garverick (Obliteracy Dot Net)&page=730,Josh Garverick (Obliteracy Dot Net),3 +/packages?q=JPEG2000,JPEG2000,3 +/packages?q=jQuery Mobile in ASP.NET MVC 5&page=46,jQuery Mobile in ASP.NET MVC 5,3 +/packages?q=jQuery Mobile in ASP.NET MVC 5&page=48,jQuery Mobile in ASP.NET MVC 5,3 +/packages?q=jQuery Mobile in ASP.NET MVC 5&page=6,jQuery Mobile in ASP.NET MVC 5,3 +/packages?q=jquery-3.3.1.slim,jquery-3.3.1.slim,3 +/packages?q=jquery-mobile-flat-ui-theme,jquery-mobile-flat-ui-theme,3 +"/packages?q=jQuery,&page=12","jQuery,",3 +/packages?q=jquery.min.js,jquery.min.js,3 +/packages?q=jquery.mousewheel,jquery.mousewheel,3 +/packages?q=jquery.signalR-2.2.3.js,jquery.signalR-2.2.3.js,3 +/packages?q=jquery.validation,jquery.validation,3 +/packages?q=JQuery&page=11,JQuery,3 +/packages?q=Jquery&page=52,Jquery,3 +/packages?q=jquery+1.10.2,jquery 1.10.2,3 +/packages?q=JQuery+Mask,JQuery Mask,3 +/packages?q=jQuery+Tag,jQuery Tag,3 +/packages?q=jquery+ui,jquery ui,3 +/packages?q=jqueryui,jqueryui,3 +/packages?q=jquiry+font,jquiry font,3 +/packages?q=jQurey+Notification,jQurey Notification,3 +/packages?q=jQurry+Tags-it,jQurry Tags-it,3 +/packages?q=jrevolt,jrevolt,3 +/packages?q=js&page=23,js,3 +/packages?q=jshint,jshint,3 +/packages?q=jsm,jsm,3 +/packages?q=Json,Json,3 +/packages?q=json-serialize,json-serialize,3 +/packages?q=JSON.NET,JSON.NET,3 +/packages?q=JSON&page=37,JSON,3 +/packages?q=JsonRpc,JsonRpc,3 +/packages?q=jstree,jstree,3 +/packages?q=jwt,jwt,3 +/packages?q=kafka-net,kafka-net,3 +/packages?q=kaliko,kaliko,3 +/packages?q=kaltura-client,kaltura-client,3 +/packages?q=KellermanSoftware,KellermanSoftware,3 +/packages?q=Kendo UI&page=42,Kendo UI,3 +/packages?q=kendo ui&page=63,kendo ui,3 +/packages?q=kendo.gird,kendo.gird,3 +/packages?q=kendo+mvc+5,kendo mvc 5,3 +/packages?q=KendoUI,KendoUI,3 +/packages?q=KendoUICore,KendoUICore,3 +/packages?q=KentorOwinCookieSaver,KentorOwinCookieSaver,3 +/packages?q=kestrel,kestrel,3 +/packages?q=Kevin Berridge&page=10,Kevin Berridge,3 +/packages?q=key&page=27,key,3 +/packages?q=keyboard+winform,keyboard winform,3 +/packages?q=KeyValue,KeyValue,3 +"/packages?q=Kinect,","Kinect,",3 +/packages?q=kinesisConsumer,kinesisConsumer,3 +/packages?q=Kiosk,Kiosk,3 +/packages?q=Korzh.DbTool,Korzh.DbTool,3 +/packages?q=KryptonToolkitSuite5/,KryptonToolkitSuite5/,3 +/packages?q=kudocode,kudocode,3 +/packages?q=lambda,lambda,3 +/packages?q=language server&sortOrder=package-download-count,language server,3 +/packages?q=languages&page=11,languages,3 +/packages?q=latitude,latitude,3 +/packages?q=launcher,launcher,3 +/packages?q=layout,layout,3 +/packages?q=Leadtools,Leadtools,3 +/packages?q=Leadtools.Viewer.Controls,Leadtools.Viewer.Controls,3 +/packages?q=Lee Irving Barlin,Lee Irving Barlin,3 +/packages?q=lesscss,lesscss,3 +/packages?q=levelDB-vc120,levelDB-vc120,3 +/packages?q=Lex,Lex,3 +/packages?q=libav,libav,3 +/packages?q=libevince,libevince,3 +/packages?q=libfabric,libfabric,3 +/packages?q=libgit2,libgit2,3 +/packages?q=libnmap,libnmap,3 +/packages?q=libphonenumber,libphonenumber,3 +/packages?q=libpng,libpng,3 +/packages?q=Library&page=68,Library,3 +/packages?q=librdkafka,librdkafka,3 +/packages?q=Libsodium,Libsodium,3 +/packages?q=libspatialite,libspatialite,3 +/packages?q=libupnp,libupnp,3 +/packages?q=Libvlc+,Libvlc,3 +/packages?q=libvlcsharp,libvlcsharp,3 +/packages?q=libxsmm,libxsmm,3 +/packages?q=lifetime,lifetime,3 +/packages?q=Light&sortOrder=package-download-count&page=4,Light,3 +/packages?q=Lijun(Copied from Tim Heuer)&page=136,Lijun(Copied from Tim Heuer),3 +/packages?q=Lijun(Copied from Tim Heuer)&page=98,Lijun(Copied from Tim Heuer),3 +/packages?q=Limilabs,Limilabs,3 +/packages?q=line+graphs,line graphs,3 +/packages?q=LinkedIn,LinkedIn,3 +/packages?q=Links&page=2,Links,3 +/packages?q=linq,linq,3 +/packages?q=LINQ,LINQ,3 +/packages?q=LINQ to LDAP,LINQ to LDAP,3 +"/packages?q=Linq,&page=2","Linq,",3 +/packages?q=Linqkit,Linqkit,3 +/packages?q=LINQKit.Core,LINQKit.Core,3 +/packages?q=LinqOptimizer,LinqOptimizer,3 +/packages?q=ListBox,ListBox,3 +/packages?q=listview drag drop,listview drag drop,3 +/packages?q=litedb,litedb,3 +/packages?q=litenetlib,litenetlib,3 +/packages?q=LiteX.HealthChecks&source=post_page---------------------------,LiteX.HealthChecks,3 +/packages?q=litjson,litjson,3 +/packages?q=livecharts,livecharts,3 +/packages?q=LLBLGen,LLBLGen,3 +/packages?q=load&page=14,load,3 +/packages?q=locks,locks,3 +/packages?q=LOG4NET,LOG4NET,3 +/packages?q=log4net appender&page=21,log4net appender,3 +/packages?q=log4net.1.2.13,log4net.1.2.13,3 +/packages?q=log4net.Ext.Json,log4net.Ext.Json,3 +/packages?q=log4net+,log4net,3 +/packages?q=log4net+1.2,log4net 1.2,3 +/packages?q=log4net+appender,log4net appender,3 +/packages?q=Log4NetAdapter,Log4NetAdapter,3 +/packages?q=logexptert,logexptert,3 +"/packages?q=logger,&page=23","logger,",3 +/packages?q=logging,logging,3 +/packages?q=logging&page=5,logging,3 +/packages?q=Logging&page=77,Logging,3 +/packages?q=LoggingServer,LoggingServer,3 +/packages?q=login,login,3 +/packages?q=login&page=2,login,3 +/packages?q=login+form,login form,3 +/packages?q=logix,logix,3 +/packages?q=loomo,loomo,3 +/packages?q=loopback,loopback,3 +/packages?q=Luabind,Luabind,3 +/packages?q=lucene.net&page=5,lucene.net,3 +/packages?q=Luhn,Luhn,3 +/packages?q=lynicon,lynicon,3 +/packages?q=lz4,lz4,3 +"/packages?q=lzma,","lzma,",3 +/packages?q=LZMA&prerel=false,LZMA,3 +/packages?q=MachinaTrader,MachinaTrader,3 +/packages?q=machine-learning,machine-learning,3 +/packages?q=maching+learning,maching learning,3 +/packages?q=Mads Kristensen,Mads Kristensen,3 +/packages?q=magic,magic,3 +/packages?q=magic+Onion,magic Onion,3 +/packages?q=Magick.NET,Magick.NET,3 +/packages?q=magicknet,magicknet,3 +/packages?q=Magnifier,Magnifier,3 +/packages?q=Mah+apps+metro,Mah apps metro,3 +/packages?q=MahApps.Metro.IconPacks,MahApps.Metro.IconPacks,3 +/packages?q=mail.net,mail.net,3 +/packages?q=mail&page=3,mail,3 +/packages?q=MailChimp.Net.V3,MailChimp.Net.V3,3 +/packages?q=mailerlite&sortOrder=package-download-count,mailerlite,3 +/packages?q=Mailkit,Mailkit,3 +/packages?q=Malcolm Crowe,Malcolm Crowe,3 +/packages?q=Managed&page=11,Managed,3 +/packages?q=managed&page=13,managed,3 +/packages?q=managedcuda+netstandard,managedcuda netstandard,3 +/packages?q=ManagedCuda+NETStandard,ManagedCuda NETStandard,3 +/packages?q=Mandrill,Mandrill,3 +/packages?q=manifest,manifest,3 +"/packages?q=map,&sortOrder=relevance&page=2&prerelease=False","map,",3 +/packages?q=mapbox,mapbox,3 +/packages?q=mapbox&sortOrder=package-download-count,mapbox,3 +/packages?q=mapper&page=2,mapper,3 +/packages?q=mapping,mapping,3 +/packages?q=maps,maps,3 +/packages?q=Maps&page=7,Maps,3 +/packages?q=mariadb+connector,mariadb connector,3 +/packages?q=MarkdownGenerator,MarkdownGenerator,3 +/packages?q=marketing,marketing,3 +/packages?q=marketplace,marketplace,3 +/packages?q=markov,markov,3 +/packages?q=marqmetrix,marqmetrix,3 +/packages?q=mask&page=1,mask,3 +/packages?q=mask&page=2,mask,3 +/packages?q=MassTransit.Quartz,MassTransit.Quartz,3 +/packages?q=matErIAlDESIGN,matErIAlDESIGN,3 +/packages?q=MaterialDesignThemes,MaterialDesignThemes,3 +/packages?q=materialskin,materialskin,3 +/packages?q=mathematical,mathematical,3 +/packages?q=mathnet.numerics,mathnet.numerics,3 +/packages?q=MathParser,MathParser,3 +/packages?q=mathparser.org,mathparser.org,3 +/packages?q=MatrixFactorization+,MatrixFactorization,3 +/packages?q=Matt Hidinger&sortOrder=package-download-count&page=2,Matt Hidinger,3 +/packages?q=Max Toro Q.&sortOrder=package-download-count&page=2,Max Toro Q.,3 +/packages?q=McDonald Consulting,McDonald Consulting,3 +/packages?q=McMaster.Extensions.CommandLineUtils,McMaster.Extensions.CommandLineUtils,3 +/packages?q=MD5,MD5,3 +/packages?q=MDB+,MDB,3 +/packages?q=MDS-Tools,MDS-Tools,3 +/packages?q=MDX,MDX,3 +/packages?q=MEDIAELEMENT,MEDIAELEMENT,3 +/packages?q=mediaR,mediaR,3 +/packages?q=mediatr,mediatr,3 +/packages?q=MediatR,MediatR,3 +/packages?q=mediatr+dependancy+injection,mediatr dependancy injection,3 +/packages?q=megaphone&source=post_page---------------------------,megaphone,3 +/packages?q=membership,membership,3 +/packages?q=Membership,Membership,3 +/packages?q=membershipprovider,membershipprovider,3 +/packages?q=memolist,memolist,3 +/packages?q=memorycache,memorycache,3 +/packages?q=menu,menu,3 +/packages?q=MercadoPago,MercadoPago,3 +/packages?q=merge,merge,3 +/packages?q=message-bus,message-bus,3 +/packages?q=MethodTimer,MethodTimer,3 +/packages?q=Método+no+encontrado:+'System.Collections.Generic.Dictionary`2+NLog.Config.LoggingConfiguration.get_Variables()'.,Método no encontrado: 'System.Collections.Generic.Dictionary`2 NLog.Config.LoggingConfiguration.get_Variables()'.,3 +/packages?q=metrics&page=6,metrics,3 +/packages?q=metro,metro,3 +/packages?q=Michael Kennedy&page=3,Michael Kennedy,3 +/packages?q=micjahn,micjahn,3 +/packages?q=MicroFramework&page=1,MicroFramework,3 +/packages?q=microphone,microphone,3 +/packages?q=microsft+dependency+injection,microsft dependency injection,3 +/packages?q=microsoft,microsoft,3 +/packages?q=Microsoft ASP.NET WebHooks Receiver&page=103,Microsoft ASP.NET WebHooks Receiver,3 +/packages?q=Microsoft ASP.NET WebHooks Receiver&page=353,Microsoft ASP.NET WebHooks Receiver,3 +/packages?q=Microsoft ASP.NET WebHooks Receiver&page=411,Microsoft ASP.NET WebHooks Receiver,3 +/packages?q=Microsoft ASP.NET WebHooks Receiver&page=92,Microsoft ASP.NET WebHooks Receiver,3 +/packages?q=Microsoft Corporation&page=70,Microsoft Corporation,3 +/packages?q=Microsoft ECO&page=60,Microsoft ECO,3 +/packages?q=microsoft.,microsoft.,3 +/packages?q=Microsoft.Activities,Microsoft.Activities,3 +/packages?q=Microsoft.AnalysisServices.AdomdClient,Microsoft.AnalysisServices.AdomdClient,3 +/packages?q=Microsoft.ApplicationInsights.DependencyCollector,Microsoft.ApplicationInsights.DependencyCollector,3 +/packages?q=Microsoft.ApplicationInsights.Web,Microsoft.ApplicationInsights.Web,3 +/packages?q=Microsoft.ApplicationServer.Caching,Microsoft.ApplicationServer.Caching,3 +/packages?q=Microsoft.AspNet.Cors,Microsoft.AspNet.Cors,3 +/packages?q=Microsoft.Aspnet.Identity,Microsoft.Aspnet.Identity,3 +/packages?q=Microsoft.AspNet.Identity.Core+2.2.1,Microsoft.AspNet.Identity.Core 2.2.1,3 +/packages?q=Microsoft.AspNet.Mvc,Microsoft.AspNet.Mvc,3 +/packages?q=Microsoft.AspNet.Razor,Microsoft.AspNet.Razor,3 +/packages?q=Microsoft.AspNet.Scaffolding.Mvc,Microsoft.AspNet.Scaffolding.Mvc,3 +/packages?q=Microsoft.AspNet.Scaffolding.Webforms.0.1.0-pre,Microsoft.AspNet.Scaffolding.Webforms.0.1.0-pre,3 +/packages?q=Microsoft.AspNet.ScriptManager.WebForms,Microsoft.AspNet.ScriptManager.WebForms,3 +/packages?q=Microsoft.AspNet.SignalR.Client.Connection,Microsoft.AspNet.SignalR.Client.Connection,3 +/packages?q=Microsoft.AspNet.WebApi.Core.5.2.6,Microsoft.AspNet.WebApi.Core.5.2.6,3 +/packages?q=Microsoft.AspNet.WebHelpers,Microsoft.AspNet.WebHelpers,3 +/packages?q=Microsoft.AspNet.WebHooks.Receivers.Salesforce,Microsoft.AspNet.WebHooks.Receivers.Salesforce,3 +/packages?q=microsoft.aspnetcore.all,microsoft.aspnetcore.all,3 +/packages?q=Microsoft.AspNetCore.App+,Microsoft.AspNetCore.App,3 +/packages?q=Microsoft.aspNETCore.authentication.ab,Microsoft.aspNETCore.authentication.ab,3 +/packages?q=Microsoft.AspNetCore.Authentication.OpenIdConnect,Microsoft.AspNetCore.Authentication.OpenIdConnect,3 +/packages?q=Microsoft.AspNetCore.Cors,Microsoft.AspNetCore.Cors,3 +/packages?q=Microsoft.AspNetCore.Diagnostics,Microsoft.AspNetCore.Diagnostics,3 +/packages?q=Microsoft.AspNetCore.EntityFrameworkCore.Proxies,Microsoft.AspNetCore.EntityFrameworkCore.Proxies,3 +/packages?q=Microsoft.AspNetCore.Hosting.WindowsServiecs,Microsoft.AspNetCore.Hosting.WindowsServiecs,3 +/packages?q=Microsoft.AspNetCore.Http.HttpRequest,Microsoft.AspNetCore.Http.HttpRequest,3 +/packages?q=Microsoft.AspNetCore.HttpsPolicy,Microsoft.AspNetCore.HttpsPolicy,3 +/packages?q=Microsoft.AspNetCore.Identity,Microsoft.AspNetCore.Identity,3 +/packages?q=microsoft.aspnetcore.identity.entityframeworkcore,microsoft.aspnetcore.identity.entityframeworkcore,3 +/packages?q=microsoft.aspnetcore.mvc,microsoft.aspnetcore.mvc,3 +/packages?q=Microsoft.AspNetCore.Mvc.Abstractions,Microsoft.AspNetCore.Mvc.Abstractions,3 +/packages?q=Microsoft.AspNetCore.Mvc.Api.Analyzers,Microsoft.AspNetCore.Mvc.Api.Analyzers,3 +/packages?q=Microsoft.AspNetCore.Mvc.ApiExplorer,Microsoft.AspNetCore.Mvc.ApiExplorer,3 +/packages?q=Microsoft.AspNetCore.Mvc.Core,Microsoft.AspNetCore.Mvc.Core,3 +/packages?q=Microsoft.AspNetCore.Mvc.Cors,Microsoft.AspNetCore.Mvc.Cors,3 +/packages?q=Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation,Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation,3 +/packages?q=Microsoft.AspNetCore.Mvc.ViewFeatures,Microsoft.AspNetCore.Mvc.ViewFeatures,3 +/packages?q=Microsoft.AspNetCore.OData,Microsoft.AspNetCore.OData,3 +/packages?q=Microsoft.AspNetCore.Razor.Design,Microsoft.AspNetCore.Razor.Design,3 +/packages?q=Microsoft.AspNetCore.Server.HttpSys,Microsoft.AspNetCore.Server.HttpSys,3 +/packages?q=Microsoft.AspNetCore.SignalR.Protocols.MessagePack,Microsoft.AspNetCore.SignalR.Protocols.MessagePack,3 +/packages?q=Microsoft.AspNetCore.SpaTemplates,Microsoft.AspNetCore.SpaTemplates,3 +/packages?q=Microsoft.AspNetCore.Test,Microsoft.AspNetCore.Test,3 +/packages?q=Microsoft.AspNetCore.TestHost,Microsoft.AspNetCore.TestHost,3 +/packages?q=Microsoft.AspNetCore.WebUtilities,Microsoft.AspNetCore.WebUtilities,3 +/packages?q=microsoft.azure,microsoft.azure,3 +/packages?q=Microsoft.Azure.CognitiveServices,Microsoft.Azure.CognitiveServices,3 +/packages?q=Microsoft.Azure.CognitiveServices.Vision.Face,Microsoft.Azure.CognitiveServices.Vision.Face,3 +/packages?q=microsoft.azure.common,microsoft.azure.common,3 +/packages?q=microsoft.azure.cosmos.table,microsoft.azure.cosmos.table,3 +/packages?q=Microsoft.Azure.Cosmos.Table,Microsoft.Azure.Cosmos.Table,3 +/packages?q=Microsoft.Azure.Devices.Client,Microsoft.Azure.Devices.Client,3 +/packages?q=microsoft.azure.documentdb,microsoft.azure.documentdb,3 +/packages?q=Microsoft.Azure.DocumentDb,Microsoft.Azure.DocumentDb,3 +/packages?q=Microsoft.Azure.DocumentDB.Core,Microsoft.Azure.DocumentDB.Core,3 +/packages?q=Microsoft.Azure.Documents.ServiceInterop.,Microsoft.Azure.Documents.ServiceInterop.,3 +/packages?q=microsoft.azure.functions.extensions.dependencyinjection,microsoft.azure.functions.extensions.dependencyinjection,3 +/packages?q=Microsoft.Azure.Functions.Extensions.DependencyInjection,Microsoft.Azure.Functions.Extensions.DependencyInjection,3 +/packages?q=Microsoft.Azure.KeyVault.Core,Microsoft.Azure.KeyVault.Core,3 +/packages?q=Microsoft.Azure.Management.DataLake.Analytics,Microsoft.Azure.Management.DataLake.Analytics,3 +/packages?q=Microsoft.Azure.Management.Fluent,Microsoft.Azure.Management.Fluent,3 +/packages?q=Microsoft.Azure.Management.HDInsight,Microsoft.Azure.Management.HDInsight,3 +/packages?q=microsoft.azure.management.resourcemanager,microsoft.azure.management.resourcemanager,3 +/packages?q=Microsoft.Azure.Mobile.Client,Microsoft.Azure.Mobile.Client,3 +/packages?q=Microsoft.Azure.Services.AppAuthentication,Microsoft.Azure.Services.AppAuthentication,3 +/packages?q=Microsoft.Azure.SignalR.AspNet,Microsoft.Azure.SignalR.AspNet,3 +/packages?q=Microsoft.Azure.Storage,Microsoft.Azure.Storage,3 +/packages?q=Microsoft.Azure.WebJobs.Extensions,Microsoft.Azure.WebJobs.Extensions,3 +/packages?q=Microsoft.Bcl.AsyncInterfaces,Microsoft.Bcl.AsyncInterfaces,3 +/packages?q=Microsoft.Bot.Builder.Abstractions;,Microsoft.Bot.Builder.Abstractions;,3 +/packages?q=Microsoft.Bot.Builder.Integration.AspNet.Core,Microsoft.Bot.Builder.Integration.AspNet.Core,3 +/packages?q=Microsoft.Bot.Builder.Integration.AspNet.WebApi.,Microsoft.Bot.Builder.Integration.AspNet.WebApi.,3 +/packages?q=Microsoft.Bot.Builder.Teams,Microsoft.Bot.Builder.Teams,3 +/packages?q=microsoft.chakracore.vc140,microsoft.chakracore.vc140,3 +/packages?q=Microsoft.Charp,Microsoft.Charp,3 +/packages?q=Microsoft.Cis.Monitoring.Events,Microsoft.Cis.Monitoring.Events,3 +/packages?q=microsoft.codeanalysis.,microsoft.codeanalysis.,3 +/packages?q=Microsoft.CodeAnalysis.FlowAnalysis.Utilities,Microsoft.CodeAnalysis.FlowAnalysis.Utilities,3 +/packages?q=Microsoft.CodeAnalysis.FxCopAnalyzers,Microsoft.CodeAnalysis.FxCopAnalyzers,3 +/packages?q=Microsoft.CodeDom.Providers.DotNetCompilerPlatform,Microsoft.CodeDom.Providers.DotNetCompilerPlatform,3 +/packages?q=Microsoft.CommonSchema,Microsoft.CommonSchema,3 +/packages?q=Microsoft.Composition,Microsoft.Composition,3 +/packages?q=Microsoft.Configuration.ConfigurationBuilders.Base,Microsoft.Configuration.ConfigurationBuilders.Base,3 +/packages?q=Microsoft.Configuration.ConfigurationBuilders.Json,Microsoft.Configuration.ConfigurationBuilders.Json,3 +/packages?q=Microsoft.Core.App,Microsoft.Core.App,3 +/packages?q=microsoft.csharp.runtimebinder,microsoft.csharp.runtimebinder,3 +/packages?q=microsoft.data,microsoft.data,3 +/packages?q=Microsoft.Data.Services.Client,Microsoft.Data.Services.Client,3 +/packages?q=Microsoft.Data.Sqlclient,Microsoft.Data.Sqlclient,3 +/packages?q=Microsoft.Data.SqlClient,Microsoft.Data.SqlClient,3 +/packages?q=Microsoft.Data.SqlLite,Microsoft.Data.SqlLite,3 +/packages?q=Microsoft.Data.Tools.Msbuild,Microsoft.Data.Tools.Msbuild,3 +/packages?q=microsoft.diagnostics,microsoft.diagnostics,3 +/packages?q=Microsoft.Diagnostics.Tracing,Microsoft.Diagnostics.Tracing,3 +/packages?q=Microsoft.Dotnet.arcade.sdk,Microsoft.Dotnet.arcade.sdk,3 +/packages?q=Microsoft.DotNet.Build.Tasks.Packaging,Microsoft.DotNet.Build.Tasks.Packaging,3 +/packages?q=Microsoft.DotNet.BuildTools,Microsoft.DotNet.BuildTools,3 +/packages?q=Microsoft.DotNet.Helix.Sdk,Microsoft.DotNet.Helix.Sdk,3 +/packages?q=microsoft.entiryframeworkcore,microsoft.entiryframeworkcore,3 +/packages?q=Microsoft.EntityFramework,Microsoft.EntityFramework,3 +/packages?q=Microsoft.EntityFrameworkCore.,Microsoft.EntityFrameworkCore.,3 +/packages?q=Microsoft.EntityFrameworkCore.Att,Microsoft.EntityFrameworkCore.Att,3 +/packages?q=microsoft.EntityFrameworkCore.Design,microsoft.EntityFrameworkCore.Design,3 +/packages?q=Microsoft.EntityFrameworkCore.Desing,Microsoft.EntityFrameworkCore.Desing,3 +/packages?q=microsoft.entityframeworkcore.inmemory,microsoft.entityframeworkcore.inmemory,3 +/packages?q=Microsoft.EntityFrameworkCore.Migrations,Microsoft.EntityFrameworkCore.Migrations,3 +/packages?q=Microsoft.EntityFrameworkCore.proxies,Microsoft.EntityFrameworkCore.proxies,3 +/packages?q=Microsoft.EntityFrameworkCore.Relational,Microsoft.EntityFrameworkCore.Relational,3 +/packages?q=Microsoft.EntityFrameworkCore.Sqlite+2.1.1,Microsoft.EntityFrameworkCore.Sqlite 2.1.1,3 +/packages?q=Microsoft.EntityFrameworkCore.sqlserver,Microsoft.EntityFrameworkCore.sqlserver,3 +/packages?q=Microsoft.EntityFrameworkCore.SqlServer.Design,Microsoft.EntityFrameworkCore.SqlServer.Design,3 +/packages?q=microsoft.entityframeworkcore.tools,microsoft.entityframeworkcore.tools,3 +/packages?q=Microsoft.EntityFrameworkCore.Tools+,Microsoft.EntityFrameworkCore.Tools,3 +/packages?q=Microsoft.Expression.Interactions,Microsoft.Expression.Interactions,3 +/packages?q=Microsoft.Exten,Microsoft.Exten,3 +/packages?q=microsoft.extension.configuration,microsoft.extension.configuration,3 +/packages?q=Microsoft.Extensions.ApiDescription,Microsoft.Extensions.ApiDescription,3 +/packages?q=microsoft.extensions.apidescription.client,microsoft.extensions.apidescription.client,3 +/packages?q=Microsoft.Extensions.ApiDescription.Client,Microsoft.Extensions.ApiDescription.Client,3 +/packages?q=microsoft.extensions.caching.,microsoft.extensions.caching.,3 +/packages?q=Microsoft.Extensions.Caching.Memory,Microsoft.Extensions.Caching.Memory,3 +/packages?q=microsoft.Extensions.Configuration,microsoft.Extensions.Configuration,3 +/packages?q=Microsoft.Extensions.Configuration.com,Microsoft.Extensions.Configuration.com,3 +/packages?q=Microsoft.Extensions.Configuration.Json,Microsoft.Extensions.Configuration.Json,3 +/packages?q=microsoft.extensions.configuration.zookeeper,microsoft.extensions.configuration.zookeeper,3 +/packages?q=microsoft.extensions.de,microsoft.extensions.de,3 +/packages?q=Microsoft.Extensions.DependencyInjection.Abstractions,Microsoft.Extensions.DependencyInjection.Abstractions,3 +/packages?q=Microsoft.Extensions.DependencyInjection.Abstractions+2.2.0+,Microsoft.Extensions.DependencyInjection.Abstractions 2.2.0,3 +/packages?q=Microsoft.Extensions.FileProviders,Microsoft.Extensions.FileProviders,3 +/packages?q=microsoft.extensions.hosting.abstractions,microsoft.extensions.hosting.abstractions,3 +/packages?q=Microsoft.Extensions.Http,Microsoft.Extensions.Http,3 +/packages?q=microsoft.extensions.logging,microsoft.extensions.logging,3 +/packages?q=Microsoft.extensions.logging,Microsoft.extensions.logging,3 +/packages?q=microsoft.extensions.logging.applicationinsights,microsoft.extensions.logging.applicationinsights,3 +/packages?q=Microsoft.Extensions.Logging.ApplicationInsights,Microsoft.Extensions.Logging.ApplicationInsights,3 +/packages?q=Microsoft.Extensions.Logging.Console,Microsoft.Extensions.Logging.Console,3 +/packages?q=Microsoft.Extensions.Logging.Log4Net.AspNetcore,Microsoft.Extensions.Logging.Log4Net.AspNetcore,3 +/packages?q=Microsoft.Extensions.Logging.Log4Net.AspNetCore,Microsoft.Extensions.Logging.Log4Net.AspNetCore,3 +/packages?q=microsoft.extensions.options,microsoft.extensions.options,3 +/packages?q=Microsoft.Extensions.Options,Microsoft.Extensions.Options,3 +/packages?q=microsoft.extensions.options.configurationextensions,microsoft.extensions.options.configurationextensions,3 +/packages?q=Microsoft.Extensions.Options.ConfigurationExtensions,Microsoft.Extensions.Options.ConfigurationExtensions,3 +/packages?q=Microsoft.Extensions.Primitives,Microsoft.Extensions.Primitives,3 +/packages?q=Microsoft.Graph.Auth,Microsoft.Graph.Auth,3 +/packages?q=microsoft.graph.core,microsoft.graph.core,3 +/packages?q=Microsoft.Identity.ServerAuthorization,Microsoft.Identity.ServerAuthorization,3 +/packages?q=Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext,Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext,3 +/packages?q=Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms,Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms,3 +/packages?q=Microsoft.IdentityModel.Logging,Microsoft.IdentityModel.Logging,3 +/packages?q=Microsoft.IdentityModel.Protocols.OpenIdConnect,Microsoft.IdentityModel.Protocols.OpenIdConnect,3 +/packages?q=Microsoft.Intune.MAM.Xamarin,Microsoft.Intune.MAM.Xamarin,3 +/packages?q=Microsoft.Management.Infrastructure,Microsoft.Management.Infrastructure,3 +/packages?q=microsoft.net.compilers,microsoft.net.compilers,3 +/packages?q=Microsoft.Net.Compilers,Microsoft.Net.Compilers,3 +/packages?q=Microsoft.Net.Http.Headers,Microsoft.Net.Http.Headers,3 +/packages?q=microsoft.net.sdk,microsoft.net.sdk,3 +/packages?q=microsoft.net.sdk.functions,microsoft.net.sdk.functions,3 +/packages?q=Microsoft.NET.Sdk.Web,Microsoft.NET.Sdk.Web,3 +/packages?q=Microsoft.NetCore.*,Microsoft.NetCore.*,3 +/packages?q=Microsoft.NETCore.DotNetHostPolicy,Microsoft.NETCore.DotNetHostPolicy,3 +/packages?q=Microsoft.NETCore.DotNetHostResolver,Microsoft.NETCore.DotNetHostResolver,3 +/packages?q=Microsoft.NetCore.Platforms,Microsoft.NetCore.Platforms,3 +/packages?q=microsoft.netfx20,microsoft.netfx20,3 +/packages?q=Microsoft.Office.Interop.Excel,Microsoft.Office.Interop.Excel,3 +/packages?q=microsoft.office.intterop,microsoft.office.intterop,3 +/packages?q=microsoft.orleans,microsoft.orleans,3 +/packages?q=Microsoft.Orleans.Clustering.,Microsoft.Orleans.Clustering.,3 +/packages?q=Microsoft.Owin,Microsoft.Owin,3 +/packages?q=microsoft.owin.cors,microsoft.owin.cors,3 +/packages?q=Microsoft.Owin.Cors,Microsoft.Owin.Cors,3 +/packages?q=Microsoft.Owin.Host.SystemWeb,Microsoft.Owin.Host.SystemWeb,3 +/packages?q=microsoft.owin.security,microsoft.owin.security,3 +/packages?q=Microsoft.Owin.Security,Microsoft.Owin.Security,3 +/packages?q=Microsoft.Owin.Security.jwt,Microsoft.Owin.Security.jwt,3 +/packages?q=microsoft.owin.security.oauth\,microsoft.owin.security.oauth\,3 +/packages?q=Microsoft.Owin.Security.OpenIdConnect,Microsoft.Owin.Security.OpenIdConnect,3 +/packages?q=microsoft.PowerBi.api,microsoft.PowerBi.api,3 +/packages?q=Microsoft.PowerShell.Test.SDK,Microsoft.PowerShell.Test.SDK,3 +/packages?q=Microsoft.Practices.Unity;,Microsoft.Practices.Unity;,3 +/packages?q=Microsoft.Report.Viewer+14.0.0,Microsoft.Report.Viewer 14.0.0,3 +/packages?q=Microsoft.Reporting.WinForms.LocalProcessingException'+occurred+in+Microsoft.ReportViewer.WinForms.dll,Microsoft.Reporting.WinForms.LocalProcessingException' occurred in Microsoft.ReportViewer.WinForms.dll,3 +/packages?q=Microsoft.ReportViewer.WinForms,Microsoft.ReportViewer.WinForms,3 +/packages?q=Microsoft.Rest.ClientRuntime,Microsoft.Rest.ClientRuntime,3 +/packages?q=microsoft.sdk.expression.blend,microsoft.sdk.expression.blend,3 +/packages?q=microsoft.server.dac,microsoft.server.dac,3 +/packages?q=microsoft.servicebus,microsoft.servicebus,3 +/packages?q=microsoft.servicefabric,microsoft.servicefabric,3 +/packages?q=microsoft.servicefabric.fabricttransport,microsoft.servicefabric.fabricttransport,3 +/packages?q=Microsoft.ServiceFabric.Services,Microsoft.ServiceFabric.Services,3 +/packages?q=Microsoft.SharePoint,Microsoft.SharePoint,3 +/packages?q=Microsoft.SharePoint.Library,Microsoft.SharePoint.Library,3 +/packages?q=microsoft.sourcelink.common,microsoft.sourcelink.common,3 +/packages?q=microsoft.sqlserver.dac+microsoft.sqlserver.dacfx,microsoft.sqlserver.dac microsoft.sqlserver.dacfx,3 +/packages?q=Microsoft.SqlServer.SqlManagementObjects,Microsoft.SqlServer.SqlManagementObjects,3 +/packages?q=Microsoft.TeamFoundation.WorkItemTracking.Proxy,Microsoft.TeamFoundation.WorkItemTracking.Proxy,3 +/packages?q=Microsoft.TeamFoundationServer,Microsoft.TeamFoundationServer,3 +/packages?q=Microsoft.Threading.Tasks,Microsoft.Threading.Tasks,3 +/packages?q=Microsoft.Toolkit,Microsoft.Toolkit,3 +/packages?q=Microsoft.Toolkit.Wpf.UI.Controls.WebView,Microsoft.Toolkit.Wpf.UI.Controls.WebView,3 +/packages?q=microsoft.typescript.msbuild,microsoft.typescript.msbuild,3 +/packages?q=Microsoft.VisualBasic.Devices,Microsoft.VisualBasic.Devices,3 +/packages?q=Microsoft.VisualStudio.Azure.Fabric.MSBuild,Microsoft.VisualStudio.Azure.Fabric.MSBuild,3 +/packages?q=microsoft.visualstudio.commanding,microsoft.visualstudio.commanding,3 +/packages?q=Microsoft.VisualStudio.LanguageServer,Microsoft.VisualStudio.LanguageServer,3 +/packages?q=Microsoft.VisualStudio.QualityTools.UnitTestFramework,Microsoft.VisualStudio.QualityTools.UnitTestFramework,3 +/packages?q=Microsoft.VisualStudio.TestPlatform.ObjectModel&sortOrder=package-download-count,Microsoft.VisualStudio.TestPlatform.ObjectModel,3 +/packages?q=microsoft.visualstudio.web.codegeneration.design,microsoft.visualstudio.web.codegeneration.design,3 +/packages?q=Microsoft.Web.Administration,Microsoft.Web.Administration,3 +/packages?q=Microsoft.Web.RedisSessionStateProvider,Microsoft.Web.RedisSessionStateProvider,3 +/packages?q=Microsoft.Win32.Primitives,Microsoft.Win32.Primitives,3 +/packages?q=Microsoft.Win32.Registry,Microsoft.Win32.Registry,3 +/packages?q=Microsoft.Windows.Compatibility,Microsoft.Windows.Compatibility,3 +/packages?q=Microsoft.Windows.Design.Extensibility,Microsoft.Windows.Design.Extensibility,3 +/packages?q=Microsoft.WindowsAzure.ConfigurationManager,Microsoft.WindowsAzure.ConfigurationManager,3 +/packages?q=Microsoft.WindowsAzure.Management,Microsoft.WindowsAzure.Management,3 +/packages?q=Microsoft.WindowsAzure.MediaServices.Client,Microsoft.WindowsAzure.MediaServices.Client,3 +/packages?q=Microsoft.WindowsAzure.Storage,Microsoft.WindowsAzure.Storage,3 +/packages?q=microsoft.xrm.sdk,microsoft.xrm.sdk,3 +/packages?q=Microsoft&page=177,Microsoft,3 +/packages?q=microsoft&page=185,microsoft,3 +/packages?q=Microsoft+ASP.NET+WebHooks+Receiver,Microsoft ASP.NET WebHooks Receiver,3 +/packages?q=microsoft+compilers,microsoft compilers,3 +/packages?q=Microsoft+cross+origin+support,Microsoft cross origin support,3 +/packages?q=Microsoft+EntityFrame'workCore.Tools,Microsoft EntityFrame'workCore.Tools,3 +/packages?q=microsoft+extensions,microsoft extensions,3 +/packages?q=microsoft+logging,microsoft logging,3 +/packages?q=microsoft+office,microsoft office,3 +/packages?q=microsoft+owin,microsoft owin,3 +/packages?q=Microsoft+Shell+Controls+And+Automation+,Microsoft Shell Controls And Automation,3 +/packages?q=microsoft+visual+studio,microsoft visual studio,3 +/packages?q=Microsoft+web+redissessionstateprovider,Microsoft web redissessionstateprovider,3 +/packages?q=MicrosoftWin32.SystemEvents,MicrosoftWin32.SystemEvents,3 +/packages?q=MigraDoc,MigraDoc,3 +/packages?q=migration,migration,3 +/packages?q=migrationreport,migrationreport,3 +/packages?q=Mindrouting Inc.&page=28,Mindrouting Inc.,3 +/packages?q=Minecraft+pe,Minecraft pe,3 +/packages?q=miniprofiler,miniprofiler,3 +"/packages?q=MiniProfiler,&page=4","MiniProfiler,",3 +/packages?q=MiniProfiler+owner:StackExchange,MiniProfiler owner:StackExchange,3 +/packages?q=MISP,MISP,3 +/packages?q=mm7,mm7,3 +/packages?q=Mocking,Mocking,3 +/packages?q=ModalContentPresenter,ModalContentPresenter,3 +/packages?q=modem,modem,3 +/packages?q=Modern,Modern,3 +/packages?q=modulus,modulus,3 +/packages?q=moles,moles,3 +/packages?q=mollie&sortOrder=package-download-count,mollie,3 +/packages?q=MomDevelop,MomDevelop,3 +/packages?q=moment,moment,3 +/packages?q=Moment,Moment,3 +/packages?q=money,money,3 +/packages?q=mongo+helper,mongo helper,3 +/packages?q=mongocsharpdriver,mongocsharpdriver,3 +/packages?q=MongoDB.Bson,MongoDB.Bson,3 +/packages?q=mongorepository,mongorepository,3 +/packages?q=Monitor.Fluent,Monitor.Fluent,3 +/packages?q=monkeycache,monkeycache,3 +/packages?q=Mono,Mono,3 +/packages?q=Mono.Reflection,Mono.Reflection,3 +/packages?q=monogame,monogame,3 +/packages?q=morelinq c#sources&page=166,morelinq c,3 +/packages?q=Morten Nielsen,Morten Nielsen,3 +/packages?q=MouseKeyHook,MouseKeyHook,3 +/packages?q=mq,mq,3 +/packages?q=MQ,MQ,3 +/packages?q=MQTTnet.AspNetCore,MQTTnet.AspNetCore,3 +/packages?q=MS+SQL+Server+Express,MS SQL Server Express,3 +/packages?q=MSBuild.Community.Tasks.Zip,MSBuild.Community.Tasks.Zip,3 +/packages?q=MSBuildLocator,MSBuildLocator,3 +/packages?q=msc,msc,3 +"/packages?q=mscorlib,+Version=4.0.0.0","mscorlib, Version=4.0.0.0",3 +/packages?q=MSG,MSG,3 +/packages?q=msg&page=3,msg,3 +/packages?q=MsgPack,MsgPack,3 +/packages?q=mshtml,mshtml,3 +/packages?q=msi,msi,3 +/packages?q=msmq+nservicebus,msmq nservicebus,3 +/packages?q=Mspec,Mspec,3 +/packages?q=msserver,msserver,3 +/packages?q=MSTEST,MSTEST,3 +/packages?q=mstest.test,mstest.test,3 +/packages?q=MSTest.TestAdapter,MSTest.TestAdapter,3 +/packages?q=MSTest.TestFramework,MSTest.TestFramework,3 +/packages?q=MugenMvvmToolkit https://mugenmvvmtoolkit.readme.io/docs/getting-started,MugenMvvmToolkit https://mugenmvvmtoolkit.readme.io/docs/getting-started,3 +/packages?q=MulitTouch+Windows+Forms,MulitTouch Windows Forms,3 +/packages?q=MultiMap,MultiMap,3 +/packages?q=music,music,3 +/packages?q=Music,Music,3 +/packages?q=Mustache,Mustache,3 +/packages?q=mvc.grid,mvc.grid,3 +/packages?q=Mvc&page=151,Mvc,3 +/packages?q=mvcsitemapprovider.mvc,mvcsitemapprovider.mvc,3 +/packages?q=mvcsitemapprovider.mvc*.di&prerelease=&sortOrder=package-download-count,mvcsitemapprovider.mvc*.di,3 +/packages?q=mvgrid.net.ajax,mvgrid.net.ajax,3 +/packages?q=MVVM&page=31,MVVM,3 +/packages?q=Mvvm&page=40,Mvvm,3 +/packages?q=mvvmcross,mvvmcross,3 +/packages?q=MvvmCross,MvvmCross,3 +/packages?q=MvvmCross Plugin&page=22,MvvmCross Plugin,3 +/packages?q=MvvmCross&page=11,MvvmCross,3 +/packages?q=mvvmvalidation,mvvmvalidation,3 +/packages?q=mvvmzero,mvvmzero,3 +/packages?q=mws,mws,3 +/packages?q=mysql-server,mysql-server,3 +/packages?q=mysql.data,mysql.data,3 +/packages?q=mysql+auth,mysql auth,3 +/packages?q=mysql+core,mysql core,3 +/packages?q=mysqlbackup.net,mysqlbackup.net,3 +/packages?q=MySqlConnector,MySqlConnector,3 +/packages?q=MyUmbracoPropertyEditor,MyUmbracoPropertyEditor,3 +/packages?q=nagedobjects,nagedobjects,3 +/packages?q=naked+objects,naked objects,3 +/packages?q=Named+Pipe,Named Pipe,3 +/packages?q=namegenerator&sortOrder=package-download-count,namegenerator,3 +/packages?q=Namotion.Reflection,Namotion.Reflection,3 +/packages?q=nancy.json,nancy.json,3 +/packages?q=nancy.viewengines,nancy.viewengines,3 +/packages?q=nancyfx,nancyfx,3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=108,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=506,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=771,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=788,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=798,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=801,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=Nathan Totten (Unofficial Package of Microsoft Code Contracts)&page=820,Nathan Totten (Unofficial Package of Microsoft Code Contracts),3 +/packages?q=NATS,NATS,3 +/packages?q=NAudio,NAudio,3 +/packages?q=navigationmenu,navigationmenu,3 +/packages?q=nbuilder,nbuilder,3 +/packages?q=ncache,ncache,3 +/packages?q=NCache,NCache,3 +/packages?q=ncalc,ncalc,3 +/packages?q=NCO,NCO,3 +/packages?q=NDepend,NDepend,3 +/packages?q=Nebula Applications&page=1,Nebula Applications,3 +/packages?q=Nemiro.OAuth,Nemiro.OAuth,3 +/packages?q=nerdbank,nerdbank,3 +/packages?q=nest,nest,3 +/packages?q=net-snmp,net-snmp,3 +/packages?q=Net&page=105,Net,3 +/packages?q=net&page=267,net,3 +/packages?q=Net&page=307,Net,3 +/packages?q=Net&page=542,Net,3 +/packages?q=net+core+print+object,net core print object,3 +/packages?q=net+standard+library,net standard library,3 +/packages?q=netcore+app,netcore app,3 +/packages?q=NetTopologySuite.IO,NetTopologySuite.IO,3 +/packages?q=News,News,3 +/packages?q=newton,newton,3 +/packages?q=Newton,Newton,3 +/packages?q=newton+json,newton json,3 +/packages?q=newton+soft,newton soft,3 +/packages?q=newtonjson+,newtonjson,3 +/packages?q=Newtonsoft.Json.11.0.2,Newtonsoft.Json.11.0.2,3 +/packages?q=Newtonsoft.Json.4.5.6,Newtonsoft.Json.4.5.6,3 +/packages?q=Newtonsoft.Json.JsonConvert,Newtonsoft.Json.JsonConvert,3 +/packages?q=newtonsoftjson,newtonsoftjson,3 +/packages?q=Newtown.Json,Newtown.Json,3 +/packages?q=nfc,nfc,3 +/packages?q=NHibernate,NHibernate,3 +/packages?q=NHibernate community&page=12,NHibernate community,3 +/packages?q=NHibernate Community&page=42,NHibernate Community,3 +/packages?q=NHibernate.Caches.Redis,NHibernate.Caches.Redis,3 +/packages?q=nhunspell+component,nhunspell component,3 +/packages?q=nickstrupat,nickstrupat,3 +/packages?q=Nicolas Gallagher & Jonathan Neal=&page=23,Nicolas Gallagher,3 +/packages?q=Ninject,Ninject,3 +/packages?q=nisocountries,nisocountries,3 +/packages?q=Nito.AsyncEx.Interop.WaitHandles,Nito.AsyncEx.Interop.WaitHandles,3 +/packages?q=Nivaes.Droid.Hdodenhof.CircleImageView,Nivaes.Droid.Hdodenhof.CircleImageView,3 +/packages?q=njson+schema,njson schema,3 +/packages?q=njsonschema.code,njsonschema.code,3 +/packages?q=nlipsum,nlipsum,3 +/packages?q=NLOg,NLOg,3 +/packages?q=NLog.,NLog.,3 +/packages?q=NLog.AuthenticationConfig,NLog.AuthenticationConfig,3 +/packages?q=nlog&sortOrder=package-download-count&page=6&prerelease=False,nlog,3 +/packages?q=nltk,nltk,3 +/packages?q=nmea,nmea,3 +/packages?q=NMock3,NMock3,3 +/packages?q=nmodbus,nmodbus,3 +/packages?q=node.js,node.js,3 +/packages?q=normalization,normalization,3 +/packages?q=normalize,normalize,3 +"/packages?q=notification,&page=11","notification,",3 +/packages?q=notification&page=4,notification,3 +/packages?q=notifications,notifications,3 +"/packages?q=notifications,","notifications,",3 +/packages?q=notifications&page=9,notifications,3 +/packages?q=npgsql&sortOrder=package-download-count,npgsql,3 +/packages?q=npm,npm,3 +/packages?q=NPOI,NPOI,3 +/packages?q=NServiceBus.Metrics.ServiceControl.Msmq,NServiceBus.Metrics.ServiceControl.Msmq,3 +/packages?q=nservicebus.nhibernate,nservicebus.nhibernate,3 +/packages?q=nsis,nsis,3 +/packages?q=nspec,nspec,3 +/packages?q=nsub,nsub,3 +/packages?q=Nsubstitute,Nsubstitute,3 +/packages?q=NSubstitute,NSubstitute,3 +/packages?q=nswag,nswag,3 +/packages?q=NSwag&prerel=false,NSwag,3 +/packages?q=NTS,NTS,3 +/packages?q=NTS+TopologySuite,NTS TopologySuite,3 +/packages?q=NuGet,NuGet,3 +/packages?q=nuget.,nuget.,3 +/packages?q=nuget.build.tasks.pack,nuget.build.tasks.pack,3 +/packages?q=NuGet.CommandLine,NuGet.CommandLine,3 +/packages?q=nuget.org+version,nuget.org version,3 +/packages?q=nuget.packaging,nuget.packaging,3 +/packages?q=NuGet.ProjectModel,NuGet.ProjectModel,3 +/packages?q=nuget+c#+cace,nuget c,3 +/packages?q=nuget+client+2.12,nuget client 2.12,3 +/packages?q=nuget+package+manager,nuget package manager,3 +/packages?q=NuGet+Provider,NuGet Provider,3 +/packages?q=nuget+viewer,nuget viewer,3 +/packages?q=nugetv4,nugetv4,3 +/packages?q=NUI,NUI,3 +/packages?q=nuke,nuke,3 +/packages?q=Null,Null,3 +/packages?q=nullfx,nullfx,3 +/packages?q=numbering,numbering,3 +"/packages?q=Numeric,","Numeric,",3 +/packages?q=numpy,numpy,3 +/packages?q=nunit-console,nunit-console,3 +/packages?q=nunit.core.interfaces,nunit.core.interfaces,3 +/packages?q=nunit.core.interfaces.dll,nunit.core.interfaces.dll,3 +/packages?q=nunit+adapter,nunit adapter,3 +/packages?q=nunit+console+runner,nunit console runner,3 +/packages?q=nunit+test+3adapter+,nunit test 3adapter,3 +/packages?q=nunit+test+adapter,nunit test adapter,3 +/packages?q=nunit3,nunit3,3 +/packages?q=NUnit3TestAdapter,NUnit3TestAdapter,3 +/packages?q=NUnitTestAdapter,NUnitTestAdapter,3 +/packages?q=nuproj,nuproj,3 +/packages?q=nuspec,nuspec,3 +/packages?q=Nustache.Core,Nustache.Core,3 +/packages?q=nwtonsoft,nwtonsoft,3 +/packages?q=OASIS,OASIS,3 +"/packages?q=oauth,&page=18","oauth,",3 +/packages?q=OAuth+JWT,OAuth JWT,3 +/packages?q=oauth2&page=19,oauth2,3 +/packages?q=objectdumper,objectdumper,3 +/packages?q=Obliteracy Dot Net&page=173,Obliteracy Dot Net,3 +/packages?q=Obliteracy Dot Net&page=80,Obliteracy Dot Net,3 +/packages?q=observablecollection,observablecollection,3 +/packages?q=OCR&page=4,OCR,3 +/packages?q=Octo,Octo,3 +/packages?q=octopack,octopack,3 +/packages?q=OctoPack,OctoPack,3 +/packages?q=octopus+platform,octopus platform,3 +/packages?q=ODBC&page=2,ODBC,3 +/packages?q=ODP.NET+Managed+Driver,ODP.NET Managed Driver,3 +/packages?q=Office UI Fabric,Office UI Fabric,3 +/packages?q=office.interop,office.interop,3 +/packages?q=office+core,office core,3 +/packages?q=OfficeApps.Model,OfficeApps.Model,3 +/packages?q=officedev,officedev,3 +/packages?q=officedevpnp,officedevpnp,3 +/packages?q=OfficeOpenXml,OfficeOpenXml,3 +/packages?q=OLAP&page=2,OLAP,3 +/packages?q=ole+dotnet+core,ole dotnet core,3 +/packages?q=OmniSharp.Extensions,OmniSharp.Extensions,3 +/packages?q=omnisharp.roslyn,omnisharp.roslyn,3 +/packages?q=onedrive,onedrive,3 +/packages?q=onionarch,onionarch,3 +/packages?q=opc+ua,opc ua,3 +/packages?q=open+office,open office,3 +/packages?q=open+xml+sdk,open xml sdk,3 +"/packages?q=opencv,&page=4","opencv,",3 +/packages?q=OpenCV.overlay-x64_v120,OpenCV.overlay-x64_v120,3 +/packages?q=opencv.win.native.static,opencv.win.native.static,3 +/packages?q=Opencv+mobile,Opencv mobile,3 +/packages?q=opencvsharp,opencvsharp,3 +/packages?q=OPENCVsharp,OPENCVsharp,3 +/packages?q=opendnp3,opendnp3,3 +/packages?q=OpenGL&page=4,OpenGL,3 +/packages?q=openid,openid,3 +/packages?q=openid+connect+client,openid connect client,3 +/packages?q=openidconnect,openidconnect,3 +/packages?q=Openiddict,Openiddict,3 +/packages?q=openrasta,openrasta,3 +/packages?q=openssl cpp&page=5,openssl cpp,3 +/packages?q=openssl+windows+arm64,openssl windows arm64,3 +/packages?q=openvino,openvino,3 +/packages?q=OpenWebKitSharp+,OpenWebKitSharp,3 +/packages?q=opera,opera,3 +/packages?q=opera&page=2,opera,3 +/packages?q=Opten,Opten,3 +/packages?q=optional,optional,3 +/packages?q=options,options,3 +/packages?q=opus,opus,3 +/packages?q=OR&page=2005,OR,3 +/packages?q=Oracle Corporation&page=2,Oracle Corporation,3 +/packages?q=Oracle.DataAccess.Client,Oracle.DataAccess.Client,3 +/packages?q=Oracle.DataAccess+1.122.1.0,Oracle.DataAccess 1.122.1.0,3 +/packages?q=Oracle.DataAccess+2.102.2.20,Oracle.DataAccess 2.102.2.20,3 +/packages?q=Oracle.ManagedDataAccess,Oracle.ManagedDataAccess,3 +/packages?q=Oracle.ManagedDataAccess.Client,Oracle.ManagedDataAccess.Client,3 +/packages?q=Oracle.ManagedDataAccess.Core,Oracle.ManagedDataAccess.Core,3 +/packages?q=Oracle.ManagedDataAccess&prerel=false,Oracle.ManagedDataAccess,3 +/packages?q=oracle+core,oracle core,3 +/packages?q=oracle+dapper,oracle dapper,3 +/packages?q=oracled+managed+data+access,oracled managed data access,3 +/packages?q=oraclemanageddataaccess,oraclemanageddataaccess,3 +/packages?q=OrbintSoft.Yauaa,OrbintSoft.Yauaa,3 +/packages?q=organizacion+tree,organizacion tree,3 +"/packages?q=ORM,&page=38","ORM,",3 +/packages?q=ormlite,ormlite,3 +/packages?q=osharpns,osharpns,3 +/packages?q=OsmSharp+xamarin,OsmSharp xamarin,3 +/packages?q=outputcache,outputcache,3 +/packages?q=overlay,overlay,3 +/packages?q=Owin.Hosting contributors&page=11,Owin.Hosting contributors,3 +/packages?q=Owin.Security.AesDataProtectorProvider,Owin.Security.AesDataProtectorProvider,3 +/packages?q=owin+google,owin google,3 +"/packages?q=Owner:""Autofac""+Autofac*+webapi","Owner:""Autofac"" Autofac* webapi",3 +"/packages?q=owner:""bush""+tags:""revit""","owner:""bush"" tags:""revit""",3 +/packages?q=oxyplor+xamarin+wpf,oxyplor xamarin wpf,3 +/packages?q=oxyplot.core.drawing,oxyplot.core.drawing,3 +/packages?q=oxyplot&prerel=false,oxyplot,3 +/packages?q=p2p,p2p,3 +/packages?q=pack&page=9,pack,3 +/packages?q=Package_for_Deploy_V1.0.1,Package_for_Deploy_V1.0.1,3 +/packages?q=Package&page=177,Package,3 +/packages?q=package&page=228,package,3 +/packages?q=package&page=396,package,3 +/packages?q=PagedList,PagedList,3 +/packages?q=Pagedlist&prerel=false,Pagedlist,3 +/packages?q=pager,pager,3 +/packages?q=Pager,Pager,3 +/packages?q=pagespeed,pagespeed,3 +"/packages?q=Pagination,&page=5","Pagination,",3 +/packages?q=Pagination&page=4,Pagination,3 +/packages?q=Paho,Paho,3 +/packages?q=Panuon.UI,Panuon.UI,3 +/packages?q=Papertrail,Papertrail,3 +/packages?q=parse,parse,3 +/packages?q=password,password,3 +/packages?q=Password+Protected+PDF+Using+PDFsharp,Password Protected PDF Using PDFsharp,3 +/packages?q=patagames,patagames,3 +/packages?q=patagames.ocr.xml,patagames.ocr.xml,3 +/packages?q=patch,patch,3 +/packages?q=path,path,3 +/packages?q=Patrick,Patrick,3 +/packages?q=pattern&page=43,pattern,3 +/packages?q=Paul Hiles (the DLL and original C#bootstraper)&page=133,Paul Hiles (the DLL and original C,3 +/packages?q=Paul Hiles (the DLL and original C#bootstraper)&page=145,Paul Hiles (the DLL and original C,3 +/packages?q=Paul Hiles (the DLL and original C#bootstraper)&page=179,Paul Hiles (the DLL and original C,3 +/packages?q=Paul Hiles (the DLL and original C#bootstraper)&page=208,Paul Hiles (the DLL and original C,3 +/packages?q=Paul Jenkins; Jake Ginnivan&page=3,Paul Jenkins; Jake Ginnivan,3 +/packages?q=paypal,paypal,3 +/packages?q=PayPalCheckoutSdk,PayPalCheckoutSdk,3 +/packages?q=pcl&page=46,pcl,3 +/packages?q=pclstorage,pclstorage,3 +/packages?q=pcsc,pcsc,3 +"/packages?q=pdf,&page=7","pdf,",3 +/packages?q=PDF.NET,PDF.NET,3 +/packages?q=PDF&page=20,PDF,3 +/packages?q=PDF&page=22,PDF,3 +/packages?q=pdf+convert,pdf convert,3 +/packages?q=pdf+to+image,pdf to image,3 +/packages?q=pdf+xamarin+shared,pdf xamarin shared,3 +"/packages?q=PDF417,&page=2","PDF417,",3 +/packages?q=PDF417&page=5,PDF417,3 +/packages?q=pdf417+reader,pdf417 reader,3 +/packages?q=pdfbox,pdfbox,3 +/packages?q=pdflibrary,pdflibrary,3 +/packages?q=Pdfsharp,Pdfsharp,3 +/packages?q=PDFSharp,PDFSharp,3 +/packages?q=pdu,pdu,3 +/packages?q=Pechkin,Pechkin,3 +/packages?q=pem,pem,3 +/packages?q=pemutils,pemutils,3 +/packages?q=PerformanceCounters,PerformanceCounters,3 +/packages?q=permission,permission,3 +/packages?q=PetaPoco,PetaPoco,3 +/packages?q=pgp,pgp,3 +/packages?q=phantom+js,phantom js,3 +/packages?q=phoesion,phoesion,3 +/packages?q=phonegap,phonegap,3 +/packages?q=phonenumber,phonenumber,3 +/packages?q=php,php,3 +/packages?q=physics,physics,3 +/packages?q=piechart,piechart,3 +/packages?q=Pieter van Ginkel,Pieter van Ginkel,3 +/packages?q=Pipe,Pipe,3 +/packages?q=pipeline,pipeline,3 +/packages?q=pipelines.sockets.unofficial,pipelines.sockets.unofficial,3 +/packages?q=pivotal,pivotal,3 +/packages?q=pkcs11,pkcs11,3 +/packages?q=plaid.net,plaid.net,3 +/packages?q=platform&page=52,platform,3 +/packages?q=platform+abstrac,platform abstrac,3 +/packages?q=playfab&sortOrder=package-download-count,playfab,3 +/packages?q=PList,PList,3 +/packages?q=plot&page=3,plot,3 +/packages?q=Plugin,Plugin,3 +/packages?q=plugin for xamarin&page=121,plugin for xamarin,3 +/packages?q=plugin for xamarin&page=128,plugin for xamarin,3 +/packages?q=plugin for xamarin&page=16,plugin for xamarin,3 +/packages?q=plugin for xamarin&page=29,plugin for xamarin,3 +/packages?q=plugin for xamarin&page=7,plugin for xamarin,3 +/packages?q=plugins for xamarin&page=88,plugins for xamarin,3 +/packages?q=plugins+for+xamarin,plugins for xamarin,3 +/packages?q=plural,plural,3 +/packages?q=pnp,pnp,3 +/packages?q=poco,poco,3 +/packages?q=POCO&prerel=false,POCO,3 +/packages?q=pomelo,pomelo,3 +/packages?q=Pomelo,Pomelo,3 +/packages?q=pomelo.entityframeworkcore.mysql,pomelo.entityframeworkcore.mysql,3 +/packages?q=pomelo+mysql,pomelo mysql,3 +/packages?q=Pool,Pool,3 +"/packages?q=POP3,","POP3,",3 +/packages?q=popup,popup,3 +/packages?q=Popup,Popup,3 +/packages?q=portable+accord.net,portable accord.net,3 +/packages?q=portaudio,portaudio,3 +/packages?q=POS&page=2,POS,3 +/packages?q=Posh-Git,Posh-Git,3 +/packages?q=postcss,postcss,3 +/packages?q=postgres+,postgres,3 +/packages?q=PowerPoint&page=2,PowerPoint,3 +/packages?q=ppmd,ppmd,3 +/packages?q=PPS,PPS,3 +/packages?q=pptx,pptx,3 +/packages?q=practices,practices,3 +/packages?q=Practices.unity+,Practices.unity,3 +/packages?q=praeclarum,praeclarum,3 +/packages?q=print+to+barcode,print to barcode,3 +/packages?q=print+to+pdf,print to pdf,3 +/packages?q=printdocument,printdocument,3 +/packages?q=prism,prism,3 +"/packages?q=Prism,&page=5","Prism,",3 +/packages?q=prism.unity,prism.unity,3 +/packages?q=prism+5.0,prism 5.0,3 +/packages?q=Process,Process,3 +/packages?q=process&page=14,process,3 +/packages?q=ProcessRunner,ProcessRunner,3 +/packages?q=Profiler,Profiler,3 +/packages?q=profiling,profiling,3 +/packages?q=progress,progress,3 +/packages?q=progress+bar,progress bar,3 +/packages?q=Project Extensions&page=314,Project Extensions,3 +/packages?q=ProjectServerServices,ProjectServerServices,3 +/packages?q=projnet,projnet,3 +/packages?q=prometheus-net.AspNetCore,prometheus-net.AspNetCore,3 +/packages?q=protector,protector,3 +/packages?q=Proto.Actor,Proto.Actor,3 +/packages?q=protobuf.cpp+vs2013,protobuf.cpp vs2013,3 +/packages?q=protobuf+tool,protobuf tool,3 +/packages?q=PrototypeJS,PrototypeJS,3 +/packages?q=proxy,proxy,3 +/packages?q=PSeq,PSeq,3 +/packages?q=PSGTestLibrary,PSGTestLibrary,3 +/packages?q=pt-br,pt-br,3 +/packages?q=publish,publish,3 +/packages?q=PubSub,PubSub,3 +/packages?q=puppeteer,puppeteer,3 +/packages?q=Puppeteer,Puppeteer,3 +/packages?q=PushNotification,PushNotification,3 +/packages?q=PushNotification&page=2,PushNotification,3 +/packages?q=PushSharp.Amazon,PushSharp.Amazon,3 +/packages?q=Pushwoosh,Pushwoosh,3 +/packages?q=qr,qr,3 +/packages?q=qr&page=3,qr,3 +/packages?q=qrcode&prerel=false,qrcode,3 +/packages?q=QRCode+c,QRCode c,3 +/packages?q=QRCoder,QRCoder,3 +/packages?q=Quartz,Quartz,3 +/packages?q=Quartz.Log,Quartz.Log,3 +/packages?q=Quartz.NET+,Quartz.NET,3 +/packages?q=Quartz.Plugin,Quartz.Plugin,3 +/packages?q=quartz+2.3.3.0,quartz 2.3.3.0,3 +/packages?q=queryable,queryable,3 +"/packages?q=querystring,","querystring,",3 +/packages?q=QueryStringDotNET,QueryStringDotNET,3 +/packages?q=Queue+job+Queue+FIFO,Queue job Queue FIFO,3 +/packages?q=QuickFix.Net.NETCore.FIX44,QuickFix.Net.NETCore.FIX44,3 +/packages?q=quill,quill,3 +/packages?q=R.Scheduler,R.Scheduler,3 +/packages?q=r4mvc,r4mvc,3 +/packages?q=rabbimq.clinet,rabbimq.clinet,3 +/packages?q=RabbitMQ,RabbitMQ,3 +/packages?q=RabbitMQ.Client,RabbitMQ.Client,3 +/packages?q=radar,radar,3 +/packages?q=radar+chart,radar chart,3 +/packages?q=radial+menu,radial menu,3 +/packages?q=radius,radius,3 +/packages?q=RAML.Api.Core,RAML.Api.Core,3 +/packages?q=Range&page=6,Range,3 +/packages?q=Rank,Rank,3 +/packages?q=ranorex,ranorex,3 +/packages?q=Raspberry,Raspberry,3 +/packages?q=Raspberry&page=2,Raspberry,3 +/packages?q=raster,raster,3 +/packages?q=ratelimit&sortOrder=package-download-count,ratelimit,3 +/packages?q=raven,raven,3 +/packages?q=raygun,raygun,3 +/packages?q=razor,razor,3 +/packages?q=Razor Client Templates&page=29,Razor Client Templates,3 +/packages?q=RazorTemplates Project&page=35,RazorTemplates Project,3 +/packages?q=RDF,RDF,3 +/packages?q=reactive,reactive,3 +/packages?q=Reactive+Extensions,Reactive Extensions,3 +"/packages?q=Readability,","Readability,",3 +/packages?q=readme,readme,3 +/packages?q=ReadOnlyCollection,ReadOnlyCollection,3 +/packages?q=Realm,Realm,3 +/packages?q=Realm.Database,Realm.Database,3 +/packages?q=realtime,realtime,3 +/packages?q=recognition,recognition,3 +/packages?q=rectangles,rectangles,3 +/packages?q=redis,redis,3 +/packages?q=Redis,Redis,3 +/packages?q=redis&page=20,redis,3 +/packages?q=redis+stackexchange,redis stackexchange,3 +/packages?q=refactoring,refactoring,3 +/packages?q=reference+dll+embed,reference dll embed,3 +/packages?q=reflection&page=4,reflection,3 +"/packages?q=regex,&page=4","regex,",3 +/packages?q=registration&page=6,registration,3 +/packages?q=remesh,remesh,3 +/packages?q=remote&page=2,remote,3 +/packages?q=remove package,remove package,3 +/packages?q=renderer&page=2,renderer,3 +/packages?q=repl,repl,3 +/packages?q=replace&page=2,replace,3 +/packages?q=report+generator,report generator,3 +/packages?q=Report+viewer+,Report viewer,3 +/packages?q=reporting&page=5,reporting,3 +/packages?q=reports&page=2,reports,3 +/packages?q=ReportViewerForMVC,ReportViewerForMVC,3 +/packages?q=reportviewerformvc+core,reportviewerformvc core,3 +/packages?q=repository,repository,3 +/packages?q=Repository,Repository,3 +/packages?q=request,request,3 +/packages?q=resharper,resharper,3 +/packages?q=resizer&page=4,resizer,3 +/packages?q=response,response,3 +/packages?q=Response,Response,3 +"/packages?q=responsive,&page=6","responsive,",3 +/packages?q=rest,rest,3 +"/packages?q=REST,&page=13","REST,",3 +"/packages?q=REST,&page=32","REST,",3 +"/packages?q=REST,&page=51","REST,",3 +/packages?q=Rest&page=12,Rest,3 +/packages?q=Rest&page=27,Rest,3 +/packages?q=REST&page=50,REST,3 +/packages?q=REST&sortOrder=relevance&page=17&prerelease=False,REST,3 +/packages?q=restcake,restcake,3 +/packages?q=restful,restful,3 +/packages?q=restore&page=3,restore,3 +/packages?q=restshap,restshap,3 +/packages?q=RestSharp,RestSharp,3 +/packages?q=RestSharp&page=2,RestSharp,3 +/packages?q=retry&page=5,retry,3 +/packages?q=Reverse,Reverse,3 +/packages?q=Rezoom,Rezoom,3 +/packages?q=RGB,RGB,3 +/packages?q=riaservices.server,riaservices.server,3 +/packages?q=RibbonBar,RibbonBar,3 +/packages?q=rich,rich,3 +/packages?q=Rich,Rich,3 +/packages?q=Richard Dingwall&page=5,Richard Dingwall,3 +/packages?q=rightnow,rightnow,3 +/packages?q=Robin Herbots,Robin Herbots,3 +/packages?q=rolosoft,rolosoft,3 +/packages?q=rosyln,rosyln,3 +/packages?q=rotativa,rotativa,3 +/packages?q=routeconfig,routeconfig,3 +/packages?q=rspec,rspec,3 +/packages?q=RSS14&page=1,RSS14,3 +/packages?q=rtf,rtf,3 +/packages?q=RuleEngine,RuleEngine,3 +/packages?q=rules,rules,3 +/packages?q=Run&page=25,Run,3 +/packages?q=runtime.linux-musl-x64.microsoft.netcore.app,runtime.linux-musl-x64.microsoft.netcore.app,3 +/packages?q=runtime.native,runtime.native,3 +/packages?q=Runtime&page=39,Runtime,3 +/packages?q=rust,rust,3 +/packages?q=Rx,Rx,3 +/packages?q=s22,s22,3 +/packages?q=s3,s3,3 +/packages?q=SaasKit.Multitenancy.WebApi,SaasKit.Multitenancy.WebApi,3 +/packages?q=Sage Software,Sage Software,3 +/packages?q=Sage+Data+Object,Sage Data Object,3 +/packages?q=samplebrowser.core,samplebrowser.core,3 +/packages?q=samsung xamarin&page=43,samsung xamarin,3 +/packages?q=saraff.twain,saraff.twain,3 +/packages?q=save+file,save file,3 +/packages?q=scaffolding,scaffolding,3 +"/packages?q=Scaffolding,&page=5","Scaffolding,",3 +/packages?q=scaffolding&sortOrder=package-download-count,scaffolding,3 +/packages?q=ScalingClever,ScalingClever,3 +/packages?q=scan,scan,3 +/packages?q=scentry,scentry,3 +/packages?q=schedule,schedule,3 +/packages?q=scheduling,scheduling,3 +/packages?q=scientific,scientific,3 +/packages?q=Scott (nuget package only)&page=295,Scott (nuget package only),3 +/packages?q=Scott Hanselman&sortOrder=relevance&page=2,Scott Hanselman,3 +/packages?q=scraper,scraper,3 +/packages?q=Screen&page=7,Screen,3 +/packages?q=script#&page=183,script,3 +"/packages?q=scripts,","scripts,",3 +/packages?q=scripts&page=18,scripts,3 +/packages?q=scrolling,scrolling,3 +/packages?q=sdk,sdk,3 +"/packages?q=sdk,&page=20","sdk,",3 +"/packages?q=sdk,&sortOrder=package-download-count&page=6&prerelease=False","sdk,",3 +/packages?q=sdk&page=21,sdk,3 +/packages?q=SDK&page=26,SDK,3 +/packages?q=SDK&page=91,SDK,3 +/packages?q=SDL2_image,SDL2_image,3 +/packages?q=secure-peer,secure-peer,3 +/packages?q=secure&page=5,secure,3 +/packages?q=secureblackbox,secureblackbox,3 +/packages?q=SecureBlackbox+10,SecureBlackbox 10,3 +/packages?q=security,security,3 +/packages?q=segment.io,segment.io,3 +/packages?q=selectr,selectr,3 +"/packages?q=Selenium,&page=8","Selenium,",3 +/packages?q=selenium?utm_medium=email&utm_language=csharp&__s=p8vukpcerof2v9xz8ess,selenium?utm_medium=email,3 +/packages?q=Self-Host&page=3,Self-Host,3 +/packages?q=SelfHost&page=2,SelfHost,3 +/packages?q=semantic,semantic,3 +/packages?q=SendEx,SendEx,3 +/packages?q=sendgrid,sendgrid,3 +/packages?q=SendGridMail,SendGridMail,3 +/packages?q=senparc,senparc,3 +/packages?q=Senparc.Weixin,Senparc.Weixin,3 +/packages?q=sentry,sentry,3 +/packages?q=sequencial+guid,sequencial guid,3 +/packages?q=serde-yaml,serde-yaml,3 +/packages?q=serialization,serialization,3 +/packages?q=Serialization&page=13,Serialization,3 +/packages?q=SerialPortStream,SerialPortStream,3 +/packages?q=serilog.aspnetcore,serilog.aspnetcore,3 +/packages?q=Serilog.Extensions.Logging.File,Serilog.Extensions.Logging.File,3 +/packages?q=serilog.settings,serilog.settings,3 +/packages?q=Serilog.Settings.Configuration,Serilog.Settings.Configuration,3 +/packages?q=serilog.sinks,serilog.sinks,3 +/packages?q=Serilog.Sinks.Async,Serilog.Sinks.Async,3 +/packages?q=Serilog.Sinks.Console,Serilog.Sinks.Console,3 +/packages?q=Serilog.Sinks.ElasticSearch,Serilog.Sinks.ElasticSearch,3 +/packages?q=Serilog.Sinks.PeriodicBatching,Serilog.Sinks.PeriodicBatching,3 +/packages?q=serilog.sinks.udp,serilog.sinks.udp,3 +/packages?q=serilog+elasticsearch,serilog elasticsearch,3 +/packages?q=serilog+sink,serilog sink,3 +/packages?q=Service,Service,3 +/packages?q=service-locator,service-locator,3 +/packages?q=service+model,service model,3 +/packages?q=servicebus,servicebus,3 +/packages?q=ServiceRuntime,ServiceRuntime,3 +/packages?q=servicestack,servicestack,3 +/packages?q=ServiceStack,ServiceStack,3 +/packages?q=ServiceStack.Api.OpenApi,ServiceStack.Api.OpenApi,3 +/packages?q=servicestack.interfaces,servicestack.interfaces,3 +/packages?q=ServiceStack.Ormlite,ServiceStack.Ormlite,3 +/packages?q=servicestack.text,servicestack.text,3 +/packages?q=ServiceStack.Text,ServiceStack.Text,3 +/packages?q=session,session,3 +/packages?q=Session;&page=3,Session;,3 +/packages?q=sevenzipsharp,sevenzipsharp,3 +/packages?q=SFA.DAS.EmployerUrlHelper,SFA.DAS.EmployerUrlHelper,3 +/packages?q=SFA.DAS.Notifications.Api.Client,SFA.DAS.Notifications.Api.Client,3 +/packages?q=SFA.DAS.Reservations.Api.Client,SFA.DAS.Reservations.Api.Client,3 +/packages?q=sfa.das.sas,sfa.das.sas,3 +/packages?q=sfdataform,sfdataform,3 +/packages?q=sflistview,sflistview,3 +/packages?q=sftp&source=post_page---------------------------,sftp,3 +/packages?q=sftp+server,sftp server,3 +/packages?q=SGML,SGML,3 +"/packages?q=SHA,","SHA,",3 +/packages?q=shader&sortOrder=package-download-count&page=2,shader,3 +/packages?q=Shapefile,Shapefile,3 +/packages?q=shapefile+geojson,shapefile geojson,3 +/packages?q=shared+management+objects,shared management objects,3 +/packages?q=SharePoint 2013 client&page=204,SharePoint 2013 client,3 +/packages?q=SharePoint PnP Core Library,SharePoint PnP Core Library,3 +/packages?q=SharePoint PnP Core Library&page=15,SharePoint PnP Core Library,3 +/packages?q=SharePoint PnP Core Library&page=8,SharePoint PnP Core Library,3 +"/packages?q=SharePoint,","SharePoint,",3 +/packages?q=sharepoint.dll,sharepoint.dll,3 +/packages?q=SharePoint.dll,SharePoint.dll,3 +/packages?q=SharePoint+2013+client,SharePoint 2013 client,3 +/packages?q=SharePointDSC,SharePointDSC,3 +/packages?q=Sharp Architecture Dev Team&page=63,Sharp Architecture Dev Team,3 +/packages?q=Sharp Architecture Dev Team&sortOrder=package-download-count&page=22,Sharp Architecture Dev Team,3 +/packages?q=SharpBucket,SharpBucket,3 +/packages?q=sharpbuckettest,sharpbuckettest,3 +/packages?q=SharpDevelop,SharpDevelop,3 +/packages?q=sharpgl,sharpgl,3 +/packages?q=SharpKml.Base,SharpKml.Base,3 +/packages?q=Sharpnado,Sharpnado,3 +/packages?q=sharppcap,sharppcap,3 +/packages?q=SharpShell,SharpShell,3 +/packages?q=SharpSvn Project&page=139,SharpSvn Project,3 +/packages?q=SharpSvn Project&page=16,SharpSvn Project,3 +/packages?q=SharpVG,SharpVG,3 +/packages?q=shorthand,shorthand,3 +/packages?q=showme,showme,3 +/packages?q=SignalR,SignalR,3 +/packages?q=signalr://&page=107,signalr://,3 +/packages?q=signalr://&page=233,signalr://,3 +/packages?q=SILVERLIGHT&sortOrder=relevance&page=4,SILVERLIGHT,3 +"/packages?q=simple,&page=161","simple,",3 +/packages?q=simple.odata.client,simple.odata.client,3 +/packages?q=simple&page=70,simple,3 +/packages?q=simpleinject,simpleinject,3 +/packages?q=simulator,simulator,3 +/packages?q=single+sign+on,single sign on,3 +/packages?q=singler,singler,3 +/packages?q=singleton,singleton,3 +/packages?q=sitecore&page=5,sitecore,3 +/packages?q=Sitefinity&page=158,Sitefinity,3 +/packages?q=Sitefinity&page=23,Sitefinity,3 +/packages?q=SkiaSharp,SkiaSharp,3 +/packages?q=skiaSharp+linux,skiaSharp linux,3 +/packages?q=sl50&page=4,sl50,3 +/packages?q=slackapi,slackapi,3 +/packages?q=slackclient,slackclient,3 +/packages?q=slf4net,slf4net,3 +/packages?q=slider&page=3,slider,3 +/packages?q=slow+cheetah,slow cheetah,3 +/packages?q=Smagger,Smagger,3 +/packages?q=SMART,SMART,3 +/packages?q=SmartThings,SmartThings,3 +/packages?q=SMPP,SMPP,3 +/packages?q=SMS,SMS,3 +/packages?q=SMS&sortOrder=package-download-count&page=3&prerelease=False,SMS,3 +/packages?q=Smtp,Smtp,3 +/packages?q=SmtpClient,SmtpClient,3 +/packages?q=SnapObjects,SnapObjects,3 +/packages?q=Snapshot,Snapshot,3 +/packages?q=snmp+server,snmp server,3 +/packages?q=Snowball,Snowball,3 +/packages?q=snowflake,snowflake,3 +/packages?q=soap+validator&prerel=false,soap validator,3 +/packages?q=soapcore,soapcore,3 +/packages?q=socket+autoreconnect,socket autoreconnect,3 +/packages?q=socket+com,socket com,3 +/packages?q=SoftCircuits.EasyEncryption,SoftCircuits.EasyEncryption,3 +/packages?q=solidworks,solidworks,3 +/packages?q=sonar,sonar,3 +/packages?q=sonarsharp,sonarsharp,3 +/packages?q=sort,sort,3 +/packages?q=sound&page=3,sound,3 +/packages?q=source,source,3 +/packages?q=sourcelink,sourcelink,3 +/packages?q=spam,spam,3 +/packages?q=SpanapiWrapper,SpanapiWrapper,3 +/packages?q=spark,spark,3 +/packages?q=sparkpost,sparkpost,3 +/packages?q=Spatial&page=4,Spatial,3 +/packages?q=spatial&sortOrder=relevance&page=2&prerelease=False,spatial,3 +/packages?q=spd+log,spd log,3 +/packages?q=spdlog,spdlog,3 +/packages?q=specf;pw,specf;pw,3 +/packages?q=SpecFlow,SpecFlow,3 +/packages?q=specflow.tools.msbuild.generation,specflow.tools.msbuild.generation,3 +/packages?q=specification,specification,3 +/packages?q=Speech,Speech,3 +/packages?q=spinner,spinner,3 +/packages?q=spinner&page=2,spinner,3 +/packages?q=spire,spire,3 +/packages?q=Splunk&prerel=false,Splunk,3 +/packages?q=Sportradar,Sportradar,3 +/packages?q=spreadsheet&page=4,spreadsheet,3 +/packages?q=spreadsheetgear,spreadsheetgear,3 +/packages?q=spring,spring,3 +/packages?q=Spring.Data.NHibernate,Spring.Data.NHibernate,3 +/packages?q=spring.net,spring.net,3 +/packages?q=Sprites,Sprites,3 +/packages?q=Sql&page=19,Sql,3 +/packages?q=sql&page=87,sql,3 +/packages?q=Sql&sortOrder=relevance&page=17&prerelease=False,Sql,3 +/packages?q=sql+server+driver,sql server driver,3 +/packages?q=SqlBulkTools,SqlBulkTools,3 +/packages?q=sqlcompact,sqlcompact,3 +/packages?q=SQLite Development Team,SQLite Development Team,3 +/packages?q=sqlite&sortOrder=package-download-count,sqlite,3 +/packages?q=sqlite+bulk+insert,sqlite bulk insert,3 +/packages?q=sqlite+core,sqlite core,3 +/packages?q=sqlitepcl,sqlitepcl,3 +/packages?q=SQLitePCL,SQLitePCL,3 +/packages?q=SQLitePCL.raw,SQLitePCL.raw,3 +/packages?q=SQLitePCLRaw.bundle_e_sqlite3,SQLitePCLRaw.bundle_e_sqlite3,3 +/packages?q=SqlLite,SqlLite,3 +/packages?q=sqlmanagement,sqlmanagement,3 +/packages?q=SQLProj,SQLProj,3 +/packages?q=sqlprovider,sqlprovider,3 +/packages?q=sqlservercompact,sqlservercompact,3 +/packages?q=sqs,sqs,3 +/packages?q=ss.net,ss.net,3 +/packages?q=ss.pangu,ss.pangu,3 +/packages?q=ssh.net,ssh.net,3 +/packages?q=StackExchange+Redis,StackExchange Redis,3 +/packages?q=StackifyLib.AspNetCore,StackifyLib.AspNetCore,3 +/packages?q=StackOverflow,StackOverflow,3 +/packages?q=stanford,stanford,3 +/packages?q=Starksoft,Starksoft,3 +/packages?q=stars,stars,3 +/packages?q=State+Machine+,State Machine,3 +/packages?q=statechart,statechart,3 +/packages?q=statistics,statistics,3 +/packages?q=status,status,3 +/packages?q=steam,steam,3 +/packages?q=Steeltoe.Discovery.Eureka.Client,Steeltoe.Discovery.Eureka.Client,3 +/packages?q=Steeltoe.Management.Diagnostics.2.1.0,Steeltoe.Management.Diagnostics.2.1.0,3 +/packages?q=Steven van Deursen&page=12,Steven van Deursen,3 +/packages?q=StoredProcedures,StoredProcedures,3 +/packages?q=stratis+smart+contract,stratis smart contract,3 +/packages?q=streaming,streaming,3 +/packages?q=streaming&page=5,streaming,3 +/packages?q=Streaming&page=5,Streaming,3 +/packages?q=String,String,3 +/packages?q=string.format,string.format,3 +/packages?q=stringbuilder,stringbuilder,3 +/packages?q=StringBuilder,StringBuilder,3 +/packages?q=StringComparison,StringComparison,3 +/packages?q=Strings,Strings,3 +/packages?q=stripe,stripe,3 +/packages?q=Strongly-Typed&page=4,Strongly-Typed,3 +/packages?q=StronglyTypedId,StronglyTypedId,3 +/packages?q=structuremap.automocking,structuremap.automocking,3 +/packages?q=stun,stun,3 +/packages?q=stylecop.analyzers,stylecop.analyzers,3 +/packages?q=StyleCop.Analyzers.Codefixes,StyleCop.Analyzers.Codefixes,3 +/packages?q=stylet,stylet,3 +/packages?q=submenu,submenu,3 +/packages?q=subsonic,subsonic,3 +/packages?q=supersocket,supersocket,3 +/packages?q=sustainsys.saml2.mvc,sustainsys.saml2.mvc,3 +/packages?q=svg,svg,3 +/packages?q=SVM,SVM,3 +/packages?q=svn+c,svn c,3 +/packages?q=sw,sw,3 +/packages?q=swagger,swagger,3 +/packages?q=Swashbuckle,Swashbuckle,3 +/packages?q=Swashbuckle.AspNetCore.Filters,Swashbuckle.AspNetCore.Filters,3 +/packages?q=Swashbuckle.AspNetCore.SwaggerGen,Swashbuckle.AspNetCore.SwaggerGen,3 +/packages?q=Swashbuckle.AspNetCore+,Swashbuckle.AspNetCore,3 +/packages?q=Swashbuckle.Core,Swashbuckle.Core,3 +/packages?q=swashbuckle.mvc,swashbuckle.mvc,3 +/packages?q=Swashbuckle.Swagger,Swashbuckle.Swagger,3 +/packages?q=Swipyrefresh,Swipyrefresh,3 +/packages?q=switch,switch,3 +/packages?q=Switch,Switch,3 +/packages?q=SYBase,SYBase,3 +/packages?q=Sybase.Data.AseDataProvider,Sybase.Data.AseDataProvider,3 +/packages?q=symbol+server,symbol server,3 +/packages?q=Symbols,Symbols,3 +/packages?q=Syncfusion.Compression.Base,Syncfusion.Compression.Base,3 +/packages?q=Syncfusion.ej2.blazor,Syncfusion.ej2.blazor,3 +/packages?q=Syncfusion.ExcelToPdfConverter.AspNet.Mvc5,Syncfusion.ExcelToPdfConverter.AspNet.Mvc5,3 +/packages?q=syncfusion.licensing,syncfusion.licensing,3 +/packages?q=syncfusion+blazor,syncfusion blazor,3 +/packages?q=synchronize&page=2,synchronize,3 +/packages?q=Syntax,Syntax,3 +/packages?q=syslog+tcp+client,syslog tcp client,3 +/packages?q=system.collections.immutable,system.collections.immutable,3 +/packages?q=system.collections.specialized,system.collections.specialized,3 +/packages?q=System.Collections.Specialized,System.Collections.Specialized,3 +/packages?q=System.Composition,System.Composition,3 +/packages?q=system.configuration,system.configuration,3 +/packages?q=System.configuration,System.configuration,3 +/packages?q=System.Configuration,System.Configuration,3 +/packages?q=System.Configuration.ConfigurationManager,System.Configuration.ConfigurationManager,3 +/packages?q=System.Configuration.ConfigurationManager.,System.Configuration.ConfigurationManager.,3 +/packages?q=System.Configuration.ConfigurationManager&sortOrder=package-download-count,System.Configuration.ConfigurationManager,3 +/packages?q=System.Configuration.ConfigurationManager+,System.Configuration.ConfigurationManager,3 +/packages?q=System.Configuration.ConfigurationSettings,System.Configuration.ConfigurationSettings,3 +/packages?q=system.data.datasetextensions,system.data.datasetextensions,3 +/packages?q=System.Data.Entity+.net+core+2.0,System.Data.Entity .net core 2.0,3 +/packages?q=system.data.sqlClient,system.data.sqlClient,3 +/packages?q=System.Data.Sqlite,System.Data.Sqlite,3 +/packages?q=System.Device.Gpio,System.Device.Gpio,3 +/packages?q=system.device.location,system.device.location,3 +/packages?q=System.Diagnostics,System.Diagnostics,3 +/packages?q=system.diagnostics.diagnosticsource,system.diagnostics.diagnosticsource,3 +/packages?q=System.Diagnostics.DiagnosticSource,System.Diagnostics.DiagnosticSource,3 +/packages?q=System.Diagnostics.StackTrace,System.Diagnostics.StackTrace,3 +/packages?q=System.Diagnostics.TraceSource,System.Diagnostics.TraceSource,3 +/packages?q=system.drawing.common,system.drawing.common,3 +/packages?q=System.Drawing.Common,System.Drawing.Common,3 +/packages?q=System.Drawing.dll,System.Drawing.dll,3 +/packages?q=System.Drawing&page=2,System.Drawing,3 +/packages?q=system.globalization,system.globalization,3 +/packages?q=System.Globalization.Extensions,System.Globalization.Extensions,3 +/packages?q=System.IdentityModel,System.IdentityModel,3 +/packages?q=system.identitymodel.tokens.jwt,system.identitymodel.tokens.jwt,3 +/packages?q=System.Interactive,System.Interactive,3 +/packages?q=system.io,system.io,3 +/packages?q=system.io.compression.native,system.io.compression.native,3 +/packages?q=System.IO.FileSystem.Watcher,System.IO.FileSystem.Watcher,3 +/packages?q=System.IO.Packaging,System.IO.Packaging,3 +/packages?q=system.io+4.3,system.io 4.3,3 +/packages?q=System.link.dynamic,System.link.dynamic,3 +/packages?q=System.Management.Automation,System.Management.Automation,3 +/packages?q=System.Management.Automation.dll,System.Management.Automation.dll,3 +/packages?q=System.memory,System.memory,3 +/packages?q=System.Messaging.Message,System.Messaging.Message,3 +/packages?q=system.net,system.net,3 +/packages?q=System.Net.Http.Extensions.Compression.Core.Compressors,System.Net.Http.Extensions.Compression.Core.Compressors,3 +/packages?q=System.Net.Jsaon,System.Net.Jsaon,3 +/packages?q=system.net.websockets,system.net.websockets,3 +/packages?q=System.Object,System.Object,3 +/packages?q=System.ObjectModel,System.ObjectModel,3 +/packages?q=System.Reflection.DispatchProxy,System.Reflection.DispatchProxy,3 +/packages?q=System.Reflection.Emit,System.Reflection.Emit,3 +/packages?q=System.Reflection.Metadata&sortOrder=package-download-count,System.Reflection.Metadata,3 +/packages?q=System.Reflection.TypeExtensions,System.Reflection.TypeExtensions,3 +/packages?q=System.Runtime.Caching.ObjectCache,System.Runtime.Caching.ObjectCache,3 +/packages?q=system.runtime.compilerservices.unsafe,system.runtime.compilerservices.unsafe,3 +/packages?q=System.Runtime.Loader,System.Runtime.Loader,3 +/packages?q=System.Runtime.Serialization.Formatters.Soap,System.Runtime.Serialization.Formatters.Soap,3 +/packages?q=System.Runtime+,System.Runtime,3 +/packages?q=system.runtine,system.runtine,3 +/packages?q=System.Security,System.Security,3 +/packages?q=System.Security.Claims,System.Security.Claims,3 +/packages?q=System.Security.Cryptography,System.Security.Cryptography,3 +/packages?q=System.Security.Cryptography.X509Certificates,System.Security.Cryptography.X509Certificates,3 +/packages?q=System.Security.Cyptography,System.Security.Cyptography,3 +/packages?q=System.Security.Principal.windows,System.Security.Principal.windows,3 +/packages?q=System.Security.Principal.Windows,System.Security.Principal.Windows,3 +/packages?q=System.ServiceModel,System.ServiceModel,3 +/packages?q=System.ServiceModel.Channels,System.ServiceModel.Channels,3 +/packages?q=system.servicemodel.primitives,system.servicemodel.primitives,3 +/packages?q=System.ServiceModel.Syndicatio,System.ServiceModel.Syndicatio,3 +/packages?q=System.ServiceModel.Syndication,System.ServiceModel.Syndication,3 +/packages?q=System.ServiceProcess.ServiceController,System.ServiceProcess.ServiceController,3 +/packages?q=System.Text.json,System.Text.json,3 +/packages?q=System.Text.Json.Serialization,System.Text.Json.Serialization,3 +/packages?q=system.valuetask,system.valuetask,3 +/packages?q=system.web.extensions,system.web.extensions,3 +/packages?q=System.Web.Extensions,System.Web.Extensions,3 +/packages?q=System.Web.Http+,System.Web.Http,3 +"/packages?q=System.Web.Mvc,+Version=5.2.3.0","System.Web.Mvc, Version=5.2.3.0",3 +/packages?q=System.Web.Razor,System.Web.Razor,3 +/packages?q=System.Web.Services.Protocols.SoapMessage,System.Web.Services.Protocols.SoapMessage,3 +/packages?q=system.web.webpages,system.web.webpages,3 +/packages?q=System.Web.Webpages,System.Web.Webpages,3 +/packages?q=system.web.webpages.razor,system.web.webpages.razor,3 +/packages?q=System.Xml.ReaderWriter,System.Xml.ReaderWriter,3 +/packages?q=System.Xml.XmlSerializer,System.Xml.XmlSerializer,3 +/packages?q=system.xml.xpath.xmldocument,system.xml.xpath.xmldocument,3 +/packages?q=system+numerics,system numerics,3 +/packages?q=system+web+mvc,system web mvc,3 +/packages?q=Systems.Xml,Systems.Xml,3 +"/packages?q=T-SQL,","T-SQL,",3 +/packages?q=T.dump,T.dump,3 +/packages?q=tab&page=1,tab,3 +/packages?q=TabControl wpf,TabControl wpf,3 +"/packages?q=Table,&page=4","Table,",3 +/packages?q=tagif,tagif,3 +"/packages?q=Tags:"".Net,MVC,WebApi""","Tags:"".Net,MVC,WebApi""",3 +"/packages?q=Tags:"".net""","Tags:"".net""",3 +"/packages?q=Tags:"".net47""","Tags:"".net47""",3 +"/packages?q=Tags:"".nupkg""","Tags:"".nupkg""",3 +"/packages?q=Tags:""'.Net""&page=200","Tags:""'.Net""",3 +"/packages?q=Tags:""'.NET""&page=68","Tags:""'.NET""",3 +"/packages?q=Tags:""'API""&page=69","Tags:""'API""",3 +"/packages?q=Tags:""'C#""&page=38","Tags:""'C",3 +"/packages?q=Tags:""'Data""&page=29","Tags:""'Data""",3 +"/packages?q=Tags:""'Decrypt'""","Tags:""'Decrypt'""",3 +"/packages?q=Tags:""'Encrypt'""","Tags:""'Encrypt'""",3 +"/packages?q=Tags:""'Test""&page=7","Tags:""'Test""",3 +"/packages?q=Tags:""""virtual""","Tags:""""virtual""",3 +"/packages?q=Tags:""&page=990","Tags:""",3 +"/packages?q=Tags:""#bot""&page=3","Tags:""",3 +"/packages?q=Tags:""#Emoji""","Tags:""",3 +"/packages?q=Tags:""#Generator""&page=9","Tags:""",3 +"/packages?q=Tags:""1C""","Tags:""1C""",3 +"/packages?q=Tags:""2Captcha""","Tags:""2Captcha""",3 +"/packages?q=Tags:""61850""","Tags:""61850""",3 +"/packages?q=Tags:""ACBr""","Tags:""ACBr""",3 +"/packages?q=Tags:""accessibility""","Tags:""accessibility""",3 +"/packages?q=Tags:""Acrylic""","Tags:""Acrylic""",3 +"/packages?q=Tags:""ActionFilter""","Tags:""ActionFilter""",3 +"/packages?q=Tags:""ActivePDF""","Tags:""ActivePDF""",3 +"/packages?q=Tags:""AddJsonFile""","Tags:""AddJsonFile""",3 +"/packages?q=Tags:""ADFS""","Tags:""ADFS""",3 +"/packages?q=Tags:""ADO.NET""","Tags:""ADO.NET""",3 +"/packages?q=Tags:""Ads""","Tags:""Ads""",3 +"/packages?q=Tags:""aead""","Tags:""aead""",3 +"/packages?q=Tags:""aes-encryption""","Tags:""aes-encryption""",3 +"/packages?q=Tags:""aes128gcm""","Tags:""aes128gcm""",3 +"/packages?q=Tags:""aes256""","Tags:""aes256""",3 +"/packages?q=Tags:""AfterEffects""","Tags:""AfterEffects""",3 +"/packages?q=Tags:""AI""","Tags:""AI""",3 +"/packages?q=Tags:""ajax""","Tags:""ajax""",3 +"/packages?q=Tags:""akka""&page=6","Tags:""akka""",3 +"/packages?q=Tags:""alert-dialog""","Tags:""alert-dialog""",3 +"/packages?q=Tags:""algebra""&page=2","Tags:""algebra""",3 +"/packages?q=Tags:""aliyun-sdk""","Tags:""aliyun-sdk""",3 +"/packages?q=Tags:""alpr""","Tags:""alpr""",3 +"/packages?q=Tags:""Amazon.Product.API""","Tags:""Amazon.Product.API""",3 +"/packages?q=Tags:""Amazon""","Tags:""Amazon""",3 +"/packages?q=Tags:""amd64""","Tags:""amd64""",3 +"/packages?q=Tags:""android-material""","Tags:""android-material""",3 +"/packages?q=Tags:""android,""&page=2","Tags:""android,""",3 +"/packages?q=Tags:""angular-modal""","Tags:""angular-modal""",3 +"/packages?q=Tags:""AngularJS""","Tags:""AngularJS""",3 +"/packages?q=Tags:""Annotate""","Tags:""Annotate""",3 +"/packages?q=Tags:""anticaptcha""","Tags:""anticaptcha""",3 +"/packages?q=Tags:""AntiXSS""","Tags:""AntiXSS""",3 +"/packages?q=Tags:""API-Client""&page=2","Tags:""API-Client""",3 +"/packages?q=Tags:""API""""&page=58","Tags:""API""""",3 +"/packages?q=Tags:""Apiary""","Tags:""Apiary""",3 +"/packages?q=Tags:""APM""","Tags:""APM""",3 +"/packages?q=Tags:""app-intro""","Tags:""app-intro""",3 +"/packages?q=Tags:""AppFabric""","Tags:""AppFabric""",3 +"/packages?q=Tags:""application""","Tags:""application""",3 +"/packages?q=Tags:""appointment""","Tags:""appointment""",3 +"/packages?q=Tags:""are""","Tags:""are""",3 +"/packages?q=Tags:""ARES""","Tags:""ARES""",3 +"/packages?q=Tags:""args""","Tags:""args""",3 +"/packages?q=Tags:""argument-checking""","Tags:""argument-checking""",3 +"/packages?q=Tags:""Arithmetic""","Tags:""Arithmetic""",3 +"/packages?q=Tags:""as400""","Tags:""as400""",3 +"/packages?q=Tags:""ASCII""","Tags:""ASCII""",3 +"/packages?q=Tags:""ASCII85""","Tags:""ASCII85""",3 +"/packages?q=Tags:""ASM""","Tags:""ASM""",3 +"/packages?q=Tags:""asp-net""&page=46","Tags:""asp-net""",3 +"/packages?q=Tags:""asp.net-mvc-5""","Tags:""asp.net-mvc-5""",3 +"/packages?q=Tags:""ASP.NETcore""","Tags:""ASP.NETcore""",3 +"/packages?q=Tags:""aspnetcore,""&page=19","Tags:""aspnetcore,""",3 +"/packages?q=Tags:""assemblyinfo""","Tags:""assemblyinfo""",3 +"/packages?q=Tags:""assert""","Tags:""assert""",3 +"/packages?q=Tags:""AStar""","Tags:""AStar""",3 +"/packages?q=Tags:""ATLASSIAN""","Tags:""ATLASSIAN""",3 +"/packages?q=Tags:""atom""","Tags:""atom""",3 +"/packages?q=Tags:""audio-converter""","Tags:""audio-converter""",3 +"/packages?q=Tags:""audio""&page=2","Tags:""audio""",3 +"/packages?q=Tags:""augmented-reality""","Tags:""augmented-reality""",3 +"/packages?q=Tags:""Auth""&page=2","Tags:""Auth""",3 +"/packages?q=Tags:""authenticator""","Tags:""authenticator""",3 +"/packages?q=Tags:""Authorization""","Tags:""Authorization""",3 +"/packages?q=Tags:""Authorization""&page=1","Tags:""Authorization""",3 +"/packages?q=Tags:""Authorize.Net""","Tags:""Authorize.Net""",3 +"/packages?q=Tags:""autocomplete""","Tags:""autocomplete""",3 +"/packages?q=Tags:""Autoit""","Tags:""Autoit""",3 +"/packages?q=Tags:""Automapper""","Tags:""Automapper""",3 +"/packages?q=Tags:""AutoMapper""","Tags:""AutoMapper""",3 +"/packages?q=Tags:""AvalonDock""","Tags:""AvalonDock""",3 +"/packages?q=Tags:""Avatar""","Tags:""Avatar""",3 +"/packages?q=Tags:""AVX""","Tags:""AVX""",3 +"/packages?q=Tags:""Awesome""&page=2","Tags:""Awesome""",3 +"/packages?q=Tags:""Awesomium""","Tags:""Awesomium""",3 +"/packages?q=Tags:""aws-dynamodb""","Tags:""aws-dynamodb""",3 +"/packages?q=Tags:""aws-sdk-cpp""","Tags:""aws-sdk-cpp""",3 +"/packages?q=Tags:""aws-sdk-v3""&refid=ha_awssm-evergreen","Tags:""aws-sdk-v3""",3 +"/packages?q=Tags:""aws-sdk-v3""+sns","Tags:""aws-sdk-v3"" sns",3 +"/packages?q=Tags:""aws-sdk""","Tags:""aws-sdk""",3 +"/packages?q=Tags:""Axapta""","Tags:""Axapta""",3 +"/packages?q=Tags:""azure-functions""","Tags:""azure-functions""",3 +"/packages?q=Tags:""azure-table-storage""&page=2","Tags:""azure-table-storage""",3 +"/packages?q=Tags:""background""","Tags:""background""",3 +"/packages?q=Tags:""Backup""","Tags:""Backup""",3 +"/packages?q=Tags:""bank""","Tags:""bank""",3 +"/packages?q=Tags:""BankMellat""","Tags:""BankMellat""",3 +"/packages?q=Tags:""bar-chart""","Tags:""bar-chart""",3 +"/packages?q=Tags:""Bar-Chart""","Tags:""Bar-Chart""",3 +"/packages?q=Tags:""bar-code""","Tags:""bar-code""",3 +"/packages?q=Tags:""Bar-Code""","Tags:""Bar-Code""",3 +"/packages?q=Tags:""BarChart""","Tags:""BarChart""",3 +"/packages?q=Tags:""barcode""","Tags:""barcode""",3 +"/packages?q=Tags:""basic-authentication""","Tags:""basic-authentication""",3 +"/packages?q=Tags:""bat""","Tags:""bat""",3 +"/packages?q=Tags:""bcp""","Tags:""bcp""",3 +"/packages?q=Tags:""beanstalk""","Tags:""beanstalk""",3 +"/packages?q=Tags:""best-practices""","Tags:""best-practices""",3 +"/packages?q=Tags:""Betfair""","Tags:""Betfair""",3 +"/packages?q=Tags:""bezier""","Tags:""bezier""",3 +"/packages?q=Tags:""BGP""","Tags:""BGP""",3 +"/packages?q=Tags:""BHoM""","Tags:""BHoM""",3 +"/packages?q=Tags:""Binance""","Tags:""Binance""",3 +"/packages?q=Tags:""BinaryWriter""","Tags:""BinaryWriter""",3 +"/packages?q=Tags:""binlist.net""","Tags:""binlist.net""",3 +"/packages?q=Tags:""Biometric""","Tags:""Biometric""",3 +"/packages?q=Tags:""BitBucket""","Tags:""BitBucket""",3 +"/packages?q=Tags:""bitfinex""","Tags:""bitfinex""",3 +"/packages?q=Tags:""bitmap""","Tags:""bitmap""",3 +"/packages?q=Tags:""BitmapImage""","Tags:""BitmapImage""",3 +"/packages?q=Tags:""BITS""","Tags:""BITS""",3 +"/packages?q=Tags:""Ble""","Tags:""Ble""",3 +"/packages?q=Tags:""BLE""","Tags:""BLE""",3 +"/packages?q=Tags:""bleno""","Tags:""bleno""",3 +"/packages?q=Tags:""Block.io""","Tags:""Block.io""",3 +"/packages?q=Tags:""blockchain""","Tags:""blockchain""",3 +"/packages?q=Tags:""blog""","Tags:""blog""",3 +"/packages?q=Tags:""Blowfish""","Tags:""Blowfish""",3 +"/packages?q=Tags:""bluetooth""","Tags:""bluetooth""",3 +"/packages?q=Tags:""Blur""","Tags:""Blur""",3 +"/packages?q=Tags:""bmp""","Tags:""bmp""",3 +"/packages?q=Tags:""BMP""","Tags:""BMP""",3 +"/packages?q=Tags:""bnf""","Tags:""bnf""",3 +"/packages?q=Tags:""bookmarks""","Tags:""bookmarks""",3 +"/packages?q=Tags:""bootstrap-table""","Tags:""bootstrap-table""",3 +"/packages?q=Tags:""Bootstrap.modal""","Tags:""Bootstrap.modal""",3 +"/packages?q=Tags:""bootstrap""","Tags:""bootstrap""",3 +"/packages?q=Tags:""bootstrap""&page=6","Tags:""bootstrap""",3 +"/packages?q=Tags:""bootstraper""","Tags:""bootstraper""",3 +"/packages?q=Tags:""border-radius""","Tags:""border-radius""",3 +"/packages?q=Tags:""Borderless""","Tags:""Borderless""",3 +"/packages?q=Tags:""bot-detection""","Tags:""bot-detection""",3 +"/packages?q=Tags:""botbuilder""","Tags:""botbuilder""",3 +"/packages?q=Tags:""bottom""","Tags:""bottom""",3 +"/packages?q=Tags:""bounce-inspector""","Tags:""bounce-inspector""",3 +"/packages?q=Tags:""boundary""","Tags:""boundary""",3 +"/packages?q=Tags:""Bowser""","Tags:""Bowser""",3 +"/packages?q=Tags:""brazil""","Tags:""brazil""",3 +"/packages?q=Tags:""Broker""","Tags:""Broker""",3 +"/packages?q=Tags:""Browser,""&page=4","Tags:""Browser,""",3 +"/packages?q=Tags:""BTree""","Tags:""BTree""",3 +"/packages?q=Tags:""buildvu""","Tags:""buildvu""",3 +"/packages?q=Tags:""BulkCopy""","Tags:""BulkCopy""",3 +"/packages?q=Tags:""bypass-recaptcha-v2""","Tags:""bypass-recaptcha-v2""",3 +"/packages?q=Tags:""Bypass""","Tags:""Bypass""",3 +"/packages?q=Tags:""c""","Tags:""c""",3 +"/packages?q=Tags:""c++""","Tags:""c """,3 +"/packages?q=Tags:""C++/CLI""","Tags:""C /CLI""",3 +"/packages?q=Tags:""Cache.""&page=4","Tags:""Cache.""",3 +"/packages?q=Tags:""Cache""","Tags:""Cache""",3 +"/packages?q=Tags:""cadru""","Tags:""cadru""",3 +"/packages?q=Tags:""cake-build""","Tags:""cake-build""",3 +"/packages?q=Tags:""Calendar""&page=3","Tags:""Calendar""",3 +"/packages?q=Tags:""camelcase""","Tags:""camelcase""",3 +"/packages?q=Tags:""CamelCase""","Tags:""CamelCase""",3 +"/packages?q=Tags:""Camera""","Tags:""Camera""",3 +"/packages?q=Tags:""CAN""","Tags:""CAN""",3 +"/packages?q=Tags:""candlestick-charts""","Tags:""candlestick-charts""",3 +"/packages?q=Tags:""canvasjs""","Tags:""canvasjs""",3 +"/packages?q=Tags:""carousel""","Tags:""carousel""",3 +"/packages?q=Tags:""Carousel""","Tags:""Carousel""",3 +"/packages?q=Tags:""Cash""","Tags:""Cash""",3 +"/packages?q=Tags:""CasperJs""","Tags:""CasperJs""",3 +"/packages?q=Tags:""cdn""","Tags:""cdn""",3 +"/packages?q=Tags:""CEFGlue""","Tags:""CEFGlue""",3 +"/packages?q=Tags:""Center""","Tags:""Center""",3 +"/packages?q=Tags:""cfdi""","Tags:""cfdi""",3 +"/packages?q=Tags:""ChakraCore""","Tags:""ChakraCore""",3 +"/packages?q=Tags:""ChannelFactory""","Tags:""ChannelFactory""",3 +"/packages?q=Tags:""Chaos-engineering""","Tags:""Chaos-engineering""",3 +"/packages?q=Tags:""Charset""","Tags:""Charset""",3 +"/packages?q=Tags:""chart,""&page=4","Tags:""chart,""",3 +"/packages?q=Tags:""checkbox""","Tags:""checkbox""",3 +"/packages?q=Tags:""Checkbox""","Tags:""Checkbox""",3 +"/packages?q=Tags:""CheckBoxList""","Tags:""CheckBoxList""",3 +"/packages?q=Tags:""checker""","Tags:""checker""",3 +"/packages?q=Tags:""chess""","Tags:""chess""",3 +"/packages?q=Tags:""choosefont""","Tags:""choosefont""",3 +"/packages?q=Tags:""CI/CD""","Tags:""CI/CD""",3 +"/packages?q=Tags:""CISCO""","Tags:""CISCO""",3 +"/packages?q=Tags:""CKFinder""","Tags:""CKFinder""",3 +"/packages?q=Tags:""Clang""","Tags:""Clang""",3 +"/packages?q=Tags:""Classification""","Tags:""Classification""",3 +"/packages?q=Tags:""Clean""","Tags:""Clean""",3 +"/packages?q=Tags:""ClickHouse""","Tags:""ClickHouse""",3 +"/packages?q=Tags:""ClickOnce""","Tags:""ClickOnce""",3 +"/packages?q=Tags:""ClientCredentials""","Tags:""ClientCredentials""",3 +"/packages?q=Tags:""clock""","Tags:""clock""",3 +"/packages?q=Tags:""Clone""","Tags:""Clone""",3 +"/packages?q=Tags:""cloud-messaging""","Tags:""cloud-messaging""",3 +"/packages?q=Tags:""Codabar""","Tags:""Codabar""",3 +"/packages?q=Tags:""Code-Coverage""","Tags:""Code-Coverage""",3 +"/packages?q=Tags:""Code,""&page=8","Tags:""Code,""",3 +"/packages?q=Tags:""code93""","Tags:""code93""",3 +"/packages?q=Tags:""CodeDOM""","Tags:""CodeDOM""",3 +"/packages?q=Tags:""CodeGeneration""","Tags:""CodeGeneration""",3 +"/packages?q=Tags:""CodeGenerator""","Tags:""CodeGenerator""",3 +"/packages?q=Tags:""Coinbase""","Tags:""Coinbase""",3 +"/packages?q=Tags:""color-wheel""","Tags:""color-wheel""",3 +"/packages?q=Tags:""colorpicker""","Tags:""colorpicker""",3 +"/packages?q=Tags:""column""","Tags:""column""",3 +"/packages?q=Tags:""CommandLine""","Tags:""CommandLine""",3 +"/packages?q=Tags:""CommonJS""","Tags:""CommonJS""",3 +"/packages?q=Tags:""Comparison""","Tags:""Comparison""",3 +"/packages?q=Tags:""Compiler""","Tags:""Compiler""",3 +"/packages?q=Tags:""composite-c1""","Tags:""composite-c1""",3 +"/packages?q=Tags:""compress-pdf""","Tags:""compress-pdf""",3 +"/packages?q=Tags:""ConcurrentList""","Tags:""ConcurrentList""",3 +"/packages?q=Tags:""configuration""&page=7","Tags:""configuration""",3 +"/packages?q=Tags:""connectivity""","Tags:""connectivity""",3 +"/packages?q=Tags:""Connector/NET""","Tags:""Connector/NET""",3 +"/packages?q=Tags:""console-shell""","Tags:""console-shell""",3 +"/packages?q=Tags:""console""","Tags:""console""",3 +"/packages?q=Tags:""Consul""","Tags:""Consul""",3 +"/packages?q=Tags:""content-management""","Tags:""content-management""",3 +"/packages?q=Tags:""ContentPage""","Tags:""ContentPage""",3 +"/packages?q=Tags:""context-menu""","Tags:""context-menu""",3 +"/packages?q=Tags:""contour""","Tags:""contour""",3 +"/packages?q=Tags:""controller""","Tags:""controller""",3 +"/packages?q=Tags:""ControllerBase""","Tags:""ControllerBase""",3 +"/packages?q=Tags:""conversion""","Tags:""conversion""",3 +"/packages?q=Tags:""Convey""","Tags:""Convey""",3 +"/packages?q=Tags:""cookie""","Tags:""cookie""",3 +"/packages?q=Tags:""Copy""","Tags:""Copy""",3 +"/packages?q=Tags:""coreml""","Tags:""coreml""",3 +"/packages?q=Tags:""correios""","Tags:""correios""",3 +"/packages?q=Tags:""correlation""","Tags:""correlation""",3 +"/packages?q=Tags:""CosmosDb""","Tags:""CosmosDb""",3 +"/packages?q=Tags:""CosmosDB""","Tags:""CosmosDB""",3 +"/packages?q=Tags:""country-picker""","Tags:""country-picker""",3 +"/packages?q=Tags:""coupon""","Tags:""coupon""",3 +"/packages?q=Tags:""Coverity""","Tags:""Coverity""",3 +"/packages?q=Tags:""crashlytics""","Tags:""crashlytics""",3 diff --git a/SearchScorer/Program.cs b/SearchScorer/Program.cs index b44d88c..22fd7aa 100644 --- a/SearchScorer/Program.cs +++ b/SearchScorer/Program.cs @@ -9,18 +9,19 @@ var settings = new SearchScorerSettings { ControlBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery", //TODO: Add marketplace url - TreatmentBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery", + TreatmentBaseUrl = "https://marketplace.vsallin.net/_apis/public/gallery/extensionquery", //ControlBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery?api-version=6.0-preview.1", //TODO: Add marketplace url //TreatmentBaseUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery?api-version=6.0-preview.1", - CuratedSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\curatedqueries.csv", - TopSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\topsearchqueries.csv", - TopSearchSelectionsCsvPath = @"C:\data\SearchScorerData\vsm\topsearchselections.csv", - TopClientSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\topsearchqueries.csv", - GoogleAnalyticsSearchReferralsCsvPath = @"C:\data\SearchScorerData\vsm\topsearchreferrals.csv", + CuratedSearchQueriesCsvPath = @"curatedsearchqueries.csv", + TopSearchQueriesCsvPath = @"topsearchqueries.csv", + TopSearchSelectionsCsvPath = @"topsearchselections.csv", - ClientCuratedSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\curatedqueries.csv", - FeedbackSearchQueriesCsvPath = @"C:\data\SearchScorerData\vsm\feedbackcuratedqueries.csv", + TopClientSearchQueriesCsvPath = @"topclientsearchqueries.csv", + GoogleAnalyticsSearchReferralsCsvPath = @"GoogleAnalyticsSearchReferrals.csv", + + ClientCuratedSearchQueriesCsvPath = @"curatedsearchqueries.csv", + FeedbackSearchQueriesCsvPath = @"feedbacksearchqueries.csv", PackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), TokenizedPackageIdWeights = CreateRange(lower: 1, upper: 10, increments: 3), diff --git a/SearchScorer/TopClientSearchQueries.csv b/SearchScorer/TopClientSearchQueries.csv new file mode 100644 index 0000000..b96edca --- /dev/null +++ b/SearchScorer/TopClientSearchQueries.csv @@ -0,0 +1,3 @@ +Query,QueryCount +python,2196 +azure,1801 diff --git a/SearchScorer/TopSearchQueries.csv b/SearchScorer/TopSearchQueries.csv new file mode 100644 index 0000000..ba4054c --- /dev/null +++ b/SearchScorer/TopSearchQueries.csv @@ -0,0 +1,3 @@ +Query,QueryCount +java,2196 +mysql,1801 \ No newline at end of file diff --git a/SearchScorer/TopSearchSelections.csv b/SearchScorer/TopSearchSelections.csv new file mode 100644 index 0000000..2cff55c --- /dev/null +++ b/SearchScorer/TopSearchSelections.csv @@ -0,0 +1,3 @@ +SearchQuery,Selections +java,"[""vscode-maven:1390"",""vscode-tomcat:108""]" +mysql,"[""vscode-mysql-client2:554"", ""vscode-mysql:1""]" \ No newline at end of file