Implement new 'browse' API methods.
Implement new 'browse' API methods.

--- a/KerbalStuffReadOnly/KerbalStuffReadOnly.cs
+++ b/KerbalStuffReadOnly/KerbalStuffReadOnly.cs
@@ -99,6 +99,81 @@
 		}
 
 		/// <summary>
+		/// Queries KerbalStuff for a list of the curator-featured mods on the site, returning a List of
+		/// <see cref="KerbalStuff.Mod"/> objects, or an empty list if none are found or on an error.
+		/// </summary>
+		/// <param name="pageId">Optional, 1-indexed page number.  Zero, negative, and empty values are evaluated as 1.</param>
+		public static List<Mod> BrowseFeatured(long pageId = 1)
+		{
+			ExecuteGetRequest(KerbalStuffAction.BrowseFeatured, pageId);
+
+			List<Mod> mods = new List<Mod>();
+
+			if (currentJson != null && currentJson is List<object>)
+			{
+				foreach (var modObj in (currentJson as List<object>))
+				{
+					if (modObj is Dictionary<string, object>)
+					{
+						mods.Add(new Mod(modObj as Dictionary<string, object>));
+					}
+				}
+			}
+
+			return mods;
+		}
+
+		/// <summary>
+		/// Queries KerbalStuff for a list of the newest mods on the site, returning a List of
+		/// <see cref="KerbalStuff.Mod"/> objects, or an empty list if none are found or on an error.
+		/// </summary>
+		/// <param name="pageId">Optional, 1-indexed page number.  Zero, negative, and empty values are evaluated as 1.</param>
+		public static List<Mod> BrowseNew(long? pageId = null)
+		{
+			ExecuteGetRequest(KerbalStuffAction.BrowseNew, pageId);
+
+			List<Mod> mods = new List<Mod>();
+
+			if (currentJson != null && currentJson is List<object>)
+			{
+				foreach (var modObj in (currentJson as List<object>))
+				{
+					if (modObj is Dictionary<string, object>)
+					{
+						mods.Add(new Mod(modObj as Dictionary<string, object>));
+					}
+				}
+			}
+
+			return mods;
+		}
+
+		/// <summary>
+		/// Queries KerbalStuff for a list of the most popular mods on the site, returning a List of
+		/// <see cref="KerbalStuff.Mod"/> objects, or an empty list if none are found or on an error.
+		/// </summary>
+		/// <param name="pageId">Optional, 1-indexed page number.  Zero, negative, and empty values are evaluated as 1.</param>
+		public static List<Mod> BrowseTop(long? pageId = null)
+		{
+			ExecuteGetRequest(KerbalStuffAction.BrowseTop, pageId);
+
+			List<Mod> mods = new List<Mod>();
+
+			if (currentJson != null && currentJson is List<object>)
+			{
+				foreach (var modObj in (currentJson as List<object>))
+				{
+					if (modObj is Dictionary<string, object>)
+					{
+						mods.Add(new Mod(modObj as Dictionary<string, object>));
+					}
+				}
+			}
+
+			return mods;
+		}
+
+		/// <summary>
 		/// Queries KerbalStuff for the mod with the given Id, returning a <see cref="KerbalStuff.Mod"/> object,
 		/// or null if an error occured.
 		/// </summary>
@@ -275,6 +350,27 @@
 	public struct KerbalStuffAction
 	{
 		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff browse/new?page&lt;page_id&gt; API action.
+		/// &lt;page_id&gt is indexed from 1, but zero, negative, and empty values evaluate as 1.
+		/// </summary>
+		public static readonly KerbalStuffAction BrowseNew =
+			new KerbalStuffAction("browse/new", "/browse/new?page={0:d}", "GET");
+
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff browse/featured?page&lt;page_id&gt; API action.
+		/// &lt;page_id&gt is indexed from 1, but zero, negative, and empty values evaluate as 1.
+		/// </summary>
+		public static readonly KerbalStuffAction BrowseFeatured =
+			new KerbalStuffAction("browse/featured", "/browse/featured?page={0:d}", "GET");
+
+		/// <summary>
+		/// KerbalStuffAction object describing access to the KerbalStuff browse/top?page&lt;page_id&gt; API action.
+		/// &lt;page_id&gt is indexed from 1, but zero, negative, and empty values evaluate as 1.
+		/// </summary>
+		public static readonly KerbalStuffAction BrowseTop =
+			new KerbalStuffAction("browse/top", "/browse/top?page={0:d}", "GET");
+
+		/// <summary>
 		/// KerbalStuffAction object describing access to the KerbalStuff create API action.
 		/// </summary>
 		public static readonly KerbalStuffAction Create = new KerbalStuffAction("create", "/mod/create", "POST");

--- a/KerbalStuffWrapper/KerbalStuffWrapper.cs
+++ b/KerbalStuffWrapper/KerbalStuffWrapper.cs
@@ -48,8 +48,6 @@
 using System.IO;
 using System.Linq;
 
-// TODO: Write a console program that uses the KerbalStuff wrapper API.
-
 namespace KerbalStuff.Wrapper
 {
 	public class KerbalStuffWrapper
@@ -105,7 +103,62 @@
 
 		private const string appName = "KerbalStuffWrapper";
 
-		// TODO: Action methods.
+		[Verb(Aliases = "featured,bf")]
+		public static void BrowseFeatured([DefaultValue(1)]long pageId)
+		{
+			List<Mod> mods = KerbalStuff.BrowseFeatured(pageId);
+
+			if (mods.Count < 1)
+			{
+				WriteOutLine("Query yielded no results.");
+			}
+			else
+			{
+				foreach (Mod mod in mods)
+				{
+					Console.WriteLine(mod);
+					Console.WriteLine();
+				}
+			}
+		}
+
+		[Verb(Aliases = "new,bn")]
+		public static void BrowseNew([DefaultValue(1)]long pageId)
+		{
+			List<Mod> mods = KerbalStuff.BrowseNew(pageId);
+
+			if (mods.Count < 1)
+			{
+				WriteOutLine("Query yielded no results.");
+			}
+			else
+			{
+				foreach (Mod mod in mods)
+				{
+					Console.WriteLine(mod);
+					Console.WriteLine();
+				}
+			}
+		}
+
+		[Verb(Aliases = "top,bt")]
+		public static void BrowseTop([DefaultValue(1)]long pageId)
+		{
+			List<Mod> mods = KerbalStuff.BrowseTop(pageId);
+
+			if (mods.Count < 1)
+			{
+				WriteOutLine("Query yielded no results.");
+			}
+			else
+			{
+				foreach (Mod mod in mods)
+				{
+					Console.WriteLine(mod);
+					Console.WriteLine();
+				}
+			}
+		}
 
 		[Verb(Aliases = "mod,m")]
 		public static void ModInfo([Required]long modId)