Added a custom Neighbour method to graphs

--- src/graphs/Neighbours.cs
+++ src/graphs/Neighbours.cs
@@ -1,10 +1,76 @@
-using GraphSharp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using GraphSharp;
 using QuickGraph;
 using VVVV.Packs.Messaging;
 using VVVV.PluginInterfaces.V2;

 namespace VVVV.Nodes
 {
+    [PluginInfo(
+        Name = "Neighbours",
+        Category = "Graph",
+        Version = "OutEdge",
+        Author = "microdee"
+    )]
+    public class GraphOutEdgeNeighboursNode : IPluginEvaluate
+    {
+        [Input("Graph")]
+        public ISpread<IVertexAndEdgeListGraph<Message, MessageEdge>> FGraph;
+        [Input("Reference")]
+        public ISpread<Message> FRef;
+        [Input("Compute", IsBang = true)]
+        public ISpread<bool> FComp;
+
+        [Output("Neighbours")]
+        public ISpread<ISpread<MessageEdge>> FNeighbours;
+        [Output("Running")]
+        public ISpread<bool> FRunning;
+        [Output("Done", IsBang = true)]
+        public ISpread<bool> FDone;
+
+        private Task Eval;
+        Spread<List<MessageEdge>> FoundEdges = new Spread<List<MessageEdge>>();
+
+        public void Evaluate(int SpreadMax)
+        {
+            FDone[0] = false;
+            if (FComp[0])
+            {
+                Eval = new Task(() =>
+                {
+                    FoundEdges.SliceCount = FRef.SliceCount;
+                    for (int i = 0; i < FoundEdges.SliceCount; i++)
+                    {
+                        FoundEdges[i] = new List<MessageEdge>();
+                        foreach (var edge in FGraph[0].OutEdges(FRef[i]))
+                        {
+                            FoundEdges[i].Add(edge);
+                        }
+                    }
+                });
+                Eval.Start();
+                FRunning[0] = true;
+            }
+            if (Eval != null && Eval.IsCompleted && FRunning[0])
+            {
+                FNeighbours.SliceCount = FoundEdges.SliceCount;
+                for (int i = 0; i < FNeighbours.SliceCount; i++)
+                {
+                    FNeighbours[i].SliceCount = FoundEdges[i].Count;
+                    for (int j = 0; j < FoundEdges[i].Count; j++)
+                    {
+                        FNeighbours[i][j] = FoundEdges[i][j];
+                    }
+                }
+                FDone[0] = true;
+                FRunning[0] = false;
+            }
+        }
+    }
+
     [PluginInfo(
         Name = "Neighbours",
         Category = "Graph",
@@ -18,23 +84,106 @@
         public ISpread<Message> FRef;
         [Input("Compute", IsBang = true)]
         public ISpread<bool> FComp;
-
+        [Input("Levels", DefaultValue = 1, MinValue = 1)]
+        public ISpread<int> FLevels;
+
         [Output("Neighbours")]
         public ISpread<ISpread<MessageEdge>> FNeighbours;
-
+        [Output("Neighbour Edge Level")]
+        public ISpread<ISpread<int>> FNeighbourLevels;
+        [Output("Neighbour Nodes")]
+        public ISpread<ISpread<Message>> FNeighbourNodes;
+        [Output("Neighbour Node Level")]
+        public ISpread<ISpread<int>> FNeighbourNodeLevels;
+        [Output("Running")]
+        public ISpread<bool> FRunning;
+        [Output("Done", IsBang = true)]
+        public ISpread<bool> FDone;
+
+        private Spread<Task> Eval = new Spread<Task>();
+        Spread<List<Tuple<MessageEdge, int>>> FoundEdges = new Spread<List<Tuple<MessageEdge, int>>>();
+        Spread<List<Tuple<Message, int>>> FoundNodes = new Spread<List<Tuple<Message, int>>>();
+        Spread<List<Message>> RefNodes = new Spread<List<Message>>();
+
         public void Evaluate(int SpreadMax)
         {
-            if (FComp[0])
+            for (int i = 0; i < FDone.SliceCount; i++)
             {
-                FNeighbours.SliceCount = FRef.SliceCount;
-                for (int i = 0; i < FNeighbours.SliceCount; i++)
+                FDone[i] = false;
+            }
+            FRunning.SliceCount = FRef.SliceCount;
+            FDone.SliceCount = FRef.SliceCount;
+            Eval.SliceCount = FRef.SliceCount;
+            FoundEdges.SliceCount = FRef.SliceCount;
+            FoundNodes.SliceCount = FRef.SliceCount;
+            RefNodes.SliceCount = FRef.SliceCount;
+            for (int i = 0; i < FRef.SliceCount; i++)
+            {
+                if (FComp[i])
                 {
-                    var neighbours = FGraph[0].OutEdges(FRef[i]);
+                    Eval[i] = new Task(state =>
+                    {
+                        var ii = (int)state;
+                        FoundEdges[ii] = new List<Tuple<MessageEdge, int>>();
+                        FoundNodes[ii] = new List<Tuple<Message, int>>();
+                        RefNodes[ii] = new List<Message> {FRef[ii]};
+                        for (int l = 0; l < FLevels[ii]; l++)
+                        {
+                            var stagingrefs = new List<Message>();
+                            foreach (var rnode in RefNodes[ii])
+                            {
+                                foreach (var edge in FGraph[0].Edges)
+                                {
+                                    if (!edge.Source.Equals(rnode) && !edge.Target.Equals(rnode)) continue;
+                                    if (FoundEdges[ii].Any(tuple => tuple.Item1.Equals(edge))) continue;
+                                    FoundEdges[ii].Add(new Tuple<MessageEdge, int>(edge, l));
+                                    if (!edge.Source.Equals(rnode) && !FoundNodes[ii].Any(tuple => tuple.Item1.Equals(edge.Source)))
+                                    {
+                                        FoundNodes[ii].Add(new Tuple<Message, int>(edge.Source, l));
+                                        stagingrefs.Add(edge.Source);
+                                    }
+                                    if (!edge.Target.Equals(rnode) && !FoundNodes[ii].Any(tuple => tuple.Item1.Equals(edge.Target)))
+                                    {
+                                        FoundNodes[ii].Add(new Tuple<Message, int>(edge.Target, l));
+                                        stagingrefs.Add(edge.Target);
+                                    }
+                                }
+                            }
+                            RefNodes[ii] = stagingrefs;
+                        }
+                    }, i);
+                    Eval[i].Start();
+                    FRunning[i] = true;
+                }
+            }
+            FNeighbours.SliceCount = FoundEdges.SliceCount;
+            FNeighbourLevels.SliceCount = FoundEdges.SliceCount;
+            FNeighbourNodes.SliceCount = FoundNodes.SliceCount;
+            FNeighbourNodeLevels.SliceCount = FoundNodes.SliceCount;
+            for (int i = 0; i < Eval.SliceCount; i++)
+            {
+                if (Eval[i] != null && Eval[i].IsCompleted && FRunning[i])
+                {
+                    FNeighbours[i].SliceCount = FoundEdges[i].Count;
+                    FNeighbourLevels[i].SliceCount = FoundEdges[i].Count;
+                    FNeighbourNodes[i].SliceCount = FoundNodes[i].Count;
+                    FNeighbourNodeLevels[i].SliceCount = FoundNodes[i].Count;
+                    for (int j = 0; j < FoundEdges[i].Count; j++)
+                    {
+                        FNeighbours[i][j] = FoundEdges[i][j].Item1;
+                        FNeighbourLevels[i][j] = FoundEdges[i][j].Item2;
+                    }
+                    for (int j = 0; j < FoundNodes[i].Count; j++)
+                    {
+                        FNeighbourNodes[i][j] = FoundNodes[i][j].Item1;
+                        FNeighbourNodeLevels[i][j] = FoundNodes[i][j].Item2;
+                    }
+                    FDone[i] = true;
+                    FRunning[i] = false;
+                }
+                else
+                {
                     FNeighbours[i].SliceCount = 0;
-                    foreach (var v in neighbours)
-                    {
-                        FNeighbours[i].Add(v);
-                    }
                 }
             }
         }


Fix overlooked test

Fix overlooked test

--- test/Serilog.Sinks.PeriodicBatching.Tests/Sinks/PeriodicBatching/BatchedConnectionStatusTests.cs
+++ test/Serilog.Sinks.PeriodicBatching.Tests/Sinks/PeriodicBatching/BatchedConnectionStatusTests.cs
@@ -55,24 +55,28 @@
         }

         [Fact]
-        public void WhenFourFailuresHaveOccurredTheIntervalBacksOffAndBatchIsDropped()
+        public void When8FailuresHaveOccurredTheIntervalBacksOffAndBatchIsDropped()
         {
             var bcs = new BatchedConnectionStatus(DefaultPeriod);
-            bcs.MarkFailure();
-            bcs.MarkFailure();
-            bcs.MarkFailure();
-            bcs.MarkFailure();
-            Assert.Equal(TimeSpan.FromSeconds(40), bcs.NextInterval);
+            for (var i = 0; i < 8; ++i)
+            {
+                Assert.False(bcs.ShouldDropBatch);
+                bcs.MarkFailure();
+            }
+            Assert.Equal(TimeSpan.FromMinutes(10), bcs.NextInterval);
             Assert.True(bcs.ShouldDropBatch);
             Assert.False(bcs.ShouldDropQueue);
         }

         [Fact]
-        public void WhenSixFailuresHaveOccurredTheQueueIsDropped()
+        public void When10FailuresHaveOccurredTheQueueIsDropped()
         {
             var bcs = new BatchedConnectionStatus(DefaultPeriod);
-            for (var i = 0; i < 6; ++i )
+            for (var i = 0; i < 10; ++i)
+            {
+                Assert.False(bcs.ShouldDropQueue);
                 bcs.MarkFailure();
+            }
             Assert.True(bcs.ShouldDropQueue);
         }


cat gone

cat gone

--- Samples/resource-owner-password-credential/Angular2/src/newoidc/Controllers/ResourceController.cs
+++ Samples/resource-owner-password-credential/Angular2/src/newoidc/Controllers/ResourceController.cs
@@ -15,9 +15,6 @@

         public TestController(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
         {
-            /*my cat did this
-            ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-            */
             _context = context;
             _userManager = userManager;
         }


map styling

map styling

--- Web/Views/Shared/_dashboardmap.cshtml
+++ Web/Views/Shared/_dashboardmap.cshtml
@@ -7,8 +7,8 @@
 <style>
     .map
     {
-        width:400px;
-        height:400px;
+        width:600px;
+        height:600px;
         border:solid 1px #DDD;
     }

@@ -16,6 +16,7 @@
 <link rel="stylesheet" href="~/Content/MapResources/openlayers/theme/default/style.css" type="text/css">
 <script src="~/Content/MapResources/OpenlayersWrapper.js"></script>
 <script src="~/Content/MapResources/openlayers/lib/OpenLayers.js"></script>
+<script src="~/Content/MapResources/MapStyle.js"></script>

 <div id="map1" class="map">
@@ -46,13 +47,13 @@
                                                     var name = get_attribute_value(feature.attributes, "name", "");
                                                     var att = regionAttributes[name];
                                                     var blue = Math.round(50 * (100 - att) / 100) + 170;
-                                                    return "rgb(" + 100 + "," + blue + "," + blue + ")";
+                                                    return "rgb(" + blue + "," + 100 + "," + 100 + ")";
                                                 }
                                                 , strokeColor: function (feature) {
                                                     var name = get_attribute_value(feature.attributes, "name", "");
                                                     var att = regionAttributes[name];
                                                     var blue = Math.round(50 * (100 - att) / 100) + 170;
-                                                    return "rgb(" + 100 + "," + blue + "," + blue + ")";
+                                                    return "rgb(" + blue + "," + 100+ "," + 100+ ")";
                                                 }
                                                 }
                                         }


