Add a few missing async tests

Add a few missing async tests

--- Source/HttpMultipartParser.UnitTests/ParserScenarios/TinyData.cs
+++ Source/HttpMultipartParser.UnitTests/ParserScenarios/TinyData.cs
@@ -2,6 +2,7 @@
 using System.IO;
 using System.Text;
 using System.Text.RegularExpressions;
+using System.Threading.Tasks;
 using Xunit;

 namespace HttpMultipartParser.UnitTests.ParserScenarios
@@ -56,6 +57,19 @@
         }

         /// <summary>
+        ///     Tests for correct detection of the boundary in the input stream.
+        /// </summary>
+        [Fact]
+        public async Task CanAutoDetectBoundaryAsync()
+        {
+            using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream).ConfigureAwait(false);
+                Assert.True(_testCase.Validate(parser));
+            }
+        }
+
+        /// <summary>
         ///     Ensures that boundary detection works even when the boundary spans
         ///     two different buffers.
         /// </summary>
@@ -65,6 +79,20 @@
             using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
             {
                 var parser = MultipartFormDataParser.Parse(stream, "boundry", Encoding.UTF8, 16);
+                Assert.True(_testCase.Validate(parser));
+            }
+        }
+
+        /// <summary>
+        ///     Ensures that boundary detection works even when the boundary spans
+        ///     two different buffers.
+        /// </summary>
+        [Fact]
+        public async Task CanDetectBoundariesCrossBufferAsync()
+        {
+            using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8, 16).ConfigureAwait(false);
                 Assert.True(_testCase.Validate(parser));
             }
         }
@@ -86,6 +114,22 @@
         }

         /// <summary>
+        ///     Ensure that mixed newline formats are correctly handled.
+        /// </summary>
+        [Fact]
+        public async Task CorrectlyHandleMixedNewlineFormatsAsync()
+        {
+            // Replace the first '\n' with '\r\n'
+            var regex = new Regex(Regex.Escape("\n"));
+            string request = regex.Replace(_testCase.Request, "\r\n", 1);
+            using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8).ConfigureAwait(false);
+                Assert.True(_testCase.Validate(parser));
+            }
+        }
+
+        /// <summary>
         ///     Tests for correct handling of <c>crlf (\r\n)</c> in the input stream.
         /// </summary>
         [Fact]
@@ -100,6 +144,20 @@
         }

         /// <summary>
+        ///     Tests for correct handling of <c>crlf (\r\n)</c> in the input stream.
+        /// </summary>
+        [Fact]
+        public async Task CorrectlyHandlesCRLFAsync()
+        {
+            string request = _testCase.Request.Replace("\n", "\r\n");
+            using (Stream stream = TestUtil.StringToStream(request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8).ConfigureAwait(false);
+                Assert.True(_testCase.Validate(parser));
+            }
+        }
+
+        /// <summary>
         ///     The tiny data test.
         /// </summary>
         [Fact]
@@ -108,6 +166,19 @@
             using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
             {
                 var parser = MultipartFormDataParser.Parse(stream, "boundry", Encoding.UTF8);
+                Assert.True(_testCase.Validate(parser));
+            }
+        }
+
+        /// <summary>
+        ///     The tiny data test.
+        /// </summary>
+        [Fact]
+        public async Task TinyDataTestAsync()
+        {
+            using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8).ConfigureAwait(false);
                 Assert.True(_testCase.Validate(parser));
             }
         }
@@ -126,11 +197,34 @@
         }

         [Fact]
+        public async Task DoesNotCloseTheStreamAsync()
+        {
+            using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8).ConfigureAwait(false);
+                Assert.True(_testCase.Validate(parser));
+
+                stream.Position = 0;
+                Assert.True(true, "A closed stream would throw ObjectDisposedException");
+            }
+        }
+
+        [Fact]
         public void GetParameterValueReturnsNullIfNoParameterFound()
         {
             using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
             {
                 var parser = MultipartFormDataParser.Parse(stream, "boundry", Encoding.UTF8);
+                Assert.Null(parser.GetParameterValue("does not exist"));
+            }
+        }
+
+        [Fact]
+        public async Task GetParameterValueReturnsNullIfNoParameterFoundAsync()
+        {
+            using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
+            {
+                var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8).ConfigureAwait(false);
                 Assert.Null(parser.GetParameterValue("does not exist"));
             }
         }
@@ -147,5 +241,18 @@
                 }
             }
         }
+
+        [Fact]
+        public async Task CanDetectBoundriesWithNewLineInNextBufferAsync()
+        {
+            for (int i = 16; i < _testCase.Request.Length; i++)
+            {
+                using (Stream stream = TestUtil.StringToStream(_testCase.Request, Encoding.UTF8))
+                {
+                    var parser = await MultipartFormDataParser.ParseAsync(stream, "boundry", Encoding.UTF8, i).ConfigureAwait(false);
+                    Assert.True(_testCase.Validate(parser), $"Failure in buffer length {i}");
+                }
+            }
+        }
     }
 }


Little code change in byte array extention

--- WPFHexaEditor.Control/Core/MethodExtention/ByteArrayExtention.cs
+++ WPFHexaEditor.Control/Core/MethodExtention/ByteArrayExtention.cs
@@ -19,7 +19,6 @@
         public static IEnumerable<long> FindIndexOf(this byte[] self, byte[] candidate)
         {
             if (!IsEmptyLocate(self, candidate))
-            {
                 for (var i = 0; i < self.Length; i++)
                 {
                     if (!IsMatch(self, i, candidate))
@@ -27,28 +26,21 @@

                     yield return i;
                 }
-            }
         }

         /// <summary>
         /// Check if match is finded
         /// </summary>
-        private static bool IsMatch(byte[] array, long position, byte[] candidate)
-        {
-            return candidate.Length <= array.Length - position &&
-                   !candidate.Where((t, i) => array[position + i] != t).Any();
-        }
+        private static bool IsMatch(byte[] array, long position, byte[] candidate) =>
+            candidate.Length <= array.Length - position && !candidate.Where((t, i) => array[position + i] != t).Any();

         /// <summary>
         /// Check if can find
         /// </summary>
-        private static bool IsEmptyLocate(byte[] array, byte[] candidate)
-        {
-            return array == null
-                || candidate == null
-                || array.Length == 0
-                || candidate.Length == 0
-                || candidate.Length > array.Length;
-        }
+        private static bool IsEmptyLocate(byte[] array, byte[] candidate) => array == null
+                                                                             || candidate == null
+                                                                             || array.Length == 0
+                                                                             || candidate.Length == 0
+                                                                             || candidate.Length > array.Length;
     }
 }


CA-285270: Enable iso file type download in install update wizard

Signed-off-by: Ji Jiang <9feecbbdbbba2b823412e2acc0d6c9f5114f41ad@citrix.com>

--- XenModel/Actions/Updates/DownloadAndUnzipXenServerPatchAction.cs
+++ XenModel/Actions/Updates/DownloadAndUnzipXenServerPatchAction.cs
@@ -34,42 +34,54 @@
 using System.ComponentModel;
 using System.Threading;
 using System.IO;