Fix bug after merge

Fix bug after merge

--- src/Umbraco.Core/CoreBootManager.cs
+++ src/Umbraco.Core/CoreBootManager.cs
@@ -282,8 +282,8 @@
 		        typeof (DefaultUrlSegmentProvider));

             // keep it internal for now
-            //PublishedContentModelFactoryResolver.Current = new PublishedContentModelFactoryResolver(
-            //    new PublishedContentModelFactoryImpl());
+		    PublishedContentModelFactoryResolver.Current = new PublishedContentModelFactoryResolver();
+		    //    new PublishedContentModelFactoryImpl());
 		}
 	}
 }


Removes Umbraco.Core.Models.Template.GetTypeOfRenderingEngine

--- src/Umbraco.Core/Models/Template.cs
+++ src/Umbraco.Core/Models/Template.cs
@@ -103,14 +103,7 @@
         /// <summary>
         /// Returns true if the template is used as a layout for other templates (i.e. it has 'children')
         /// </summary>
-        public bool IsMasterTemplate { get; internal set; }
-
-        [Obsolete("This is no longer used and will be removed from the codebase in future versions, use the IFileSystem DetermineRenderingEngine method instead")]
-        public RenderingEngine GetTypeOfRenderingEngine()
-        {
-            //Hack! TODO: Remove this method entirely
-            return ApplicationContext.Current.Services.FileService.DetermineTemplateRenderingEngine(this);
-        }
+        public bool IsMasterTemplate { get; internal set; }

         public void SetMasterTemplate(ITemplate masterTemplate)
         {


look for drive starting with MICROBIT to account for id in drive name

--- microbit/loader/Microbit.Loader/MainWindow.xaml.cs
+++ microbit/loader/Microbit.Loader/MainWindow.xaml.cs
@@ -111,10 +111,10 @@

                 this.updateStatus("detected " + info.Name);
                 var drives = System.IO.DriveInfo.GetDrives();
-                var drive = drives.FirstOrDefault(d => getVolumeLabel(d) == "MICROBIT");
+                var drive = drives.FirstOrDefault(d => getVolumeLabel(d).StartsWith("MICROBIT", StringComparison.Ordinal));
                 if (drive == null)
                 {
-                    this.updateStatus("no BBC micro:bit detected");
+                    this.updateStatus("no MICROBIT driver detected");
                     return;
                 }


Improve ToFileTime condition

Improve ToFileTime condition

--- DokanNet/DokanOperationProxy.cs
+++ DokanNet/DokanOperationProxy.cs
@@ -977,15 +977,15 @@
         }
         /// <summary>
         /// Converts the value of <paramref name="dateTime"/> to a Windows file time.
-        /// If <paramref name="dateTime"/> is null, it returns 0
+        /// If <paramref name="dateTime"/> is null or before 12:00 midnight January 1, 1601 C.E. UTC, it returns 0
         /// </summary>
         /// <returns>The value of <paramref name="dateTime"/> expressed as a Windows file time
-        ///  -or- it returns 0 if <paramref name="dateTime"/> is before 12:00 midnight January 1, 1601 C.E. UTC.</returns>
+        ///  -or- it returns 0 if <paramref name="dateTime"/> is before 12:00 midnight January 1, 1601 C.E. UTC or null.</returns>
         [Pure]
         private static long ToFileTime(DateTime? dateTime)
         {
             //See https://msdn.microsoft.com/en-us/library/windows/desktop/aa365739(v=vs.85).aspx
-            return dateTime.HasValue && (dateTime.Value > DateTime.Parse("1601-01-01"))
+            return dateTime.HasValue && (dateTime.Value >= DateTime.FromFileTime(0))
                 ? dateTime.Value.ToFileTime()
                 : 0;
         }


Use HistoryEntry commander for SendTravelLog

--- EliteDangerous/EDSM/EDSMSync.cs
+++ EliteDangerous/EDSM/EDSMSync.cs
@@ -226,6 +226,9 @@
         public static void SendTravelLog(HistoryEntry he) // (verified with EDSM 29/9/2016, seen UTC time being sent, and same UTC time on ESDM).
         {
             EDSMClass edsm = new EDSMClass();
+            var cmdr = he.Commander;
+            edsm.commanderName = cmdr.EdsmName ?? cmdr.Name;
+            edsm.apiKey = cmdr.EdsmName ?? cmdr.Name;

             if (!edsm.IsApiKeySet)
                 return;


Shrink the displayed album cover to save memory

--- Espera/Espera.View/ViewModels/ArtistViewModel.cs
+++ Espera/Espera.View/ViewModels/ArtistViewModel.cs
@@ -114,6 +114,8 @@
                 image.BeginInit();
                 image.StreamSource = imageStream;
                 image.CacheOption = BitmapCacheOption.OnLoad;
+                image.DecodePixelHeight = 35;
+                image.DecodePixelWidth = 35;

                 try
                 {


User Roles at seed methods added;

User Roles at seed methods added;

--- Eventer/Eventer.Data/Migrations/Configuration.cs
+++ Eventer/Eventer.Data/Migrations/Configuration.cs
@@ -9,6 +9,7 @@
     using Eventer.Models;

     using Microsoft.AspNet.Identity;
+    using Microsoft.AspNet.Identity.EntityFramework;

     public sealed class Configuration : DbMigrationsConfiguration<EventerDbContext>
     {
@@ -23,6 +24,7 @@
             SeedCategories(context);
             SeedTags(context);
             SeedEvents(context);
+            SeedRoles(context);
             SeedUsers(context);
         }

@@ -72,23 +74,62 @@
             }
         }

+        private static void SeedRoles(EventerDbContext context)
+        {
+            var roleStore = new RoleStore<IdentityRole>(context);
+            var roleManager = new RoleManager<IdentityRole>(roleStore);
+
+            var roles = new List<IdentityRole>
+            {
+                new IdentityRole("Admin"),
+                new IdentityRole("User"),
+                new IdentityRole("Guest")
+            };
+
+            foreach (var role in roles)
+            {
+                if (roleManager.FindByName(role.Name) == null)
+                {
+                    roleManager.Create(role);
+                }
+            }
+
+            roleStore.Context.SaveChanges();
+        }
+
         private static void SeedUsers(EventerDbContext context)
         {
-            var password = new PasswordHasher().HashPassword("Pass123!");
+            var userStore = new UserStore<User>(context);
+            var userManager = new UserManager<User>(userStore);

-            context.Users.AddOrUpdate(x => x.Email,
+            var users = new List<User>
+            {
                 new User
                 {
                     Email = "admin@eventer.com",
                     UserName = "admin",
-                    PasswordHash = password,
-                    SecurityStamp = Guid.NewGuid().ToString(),
+                    LockoutEnabled = true,
                     Events = new List<Event>
                     {
                         context.Events.FirstOrDefault(e => e.Title == "Tribe Ibiza")
                     }
                 }
-            );
+            };
+
+            foreach (var user in users)
+            {
+                if (userManager.FindByName(user.UserName) == null)
+                {
+                    userManager.Create(user, "Pass123!");
+                    userManager.SetLockoutEnabled(user.Id, false);
+                    userManager.AddToRole(user.Id, "User");
+                }
+
+            }
+
+            userManager.AddToRole(users.FirstOrDefault(x => x.UserName == "admin").Id, "Admin");
+
+            userStore.Context.SaveChanges();
         }
     }
 }


Fix a bug in CodeBlock.cs

Fix a bug in CodeBlock.cs

--- Flame.LLVM/Codegen/CodeBlock.cs
+++ Flame.LLVM/Codegen/CodeBlock.cs
@@ -63,7 +63,7 @@
         /// <summary>
         /// Tells if the codegen for this block produces a value.
         /// </summary>
-        public bool HasValue => Value.Pointer == IntPtr.Zero;
+        public bool HasValue => Value.Pointer != IntPtr.Zero;
     }

     /// <summary>


sizing

sizing

--- FoundationMM/Window.Designer.cs
+++ FoundationMM/Window.Designer.cs
@@ -435,7 +435,7 @@
             this.infobar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 72F));
             this.infobar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45F));
             this.infobar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 55F));
-            this.infobar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 128F));
+            this.infobar.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 129F));
             this.infobar.Controls.Add(this.infobarIcon, 0, 0);
             this.infobar.Controls.Add(this.infobarLPane, 1, 0);
             this.infobar.Controls.Add(this.infobarRPane, 2, 0);
@@ -467,7 +467,7 @@
             this.infobarLPane.Dock = System.Windows.Forms.DockStyle.Fill;
             this.infobarLPane.Location = new System.Drawing.Point(75, 3);
             this.infobarLPane.Name = "infobarLPane";
-            this.infobarLPane.Size = new System.Drawing.Size(184, 66);
+            this.infobarLPane.Size = new System.Drawing.Size(183, 66);
             this.infobarLPane.TabIndex = 1;
             //
             // infobarCredits
@@ -505,7 +505,7 @@
             //
             this.infobarRPane.Controls.Add(this.infobarDesc);
             this.infobarRPane.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.infobarRPane.Location = new System.Drawing.Point(265, 3);
+            this.infobarRPane.Location = new System.Drawing.Point(264, 3);
             this.infobarRPane.Name = "infobarRPane";
             this.infobarRPane.Size = new System.Drawing.Size(226, 66);
             this.infobarRPane.TabIndex = 2;
@@ -526,10 +526,10 @@
             // infobarImage
             //
             this.infobarImage.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.infobarImage.Location = new System.Drawing.Point(494, 0);
+            this.infobarImage.Location = new System.Drawing.Point(493, 0);
             this.infobarImage.Margin = new System.Windows.Forms.Padding(0);
             this.infobarImage.Name = "infobarImage";
-            this.infobarImage.Size = new System.Drawing.Size(129, 72);
+            this.infobarImage.Size = new System.Drawing.Size(130, 72);
             this.infobarImage.TabIndex = 3;
             this.infobarImage.MouseClick += new System.Windows.Forms.MouseEventHandler(this.infobarImage_MouseClick);
             //
@@ -607,7 +607,7 @@
             this.infobar2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 72F));
             this.infobar2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45F));
             this.infobar2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 55F));
-            this.infobar2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 128F));
+            this.infobar2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 129F));
             this.infobar2.Controls.Add(this.infobar2Icon, 0, 0);
             this.infobar2.Controls.Add(this.panel4, 1, 0);
             this.infobar2.Controls.Add(this.panel5, 2, 0);
@@ -639,7 +639,7 @@
             this.panel4.Dock = System.Windows.Forms.DockStyle.Fill;
             this.panel4.Location = new System.Drawing.Point(75, 3);
             this.panel4.Name = "panel4";