+using System.Linq;
 using XenCenterLib.Archive;

 namespace XenAdmin.Actions
 {
-    internal enum DownloadState { InProgress, Cancelled, Completed, Error };
+    internal enum DownloadState
+    {
+        InProgress,
+        Cancelled,
+        Completed,
+        Error
+    };

     public class DownloadAndUnzipXenServerPatchAction : AsyncAction
     {
-        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+        private static readonly log4net.ILog log =
+            log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

         private const int SLEEP_TIME_TO_CHECK_DOWNLOAD_STATUS_MS = 900;
-        private const int MAX_NUMBER_OF_TRIES = 5; //If you consider increasing this for any reason (I think 5 is already more than enough), have a look at nextSleepMs in DownloadFile() as well.
+
+        //If you consider increasing this for any reason (I think 5 is already more than enough), have a look at nextSleepMs in DownloadFile() as well.
+        private const int MAX_NUMBER_OF_TRIES = 5;
+
         private Random random = new Random();

         private readonly Uri address;
-        private readonly string zippedFileName;
+        private readonly string outputFileName;
         private readonly string updateName;
-        private readonly string[] updateFileExtensions;
+        private readonly string[] updateFileSuffixes;
         private readonly bool downloadUpdate;
+        private readonly bool doNotExtractUpdate;
         private DownloadState patchDownloadState;
         private Exception patchDownloadError;

-        public string PatchPath
-        {
-            get; private set;
-        }
-
-        public DownloadAndUnzipXenServerPatchAction(string patchName, Uri uri, string outputFileName, bool suppressHist, params string[] updateFileExtensions)
-            : base(null, uri == null ?  string.Format(Messages.UPDATES_WIZARD_EXTRACT_ACTION_TITLE, patchName)
-            : string.Format(Messages.DOWNLOAD_AND_EXTRACT_ACTION_TITLE, patchName), string.Empty, suppressHist)
+        public string PatchPath { get; private set; }
+
+        public DownloadAndUnzipXenServerPatchAction(string patchName, Uri uri, string outputFileName, bool suppressHist,
+            params string[] updateFileExtensions)
+            : base(null, uri == null
+                ? string.Format(Messages.UPDATES_WIZARD_EXTRACT_ACTION_TITLE, patchName)
+                : string.Format(Messages.DOWNLOAD_AND_EXTRACT_ACTION_TITLE, patchName), string.Empty, suppressHist)
         {
             updateName = patchName;
             address = uri;
             downloadUpdate = address != null;
-            zippedFileName = outputFileName;
-            this.updateFileExtensions = updateFileExtensions;
+            updateFileSuffixes = (from item in updateFileExtensions select '.' + item).ToArray();
+            doNotExtractUpdate = downloadUpdate && updateFileSuffixes.Any(item => address.ToString().Contains(item));
+            this.outputFileName = outputFileName;
         }

         private void DownloadFile()
@@ -92,7 +104,7 @@
                         client.DownloadProgressChanged += client_DownloadProgressChanged;
                         client.DownloadFileCompleted += client_DownloadFileCompleted;
                         //start the download
-                        client.DownloadFileAsync(address, zippedFileName);
+                        client.DownloadFileAsync(address, outputFileName);

                         patchDownloadState = DownloadState.InProgress;
                         bool patchDownloadCancelling = false;
@@ -120,9 +132,11 @@
                             errorCount++;

                             // logging only, it will retry again.
-                            log.ErrorFormat("Error while downloading from '{0}'. Number of errors so far (including this): {1}. Trying maximum {2} times.", address, errorCount, MAX_NUMBER_OF_TRIES);
+                            log.ErrorFormat(
+                                "Error while downloading from '{0}'. Number of errors so far (including this): {1}. Trying maximum {2} times.",
+                                address, errorCount, MAX_NUMBER_OF_TRIES);
                             log.Error(patchDownloadError ?? new Exception(Messages.ERROR_UNKNOWN));
-
+
                             // wait for some randomly increased amount of time after each retry
                             nextSleepMs += random.Next(5000);
                             Thread.Sleep(nextSleepMs);
@@ -141,7 +155,7 @@
             if (patchDownloadState == DownloadState.Error)
             {
                 log.ErrorFormat("Giving up - MAX_NUMBER_OF_RETRIES_IF_FAILED has been reached.");
-
+
                 MarkCompleted(patchDownloadError ?? new Exception(Messages.ERROR_UNKNOWN));
             }

@@ -152,7 +166,7 @@
             ArchiveIterator iterator = null;
             try
             {
-                using (Stream stream = new FileStream(zippedFileName, FileMode.Open, FileAccess.Read))
+                using (Stream stream = new FileStream(outputFileName, FileMode.Open, FileAccess.Read))
                 {
                     iterator = ArchiveFactory.Reader(ArchiveFactory.Type.Zip, stream);
                     DotNetZipZipIterator zipIterator = iterator as DotNetZipZipIterator;
@@ -164,14 +178,17 @@

                     while (iterator.HasNext())
                     {
-                        string currentExtension = Path.GetExtension(iterator.CurrentFileName()).Replace(".","");
-
-                        if (Array.Exists(updateFileExtensions, item => item == currentExtension))
+                        string currentExtension = Path.GetExtension(iterator.CurrentFileName());
+
+                        if (updateFileSuffixes.Any(item => item == currentExtension))
                         {
-                            string path = downloadUpdate ? Path.Combine(Path.GetDirectoryName(zippedFileName), iterator.CurrentFileName())
+                            string path = downloadUpdate
+                                ? Path.Combine(Path.GetDirectoryName(outputFileName), iterator.CurrentFileName())
                                 : Path.Combine(Path.GetTempPath(), iterator.CurrentFileName());

-                            log.InfoFormat("Found '{0}' in the downloaded archive when looking for a '{1}' file. Extracting...", iterator.CurrentFileName(), currentExtension);
+                            log.InfoFormat(
+                                "Found '{0}' in the downloaded archive when looking for a '{1}' file. Extracting...",
+                                iterator.CurrentFileName(), currentExtension);

                             using (Stream outputStream = new FileStream(path, FileMode.Create))
                             {
@@ -179,7 +196,7 @@
                                 PatchPath = path;

                                 log.InfoFormat("Update file extracted to '{0}'", path);
-
+
                                 break;
                             }
                         }
@@ -203,13 +220,18 @@
                     iterator.Dispose();

                 if (downloadUpdate)
-                    File.Delete(zippedFileName);
-            }
-
+                {
+                    try { File.Delete(outputFileName); }
+                    catch { }
+                }
+            }
+
             if (string.IsNullOrEmpty(PatchPath) && downloadUpdate)
             {
                 MarkCompleted(new Exception(Messages.DOWNLOAD_AND_EXTRACT_ACTION_FILE_NOT_FOUND));
-                log.InfoFormat("The downloaded archive does not contain a file with any of the following extensions: {0}", string.Join(", ", updateFileExtensions));
+                log.InfoFormat(
+                    "The downloaded archive does not contain a file with any of the following extensions: {0}",
+                    string.Join(", ", updateFileSuffixes));
             }
         }

@@ -217,9 +239,7 @@
         {
             if (downloadUpdate)
             {
-                log.InfoFormat("Downloading update '{0}' (from from '{1}') to '{2}'", updateName, address, zippedFileName);
-
-
+                log.InfoFormat("Downloading update '{0}' (from '{1}') to '{2}'", updateName, address, outputFileName);
                 Description = string.Format(Messages.DOWNLOAD_AND_EXTRACT_ACTION_DOWNLOADING_DESC, updateName);
                 LogDescriptionChanges = false;
                 DownloadFile();
@@ -232,11 +252,31 @@
                     throw new CancelledException();
             }

-            log.DebugFormat("Extracting XenServer patch '{0}'", updateName);
-            Description = string.Format(Messages.DOWNLOAD_AND_EXTRACT_ACTION_EXTRACTING_DESC, updateName);
-            ExtractFile();
-            log.DebugFormat("Extracting XenServer patch '{0}' completed", updateName);
-
+            if (doNotExtractUpdate)
+            {
+                try
+                {
+                    string newFilePath = Path.Combine(Path.GetDirectoryName(outputFileName), updateName);
+                    if (File.Exists(newFilePath))
+                        File.Delete(newFilePath);
+                    File.Move(outputFileName, newFilePath);
+                    PatchPath = newFilePath;
+                    log.DebugFormat("XenServer patch '{0}' is ready", updateName);
+                }
+                catch (Exception e)
+                {
+                    log.ErrorFormat("Exception occurred when preparing archive: {0}", e.Message);
+                    throw e;
+                }
+            }
+            else
+            {
+                log.DebugFormat("Extracting XenServer patch '{0}'", updateName);
+                Description = string.Format(Messages.DOWNLOAD_AND_EXTRACT_ACTION_EXTRACTING_DESC, updateName);
+                ExtractFile();
+                log.DebugFormat("Extracting XenServer patch '{0}' completed", updateName);
+            }
+
             Description = Messages.COMPLETED;
             MarkCompleted();
         }


Return null if invalid offset and seek to the offset

--- dot10/dotNET/StringsStream.cs
+++ dot10/dotNET/StringsStream.cs
@@ -17,6 +17,9 @@
 		/// <param name="offset">Offset of string</param>
 		/// <returns>The UTF-8 decoded string or null if invalid offset</returns>
 		public string Read(uint offset) {
+			if (offset >= imageStream.Length)
+				return null;
+			imageStream.Position = offset;
 			var data = imageStream.ReadBytesUntilByte(0);
 			if (data == null)
 				return null;


Clean the LuceneIndexer

Clean the LuceneIndexer

--- src/CK.Glouton.Lucene/LuceneIndexer.cs
+++ src/CK.Glouton.Lucene/LuceneIndexer.cs
@@ -75,7 +75,7 @@
         /// Try to initialize a searcher to get the list of monitor and app IDs
         /// It can fail if the index is empty, in this case the searcher is useless
         /// </summary>
-        public void InitializeSearcher()
+        private void InitializeSearcher()
         {
             try
             {
@@ -161,7 +161,7 @@
         /// </summary>
         /// <param name="exception">The exception collected</param>
         /// <returns></returns>
-        Document GetExceptionDocuments(CKExceptionData exception)
+        private Document GetExceptionDocuments(CKExceptionData exception)
         {
             Document document = new Document();

@@ -221,29 +221,6 @@
         }

         /// <summary>
-        /// Create a lucene document with the Open Block
-        /// </summary>
-        /// <param name="openBlock">The open block of this indexer</param>
-        /// <returns></returns>
-        ///
-        //private Document GetOpenBlockDocument(IOpen openBlock)
-        //{
-        //    Document document = new Document();
-
-        //    Field openBlockAppName = new StringField("OpenAppName", openBlock.AppName, Field.Store.YES);
-        //    Field openStreamVersion = new StringField("OpenStreamVersion", openBlock.StreamVersion.ToString(), Field.Store.YES);
-        //    Field openBlockBaseDir = new StringField("OpenBaseDirectory", openBlock.BaseDirectory, Field.Store.YES);
-        //    Field openBlockInfos = new StringField("OpenInfos", openBlock.Info.ToString(), Field.Store.YES);
-
-        //    document.Add(openBlockAppName);
-        //    document.Add(openBlockBaseDir);
-        //    document.Add(openBlockInfos);
-        //    document.Add(openStreamVersion);
-
-        //    return document;
-        //}
-
-        /// <summary>
         /// Create a unique DateTimeStamp to identify each log
         /// </summary>
         /// <returns></returns>
@@ -374,7 +351,7 @@
         /// <summary>
         /// Create the Lucene document that contain all Monitor and App ID list
         /// </summary>
-        public void CreateIdListDoc()
+        private void CreateIdListDoc()
         {
             Document doc = new Document();

@@ -390,7 +367,7 @@
         /// <summary>
         /// Update the Lucene document that contain all Monitor and App ID list
         /// </summary>
-        public void UpdateIdListDoc()
+        private void UpdateIdListDoc()
         {
             Document doc = new Document();

@@ -409,7 +386,7 @@
         /// <summary>
         /// Commit the change in the index if it's needed
         /// </summary>
-        public void CommitIfNeeded()
+        private void CommitIfNeeded()
         {
             if (_numberOfFileToCommit <= 0) return;
             if ((DateTime.UtcNow - _lastCommit).TotalSeconds >= 1 || _lastCommit == null || _numberOfFileToCommit >= 100)


make PropertyChangedBase.OnPropertyChanged protected

--- src/Caliburn.Micro.Silverlight/INPC.cs
+++ src/Caliburn.Micro.Silverlight/INPC.cs
@@ -276,7 +276,12 @@
             NotifyOfPropertyChange(propertyName);
         }

-        void OnPropertyChanged(PropertyChangedEventArgs e) {
+        /// <summary>
+        ///   Raises the <see cref="E:PropertyChanged" /> event directly.
+        /// </summary>
+        /// <param name="e">The <see cref="PropertyChangedEventArgs"/> instance containing the event data.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected void OnPropertyChanged(PropertyChangedEventArgs e) {
             var handler = PropertyChanged;
             if (handler != null) {
                 handler(this, e);


Update MessagesCategory.cs

Update MessagesCategory.cs

--- VkNet/Categories/MessagesCategory.cs
+++ VkNet/Categories/MessagesCategory.cs
@@ -116,7 +116,7 @@
         /// </remarks>
         [Pure]
         [ApiVersion("5.21")]
-        public ReadOnlyCollection<Message> GetHistory(
+                public ReadOnlyCollection<Message> GetHistory(
             long id,
             bool isChat,
             out int totalCount,
@@ -135,7 +135,9 @@
                              };

             VkResponse response = _vk.Call("messages.getHistory", parameters);
+
             totalCount = response["count"];
+
             return response["items"].ToReadOnlyCollectionOf<Message>(item => item);
         }


Added nullable int

Added nullable int

--- VndbSharp/Models/Staff/StaffLinks.cs
+++ VndbSharp/Models/Staff/StaffLinks.cs
@@ -11,7 +11,7 @@
 		public String Homepage { get; private set; }
         public String Twitter { get; private set; }
         public String AniDb { get; private set; }
-        public Int32 Pixiv { get; private set; }
-        public String WikiData { get; private set; }
+		public Int32? Pixiv { get; private set; }
+		public String WikiData { get; private set; }
 	}
 }


docs: update comment for Waypoint.side_of_road to accurately describe functionality

PiperOrigin-RevId: 470296859

Source-Link: https://github.com/googleapis/googleapis/commit/87ba206e51f960fc05b63f4a26e7a5323346f044

Source-Link: https://github.com/googleapis/googleapis-gen/commit/23bb07c844f600450110062f930387f59d19154d
Copy-Tag: eyJwIjoiYXBpcy9Hb29nbGUuTWFwcy5Sb3V0aW5nLlYyLy5Pd2xCb3QueWFtbCIsImgiOiIyM2JiMDdjODQ0ZjYwMDQ1MDExMDA2MmY5MzAzODdmNTlkMTkxNTRkIn0=

--- apis/Google.Maps.Routing.V2/Google.Maps.Routing.V2/Waypoint.g.cs
+++ apis/Google.Maps.Routing.V2/Google.Maps.Routing.V2/Waypoint.g.cs
@@ -189,7 +189,7 @@
     /// value, the route will pass through the location so that the vehicle can
     /// stop at the side of road that the location is biased towards from the
     /// center of the road. This option works only for 'DRIVE' and 'TWO_WHEELER'
-    /// travel modes, and when the 'location_type' is set to 'location'.
+    /// travel modes.
     /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]


Do not use follow mode if "update listing only if visible" option is enabled and toolbox isn't visible

--- Msiler/FunctionFollower.cs
+++ Msiler/FunctionFollower.cs
@@ -41,6 +41,11 @@
             if (!IsFollowingEnabled) {
                 return;
             }
+            // do not use follow mode if "update listing on if visible" option
+            // is enabled and toolbox isn't visible
+            if (Common.Instance.GeneralOptions.UpdateListingOnlyIfVisible && !MsilerToolWindow.IsVisible) {
+                return;
+            }

             var doc = _dte.ActiveDocument;
             if (doc == null) {


Don't show the Startup Mining panel until it has valid text

--- MultiMiner.Win/MainForm.cs
+++ MultiMiner.Win/MainForm.cs
@@ -1039,9 +1039,7 @@
             }
             else
                 HideAdvancedPanel();
-
-            startupMiningPanel.Visible = applicationConfiguration.StartMiningOnStartup;
-
+
             crashRecoveryTimer.Enabled = applicationConfiguration.RestartCrashedMiners;

             SetupCoinStatsTimer();
@@ -1093,7 +1091,8 @@

         private void RefreshCountdownLabel()
         {
-            countdownLabel.Text = string.Format("Mining will start automatically in {0} seconds...", startupMiningCountdownSeconds);
+            countdownLabel.Text = string.Format("Mining will start automatically in {0} seconds...", startupMiningCountdownSeconds);
+            startupMiningPanel.Visible = true;
         }

         private List<Device> GetDevices()


removed IConsiderationContext.SetContext()

better encapsulation without it.

--- WeaponSelection/Scripts/Inventory.cs
+++ WeaponSelection/Scripts/Inventory.cs
@@ -58,7 +58,8 @@
         }

         // push our relevent into into master context
-        private void PopulateMasterConsiderationContext(IConsiderationContext masterContext)
+        private void PopulateMasterConsiderationContext(
+            ConsiderationContextDictionary masterContext)
         {
             var contents = CalculateInventoryContents();


udpate version

udpate version

--- src/Contest/Properties/AssemblyInfo.cs
+++ src/Contest/Properties/AssemblyInfo.cs
@@ -5,11 +5,11 @@
 // General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
-[assembly: AssemblyTitle("ntest")]
+[assembly: AssemblyTitle("contest")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("ntest")]
+[assembly: AssemblyProduct("contest")]
 [assembly: AssemblyCopyright("Copyright ©  2015")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -32,5 +32,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyVersion("1.0.0.5")]
+[assembly: AssemblyFileVersion("1.0.0.5")]


Remove excess device configurations after refreshing the device list

--- MultiMiner.Win/MainForm.cs
+++ MultiMiner.Win/MainForm.cs
@@ -444,11 +444,21 @@

             //there needs to be a device config for each device
             AddMissingDeviceConfigurations();
+            //but no configurations for devices that have gone missing
+            RemoveExcessDeviceConfigurations();

             deviceBindingSource.DataSource = devices;
             LoadGridValuesFromConfiguration();
             CheckAndHideNameColumn();
             deviceTotalLabel.Text = String.Format("{0} device(s)", devices.Count);
+        }
+
+        //each device needs to have a DeviceConfiguration
+        //this will remove any access ones after populating devices
+        //for instance if the user starts up the app with missing devices
+        private void RemoveExcessDeviceConfigurations()
+        {
+            engineConfiguration.DeviceConfigurations.RemoveAll(c => !devices.Exists(d => d.DeviceIndex == c.DeviceIndex));
         }

         //each device needs to have a DeviceConfiguration


NLogPerformance - Skip waiting for user input when running from command-line with args. Fixed case with multiple threads having dedicated logger (LoggerCount==ThreadCount)


Refactored event handlers

Refactored event handlers

--- src/Core2D.SkiaDemo/MainWindow.xaml.cs
+++ src/Core2D.SkiaDemo/MainWindow.xaml.cs
@@ -30,191 +30,196 @@
         private ProjectEditor _projectEditor;
         private InputProcessor _inputProcessor;
         private SvgWindow _previewWindow;
+        private bool isClosing = false;

         public MainWindow(IServiceProvider serviceProvider)
         {
             InitializeComponent();
-
-            bool isClosing = false;

             _serviceProvider = serviceProvider;
             _projectEditor = _serviceProvider.GetService<ProjectEditor>();

+            Loaded += MainWindow_Loaded;
+            KeyDown += MainWindow_KeyDown;
+            Closing += MainWindow_Closing;
+
             _previewWindow = new SvgWindow();
-
-            _previewWindow.svgButton.Click += (sender, e) =>
-            {
-                UpdateSvg();
+            _previewWindow.svgButton.Click += PreviewWindowSvgButton_Click;
+            _previewWindow.Closing += PreviewWindow_Closing;
+        }
+
+        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
+        {
+            _projectEditor.CurrentTool = _projectEditor.Tools.FirstOrDefault(t => t.Name == "Selection");
+            _projectEditor.CurrentPathTool = _projectEditor.PathTools.FirstOrDefault(t => t.Name == "Line");
+            _projectEditor.OnNewProject();
+
+            _projectEditor.Invalidate = () =>
+            {
+                OnRefreshRequested(null, null);
+                if (_previewWindow.svgLive.IsChecked == true)
+                {
+                    UpdateSvg();
+                }
             };

-            _previewWindow.Closing += (sender, e) =>
-            {
-                if (!isClosing)
-                {
-                    _previewWindow.Hide();
-                    e.Cancel = true;
-                }
-            };
-
-            Loaded += (seender, e) =>
-            {
-                _projectEditor.CurrentTool = _projectEditor.Tools.FirstOrDefault(t => t.Name == "Selection");
-                _projectEditor.CurrentPathTool = _projectEditor.PathTools.FirstOrDefault(t => t.Name == "Line");
-                _projectEditor.OnNewProject();
-                _projectEditor.Invalidate = () =>
-                {
-                    OnRefreshRequested(null, null);
-                    if (_previewWindow.svgLive.IsChecked == true)
-                    {
-                        UpdateSvg();
-                    }
-                };
-
-                _renderer = _projectEditor.Renderers[0];
-                _container = _projectEditor.Project.CurrentContainer;
-                _presenter = new EditorPresenter();
-
-                canvas.Focusable = true;
-                canvas.Focus();
-                OnRefreshRequested(null, null);
-
-                _inputProcessor = new InputProcessor(
-                    new WpfInputSource(
-                        canvas,
-                        canvas,
-                        FixPointOffset),
-                    _projectEditor);
-            };
-
-            Closing += (sender, e) =>
-            {
-                _inputProcessor.Dispose();
-                isClosing = true;
-                _previewWindow.Close();
-            };
-
-            KeyDown += (sender, e) =>
-            {
-                bool isControl = Keyboard.Modifiers == ModifierKeys.Control;
-
-                if (isControl)
-                {
-                    switch (e.Key)
-                    {
-                        case Key.P:
-                            _previewWindow.Show();
-                            break;
-                        case Key.N:
-                            NewProject();
-                            break;
-                        case Key.O:
-                            OpenProject();
-                            break;
-                        case Key.S:
-                            SaveProject();
-                            break;
-                        case Key.E:
-                            Export(_projectEditor.Project.CurrentContainer);
-                            break;
-                        case Key.Z:
-                            _projectEditor.OnUndo();
-                            break;
-                        case Key.Y:
-                            _projectEditor.OnRedo();
-                            break;
-                        case Key.X:
-                            _projectEditor.OnCut();
-                            break;
-                        case Key.C:
-                            _projectEditor.OnCopy();
-                            break;
-                        case Key.V:
-                            _projectEditor.OnPaste();
-                            break;
-                        case Key.A:
-                            _projectEditor.OnSelectAll();
-                            break;
-                        case Key.G:
-                            _projectEditor.OnGroupSelected();
-                            break;
-                        case Key.U:
-                            _projectEditor.OnUngroupSelected();
-                            break;
-                    }
-                }
-                else
-                {
-                    switch (e.Key)
-                    {
-                        case Key.N:
-                            _projectEditor.OnToolNone();
-                            break;
-                        case Key.S:
-                            _projectEditor.OnToolSelection();
-                            break;
-                        case Key.P:
-                            _projectEditor.OnToolPoint();
-                            break;
-                        case Key.L:
-                            _projectEditor.OnToolLine();
-                            break;
-                        case Key.A:
-                            _projectEditor.OnToolArc();
-                            break;
-                        case Key.B:
-                            _projectEditor.OnToolCubicBezier();
-                            break;
-                        case Key.Q:
-                            _projectEditor.OnToolQuadraticBezier();
-                            break;
-                        case Key.H:
-                            _projectEditor.OnToolPath();
-                            break;
-                        case Key.M:
-                            _projectEditor.OnToolMove();
-                            break;
-                        case Key.R:
-                            _projectEditor.OnToolRectangle();
-                            break;
-                        case Key.E:
-                            _projectEditor.OnToolEllipse();
-                            break;
-                        case Key.T:
-                            _projectEditor.OnToolText();
-                            break;
-                        case Key.I:
-                            _projectEditor.OnToolImage();
-                            break;
-                        case Key.K:
-                            _projectEditor.OnToggleDefaultIsStroked();
-                            break;
-                        case Key.F:
-                            _projectEditor.OnToggleDefaultIsFilled();
-                            break;
-                        case Key.D:
-                            _projectEditor.OnToggleDefaultIsClosed();
-                            break;
-                        case Key.J:
-                            _projectEditor.OnToggleDefaultIsSmoothJoin();
-                            break;
-                        case Key.G:
-                            _projectEditor.OnToggleSnapToGrid();
-                            break;
-                        case Key.C:
-                            _projectEditor.OnToggleTryToConnect();
-                            break;
-                        case Key.Y:
-                            _projectEditor.OnToggleCloneStyle();
-                            break;
-                        case Key.Delete:
-                            _projectEditor.OnDeleteSelected();
-                            break;
-                        case Key.Escape:
-                            _projectEditor.OnDeselectAll();
-                            break;
-                    }
-                }
-            };
+            _renderer = _projectEditor.Renderers[0];
+            _container = _projectEditor.Project.CurrentContainer;
+            _presenter = new EditorPresenter();
+
+            canvas.Focusable = true;
+            canvas.Focus();
+            OnRefreshRequested(null, null);
+
+            _inputProcessor = new InputProcessor(
+                new WpfInputSource(
+                    canvas,
+                    canvas,
+                    FixPointOffset),
+                _projectEditor);
+        }
+
+        private void MainWindow_KeyDown(object sender, KeyEventArgs e)
+        {
+            bool isControl = Keyboard.Modifiers == ModifierKeys.Control;
+            if (isControl)
+            {
+                switch (e.Key)
+                {
+                    case Key.P:
+                        _previewWindow.Show();
+                        break;
+                    case Key.N:
+                        NewProject();
+                        break;
+                    case Key.O:
+                        OpenProject();
+                        break;
+                    case Key.S:
+                        SaveProject();
+                        break;
+                    case Key.E:
+                        Export(_projectEditor.Project.CurrentContainer);
+                        break;
+                    case Key.Z:
+                        _projectEditor.OnUndo();
+                        break;
+                    case Key.Y:
+                        _projectEditor.OnRedo();
+                        break;
+                    case Key.X:
+                        _projectEditor.OnCut();
+                        break;
+                    case Key.C:
+                        _projectEditor.OnCopy();
+                        break;
+                    case Key.V:
+                        _projectEditor.OnPaste();
+                        break;
+                    case Key.A:
+                        _projectEditor.OnSelectAll();
+                        break;
+                    case Key.G:
+                        _projectEditor.OnGroupSelected();
+                        break;
+                    case Key.U:
+                        _projectEditor.OnUngroupSelected();
+                        break;
+                }
+            }
+            else
+            {
+                switch (e.Key)
+                {
+                    case Key.N:
+                        _projectEditor.OnToolNone();
+                        break;
+                    case Key.S:
+                        _projectEditor.OnToolSelection();
+                        break;
+                    case Key.P:
+                        _projectEditor.OnToolPoint();
+                        break;
+                    case Key.L:
+                        _projectEditor.OnToolLine();
+                        break;
+                    case Key.A:
+                        _projectEditor.OnToolArc();
+                        break;
+                    case Key.B:
+                        _projectEditor.OnToolCubicBezier();
+                        break;
+                    case Key.Q:
+                        _projectEditor.OnToolQuadraticBezier();
+                        break;
+                    case Key.H:
+                        _projectEditor.OnToolPath();
+                        break;
+                    case Key.M:
+                        _projectEditor.OnToolMove();
+                        break;
+                    case Key.R:
+                        _projectEditor.OnToolRectangle();
+                        break;
+                    case Key.E:
+                        _projectEditor.OnToolEllipse();
+                        break;
+                    case Key.T:
+                        _projectEditor.OnToolText();
+                        break;
+                    case Key.I:
+                        _projectEditor.OnToolImage();
+                        break;
+                    case Key.K:
+                        _projectEditor.OnToggleDefaultIsStroked();
+                        break;
+                    case Key.F:
+                        _projectEditor.OnToggleDefaultIsFilled();
+                        break;
+                    case Key.D:
+                        _projectEditor.OnToggleDefaultIsClosed();
+                        break;
+                    case Key.J:
+                        _projectEditor.OnToggleDefaultIsSmoothJoin();
+                        break;
+                    case Key.G:
+                        _projectEditor.OnToggleSnapToGrid();
+                        break;
+                    case Key.C:
+                        _projectEditor.OnToggleTryToConnect();
+                        break;
+                    case Key.Y:
+                        _projectEditor.OnToggleCloneStyle();
+                        break;
+                    case Key.Delete:
+                        _projectEditor.OnDeleteSelected();
+                        break;
+                    case Key.Escape:
+                        _projectEditor.OnDeselectAll();
+                        break;
+                }
+            }
+        }
+
+        private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+        {
+            _inputProcessor.Dispose();
+            isClosing = true;
+            _previewWindow.Close();
+        }
+
+        private void PreviewWindowSvgButton_Click(object sender, RoutedEventArgs e)
+        {
+            UpdateSvg();
+        }
+
+        private void PreviewWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+        {
+            if (!isClosing)
+            {
+                _previewWindow.Hide();
+                e.Cancel = true;
+            }
         }

         public Point FixPointOffset(Point point)


Add examples for SignatureAlgorithm

Add examples for SignatureAlgorithm

--- src/Cryptography/SignatureAlgorithm.cs
+++ src/Cryptography/SignatureAlgorithm.cs
@@ -5,6 +5,17 @@
 {
     //
     //  A digital signature algorithm
+    //
+    //  Examples
+    //
+    //      | Algorithm   | Reference  | Key Size | Signature Size |
+    //      | ----------- | ---------- | -------- | -------------- |
+    //      | ECDSA P-256 | FIPS 186-3 | 32       | 64             |
+    //      | ECDSA P-521 | FIPS 186-3 | 66       | 132            |
+    //      | Ed25519     | [1]        | 32       | 64             |
+    //      | Ed448       | [1]        | 57       | 114            |
+    //
+    //      [1] draft-irtf-cfrg-eddsa-08
     //
     public abstract class SignatureAlgorithm : Algorithm
     {


Fixed inconsistency in ApiUrls.cs (#1287)

* Fix inconsistecy in parameters name that used in methods that use "repos/{0}/{1}" syntax.

* added XML documentation for PullRequestFiles method

* updated XML documentation of some methods in ApiUrls

* added needed XML doc tags

* fixed name of parameter

* fixed name of parameter

* undo prev. commit

--- Octokit/Helpers/ApiUrls.cs
+++ Octokit/Helpers/ApiUrls.cs
@@ -567,60 +567,60 @@
         /// Returns the <see cref="Uri"/> that returns the specified label.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repo">The name of the repository</param>
-        /// <param name="name">The milestone number</param>
-        /// <returns></returns>
-        public static Uri Label(string owner, string repo, string name)
-        {
-            return "repos/{0}/{1}/labels/{2}".FormatUri(owner, repo, name);
+        /// <param name="name">The name of the repository</param>
+        /// <param name="labelName">The name of label</param>
+        /// <returns></returns>
+        public static Uri Label(string owner, string name, string labelName)
+        {
+            return "repos/{0}/{1}/labels/{2}".FormatUri(owner, name, labelName);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that returns all of the labels for the specified repository.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repo">The name of the repository</param>
-        /// <returns></returns>
-        public static Uri Labels(string owner, string repo)
-        {
-            return "repos/{0}/{1}/labels".FormatUri(owner, repo);
+        /// <param name="name">The name of the repository</param>
+        /// <returns></returns>
+        public static Uri Labels(string owner, string name)
+        {
+            return "repos/{0}/{1}/labels".FormatUri(owner, name);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that returns the named label for the specified issue.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repo">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="number">The issue number</param>
-        /// <param name="name">The name of the label</param>
-        /// <returns></returns>
-        public static Uri IssueLabel(string owner, string repo, int number, string name)
-        {
-            return "repos/{0}/{1}/issues/{2}/labels/{3}".FormatUri(owner, repo, number, name);
+        /// <param name="labelName">The name of the label</param>
+        /// <returns></returns>
+        public static Uri IssueLabel(string owner, string name, int number, string labelName)
+        {
+            return "repos/{0}/{1}/issues/{2}/labels/{3}".FormatUri(owner, name, number, labelName);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that returns all of the labels for the specified issue.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repo">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="number">The issue number</param>
         /// <returns></returns>
-        public static Uri IssueLabels(string owner, string repo, int number)
-        {
-            return "repos/{0}/{1}/issues/{2}/labels".FormatUri(owner, repo, number);
+        public static Uri IssueLabels(string owner, string name, int number)
+        {
+            return "repos/{0}/{1}/issues/{2}/labels".FormatUri(owner, name, number);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that returns all of the labels for all issues in the specified milestone.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repo">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="number">The milestone number</param>
         /// <returns></returns>
-        public static Uri MilestoneLabels(string owner, string repo, int number)
-        {
-            return "repos/{0}/{1}/milestones/{2}/labels".FormatUri(owner, repo, number);
+        public static Uri MilestoneLabels(string owner, string name, int number)
+        {
+            return "repos/{0}/{1}/milestones/{2}/labels".FormatUri(owner, name, number);
         }

         /// <summary>
@@ -639,47 +639,47 @@
         /// Returns the <see cref="Uri"/> that lists the repository hooks for the specified reference.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repositoryName">The name of the repository</param>
-        /// <returns></returns>
-        public static Uri RepositoryHooks(string owner, string repositoryName)
-        {
-            return "repos/{0}/{1}/hooks".FormatUri(owner, repositoryName);
+        /// <param name="name">The name of the repository</param>
+        /// <returns></returns>
+        public static Uri RepositoryHooks(string owner, string name)
+        {
+            return "repos/{0}/{1}/hooks".FormatUri(owner, name);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that gets the repository hook for the specified reference.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repositoryName">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="hookId">The identifier of the repository hook</param>
         /// <returns></returns>
-        public static Uri RepositoryHookById(string owner, string repositoryName, int hookId)
-        {
-            return "repos/{0}/{1}/hooks/{2}".FormatUri(owner, repositoryName, hookId);
+        public static Uri RepositoryHookById(string owner, string name, int hookId)
+        {
+            return "repos/{0}/{1}/hooks/{2}".FormatUri(owner, name, hookId);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that can tests a specified repository hook
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repositoryName">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="hookId">The identifier of the repository hook</param>
         /// <returns></returns>
-        public static Uri RepositoryHookTest(string owner, string repositoryName, int hookId)
-        {
-            return "repos/{0}/{1}/hooks/{2}/tests".FormatUri(owner, repositoryName, hookId);
+        public static Uri RepositoryHookTest(string owner, string name, int hookId)
+        {
+            return "repos/{0}/{1}/hooks/{2}/tests".FormatUri(owner, name, hookId);
         }

         /// <summary>
         /// Returns the <see cref="Uri"/> that can ping a specified repository hook
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repositoryName">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="hookId">The identifier of the repository hook</param>
         /// <returns></returns>
-        public static Uri RepositoryHookPing(string owner, string repositoryName, int hookId)
-        {
-            return "repos/{0}/{1}/hooks/{2}/pings".FormatUri(owner, repositoryName, hookId);
+        public static Uri RepositoryHookPing(string owner, string name, int hookId)
+        {
+            return "repos/{0}/{1}/hooks/{2}/pings".FormatUri(owner, name, hookId);
         }

         /// <summary>
@@ -710,11 +710,11 @@
         /// Returns the <see cref="Uri"/> that lists the repository forks for the specified reference.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repositoryName">The name of the repository</param>
-        /// <returns></returns>
-        public static Uri RepositoryForks(string owner, string repositoryName)
-        {
-            return "repos/{0}/{1}/forks".FormatUri(owner, repositoryName);
+        /// <param name="name">The name of the repository</param>
+        /// <returns></returns>
+        public static Uri RepositoryForks(string owner, string name)
+        {
+            return "repos/{0}/{1}/forks".FormatUri(owner, name);
         }

         /// <summary>
@@ -722,6 +722,7 @@
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
         /// <param name="name">The name of the repository</param>
+        /// <returns>The <see cref="Uri"/> that lists the watched repositories for the authenticated user.</returns>
         public static Uri Watchers(string owner, string name)
         {
             return "repos/{0}/{1}/subscribers".FormatUri(owner, name);
@@ -760,6 +761,7 @@
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
         /// <param name="name">The name of the repository</param>
+        /// <returns>The <see cref="Uri"/> that lists the starred repositories for the authenticated user.</returns>
         public static Uri Stargazers(string owner, string name)
         {
             return "repos/{0}/{1}/stargazers".FormatUri(owner, name);
@@ -941,6 +943,7 @@
         /// <param name="owner">The owner of the repository</param>
         /// <param name="name">The name of the repository</param>
         /// <param name="number">The pull request number</param>
+        /// <returns>The <see cref="Uri"/> that returns the pull request merge state.</returns>
         public static Uri MergePullRequest(string owner, string name, int number)
         {
             return "repos/{0}/{1}/pulls/{2}/merge".FormatUri(owner, name, number);
@@ -952,11 +955,19 @@
         /// <param name="owner">The owner of the repository</param>
         /// <param name="name">The name of the repository</param>
         /// <param name="number">The pull request number</param>
+        /// <returns>The <see cref="Uri"/> that returns the commits on a pull request.</returns>
         public static Uri PullRequestCommits(string owner, string name, int number)
         {
             return "repos/{0}/{1}/pulls/{2}/commits".FormatUri(owner, name, number);
         }

+        /// <summary>
+        /// Returns the <see cref="Uri"/> that returns the files on a pull request.
+        /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <param name="number">The pull request number</param>
+        /// <returns>The <see cref="Uri"/> that returns the files on a pull request.</returns>
         public static Uri PullRequestFiles(string owner, string name, int number)
         {
             return "repos/{0}/{1}/pulls/{2}/files".FormatUri(owner, name, number);
@@ -1032,6 +1043,9 @@
         /// <summary>
         /// Returns the <see cref="Uri"/> for the network of repositories.
         /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <returns>The <see cref="Uri"/> for the network of repositories.</returns>
         public static Uri NetworkEvents(string owner, string name)
         {
             return "networks/{0}/{1}/events".FormatUri(owner, name);
@@ -1284,22 +1298,22 @@
         /// use for update or deleting a team
         /// </summary>
         /// <param name="owner">owner of repo</param>
-        /// <param name="repo">name of repo</param>
-        /// <returns></returns>
-        public static Uri RepoCollaborators(string owner, string repo)
-        {
-            return "repos/{0}/{1}/collaborators".FormatUri(owner, repo);
+        /// <param name="name">name of repo</param>
+        /// <returns></returns>
+        public static Uri RepoCollaborators(string owner, string name)
+        {
+            return "repos/{0}/{1}/collaborators".FormatUri(owner, name);
         }

         /// <summary>
         /// returns the <see cref="Uri"/> for branches
         /// </summary>
         /// <param name="owner">owner of repo</param>
-        /// <param name="repo">name of repo</param>
-        /// <returns></returns>
-        public static Uri RepoBranches(string owner, string repo)
-        {
-            return "repos/{0}/{1}/branches".FormatUri(owner, repo);
+        /// <param name="name">name of repo</param>
+        /// <returns></returns>
+        public static Uri RepoBranches(string owner, string name)
+        {
+            return "repos/{0}/{1}/branches".FormatUri(owner, name);
         }

         /// <summary>
@@ -1429,12 +1443,12 @@
         /// Returns the <see cref="Uri"/> for a repository branch.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>
-        /// <param name="repositoryName">The name of the repository</param>
+        /// <param name="name">The name of the repository</param>
         /// <param name="branchName">The name of the branch</param>
         /// <returns></returns>
-        public static Uri RepoBranch(string owner, string repositoryName, string branchName)
-        {
-            return "repos/{0}/{1}/branches/{2}".FormatUri(owner, repositoryName, branchName);
+        public static Uri RepoBranch(string owner, string name, string branchName)
+        {
+            return "repos/{0}/{1}/branches/{2}".FormatUri(owner, name, branchName);
         }

         /// <summary>
@@ -1608,6 +1622,14 @@
             return "repos/{0}/{1}/contents/{2}".FormatUri(owner, name, path);
         }

+        /// <summary>
+        /// Creates the relative <see cref="Uri"/> for getting an archive of a given repository's contents, in a specific format
+        /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <param name="archiveFormat">The format of the archive. Can be either tarball or zipball</param>
+        /// <param name="reference">A valid Git reference.</param>
+        /// <returns>The <see cref="Uri"/> for getting an archive of a given repository's contents, in a specific format</returns>
         public static Uri RepositoryArchiveLink(string owner, string name, ArchiveFormat archiveFormat, string reference)
         {
             return "repos/{0}/{1}/{2}/{3}".FormatUri(owner, name, archiveFormat.ToParameter(), reference);
@@ -1626,16 +1648,34 @@
             return "repos/{0}/{1}/contents/{2}?ref={3}".FormatUri(owner, name, path, reference);
         }

+        /// <summary>
+        /// Creates the relative <see cref="Uri"/> for getting the page metadata for a given repository
+        /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <returns>The <see cref="Uri"/> for getting the page metadata for a given repository</returns>
         public static Uri RepositoryPage(string owner, string name)
         {
             return "repos/{0}/{1}/pages".FormatUri(owner, name);
         }

+        /// <summary>
+        /// Creates the relative <see cref="Uri"/> for getting all build metadata for a given repository
+        /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <returns>The <see cref="Uri"/> for getting all build metadata for a given repository</returns>
         public static Uri RepositoryPageBuilds(string owner, string name)
         {
             return "repos/{0}/{1}/pages/builds".FormatUri(owner, name);
         }

+        /// <summary>
+        /// Creates the relative <see cref="Uri"/> for getting the build metadata for the last build for a given repository
+        /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <returns>The <see cref="Uri"/> for getting the build metadata for the last build for a given repository</returns>
         public static Uri RepositoryPageBuildsLatest(string owner, string name)
         {
             return "repos/{0}/{1}/pages/builds/latest".FormatUri(owner, name);


add api url for IssueCommentReaction

add api url for IssueCommentReaction

--- Octokit/Helpers/ApiUrls.cs
+++ Octokit/Helpers/ApiUrls.cs
@@ -364,6 +364,18 @@
         }

         /// <summary>
+        /// Returns the <see cref="Uri"/> for the reaction of an specified issue.
+        /// </summary>
+        /// <param name="owner">The owner of the repository</param>
+        /// <param name="name">The name of the repository</param>
+        /// <param name="number">The comment number</param>
+        /// <returns></returns>
+        public static Uri IssueCommentReactions(string owner, string name, int number)
+        {
+            return "repos/{0}/{1}/issues/comment/{2}/reactions".FormatUri(owner, name, number);
+        }
+
+        /// <summary>
         /// Returns the <see cref="Uri"/> for the specified comment.
         /// </summary>
         /// <param name="owner">The owner of the repository</param>


Bugfix 'object' vs 'Object' casing issue

--- Zbu.ModelsBuilder/DiscoveryResult.cs
+++ Zbu.ModelsBuilder/DiscoveryResult.cs
@@ -75,7 +75,7 @@
         // content with that name has a base class so no need to generate one
         public void SetContentBaseClass(string contentName, string baseName)
         {
-            if (baseName != "object")
+            if (baseName.ToLowerInvariant() != "object")
                 _contentBase[contentName] = baseName;
         }


Update DrawContainerView.cs

Update DrawContainerView.cs

--- src/Draw2D/Editor/DrawContainerView.cs
+++ src/Draw2D/Editor/DrawContainerView.cs
@@ -124,10 +124,14 @@
             switch (context)
             {
                 case DrawingContext drawingContext:
-                    Draw(view, drawingContext, width, height, dx, dy, zx, zy);
+                    {
+                        Draw(view, drawingContext, width, height, dx, dy, zx, zy);
+                    }
                     break;
                 case SKCanvas canvas:
-                    Draw(view, canvas, width, height, dx, dy, zx, zy);
+                    {
+                        Draw(view, canvas, width, height, dx, dy, zx, zy);
+                    }
                     break;
             }
         }


Clip to bounds

Clip to bounds

--- src/Draw2D/Editor/DrawContainerView.cs
+++ src/Draw2D/Editor/DrawContainerView.cs
@@ -389,13 +389,17 @@
             view.CurrentContainer.Invalidate();
             view.WorkingContainer.Invalidate();

+            var bounds = new Rect(0.0, 0.0, width, height);
+
+            var boundsState = context.PushClip(bounds);
+
             if (view.InputBackground != null)
             {
                 GetBrushFill(view.InputBackground, out var brush);
-                context.FillRectangle(brush, new Rect(0.0, 0.0, width, height));
-            }
-
-            var state = context.PushPreTransform(new Matrix(zx, 0.0, 0.0, zy, dx, dy));
+                context.FillRectangle(brush, bounds);
+            }
+
+            var matrixState = context.PushPreTransform(new Matrix(zx, 0.0, 0.0, zy, dx, dy));

             if (view.WorkBackground != null)
             {
@@ -408,7 +412,9 @@
             DrawDecorators(view, context, _avaloniaRenderer);
             DrawPoints(view, context, _avaloniaRenderer);

-            state.Dispose();
+            matrixState.Dispose();
+
+            boundsState.Dispose();
         }

         public void Draw(IContainerView view, object context, double width, double height, double dx, double dy, double zx, double zy)


create default BB static cache and doco improvement

--- src/Eshopworld.Telemetry/BigBrother.cs
+++ src/Eshopworld.Telemetry/BigBrother.cs
@@ -135,6 +135,9 @@
         private KustoOptionsBuilder? _kustoOptionsBuilder;
         private long _messagesSent = 0;

+        private static BigBrother _defaultBigBrother;
+        private static object _defaultBigBrotherLock = new object();
+
         /// <summary>
         /// Static initialization of static resources in <see cref="BigBrother"/> instances.
         /// </summary>
@@ -155,7 +158,7 @@
         /// </summary>
         /// <param name="aiKey">The application's Application Insights instrumentation key.</param>
         /// <param name="internalKey">The devops internal telemetry Application Insights instrumentation key.</param>
-        [Obsolete("Use constructor with TelemetryClient supplied via DI as AI SDK for ASP.NET Core maintains fully fleshed out telemetry configuration instance - see https://github.com/microsoft/ApplicationInsights-dotnet/issues/1152 . This constructor uses default config which references only OperationCorrelationTelemetryInitializer")]
+        [Obsolete("Use constructor with TelemetryClient supplied via DI as AI SDK for ASP.NET Core maintains fully fleshed out telemetry configuration instance (available via TelemetryModule) - see https://github.com/microsoft/ApplicationInsights-dotnet/issues/1152 . This constructor uses default config which references only OperationCorrelationTelemetryInitializer")]
         public BigBrother(string aiKey, string internalKey)
         {
             TelemetryClient = new TelemetryClient(TelemetryConfiguration.CreateDefault()){InstrumentationKey = aiKey};
@@ -215,10 +218,17 @@
         /// <returns><see cref="BigBrother"/> default instance</returns>
         public static BigBrother CreateDefault(string aiKey, string internalKey)
         {
-            var telConfig = TelemetryConfiguration.CreateDefault();
-            telConfig.TelemetryInitializers.Add(new EnvironmentDetailsTelemetryInitializer());
-            var telClient = new TelemetryClient(telConfig) { InstrumentationKey = aiKey };
-            return new BigBrother(telClient, aiKey, internalKey);
+            if (_defaultBigBrother != null) return _defaultBigBrother;
+
+            lock (_defaultBigBrotherLock)
+            {
+                var telConfig = TelemetryConfiguration.CreateDefault();
+                telConfig.TelemetryInitializers.Add(new EnvironmentDetailsTelemetryInitializer());
+                var telClient = new TelemetryClient(telConfig) {InstrumentationKey = aiKey};
+                _defaultBigBrother = new BigBrother(telClient, aiKey, internalKey);
+
+                return _defaultBigBrother;
+            }
         }

         /// <summary>


Delete extra newline.

Delete extra newline.

--- src/Facility.CSharp/CSharpGenerator.cs
+++ src/Facility.CSharp/CSharpGenerator.cs
@@ -69,7 +69,6 @@
 				outputFiles.Add(GenerateHttpClient(httpServiceInfo, context));
 				outputFiles.Add(GenerateHttpHandler(httpServiceInfo, context));
 			}
-

 			return outputFiles;
 		}


Fixed columns width for ONU list and details

--- src/GPONMonitor/Views/Olt/Index.cshtml
+++ src/GPONMonitor/Views/Olt/Index.cshtml
@@ -7,7 +7,7 @@

-

+

@@ -19,20 +19,20 @@

-

+

-

+

@Localizer["Error"]

-

+

-
+

-
+

@@ -40,12 +40,18 @@

-

+

@Localizer["Error"]

+

+

+
+
+

+


Add realtime to room categories

Add realtime to room categories

--- osu.Game/Online/Multiplayer/RoomCategory.cs
+++ osu.Game/Online/Multiplayer/RoomCategory.cs
@@ -6,6 +6,7 @@
     public enum RoomCategory
     {
         Normal,
-        Spotlight
+        Spotlight,
+        Realtime,
     }
 }


Tidy up layer container logic

Tidy up layer container logic

--- osu.Game/Rulesets/Edit/HitObjectComposer.cs
+++ osu.Game/Rulesets/Edit/HitObjectComposer.cs
@@ -6,7 +6,6 @@
 using System.Linq;
 using OpenTK.Graphics;
 using osu.Framework.Allocation;
-using osu.Framework.Extensions.IEnumerableExtensions;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
@@ -27,12 +26,11 @@
         protected ICompositionTool CurrentTool { get; private set; }

         private RulesetContainer rulesetContainer;
-        private readonly Container[] layerContainers = new Container[2];
+        private readonly List<Container> layerContainers = new List<Container>();

         protected HitObjectComposer(Ruleset ruleset)
         {
             this.ruleset = ruleset;
-
             RelativeSizeAxes = Axes.Both;
         }

@@ -42,6 +40,9 @@
             try
             {
                 rulesetContainer = CreateRulesetContainer(ruleset, osuGame.Beatmap.Value);
+
+                // TODO: should probably be done at a RulesetContainer level to share logic with Player.
+                rulesetContainer.Clock = new InterpolatingFramedClock((IAdjustableClock)osuGame.Beatmap.Value.Track ?? new StopwatchClock());
             }
             catch (Exception e)
             {
@@ -49,19 +50,13 @@
                 return;
             }

-            layerContainers[0] = CreateLayerContainer();
-            layerContainers[0].Child = new Container
+            ScalableContainer createLayerContainerWithContent(Drawable content)
             {
-                Name = "Border",
-                RelativeSizeAxes = Axes.Both,
-                Masking = true,
-                BorderColour = Color4.White,
-                BorderThickness = 2,
-                Child = new Box { RelativeSizeAxes = Axes.Both, Alpha = 0, AlwaysPresent = true }
-            };
-
-            layerContainers[1] = CreateLayerContainer();
-            layerContainers[1].Child = new SelectionLayer(rulesetContainer.Playfield);
+                var container = CreateLayerContainer();
+                container.Child = content;
+                layerContainers.Add(container);
+                return container;
+            }

             RadioButtonCollection toolboxCollection;
             InternalChild = new GridContainer
@@ -87,9 +82,17 @@
                             RelativeSizeAxes = Axes.Both,
                             Children = new Drawable[]
                             {
-                                layerContainers[0],
+                                createLayerContainerWithContent(new Container
+                                {
+                                    Name = "Border",
+                                    RelativeSizeAxes = Axes.Both,
+                                    Masking = true,
+                                    BorderColour = Color4.White,
+                                    BorderThickness = 2,
+                                    Child = new Box { RelativeSizeAxes = Axes.Both, Alpha = 0, AlwaysPresent = true }
+                                }),
                                 rulesetContainer,
-                                layerContainers[1]
+                                createLayerContainerWithContent(new SelectionLayer(rulesetContainer.Playfield))
                             }
                         }
                     },
@@ -99,8 +102,6 @@
                     new Dimension(GridSizeMode.Absolute, 200),
                 }
             };
-
-            rulesetContainer.Clock = new InterpolatingFramedClock((IAdjustableClock)osuGame.Beatmap.Value.Track ?? new StopwatchClock());

             toolboxCollection.Items =
                 new[] { new RadioButton("Select", () => setCompositionTool(null)) }
@@ -134,6 +135,6 @@
         /// <summary>
         /// Creates a <see cref="ScalableContainer"/> which provides a layer above or below the <see cref="Playfield"/>.
         /// </summary>
-        protected virtual ScalableContainer CreateLayerContainer() => new ScalableContainer();
+        protected virtual ScalableContainer CreateLayerContainer() => new ScalableContainer { RelativeSizeAxes = Axes.Both };
     }
 }


Make BPM update with changes in mod settings

--- osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -25,6 +25,7 @@
 using osu.Framework.Graphics.Sprites;
 using osu.Framework.Localisation;
 using osu.Framework.Logging;
+using osu.Game.Configuration;
 using osu.Game.Rulesets;
 using osu.Game.Rulesets.Mods;
 using osu.Game.Rulesets.UI;
@@ -167,12 +168,15 @@

             private ILocalisedBindableString titleBinding;
             private ILocalisedBindableString artistBinding;
+            private Container bpmLabelContainer;

             private readonly WorkingBeatmap beatmap;
             private readonly RulesetInfo ruleset;
             private readonly IReadOnlyList<Mod> mods;
             private readonly StarDifficulty starDifficulty;

+            private ModSettingChangeTracker settingChangeTracker;
+
             public BufferedWedgeInfo(WorkingBeatmap beatmap, RulesetInfo userRuleset, IReadOnlyList<Mod> mods, StarDifficulty difficulty)
                 : base(pixelSnapping: true)
             {
@@ -189,8 +193,10 @@
                 var metadata = beatmapInfo.Metadata ?? beatmap.BeatmapSetInfo?.Metadata ?? new BeatmapMetadata();

                 CacheDrawnFrameBuffer = true;
-
                 RelativeSizeAxes = Axes.Both;
+
+                settingChangeTracker = new ModSettingChangeTracker(mods);
+                settingChangeTracker.SettingChanged += _ => updateBPM();

                 titleBinding = localisation.GetLocalisedString(new LocalisedString((metadata.TitleUnicode, metadata.Title)));
                 artistBinding = localisation.GetLocalisedString(new LocalisedString((metadata.ArtistUnicode, metadata.Artist)));
@@ -312,7 +318,25 @@
                                 Margin = new MarginPadding { Top = 20 },
                                 Spacing = new Vector2(20, 0),
                                 AutoSizeAxes = Axes.Both,
-                                Children = getInfoLabels()
+                                Children = new Drawable[]
+                                {
+                                    new InfoLabel(new BeatmapStatistic
+                                    {
+                                        Name = "Length",
+                                        CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Length),
+                                        Content = TimeSpan.FromMilliseconds(beatmapInfo.Length).ToString(@"m\:ss"),
+                                    }),
+                                    bpmLabelContainer = new Container
+                                    {
+                                        AutoSizeAxes = Axes.Both,
+                                    },
+                                    new FillFlowContainer
+                                    {
+                                        AutoSizeAxes = Axes.Both,
+                                        Spacing = new Vector2(20, 0),
+                                        Children = getRulesetInfoLabels()
+                                    }
+                                }
                             }
                         }
                     }
@@ -324,6 +348,8 @@
                 // no difficulty means it can't have a status to show
                 if (beatmapInfo.Version == null)
                     StatusPill.Hide();
+
+                updateBPM();
             }

             private static Drawable createStarRatingDisplay(StarDifficulty difficulty) => difficulty.Stars > 0
@@ -340,69 +366,60 @@
                 ForceRedraw();
             }

-            private InfoLabel[] getInfoLabels()
+            private InfoLabel[] getRulesetInfoLabels()
+            {
+                try
+                {
+                    IBeatmap playableBeatmap;
+
+                    try
+                    {
+                        // Try to get the beatmap with the user's ruleset
+                        playableBeatmap = beatmap.GetPlayableBeatmap(ruleset, Array.Empty<Mod>());
+                    }
+                    catch (BeatmapInvalidForRulesetException)
+                    {
+                        // Can't be converted to the user's ruleset, so use the beatmap's own ruleset
+                        playableBeatmap = beatmap.GetPlayableBeatmap(beatmap.BeatmapInfo.Ruleset, Array.Empty<Mod>());
+                    }
+
+                    return playableBeatmap.GetStatistics().Select(s => new InfoLabel(s)).ToArray();
+                }
+                catch (Exception e)
+                {
+                    Logger.Error(e, "Could not load beatmap successfully!");
+                }
+
+                return Array.Empty<InfoLabel>();
+            }
+
+            private void updateBPM()
             {
                 var b = beatmap.Beatmap;
-
-                List<InfoLabel> labels = new List<InfoLabel>();
-
-                if (b?.HitObjects?.Any() == true)
-                {
-                    labels.Add(new InfoLabel(new BeatmapStatistic
-                    {
-                        Name = "Length",
-                        CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Length),
-                        Content = TimeSpan.FromMilliseconds(b.BeatmapInfo.Length).ToString(@"m\:ss"),
-                    }));
-
-                    labels.Add(new InfoLabel(new BeatmapStatistic
-                    {
-                        Name = "BPM",
-                        CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Bpm),
-                        Content = getBPMRange(b),
-                    }));
-
-                    try
-                    {
-                        IBeatmap playableBeatmap;
-
-                        try
-                        {
-                            // Try to get the beatmap with the user's ruleset
-                            playableBeatmap = beatmap.GetPlayableBeatmap(ruleset, Array.Empty<Mod>());
-                        }
-                        catch (BeatmapInvalidForRulesetException)
-                        {
-                            // Can't be converted to the user's ruleset, so use the beatmap's own ruleset
-                            playableBeatmap = beatmap.GetPlayableBeatmap(beatmap.BeatmapInfo.Ruleset, Array.Empty<Mod>());
-                        }
-
-                        labels.AddRange(playableBeatmap.GetStatistics().Select(s => new InfoLabel(s)));
-                    }
-                    catch (Exception e)
-                    {
-                        Logger.Error(e, "Could not load beatmap successfully!");
-                    }
-                }
-
-                return labels.ToArray();
-            }
-
-            private string getBPMRange(IBeatmap beatmap)
-            {
+                if (b == null)
+                    return;
+
                 // this doesn't consider mods which apply variable rates, yet.
                 double rate = 1;
                 foreach (var mod in mods.OfType<IApplicableToRate>())
                     rate = mod.ApplyToRate(0, rate);

-                double bpmMax = beatmap.ControlPointInfo.BPMMaximum * rate;
-                double bpmMin = beatmap.ControlPointInfo.BPMMinimum * rate;
-                double mostCommonBPM = 60000 / beatmap.GetMostCommonBeatLength() * rate;
-
-                if (Precision.AlmostEquals(bpmMin, bpmMax))
-                    return $"{bpmMin:0}";
-
-                return $"{bpmMin:0}-{bpmMax:0} (mostly {mostCommonBPM:0})";
+                double bpmMax = b.ControlPointInfo.BPMMaximum * rate;
+                double bpmMin = b.ControlPointInfo.BPMMinimum * rate;
+                double mostCommonBPM = 60000 / b.GetMostCommonBeatLength() * rate;
+
+                string labelText = Precision.AlmostEquals(bpmMin, bpmMax)
+                    ? $"{bpmMin:0}"
+                    : $"{bpmMin:0}-{bpmMax:0} (mostly {mostCommonBPM:0})";
+
+                bpmLabelContainer.Child = new InfoLabel(new BeatmapStatistic
+                {
+                    Name = "BPM",
+                    CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Bpm),
+                    Content = labelText
+                });
+
+                ForceRedraw();
             }

             private OsuSpriteText[] getMapper(BeatmapMetadata metadata)
@@ -423,6 +440,12 @@
                         Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15),
                     }
                 };
+            }
+
+            protected override void Dispose(bool isDisposing)
+            {
+                base.Dispose(isDisposing);
+                settingChangeTracker?.Dispose();
             }

             public class InfoLabel : Container, IHasTooltip


Implement VS-suggested code fix

Implement VS-suggested code fix

--- src/Google.Api.Gax/GaxPreconditions.cs
+++ src/Google.Api.Gax/GaxPreconditions.cs
@@ -40,7 +40,7 @@
         /// <exception cref="ArgumentNullException"><paramref name="argument"/> is null</exception>
         /// <returns><paramref name="argument"/> if it is not null</returns>
         public static T CheckNotNull<T>(T argument, string paramName) where T : class =>
-            argument == null ? throw new ArgumentNullException(paramName) : argument;
+            argument ?? throw new ArgumentNullException(paramName);

         /// <summary>
         /// Checks that a string argument is neither null, nor an empty string.


DI mods in parent class and pass them down

--- osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -39,6 +39,7 @@
         private static readonly Vector2 wedged_container_shear = new Vector2(shear_width / SongSelect.WEDGE_HEIGHT, 0);

         private readonly IBindable<RulesetInfo> ruleset = new Bindable<RulesetInfo>();
+        private readonly IBindable<IReadOnlyList<Mod>> mods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());

         [Resolved]
         private BeatmapDifficultyCache difficultyCache { get; set; }
@@ -64,9 +65,11 @@
         }

         [BackgroundDependencyLoader(true)]
-        private void load([CanBeNull] Bindable<RulesetInfo> parentRuleset)
+        private void load([CanBeNull] Bindable<RulesetInfo> parentRuleset, [CanBeNull] Bindable<IReadOnlyList<Mod>> parentMods)
         {
             ruleset.BindTo(parentRuleset);
+            mods.BindTo(parentMods);
+
             ruleset.ValueChanged += _ => updateDisplay();
         }

@@ -132,7 +135,7 @@
                     return;
                 }

-                LoadComponentAsync(loadingInfo = new BufferedWedgeInfo(beatmap, ruleset.Value, beatmapDifficulty.Value)
+                LoadComponentAsync(loadingInfo = new BufferedWedgeInfo(beatmap, ruleset.Value, mods.Value, beatmapDifficulty.Value)
                 {
                     Shear = -Shear,
                     Depth = Info?.Depth + 1 ?? 0
@@ -167,13 +170,15 @@

             private readonly WorkingBeatmap beatmap;
             private readonly RulesetInfo ruleset;
+            private readonly IReadOnlyList<Mod> mods;
             private readonly StarDifficulty starDifficulty;

-            public BufferedWedgeInfo(WorkingBeatmap beatmap, RulesetInfo userRuleset, StarDifficulty difficulty)
+            public BufferedWedgeInfo(WorkingBeatmap beatmap, RulesetInfo userRuleset, IReadOnlyList<Mod> mods, StarDifficulty difficulty)
                 : base(pixelSnapping: true)
             {
                 this.beatmap = beatmap;
                 ruleset = userRuleset ?? beatmap.BeatmapInfo.Ruleset;
+                this.mods = mods;
                 starDifficulty = difficulty;
             }

@@ -383,14 +388,11 @@
                 return labels.ToArray();
             }

-            [Resolved]
-            private IBindable<IReadOnlyList<Mod>> mods { get; set; }
-
             private string getBPMRange(IBeatmap beatmap)
             {
                 // this doesn't consider mods which apply variable rates, yet.
                 double rate = 1;
-                foreach (var mod in mods.Value.OfType<IApplicableToRate>())
+                foreach (var mod in mods.OfType<IApplicableToRate>())
                     rate = mod.ApplyToRate(0, rate);

                 double bpmMax = beatmap.ControlPointInfo.BPMMaximum * rate;