-            this.panel4.Size = new System.Drawing.Size(184, 66);
+            this.panel4.Size = new System.Drawing.Size(183, 66);
             this.panel4.TabIndex = 1;
             //
             // infobar2Credits
@@ -677,7 +677,7 @@
             //
             this.panel5.Controls.Add(this.infobar2Desc);
             this.panel5.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.panel5.Location = new System.Drawing.Point(265, 3);
+            this.panel5.Location = new System.Drawing.Point(264, 3);
             this.panel5.Name = "panel5";
             this.panel5.Size = new System.Drawing.Size(226, 66);
             this.panel5.TabIndex = 2;
@@ -698,10 +698,10 @@
             // infobar2Image
             //
             this.infobar2Image.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.infobar2Image.Location = new System.Drawing.Point(494, 0);
+            this.infobar2Image.Location = new System.Drawing.Point(493, 0);
             this.infobar2Image.Margin = new System.Windows.Forms.Padding(0);
             this.infobar2Image.Name = "infobar2Image";
-            this.infobar2Image.Size = new System.Drawing.Size(129, 72);
+            this.infobar2Image.Size = new System.Drawing.Size(130, 72);
             this.infobar2Image.TabIndex = 3;
             this.infobar2Image.MouseClick += new System.Windows.Forms.MouseEventHandler(this.infobar2Image_MouseClick);
             //
@@ -744,7 +744,7 @@
             this.Controls.Add(this.statusStrip1);
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
             this.Name = "Window";
-            this.Text = "Foundation Mod Manager for Halo Online";
+            this.Text = "Foundation Mod Manager v1.20 Infinity (for Halo Online)";
             this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Window_FormClosing);
             this.Load += new System.EventHandler(this.Window_Load);
             this.panel1.ResumeLayout(false);


Only create the dummy user when development mode is enabled

--- Rainy/Main.cs
+++ Rainy/Main.cs
@@ -227,7 +227,8 @@
 					return handler;
 				});
 */
-				AddDummyUserIfRequired (container);
+				if (config.Development == true)
+					AddDummyUserIfRequired (container);
 			}

 		}


Revert "Changed NetworkLevelLoader to be in line with new loading method."

This reverts commit d5cc286f19bed45735961790e42cb6fb719e5db6.

--- Framework/NetworkLevelLoader.cs
+++ Framework/NetworkLevelLoader.cs
@@ -1,6 +1,5 @@
 using UnityEngine;
 using UnityEngine.Networking;
-using UnityEngine.SceneManagement;

 public class NetworkLevelLoader : NetScript {
 	static int lastLevel = -108;
@@ -24,7 +23,7 @@

 	[RpcClients(qosType = QosType.ReliableSequenced)]
 	private void LoadLevel (int level) {
-		SceneManager.LoadScene(level);
+		Application.LoadLevel(level);
 	}

 	void OnLevelWasLoaded (int level) {


Added functions to help in reflection.

Added functions to help in reflection.

--HG--
extra : convert_revision : svn%3A0c8f8e23-1b2a-6648-8c08-788e51663503/trunk%4011

--- Reflection.cs
+++ Reflection.cs
@@ -487,6 +487,57 @@
                 PropertyType = PropertyInfo.PropertyType;
             }
             return PropertyType;
+        }
+
+        /// <summary>
+        /// Gets a property's parent object
+        /// </summary>
+        /// <param name="SourceObject">Source object</param>
+        /// <param name="PropertyPath">Path of the property (ex: Prop1.Prop2.Prop3 would be
+        /// the Prop1 of the source object, which then has a Prop2 on it, which in turn
+        /// has a Prop3 on it.)</param>
+        /// <param name="PropertyInfo">Property info that is sent back</param>
+        /// <returns>The property's parent object</returns>
+        public static object GetPropertyParent(object SourceObject, string PropertyPath, out PropertyInfo PropertyInfo)
+        {
+            if (SourceObject == null)
+            {
+                PropertyInfo = null;
+                return null;
+            }
+            string[] Splitter = { "." };
+            string[] SourceProperties = PropertyPath.Split(Splitter, StringSplitOptions.None);
+            object TempSourceProperty = SourceObject;
+            Type PropertyType = SourceObject.GetType();
+            PropertyInfo = PropertyType.GetProperty(SourceProperties[0]);
+            PropertyType = PropertyInfo.PropertyType;
+            for (int x = 1; x < SourceProperties.Length; ++x)
+            {
+                if (TempSourceProperty != null)
+                {
+                    TempSourceProperty = PropertyInfo.GetValue(TempSourceProperty, null);
+                }
+                PropertyInfo = PropertyType.GetProperty(SourceProperties[x]);
+                PropertyType = PropertyInfo.PropertyType;
+            }
+            return TempSourceProperty;
+        }
+
+        public static PropertyInfo GetProperty<Source>(string PropertyPath)
+        {
+            if (string.IsNullOrEmpty(PropertyPath))
+                return null;
+            string[] Splitter = { "." };
+            string[] SourceProperties = PropertyPath.Split(Splitter, StringSplitOptions.None);
+            Type PropertyType = typeof(Source);
+            PropertyInfo PropertyInfo= PropertyType.GetProperty(SourceProperties[0]);
+            PropertyType = PropertyInfo.PropertyType;
+            for (int x = 1; x < SourceProperties.Length; ++x)
+            {
+                PropertyInfo = PropertyType.GetProperty(SourceProperties[x]);
+                PropertyType = PropertyInfo.PropertyType;
+            }
+            return PropertyInfo;
         }

         #endregion


Skip 0 frametime draws

Skip 0 frametime draws

Closes #270

--- GUI/Controls/GLViewerControl.cs
+++ GUI/Controls/GLViewerControl.cs
@@ -234,24 +234,36 @@

         private void Draw()
         {
-            if (GLControl.Visible)
-            {
-                var frameTime = stopwatch.ElapsedMilliseconds / 1000f;
-                stopwatch.Restart();
-
-                Camera.Tick(frameTime);
-                Camera.HandleInput(Mouse.GetState(), Keyboard.GetState());
-
-                SetFps(1f / frameTime);
-
-                GL.ClearColor(Settings.BackgroundColor);
-                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
-
-                GLPaint?.Invoke(this, new RenderEventArgs { FrameTime = frameTime, Camera = Camera });
-
+            if (!GLControl.Visible)
+            {
+                return;
+            }
+
+            var elapsed = stopwatch.ElapsedMilliseconds;
+
+            if (elapsed < 1)
+            {
                 GLControl.SwapBuffers();
                 GLControl.Invalidate();
-            }
+
+                return;
+            }
+
+            var frameTime = elapsed / 1000f;
+            stopwatch.Restart();
+
+            Camera.Tick(frameTime);
+            Camera.HandleInput(Mouse.GetState(), Keyboard.GetState());
+
+            SetFps(1f / frameTime);
+
+            GL.ClearColor(Settings.BackgroundColor);
+            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
+
+            GLPaint?.Invoke(this, new RenderEventArgs { FrameTime = frameTime, Camera = Camera });
+
+            GLControl.SwapBuffers();
+            GLControl.Invalidate();
         }

         private void OnResize(object sender, EventArgs e)


Make menu more oop

Make menu more oop

--- Game/StopTheBunny/Logos/Menu.cs
+++ Game/StopTheBunny/Logos/Menu.cs
@@ -18,7 +18,8 @@
             this.logos.Add(new StartIcon());
             this.logos.Add(new GuideIcon());
             this.logos.Add(new ScoreIcon());
-            this.logos.Add(new EndIcon());
+            this.logos.Add(new EndIcon());
+            this.logos.Add(new GoodByeLogo());
             this.gameEngine = new GameEngine();
         }

@@ -70,7 +71,7 @@
                     ReadScores();
                     break;
                 case 3:
-                    //logos.Bye();
+                    logos.Last().Print();

                     Environment.Exit(1);
                     break;
@@ -95,16 +96,16 @@
                     break;
             }

-            foreach (var item in logos)
+            for (int index = 0; index < this.logos.Count - 1;index++ )
             {
-                if (item.IsSelected)
+                if (this.logos[index].IsSelected)
                 {
-                    item.PrintSelected();
-                    item.IsSelected = false;
+                    this.logos[index].PrintSelected();
+                    this.logos[index].IsSelected = false;
                 }
                 else
                 {
-                    item.Print();
+                    this.logos[index].Print();
                 }
             }


Fixed bug where combing states wasn't working properly if the screen was the current element.

--- Gum/ToolStates/SelectedState.cs
+++ Gum/ToolStates/SelectedState.cs
@@ -579,6 +579,11 @@

                 var currentGue = WireframeObjectManager.Self.GetSelectedRepresentation();

+                if(currentGue == null)
+                {
+                    currentGue = WireframeObjectManager.Self.RootGue;
+                }
+
                 if(currentGue != null)
                 {
                     // Applying a state just stacks it on top of the current


update versioning info

update versioning info

--- FireCrypt/FireCryptEx/Properties/AssemblyInfo.cs
+++ FireCrypt/FireCryptEx/Properties/AssemblyInfo.cs
@@ -57,6 +57,6 @@
 //
 // You can specify all the values or you can use the default the Revision and
 // Build Numbers by using the '*' as shown below:
-[assembly: AssemblyVersion ("2.2.3.*")]
-[assembly: AssemblyFileVersion ("2.2.3.*")]
+[assembly: AssemblyVersion ("3.0.*")]
+[assembly: AssemblyFileVersion ("3.0.*")]
 [assembly: Guid ("a4067db9-0cc6-4a55-b87a-04b56a603f49")]


remove DeviceTimestamp from SensorValues model

--- IoT-Core/Models/SensorValues.cs
+++ IoT-Core/Models/SensorValues.cs
@@ -12,7 +12,7 @@

         public DateTime Date { get; set; }

-        public int? DeviceTimestamp { get; set; }
+        //public int? DeviceTimestamp { get; set; }

         [Required]
         public float Temperature { get; set; }


Fixed a minor bug in AstGenerator.BuildVarAssign

--- IronJS/Compiler/AstGenerator.cs
+++ IronJS/Compiler/AstGenerator.cs
@@ -765,7 +765,7 @@

             for (int i = 0; i < node.ChildCount; ++i)
             {
-                var assignNode = Build(node.GetChildSafe(0));
+                var assignNode = Build(node.GetChildSafe(i));

                 if (assignNode is AssignNode)
                 {


Changes in certain methods

Changes in certain methods

--- ISAAR.MSolve.PreProcessor/Elements/Shell8disp.cs
+++ ISAAR.MSolve.PreProcessor/Elements/Shell8disp.cs
@@ -451,7 +451,7 @@

         private double[,] ll2;
         public static int endeixill2 = 1;
-        private double[,] Getll2() //meta apo enhmerwsh h initialize
+        private void Calculatell2() //meta apo enhmerwsh h initialize
         {
             if (endeixill2 == 1)
             {
@@ -463,7 +463,7 @@
                       ll2[3 * j + 2, k] = oVn_i[j][k];}}

                 endeixill2 = 2;
-                return ll2;
+                //return ll2;
             }
             else
             {
@@ -475,13 +475,13 @@
                         ll2[3 * j + 1, k] = tU[j][3 + k];
                     }
                 }
-                return ll2;
+                //return ll2;
             }
         }

         private double[][,] l_circumflex;
         public static int endeixil_circumflex = 1;
-        private double[][,] Getl_circumflex() //afou periexei getll2: meta apo enhmerwsh h initialize
+        private void Calculatel_circumflex() //afou periexei getll2: meta apo enhmerwsh h initialize
         {
             if (endeixil_circumflex == 1)
             {
@@ -498,7 +498,7 @@
                             l_circumflex[j][k, l] = 0;
                             for (int m = 0; m < 24; m++)
                             {
-                                l_circumflex[j][k, l] += Getll1()[j][k, m] * Getll2()[m, l];
+                                l_circumflex[j][k, l] += Getll1()[j][k, m] * ll2[m, l];
                             }

                         }
@@ -507,7 +507,7 @@

                 }
                 endeixil_circumflex = 2;
-                return l_circumflex;
+                //return l_circumflex;
             }
             else
             {
@@ -520,21 +520,21 @@
                             l_circumflex[j][k, l] = 0;
                             for (int m = 0; m < 24; m++)
                             {
-                                l_circumflex[j][k, l] += Getll1()[j][k, m] * Getll2()[m, l];
-                            }
-
-                        }
-
-                    }
-
-                }
-                return l_circumflex;
+                                l_circumflex[j][k, l] += Getll1()[j][k, m] * ll2[m, l];
+                            }
+
+                        }
+
+                    }
+
+                }
+                //return l_circumflex;
             }
         }

         private double[][,] BL11b;
         public static int endeixiBL11b = 1;
-        private double[][,] GetBL11b() //afou periexei Getl_circumflex:getll2: meta apo enhmerwsh h initialize
+        private void CalculateBL11b() //afou periexei Getl_circumflex:getll2: meta apo enhmerwsh h initialize
         {
              if (endeixiBL11b == 1)
              {
@@ -556,12 +556,12 @@
                          for (int l = 0; l< 3; l++)
                          {
                              for (int m = 0; m< 3; m++)
-                             { BL11b[j][3 * k + l, 3 * k + m] = Getl_circumflex()[j][l, m]; }
+                             { BL11b[j][3 * k + l, 3 * k + m] = l_circumflex[j][l, m]; }
                          }
                      }
                  }
                  endeixiBL11b = 2;
-                 return BL11b;
+                 //return BL11b;
              }
              else
              {
@@ -579,18 +579,18 @@
                         for (int l = 0; l < 3; l++)
                         {
                             for (int m = 0; m < 3; m++)
-                            { BL11b[j][3 * k + l, 3 * k + m] = Getl_circumflex()[j][l, m]; }
-                        }
-                    }
-                }
-                return BL11b;
+                            { BL11b[j][3 * k + l, 3 * k + m] = l_circumflex[j][l, m]; }
+                        }
+                    }
+                }
+                //return BL11b;
             }
          }

          private double[][,] BL11;
          public static int endeixiBL11 = 1;
-         private double[][,] GetBL11(Element element) //afou periexei BL11:Getl_circumflex:getll2: meta apo enhmerwsh h initialize
+         private void CalculateBL11(Element element) //afou periexei BL11:Getl_circumflex:getll2: meta apo enhmerwsh h initialize
          {
              if (endeixiBL11 == 1)
              {
@@ -607,13 +607,13 @@
                              BL11[j][k, l] = 0;
                              for (int m = 0; m< 9; m++)
                              {
-                                 BL11[j][k, l] += GetBL11a(element)[j][k, m] * GetBL11b()[j][m, l];
+                                 BL11[j][k, l] += GetBL11a(element)[j][k, m] * BL11b[j][m, l];
                              }
                          }
                      }
                  }
                  endeixiBL11 = 2;
-                 return BL11;
+                 //return BL11;
              }
              else
              {
@@ -626,12 +626,12 @@
                             BL11[j][k, l] = 0;
                             for (int m = 0; m < 9; m++)
                             {
-                                BL11[j][k, l] += GetBL11a(element)[j][k, m] * GetBL11b()[j][m, l];
-                            }
-                        }
-                    }
-                }
-                return BL11;
+                                BL11[j][k, l] += GetBL11a(element)[j][k, m] * BL11b[j][m, l];
+                            }
+                        }
+                    }
+                }
+                //return BL11;
              }
         }


Added null checks around getting Jira card type

Added null checks around getting card type method in JIRA integration to
fix issue, ZD 30396 Null ref exception in integration service when
creating cards with JIRA,
https://banditsoftware.leankit.com/Boards/View/304368449/305400991

--- IntegrationService.Targets.JIRA/JiraSubsystem.cs
+++ IntegrationService.Targets.JIRA/JiraSubsystem.cs
@@ -751,21 +751,19 @@
 				boardMapping.Types != null &&
 				boardMapping.ValidCardTypes != null &&
 				boardMapping.Types.Any() &&
-				boardMapping.ValidCardTypes.Any())
-			{
-				if (boardMapping.ValidCardTypes != null && boardMapping.ValidCardTypes.Any())
-				{
-					var lkType = boardMapping.ValidCardTypes.FirstOrDefault(x => x.Name.ToLowerInvariant() == cardType.ToLowerInvariant());
-					if (lkType != null)
-					{
-						// first check for mapped type
-						var mappedType = boardMapping.Types.FirstOrDefault(x => x.LeanKit.ToLowerInvariant() == lkType.Name.ToLowerInvariant());
-						if (mappedType != null)
-						{
-							return mappedType.Target;
-						}
-					}
-				}
+				boardMapping.ValidCardTypes.Any() &&
+				!string.IsNullOrEmpty(cardType))
+			{
+				var lkType = boardMapping.ValidCardTypes.FirstOrDefault(x => x != null && !string.IsNullOrEmpty(x.Name) && x.Name.ToLowerInvariant() == cardType.ToLowerInvariant());
+				if (lkType != null)
+				{
+					// first check for mapped type
+					var mappedType = boardMapping.Types.FirstOrDefault(x => x!= null && !string.IsNullOrEmpty(x.LeanKit) && x.LeanKit.ToLowerInvariant() == lkType.Name.ToLowerInvariant());
+					if (mappedType != null)
+					{
+						return mappedType.Target;
+					}
+				}
 			}
 			// else just default to Bug
 			return "Bug";


Added argument check in ld:asset() xslt extension

--- LBi.LostDoc/Templating/TemplateXsltExtensions.cs
+++ LBi.LostDoc/Templating/TemplateXsltExtensions.cs
@@ -148,6 +148,8 @@

         public string asset(string aid)
         {
+            if (string.IsNullOrWhiteSpace(aid))
+                throw new ArgumentException("Asset id cannot be empty.");
             AssetIdentifier ai = this.Parse(aid);
             return ai.AssetId;
         }


Created Html for sell/house

Created Html for sell/house

Sell/House html

--- LandsSystem/LandsSystem/Views/Sell/Houses.cshtml
+++ LandsSystem/LandsSystem/Views/Sell/Houses.cshtml
@@ -3,21 +3,139 @@
 @{
     ViewBag.Title = "Sell House";
 }
+
+
+
 @using (Html.BeginForm("Sell", "Houses", FormMethod.Post))
 {
-

-

-
Address

-        <input type="text" placeholder="Address" required>
+

+

+
Fill the information below:

+

+

+

+

+                    <form class="form-horizontal">

-
Price

-        <input type="text" placeholder="Price" required>
+

-
Year of built

-        <input type="text" placeholder="Year of build" required>
+
+                                Address
+
+

+                                <input type="text" class="form-control" placeholder="Address">
+

+

+

-

-        <input type="submit" value="Save house" />
+

+
+                                Price
+
+

+                                <input type="number" class="form-control" placeholder="Price">
+

+

+

+

+
+                                Year Of Build
+
+

+                                <input type="number" class="form-control" placeholder="Year Of Build">
+

+

+

+
+                                Land Area
+
+

+                                <input type="number" class="form-control" placeholder="Land Area">
+

+

+

+
+                                House Area
+
+

+                                <input type="number" class="form-control" placeholder="House Area">
+

+

+

+
+                                Floors
+
+

+                                <input type="number" class="form-control" placeholder="Floors">
+

+

+

+
+                                Bedrooms
+
+

+                                <input type="number" class="form-control" placeholder="Bedrooms">
+

+

+

+
+                                Living Rooms
+
+

+                                <input type="number" class="form-control" placeholder="Living Rooms">
+

+

+

+
+                                Bathrooms
+
+

+                                <input type="number" class="form-control" placeholder="Bathrooms">
+

+

+
+

+
+                                Park Slots
+
+

+                                <input type="number" class="form-control" placeholder="Park Slots">
+

+

+

+
+                                Image URL
+
+

+                                <input type="text" class="form-control" placeholder="URL">
+

+

+

+
+
+
+

+                                <input type="checkbox" name="personality"> Basement
+                                <input type="checkbox" name="personality"> Pool
+                                <input type="checkbox" name="personality"> Garage
+

+

+

+
+
+
+

+                                <button type="submit" class="btn btn-success">Submit</button>
+

+

+
+                    </form>
+

+
+

+

-}+
+
+}


Clean up a warning in code

Clean up a warning in code

--- AtlasWorkFlows/Utils/Config.cs
+++ AtlasWorkFlows/Utils/Config.cs
@@ -1,167 +1,165 @@
-using Microsoft.Win32;
-using Sprache;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-
-namespace AtlasWorkFlows.Utils
-{
-    /// <summary>
-    /// Build configuration for various things.
-    /// Eventually I hope most of this can be loaded dynamically. But for initial setup, this seems simplest.
-    /// </summary>
-    class Config
-    {
-        /// <summary>
-        /// Get the list of configurations
-        /// </summary>
-        /// <returns></returns>
-        public static Dictionary<string, Dictionary<string, string>> GetLocationConfigs()
-        {
-            var goodFile = GoodConfigFilesOfName("AtlasSSHConfig.txt").FirstOrDefault();
-
-            if (goodFile == null)
-            {
-                throw new FileNotFoundException(string.Format("Unable to find the file 'AtlasSSHConfig.txt' in the current directory, the Documents folder, or the root OneDrive folder! Without configuration we can't continue!"));
-            }
-
-            return ParseConfigFile(goodFile);
-        }
-
-        /// <summary>
-        /// Given a default filename, return all filenames that match in our
-        /// list of knonw locations.
-        /// </summary>
-        /// <param name="filename">The filename to search for</param>
-        /// <returns></returns>
-        public static FileInfo[] GoodConfigFilesOfName(string filename)
-        {
-            if(filename == null)
-            {
-                throw new ArgumentException("Parameter filename to GoodCOnfigFilesOfName can't be null.");
-            }
-
-            var files = GetFilesSafely("./", filename)
-                .Concat(GetFilesSafely(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)), filename))
-                .Concat(GetFilesSafely(Path.Combine(getOneDriveFolderPath()), filename))
-                .Concat(GetFilesSafely(Path.Combine(getOneDriveFolderPath(), ".AtlasSSH"), filename));
-
-            var goodFiles = files
-                .Where(f => f.Exists)
-                .ToArray();
-
-            return goodFiles;
-        }
-
-        /// <summary>
-        /// Returns a list of files in a directory that match a pattern. Safe even if directory
-        /// does not exist.
-        /// </summary>
-        /// <param name="directory"></param>
-        /// <param name="filename"></param>
-        /// <returns></returns>
-        private static FileInfo[] GetFilesSafely(string directory, string filename)
-        {
-            var di = new DirectoryInfo(directory);
-            if (!di.Exists)
-                return new FileInfo[0];
-            return di.GetFiles(filename);
-        }
-
-        #region Parsers
-
-        private static readonly Parser<string> Comment =
-            from c in ParseCharText('#')
-            from t in RestOfLine
-            select t;
-
-        private static readonly Parser<char> EndOfText =
-            Parse.LineTerminator.Or(Comment).Return(' ');
-
-        private static readonly Parser<string> Identifier =
-            Parse.Identifier(Parse.Letter, Parse.LetterOrDigit.Or(Parse.Char('_')));
-
-        private static readonly Parser<string> RestOfLine =
-            Parse.AnyChar.Until(EndOfText).Text();
-
-        private static Parser<char> ParseCharText (char c)
-        {
-            return from wh in Parse.WhiteSpace.Many()
-                   from cp in Parse.Char(c)
-                   select cp;
-        }
-
-        private static readonly Parser<System.Tuple<string, string, string>> Line
-            = from blankLines in EndOfText.Many().Optional()
-              from configName in Identifier
-              from dot1 in ParseCharText('.')
-              from parameter in Identifier
-              from dot2 in ParseCharText('=')
-              from value in RestOfLine
-              select Tuple.Create(configName, parameter, value.Trim());
-
-        private static readonly Parser<IEnumerable<Tuple<string, string, string>>> File
-            = Line.Many();
-
-        #endregion
-
-        /// <summary>
-        /// Parse a configuration text file.
-        /// </summary>
-        /// <param name="f"></param>
-        /// <returns></returns>
-        internal static Dictionary<string, Dictionary<string, string>> ParseConfigFile(System.IO.FileInfo f)
-        {
-            using (var rd = f.OpenText())
-            {
-                var input = rd.ReadToEnd();
-                var results = File.Parse(input);
-
-                var r = new Dictionary<string, Dictionary<string, string>>();
-                foreach (var t in results)
-                {
-                    if (!r.ContainsKey(t.Item1))
-                    {
-                        r[t.Item1] = new Dictionary<string, string>();
-                    }
-                    r[t.Item1][t.Item2] = t.Item3;
-                }
-
-                return r;
-            }
-        }
-
-        /// <summary>
-        /// Return the path of the OneDrive folder on this machine.
-        /// </summary>
-        /// <returns></returns>
-        private static string getOneDriveFolderPath()
-        {
-            var value1 = Registry.GetValue(
-                @"HKEY_CURRENT_USER\Software\Microsoft\SkyDrive",
-                @"UserFolder", null);
-
-            var path1 = value1 as string;
-            if (path1 != null && Directory.Exists(path1)) return path1;
-
-            var value2 = Registry.GetValue(
-                @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SkyDrive",
-                @"UserFolder", null);
-
-            var path2 = value2 as string;
-            if (path2 != null && Directory.Exists(path2)) return path2;
-
-            var value3 = Registry.GetValue(
-                @"HKEY_CURRENT_USER\Software\Microsoft\OneDrive",
-                @"UserFolder", null);
-
-            var path3 = value3 as string;
-            if (path3 != null && Directory.Exists(path3)) return path3;
-
-            throw new InvalidOperationException("Onedrive is not setup on this machine. I cannot determine the onedrive path.");
-
-            return null;
-        }
-    }
-}
+using Microsoft.Win32;
+using Sprache;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace AtlasWorkFlows.Utils
+{
+    /// <summary>
+    /// Build configuration for various things.
+    /// Eventually I hope most of this can be loaded dynamically. But for initial setup, this seems simplest.
+    /// </summary>
+    class Config
+    {
+        /// <summary>
+        /// Get the list of configurations
+        /// </summary>
+        /// <returns></returns>
+        public static Dictionary<string, Dictionary<string, string>> GetLocationConfigs()
+        {
+            var goodFile = GoodConfigFilesOfName("AtlasSSHConfig.txt").FirstOrDefault();
+
+            if (goodFile == null)
+            {
+                throw new FileNotFoundException(string.Format("Unable to find the file 'AtlasSSHConfig.txt' in the current directory, the Documents folder, or the root OneDrive folder! Without configuration we can't continue!"));
+            }
+
+            return ParseConfigFile(goodFile);
+        }
+
+        /// <summary>
+        /// Given a default filename, return all filenames that match in our
+        /// list of knonw locations.
+        /// </summary>
+        /// <param name="filename">The filename to search for</param>
+        /// <returns></returns>
+        public static FileInfo[] GoodConfigFilesOfName(string filename)
+        {
+            if(filename == null)
+            {
+                throw new ArgumentException("Parameter filename to GoodCOnfigFilesOfName can't be null.");
+            }
+
+            var files = GetFilesSafely("./", filename)
+                .Concat(GetFilesSafely(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)), filename))
+                .Concat(GetFilesSafely(Path.Combine(getOneDriveFolderPath()), filename))
+                .Concat(GetFilesSafely(Path.Combine(getOneDriveFolderPath(), ".AtlasSSH"), filename));
+
+            var goodFiles = files
+                .Where(f => f.Exists)
+                .ToArray();
+
+            return goodFiles;
+        }
+
+        /// <summary>
+        /// Returns a list of files in a directory that match a pattern. Safe even if directory
+        /// does not exist.
+        /// </summary>
+        /// <param name="directory"></param>
+        /// <param name="filename"></param>
+        /// <returns></returns>
+        private static FileInfo[] GetFilesSafely(string directory, string filename)
+        {
+            var di = new DirectoryInfo(directory);
+            if (!di.Exists)
+                return new FileInfo[0];
+            return di.GetFiles(filename);
+        }
+
+        #region Parsers
+
+        private static readonly Parser<string> Comment =
+            from c in ParseCharText('#')
+            from t in RestOfLine
+            select t;
+
+        private static readonly Parser<char> EndOfText =
+            Parse.LineTerminator.Or(Comment).Return(' ');
+
+        private static readonly Parser<string> Identifier =
+            Parse.Identifier(Parse.Letter, Parse.LetterOrDigit.Or(Parse.Char('_')));
+
+        private static readonly Parser<string> RestOfLine =
+            Parse.AnyChar.Until(EndOfText).Text();
+
+        private static Parser<char> ParseCharText (char c)
+        {
+            return from wh in Parse.WhiteSpace.Many()
+                   from cp in Parse.Char(c)
+                   select cp;
+        }
+
+        private static readonly Parser<System.Tuple<string, string, string>> Line
+            = from blankLines in EndOfText.Many().Optional()
+              from configName in Identifier
+              from dot1 in ParseCharText('.')
+              from parameter in Identifier
+              from dot2 in ParseCharText('=')
+              from value in RestOfLine
+              select Tuple.Create(configName, parameter, value.Trim());
+
+        private static readonly Parser<IEnumerable<Tuple<string, string, string>>> File
+            = Line.Many();
+
+        #endregion
+
+        /// <summary>
+        /// Parse a configuration text file.
+        /// </summary>
+        /// <param name="f"></param>
+        /// <returns></returns>
+        internal static Dictionary<string, Dictionary<string, string>> ParseConfigFile(System.IO.FileInfo f)
+        {
+            using (var rd = f.OpenText())
+            {
+                var input = rd.ReadToEnd();
+                var results = File.Parse(input);
+
+                var r = new Dictionary<string, Dictionary<string, string>>();
+                foreach (var t in results)
+                {
+                    if (!r.ContainsKey(t.Item1))
+                    {
+                        r[t.Item1] = new Dictionary<string, string>();
+                    }
+                    r[t.Item1][t.Item2] = t.Item3;
+                }
+
+                return r;
+            }
+        }
+
+        /// <summary>
+        /// Return the path of the OneDrive folder on this machine.
+        /// </summary>
+        /// <returns></returns>
+        private static string getOneDriveFolderPath()
+        {
+            var value1 = Registry.GetValue(
+                @"HKEY_CURRENT_USER\Software\Microsoft\SkyDrive",
+                @"UserFolder", null);
+
+            var path1 = value1 as string;
+            if (path1 != null && Directory.Exists(path1)) return path1;
+
+            var value2 = Registry.GetValue(
+                @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SkyDrive",
+                @"UserFolder", null);
+
+            var path2 = value2 as string;
+            if (path2 != null && Directory.Exists(path2)) return path2;
+
+            var value3 = Registry.GetValue(
+                @"HKEY_CURRENT_USER\Software\Microsoft\OneDrive",
+                @"UserFolder", null);
+
+            var path3 = value3 as string;
+            if (path3 != null && Directory.Exists(path3)) return path3;
+
+            throw new InvalidOperationException("Onedrive is not setup on this machine. I cannot determine the onedrive path.");
+        }
+    }
+}


changing member variables around again

changing member variables around again

--- ComicBrowser/cbxml.cs
+++ ComicBrowser/cbxml.cs
@@ -9,7 +9,7 @@
     {
         private const string CBXML_EXTENSION = ".xml";

-        private readonly string directory;
+        private readonly string file;
          //file name relative to directory, comic
         private readonly Dictionary<string, Comic> comics;
                                   //folder, child xml
@@ -24,7 +24,7 @@
                 throw new FileNotFoundException(String.Format("{0} is not a file!", file));
             }

-            directory = new FileInfo(file).Directory.FullName;
+            this.file = file;

             if (isNewFile)
             {
@@ -44,7 +44,7 @@

             printComics();
             loadNewFiles();
-            Save(file);
+            Save();
         }

         private Dictionary<string, Comic> read(XmlDocument xml)
@@ -96,11 +96,12 @@

         private void loadNewFiles()
         {
+            string directory = new FileInfo(file).Directory.FullName;
             string[] files = Directory.GetFiles(directory);

-            foreach(string file in files)
+            foreach(string f in files)
             {
-                string fileName = Path.GetFileName(file);
+                string fileName = Path.GetFileName(f);

                 if (!ComicFileTypeExtensions.Matches(fileName) || comics.ContainsKey(fileName))
                 {
@@ -110,7 +111,7 @@
             }
         }

-        public void Save(string file)
+        public void Save()
         {
             using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
             {


Incremented version number...

Incremented version number...

--- CommonAssemblyInfo.cs
+++ CommonAssemblyInfo.cs
@@ -14,5 +14,5 @@
 [assembly: ComVisible(false)]
 [assembly: CLSCompliant(true)]

-[assembly: AssemblyVersion("0.1.0.34")]
-[assembly: AssemblyFileVersion("0.1.0.34")]+[assembly: AssemblyVersion("0.1.0.35")]
+[assembly: AssemblyFileVersion("0.1.0.35")]


Version 0.1.4.2

Version 0.1.4.2

--- CommonAssemblyInfo.cs
+++ CommonAssemblyInfo.cs
@@ -19,5 +19,5 @@
 // COM, set the ComVisible attribute to true on that type.
 [assembly: ComVisible(false)]

-[assembly: AssemblyVersion("0.1.4.1")]
-[assembly: AssemblyFileVersion("0.1.4.1")]
+[assembly: AssemblyVersion("0.1.4.2")]
+[assembly: AssemblyFileVersion("0.1.4.2")]


Version 0.5.6

Version 0.5.6

--- CommonAssemblyInfo.cs
+++ CommonAssemblyInfo.cs
@@ -19,5 +19,5 @@
 // COM, set the ComVisible attribute to true on that type.
 [assembly: ComVisible(false)]

-[assembly: AssemblyVersion("0.5.5.1")]
-[assembly: AssemblyFileVersion("0.5.5.1")]
+[assembly: AssemblyVersion("0.5.6.0")]
+[assembly: AssemblyFileVersion("0.5.6.0")]


Add more typeex

Add more typeex

--- Buch.Net.Common/GenericUtil.cs
+++ Buch.Net.Common/GenericUtil.cs
@@ -1,9 +1,8 @@
 using System;
 using System.Collections.Generic;
 using System.Globalization;
+using JetBrains.Annotations;
 using System.Linq;
-using System.Text;
-using JetBrains.Annotations;

 namespace Buch.Net.Common
 {
@@ -119,7 +118,7 @@
     /// <summary>
     /// Class for Type extention methods
     /// </summary>
-    public static class TypeExt
+    public static class TypeEx
     {
         /// <summary>
         /// Checks to see a type is a Nullable type
@@ -132,12 +131,55 @@

             return (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
         }
+
+        /// <summary>
+        /// Determine whether a type is simple (String, Decimal, DateTime, etc)
+        /// or complex (i.e. custom class with public properties and methods).
+        /// </summary>
+        /// <see cref="http://stackoverflow.com/questions/2442534/how-to-test-if-type-is-primitive"/>
+        /// <see cref="https://gist.github.com/jonathanconway/3330614"/>
+        public static bool IsSimpleType([NotNull] this Type type)
+        {
+            Validate.ArgumentNotNull(type, "type");
+
+            return
+                type.IsValueType ||
+                type.IsPrimitive ||
+                new Type[]
+                {
+                    typeof (String),
+                    typeof (Decimal),
+                    typeof (DateTime),
+                    typeof (DateTimeOffset),
+                    typeof (TimeSpan),
+                    typeof (Guid),
+                }.Contains(type) ||
+                Convert.GetTypeCode(type) != TypeCode.Object;
+        }
+
+        /// <summary>
+        /// Determine whether a type is some time value type
+        /// (Time values are DateTime, DateTimeOffset, TimeSpan)
+        /// </summary>
+        /// <param name="type">The type to examine</param>
+        /// <returns>true if type is a time value type</returns>
+        public static bool IsTimeType([NotNull] this Type type)
+        {
+            Validate.ArgumentNotNull(type, "type");
+
+            return new Type[]
+            {
+                typeof (DateTime),
+                typeof (DateTimeOffset),
+                typeof (TimeSpan)
+            }.Contains(type);
+        }
     }

     /// <summary>
     /// Class extention for objects
     /// </summary>
-    public static class ObjectExt
+    public static class ObjectEx
     {
         /// <summary>
         /// Checks if an object is null or its value is zero
@@ -214,4 +256,19 @@
             return (val is double) ? (double) val : val.ConvertTo<double>();
         }
     }
+
+    public static class DateEx
+    {
+        private static readonly List<DayOfWeek> Weekend = new List<DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday };
+
+        public static bool IsWeekend(this DateTime date)
+        {
+            return Weekend.Contains(date.DayOfWeek);
+        }
+
+        public static bool IsWeekday(this DateTime date)
+        {
+            return !date.IsWeekend();
+        }
+    }
 }


Bump commit

Bump commit

--- XPlat/ExposureNotification/build.cake
+++ XPlat/ExposureNotification/build.cake
@@ -1,6 +1,6 @@
 var TARGET = Argument("t", Argument("target", "ci"));

-var SRC_COMMIT = "b3ce14af8949829463f07c667125fca024661f36";
+var SRC_COMMIT = "150b9a89553ddef9ef146d5cf51efff31af35404";
 var SRC_URL = $"https://github.com/xamarin/xamarin.exposurenotification/archive/{SRC_COMMIT}.zip";

 var OUTPUT_PATH = (DirectoryPath)"./output/";


Ensure view overlay is added to ContentViewController before showing

--- Xamarin-Sidebar/SidebarContentArea.cs
+++ Xamarin-Sidebar/SidebarContentArea.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Drawing;
+using System.Linq;

 #if __UNIFIED__
 using UIKit;
@@ -54,6 +55,9 @@

 		public void ShowDarkOverlay(float darkOverlayAlpha)
 		{
+			if(!ContentViewController.View.Subviews.Contains(_viewOverlay))
+				ContentViewController.View.AddSubview(_viewOverlay);
+
 			_viewOverlay.Alpha = darkOverlayAlpha;
 		}


[MAC] set parent window in AlertDialogBackend

--- Xwt.Mac/Xwt.Mac/AlertDialogBackend.cs
+++ Xwt.Mac/Xwt.Mac/AlertDialogBackend.cs
@@ -72,6 +72,9 @@
 				this.AddButton (message.Buttons [i].Label);
 			}

+			var win = (WindowBackend)Toolkit.GetBackend (transientFor);
+			if (win != null)
+				return sortedButtons [this.RunSheetModal (win) - 1000];
 			return sortedButtons [this.RunModal () - 1000];
 		}


Add property InvertRepeatAsFloat

Add property InvertRepeatAsFloat

--- CyclesTextureImage.cs
+++ CyclesTextureImage.cs
@@ -57,6 +57,7 @@
 		public TextureEnvironmentMappingMode EnvProjectionMode { get; set; }

 		public bool Repeat { get; set; }
+		public float InvertRepeatAsFloat => Repeat ? 0.0f : 1.0f;
 		public float RepeatAsFloat => Repeat ? 1.0f : 0.0f;

 		public CyclesTextureImage()


Replace encounter title with current boss name

--- CactbotOverlay/FightTracker.cs
+++ CactbotOverlay/FightTracker.cs
@@ -7,6 +7,8 @@
   interface ZoneFightListener {
     void OnLogsChanged(JSEvents.LogEvent e);
     void OnPartyWipe(JSEvents.PartyWipeEvent e);
+    // If non-null, replaces the title of the current encounter.
+    string GetEncounterName();
   }

   public class BossFightPhaseDetails {
@@ -51,6 +53,12 @@
       EndFight();
     }

+    public string GetEncounterName() {
+      if (current_boss_ == null)
+        return null;
+      return current_boss_.boss_id;
+    }
+
     private void StartFight(BossFightPhaseDetails boss) {
       if (current_boss_ != null) {
         EndFight();
@@ -114,6 +122,8 @@
     }

     public void OnPartyWipe(JSEvents.PartyWipeEvent e) {}
+
+    public string GetEncounterName() { return null; }
   }

   public class FightTracker {
@@ -335,6 +345,13 @@
           LogInfo("Argument exception: " + e.ToString());
         }
       }
+
+      // Clobber current title with the boss name.
+      string title = zone_listener_.GetEncounterName();
+      if (title != null) {
+        dict["title"] = title;
+      }
+
       return dict;
     }


Actually the event is necessary

Actually the event is necessary

--- WinMDTypes.cs
+++ WinMDTypes.cs
@@ -11,6 +11,7 @@
     {
         static WinMDTypes()
         {
+            AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve;
             WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve += WindowsRuntimeMetadata_ReflectionOnlyNamespaceResolve;
         }

@@ -21,6 +22,11 @@
                     .FirstOrDefault();

             e.ResolvedAssemblies.Add(Assembly.ReflectionOnlyLoadFrom(path));
+        }
+
+        private static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
+        {
+            return Assembly.ReflectionOnlyLoad(args.Name);
         }

         private List<Type> types;


Added missing #endif due to merge

Added missing #endif due to merge

--- Commands/Base/ConnectOnline.cs
+++ Commands/Base/ConnectOnline.cs
@@ -100,6 +100,7 @@
         Code = "PS:> Connect-PnPOnline -Url https://contoso.sharepoint.com -ClientId '<id>' -Tenant 'contoso.onmicrosoft.com' -PEMCertificate <PEM string> -PEMPrivateKey <PEM string>",
         Remarks = "Connects to SharePoint using app-only tokens via an app's declared permission scopes. See https://github.com/SharePoint/PnP-PowerShell/tree/master/Samples/SharePoint.ConnectUsingAppPermissions for a sample on how to get started.",
         SortOrder = 15)]
+#endif
 #if ONPREMISES
     [CmdletExample(
         Code = @"PS:> Connect-PnPOnline -Url https://yourserver -ClientId 763d5e60-b57e-426e-8e87-b7258f7f8188 -HighTrustCertificatePath c:\HighTrust.pfx -HighTrustCertificatePassword 'password' -HighTrustCertificateIssuerId 6b9534d8-c2c1-49d6-9f4b-cd415620bca8",


try to fix !warn list for some users

try to fix !warn list for some users

--- CompatBot/Commands/Warnings.cs
+++ CompatBot/Commands/Warnings.cs
@@ -135,48 +135,59 @@
         //note: be sure to pass a sanitized userName
         private static async Task ListUserWarningsAsync(DiscordClient client, DiscordMessage message, ulong userId, string userName, bool skipIfOne = true)
         {
-            var channel = message.Channel;
-            int count;
-            using (var db = new BotDb())
-                count = await db.Warning.CountAsync(w => w.DiscordId == userId).ConfigureAwait(false);
-            if (count == 0)
+            try
             {
-                await message.RespondAsync(userName + " has no warnings, is a standup citizen, and a pillar of this community").ConfigureAwait(false);
-                return;
+                var channel = message.Channel;
+                int count;
+                using (var db = new BotDb())
+                    count = await db.Warning.CountAsync(w => w.DiscordId == userId).ConfigureAwait(false);
+                if (count == 0)
+                {
+                    await message.RespondAsync(userName + " has no warnings, is a standup citizen, and a pillar of this community").ConfigureAwait(false);
+                    return;
+                }
+
+                if (count == 1 && skipIfOne)
+                    return;
+
+                const int maxWarningsInPublicChannel = 3;
+                var isPrivate = channel.IsPrivate;
+                var isWhitelisted = client.GetMember(message.Author)?.IsWhitelisted() ?? false;
+                using (var db = new BotDb())
+                {
+                    var totalWarningCount = db.Warning.Count(w => w.DiscordId == userId);
+                    var showCount = Math.Min(maxWarningsInPublicChannel, totalWarningCount);
+                    var result = new StringBuilder("Warning list for ").Append(userName);
+                    if (!isPrivate && !isWhitelisted && totalWarningCount > maxWarningsInPublicChannel)
+                        result.Append($" (last {showCount} of {totalWarningCount}, full list in DMs)");
+                    result.AppendLine(":").AppendLine("```");
+                    var header = $"{"ID",-5} | {"Issued by",-15} | {"On date (UTC)",-20} | Reason";
+                    if (isPrivate)
+                        header += "          | Full reason";
+                    result.AppendLine(header)
+                        .AppendLine("".PadLeft(header.Length, '-'));
+                    IQueryable<Warning> query = db.Warning.Where(w => w.DiscordId == userId).OrderByDescending(w => w.Id);
+                    if (!isPrivate && !isWhitelisted)
+                        query = query.Take(maxWarningsInPublicChannel);
+                    foreach (var warning in await query.ToListAsync().ConfigureAwait(false))
+                    {
+                        var issuerName = warning.IssuerId == 0
+                            ? ""
+                            : await client.GetUserNameAsync(channel, warning.IssuerId, isPrivate, "unknown mod").ConfigureAwait(false);
+                        var timestamp = warning.Timestamp.HasValue
+                            ? new DateTime(warning.Timestamp.Value, DateTimeKind.Utc).ToString("u")
+                            : null;
+                        result.Append($"{warning.Id:00000} | {issuerName,-15} | {timestamp,-20} | {warning.Reason}");
+                        if (isPrivate)
+                            result.Append(" | ").Append(warning.FullReason);
+                        result.AppendLine();
+                    }
+                    await channel.SendAutosplitMessageAsync(result.Append("```")).ConfigureAwait(false);
+                }
             }
-
-            if (count == 1 && skipIfOne)
-                return;
-
-            const int maxWarningsInPublicChannel = 3;
-            var isPrivate = channel.IsPrivate;
-            var isWhitelisted = client.GetMember(message.Author).IsWhitelisted();
-            using (var db = new BotDb())
+            catch (Exception e)
             {
-                var totalWarningCount = db.Warning.Count(w => w.DiscordId == userId);
-                var showCount = Math.Min(maxWarningsInPublicChannel, totalWarningCount);
-                var result = new StringBuilder("Warning list for ").Append(userName);
-                if (!isPrivate && !isWhitelisted && totalWarningCount > maxWarningsInPublicChannel)
-                    result.Append($" (last {showCount} of {totalWarningCount}, full list in DMs)");
-                result.AppendLine(":").AppendLine("```");
-                var header = $"{"ID",-5} | {"Issued by",-15} | {"On date (UTC)",-20} | Reason";
-                if (isPrivate)
-                    header += "          | Full reason";
-                result.AppendLine(header)
-                    .AppendLine("".PadLeft(header.Length, '-'));
-                IQueryable<Warning> query = db.Warning.Where(w => w.DiscordId == userId).OrderByDescending(w => w.Id);
-                if (!isPrivate && !isWhitelisted)
-                    query = query.Take(maxWarningsInPublicChannel);
-                foreach (var warning in query)
-                {
-                    var issuerName = warning.IssuerId == 0 ? "" : await client.GetUserNameAsync(channel, warning.IssuerId, isPrivate, "unknown mod").ConfigureAwait(false);
-                    var timestamp = warning.Timestamp.HasValue ? new DateTime(warning.Timestamp.Value, DateTimeKind.Utc).ToString("u") : null;
-                    result.Append($"{warning.Id:00000} | {issuerName,-15} | {timestamp,-20} | {warning.Reason}");
-                    if (isPrivate)
-                        result.Append(" | ").Append(warning.FullReason);
-                    result.AppendLine();
-                }
-                await channel.SendAutosplitMessageAsync(result.Append("```")).ConfigureAwait(false);
+                Config.Log.Warn(e);
             }
         }
     }


Fix only after parsing cells when pasting

--- LiveSplit/LiveSplit.View/View/RunEditorDialog.cs
+++ LiveSplit/LiveSplit.View/View/RunEditorDialog.cs
@@ -438,7 +438,7 @@

         void runGrid_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
         {
-            var parsingResults = ParseCell(e.Value, e.RowIndex, e.ColumnIndex);
+            var parsingResults = ParseCell(e.Value, e.RowIndex, e.ColumnIndex, true);
             if (parsingResults.Parsed)
             {
                 e.ParsingApplied = true;
@@ -448,7 +448,7 @@
                 e.ParsingApplied = false;
         }

-        private ParsingResults ParseCell(object value, int rowIndex, int columnIndex)
+        private ParsingResults ParseCell(object value, int rowIndex, int columnIndex, bool shouldFix)
         {
             if (columnIndex == SEGMENTNAMEINDEX)
             {
@@ -475,7 +475,8 @@
                 if (columnIndex == SEGMENTTIMEINDEX)
                 {
                     SegmentTimeList[rowIndex] = null;
-                    FixSplitsFromSegments();
+                    if (shouldFix)
+                        FixSplitsFromSegments();
                 }
                 if (columnIndex >= CUSTOMCOMPARISONSINDEX)
                 {
@@ -483,7 +484,8 @@
                     time[SelectedMethod] = null;
                     Run[rowIndex].Comparisons[runGrid.Columns[columnIndex].Name] = time;
                 }
-                Fix();
+                if (shouldFix)
+                    Fix();
                 TimesModified();
                 return new ParsingResults(true, value);
             }
@@ -494,7 +496,8 @@
                 if (columnIndex == SEGMENTTIMEINDEX)
                 {
                     SegmentTimeList[rowIndex] = (TimeSpan)value;
-                    FixSplitsFromSegments();
+                    if (shouldFix)
+                        FixSplitsFromSegments();
                 }
                 if (columnIndex >= CUSTOMCOMPARISONSINDEX)
                 {
@@ -514,7 +517,8 @@
                     time[SelectedMethod] = (TimeSpan)value;
                     Run[rowIndex].BestSegmentTime = time;
                 }
-                Fix();
+                if (shouldFix)
+                    Fix();
                 TimesModified();
                 return new ParsingResults(true, value);
             }
@@ -864,28 +868,39 @@
                 char[] rowSplitter = { '\n' };
                 char[] columnSplitter = { '\t' };

-                IDataObject dataInClipboard = Clipboard.GetDataObject();
-                string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);
+                var dataInClipboard = Clipboard.GetDataObject();
+                var stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);

                 if (stringInClipboard != null && runGrid.SelectedCells.Count > 0)
                 {
-                    string[] rowsInClipboard = stringInClipboard.Replace("\r\n", "\n").Split(rowSplitter);
-
-                    int r = runGrid.SelectedCells[0].RowIndex;
-                    int c = runGrid.SelectedCells[0].ColumnIndex;
+                    var rowsInClipboard = stringInClipboard.Replace("\r\n", "\n").Split(rowSplitter);
+
+                    var r = runGrid.SelectedCells[0].RowIndex;
+                    var c = runGrid.SelectedCells[0].ColumnIndex;

                     var maxRow = Math.Min(rowsInClipboard.Length, runGrid.RowCount - r);

-                    for (int iRow = 0; iRow < maxRow; iRow++)
-                    {
-                        string[] valuesInRow = rowsInClipboard[iRow].Split(columnSplitter);
-
-                        for (int iCol = valuesInRow.Length - 1; iCol >= 0; iCol--)
-                        {
-                            if (runGrid.ColumnCount - 1 >= c + iCol)
+                    var splitsChanged = false;
+                    var segmentsChanged = false;
+                    var shouldFix = false;
+
+                    for (int iRow = r; iRow < r + maxRow; iRow++)
+                    {
+                        string[] valuesInRow = rowsInClipboard[iRow - r].Split(columnSplitter);
+
+                        for (int iCol = c; iCol < c + valuesInRow.Length; iCol++)
+                        {
+                            if (runGrid.ColumnCount - 1 >= iCol)
                             {
-                                var cell = runGrid.Rows[r + iRow].Cells[c + iCol];
-                                var parsingResults = ParseCell(valuesInRow[iCol], r + iRow, c + iCol);
+                                if (iCol == SEGMENTTIMEINDEX)
+                                    segmentsChanged = true;
+                                else if (iCol == SPLITTIMEINDEX)
+                                    splitsChanged = true;
+                                if (iCol != SEGMENTNAMEINDEX)
+                                    shouldFix = true;
+
+                                var cell = runGrid.Rows[iRow].Cells[iCol];
+                                var parsingResults = ParseCell(valuesInRow[iCol - c], iRow, iCol, false);
                                 if (parsingResults.Parsed)
                                 {
                                     cell.Value = parsingResults.Value;
@@ -893,6 +908,13 @@
                                 }
                             }
                         }
+                    }
+
+                    if (shouldFix)
+                    {
+                        if (segmentsChanged && !splitsChanged)
+                            FixSplitsFromSegments();
+                        Fix();
                     }
                 }
             }


Made test more specific (so generated Demo project will run tests correctly)

--- Lucid.Web.Tests/ProjectCreation/GenerateTests.cs
+++ Lucid.Web.Tests/ProjectCreation/GenerateTests.cs
@@ -75,7 +75,7 @@
                         if (knownGeneratedFiles.Contains(expectedFile))
                             continue;

-                        expectedFile.ToLower().Should().NotContain("lucid", "file should have been renamed");
+                        expectedFile.ToLower().Should().NotEndWith("\\lucid.js", "file should have been renamed");

                         zippedFiles.Should().Contain(expectedFile,
                             "file {0} was referenced by project {1}", file, csproj.Name);


updated assembly info

updated assembly info

--- MarcelJoachimKloubert/Properties/AssemblyInfo.cs
+++ MarcelJoachimKloubert/Properties/AssemblyInfo.cs
@@ -1,36 +1,47 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
+/**********************************************************************************************************************
+ * IO.NET (https://github.com/mkloubert/IO.NET)                                                                       *
+ *                                                                                *
+ * Copyright (c) 2015, Marcel Joachim Kloubert <marcel.kloubert@gmx.net>                                              *
+ * All rights reserved.                                                                                *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the   *
+ * following conditions are met:                                                                                *
+ *                                                                                *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the          *
+ *    following disclaimer.                                                                                *
+ *                                                                                *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the       *
+ *    following disclaimer in the documentation and/or other materials provided with the distribution.                *
+ *                                                                                *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote    *
+ *    products derived from this software without specific prior written permission.                                  *
+ *                                                                                *
+ *                                                                                *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR    *
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  *
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE   *
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                           *
+ *                                                                                *
+ **********************************************************************************************************************/
+
+using System.Reflection;
 using System.Runtime.InteropServices;

-// Allgemeine Informationen über eine Assembly werden über die folgenden
-// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
-// die mit einer Assembly verknüpft sind.
-[assembly: AssemblyTitle("MarcelJoachimKloubert")]
-[assembly: AssemblyDescription("")]
+[assembly: AssemblyTitle("IO.NET")]
+[assembly: AssemblyDescription("Helper classes for I/O operations.")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("MarcelJoachimKloubert")]
-[assembly: AssemblyCopyright("Copyright ©  2015")]
+[assembly: AssemblyCompany("Marcel Joachim Kloubert")]
+[assembly: AssemblyProduct("IO.NET")]
+[assembly: AssemblyCopyright("Copyright © 2015  Marcel Joachim Kloubert")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

-// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
-// für COM-Komponenten.  Wenn Sie auf einen Typ in dieser Assembly von
-// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
 [assembly: ComVisible(false)]

-// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
 [assembly: Guid("524cf10d-ac39-4e26-92e7-e9af50ce9068")]

-// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
-//
-//      Hauptversion
-//      Nebenversion
-//      Buildnummer
-//      Revision
-//
-// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
-// übernehmen, indem Sie "*" eingeben:
-// [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("1.0.0.0")]
 [assembly: AssemblyFileVersion("1.0.0.0")]


Added mock data for GetGroups method

Added mock data for GetGroups method

--- MeetupManager.Portable/Mock/MeetupServiceMock.cs
+++ MeetupManager.Portable/Mock/MeetupServiceMock.cs
@@ -103,9 +103,23 @@
             return events;
         }

-        public Task<GroupsRootObject> GetGroups(string memberId, int skip)
+        public async Task<GroupsRootObject> GetGroups(string memberId, int skip)
         {
-            throw new NotImplementedException();
+            var groups = new GroupsRootObject();
+            groups.Meta = new Meta();
+            groups.Groups = new List<Group>();
+
+            for (int i = 0; i < 14; i++)
+            {
+                groups.Groups.Add(new Group
+                    {
+                        Id = i,
+                        Name = "Mock group " + i,
+                        GroupPhoto = new GroupPhoto { PhotoLink = "http://photos1.meetupstatic.com/photos/event/3/b/6/2/global_318975202.jpeg", PhotoId = 1 }
+                    });
+            }
+
+            return groups;
         }
     }
 }


ok chưa pho

ok chưa pho

--- MomWorld/Views/NineMonthArticles/Timeline.cshtml
+++ MomWorld/Views/NineMonthArticles/Timeline.cshtml
@@ -207,7 +207,7 @@

Dự đoán giới tính con qua ngày tháng thụ thai

-
+

@@ -373,6 +373,22 @@

+        @if (User.IsInRole("Admins"))
+        {
+

+

+

+                        <button class="btn btn-warning">
+                             Thêm bài viết
+                        </button>
+

+

+

+
+

+
+        }
+

@@ -384,9 +400,7 @@
                 {

-
+

                             >


New overload to Controller.RenderText().

git-svn-id: bab0c2de90ee11a20376049c2cdee62584491f34@2349 73e77b4c-caa6-f847-a29a-24ab75ae54b6

--- MonoRail/Castle.MonoRail.Framework/Controller.cs
+++ MonoRail/Castle.MonoRail.Framework/Controller.cs
@@ -455,7 +455,6 @@
 		/// Cancels the view processing and writes
 		/// the specified contents to the browser
 		/// </summary>
-		/// <param name="contents"></param>
 		public void RenderText(String contents)
 		{
 			CancelView();
@@ -467,10 +466,18 @@
 		/// Cancels the view processing and writes
 		/// the specified contents to the browser
 		/// </summary>
-		/// <param name="contents"></param>
 		public void RenderText(String contents, params object[] args)
 		{
 			RenderText(String.Format(contents, args));
+		}
+
+		/// <summary>
+		/// Cancels the view processing and writes
+		/// the specified contents to the browser
+		/// </summary>
+		public void RenderText(IFormatProvider formatProvider, String contents, params object[] args)
+		{
+			RenderText(String.Format(formatProvider, contents, args));
 		}

 		/// <summary>


Viewer: Internal engine lock fix

Viewer: Internal engine lock fix

--- Mzinga.Viewer/ViewModel/InternalEngineWrapper.cs
+++ Mzinga.Viewer/ViewModel/InternalEngineWrapper.cs
@@ -66,7 +66,10 @@
         {
             Task.Run(() =>
             {
-                _gameEngine.ParseCommand(command);
+                lock (_gameEngine)
+                {
+                    _gameEngine.ParseCommand(command);
+                }
             });
         }
     }


add Async suffix to async methods

add Async suffix to async methods

--- OBeautifulCode.Security.GoDaddy/GoDaddyClient.cs
+++ OBeautifulCode.Security.GoDaddy/GoDaddyClient.cs
@@ -60,7 +60,7 @@
         /// <returns>
         /// The certificate identifier.
         /// </returns>
-        public async Task<CertificateIdentifierResponse> CreatePendingOrderForCertificate(
+        public async Task<CertificateIdentifierResponse> CreatePendingOrderForCertificateAsync(
             CertificateCreate request,
             string marketId = null)
         {
@@ -73,7 +73,7 @@

             var response = await client.PostAsync("certificates", request);

-            await ThrowIfResponseIsNotSuccessful(response, CertificateApiMethod.CreatePendingOrderForCertificate);
+            await ThrowIfResponseIsNotSuccessfulAsync(response, CertificateApiMethod.CreatePendingOrderForCertificate);

             var result = await response.Content.DeserializeAsync<CertificateIdentifierResponse>();

@@ -86,7 +86,7 @@
         ///// <param name="request"></param>
         ///// <param name="XMarketId"></param>
         ///// <returns></returns>
-        // public async Task<CertificateIdentifierResponse> ValidatePendingOrderForCertificate()
+        // public async Task<CertificateIdentifierResponse> ValidatePendingOrderForCertificateAsync()
         // {
         //    await ThrowIfResponseIsNotSuccessful(response, CertificateApiMethod.ValidatePendingOrderForCertificate);
         //    return null;
@@ -96,7 +96,7 @@
         ///// </summary>
         ///// <param name="request"></param>
         ///// <returns></returns>
-        // public async Task<CertificateIdentifierResponse> RetrieveCertificateDetails(CertificateDetailRetrieve request)
+        // public async Task<CertificateIdentifierResponse> RetrieveCertificateDetailsAsync(CertificateDetailRetrieve request)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.GetAsync($"certificates/{request.certificateId}");
@@ -108,7 +108,7 @@
         ///// </summary>
         ///// <param name="request"></param>
         ///// <returns></returns>
-        // public async Task<List<CertificateActionResponse>> RetrieveAllCertificateActions(CertificateActionRetrieve request)
+        // public async Task<List<CertificateActionResponse>> RetrieveAllCertificateActionsAsync(CertificateActionRetrieve request)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.GetAsync($"certificates/{request.certificateId}/actions");
@@ -120,7 +120,7 @@
         ///// </summary>
         ///// <param name="request"></param>
         ///// <returns></returns>
-        // public async Task CancelPendingCertificate(CertificateCancel request)
+        // public async Task CancelPendingCertificateAsync(CertificateCancel request)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.PostAsync($"certificates/{request.certificateId}/cancel", request);
@@ -132,7 +132,7 @@
         ///// </summary>
         ///// <param name="request"></param>
         ///// <returns></returns>
-        // public async Task<CertificateBundleResponse> DownloadCertificate(CertificateDownload request)
+        // public async Task<CertificateBundleResponse> DownloadCertificateAsync(CertificateDownload request)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.GetAsync($"certificates/{request.certificateId}/download");
@@ -145,7 +145,7 @@
         ///// <param name="request"></param>
         ///// <param name="certificateId"></param>
         ///// <returns></returns>
-        // public async Task ReissueActiveCertificate(CertificateReissue request, string certificateId)
+        // public async Task ReissueActiveCertificateAsync(CertificateReissue request, string certificateId)
         // {
         //    if (request.delayExistingRevoke != null)
         //    {
@@ -162,7 +162,7 @@
         ///// <param name="request"></param>
         ///// <param name="certificateId"></param>
         ///// <returns></returns>
-        // public async Task RenewActiveCertificate(CertificateRenew request, string certificateId)
+        // public async Task RenewActiveCertificateAsync(CertificateRenew request, string certificateId)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.PostAsync($"certificates/{certificateId}/renew", request);
@@ -175,7 +175,7 @@
         ///// <param name="request"></param>
         ///// <param name="certificateId"></param>
         ///// <returns></returns>
-        // public async Task RevokeActiveCertificate(CertificateRevoke request, string certificateId)
+        // public async Task RevokeActiveCertificateAsync(CertificateRevoke request, string certificateId)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.PostAsync($"certificates/{certificateId}/revoke", request);
@@ -187,14 +187,14 @@
         ///// </summary>
         ///// <param name="request"></param>
         ///// <returns></returns>
-        // public async Task CheckDomainControl(CertificateDomainControlCheck request)
+        // public async Task CheckDomainControlAsync(CertificateDomainControlCheck request)
         // {
         //    var client = this.GetHttpClient();
         //    var response = await client.PostAsync($"certificates/{request.certificateId}/verifydomaincontrol", null);
         //    await ThrowIfResponseIsNotSuccessful(response, CertificateApiMethod.CheckDomainControl);
         //    return;
         // }
-        private static async Task ThrowIfResponseIsNotSuccessful(
+        private static async Task ThrowIfResponseIsNotSuccessfulAsync(
             HttpResponseMessage response,
             CertificateApiMethod method)
         {


* Fixed an issue which caused regions to crash when duplicating primitives.

--- OpenSim/Region/Environment/Scenes/SceneObject.cs
+++ OpenSim/Region/Environment/Scenes/SceneObject.cs
@@ -105,6 +105,7 @@
             m_eventManager.OnBackup += new EventManager.OnBackupDelegate(ProcessBackup);
             m_eventManager.OnParcelPrimCountUpdate += new EventManager.OnParcelPrimCountUpdateDelegate(ProcessParcelPrimCountUpdate);
         }
+
         public void unregisterEvents()
         {
             m_eventManager.OnBackup -= new EventManager.OnBackupDelegate(ProcessBackup);
@@ -162,6 +163,7 @@
             SceneObject dupe = new SceneObject();

             dupe.m_world = this.m_world;
+            dupe.m_eventManager = this.m_eventManager;
             dupe.m_regionHandle = this.m_regionHandle;
             Primitive newRoot = this.rootPrimitive.Copy(dupe, dupe);
             dupe.rootPrimitive = newRoot;


On standup, trigger the changed link script event after the avatar has been fully changed.

This was meant to help with the script in http://opensimulator.org/mantis/view.php?id=5772 but it doesn't work.
Probably the event is fired before the physics actor has been set up again for the stood avatar.
Fixing that would be much more complicated, but processing the event last of all seems like a good idea in any case.

--- OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1864,8 +1864,6 @@
                     if (part.SitTargetAvatar == UUID)
                         part.SitTargetAvatar = UUID.Zero;

-                    part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
-
                     ParentPosition = part.GetWorldPosition();
                     ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
                 }
@@ -1881,6 +1879,9 @@
                 ParentID = 0;
                 SendAvatarDataToAllAgents();
                 m_requestedSitTargetID = 0;
+
+                if (part != null)
+                    part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
             }

             Animator.TrySetMovementAnimation("STAND");


goose panda

goose panda

--- OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1218,9 +1218,7 @@
             if ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
             {
                 StandUp();
-            }
-
-
+            }

             // Check if Client has camera in 'follow cam' or 'build' mode.
             Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);


As with prim sitting avatars, make an avatar phantom when it sits on the ground and solid again when it stands.

This is to avoid http://opensimulator.org/mantis/view.php?id=5783 when a collision with a ground sitting avatar causes that avatar to automatically stand and sometimes not be able to move
A better solution may be to keep gound sitting avatars solid but remove their collision status.  However, this requires some physics code work.

--- OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1419,6 +1419,7 @@
                 // to use.  Or we could add a m_isSitting variable.
                 //Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
                 SitGround = true;
+                RemoveFromPhysicalScene();
             }

             // In the future, these values might need to go global.
@@ -1835,11 +1836,14 @@
         /// </summary>
         public void StandUp()
         {
+//            m_log.DebugFormat("[SCENE PRESENCE]: StandUp() for {0}", Name);
+
             SitGround = false;
+            if (PhysicsActor == null)
+                AddToPhysicalScene(false);

             if (ParentID != 0)
             {
-//                m_log.Debug("StandupCode Executed");
                 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID);
                 if (part != null)
                 {
@@ -1864,11 +1868,6 @@

                     ParentPosition = part.GetWorldPosition();
                     ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
-                }
-
-                if (PhysicsActor == null)
-                {
-                    AddToPhysicalScene(false);
                 }

                 m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight);