WIP Test Milestone 1.2

WIP Test Milestone 1.2

--- RDFSharp.Test/Model/Serializers/RDFTurtleTest.cs
+++ RDFSharp.Test/Model/Serializers/RDFTurtleTest.cs
@@ -5970,6 +5970,420 @@
             Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object.Equals(new RDFTypedLiteral("25", RDFModelEnums.RDFDatatypes.XSD_INTEGER))));
         }

+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPOTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> <http://pred/> <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPOTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInSubject()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}rdf:Alt <http://pred/> <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(RDFVocabulary.RDF.ALT, new RDFResource("http://pred/"), new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(RDFVocabulary.RDF.ALT, new RDFResource("http://pred/"), new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPOTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> rdf:Alt <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.ALT, new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.ALT, new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPOTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> a <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.TYPE, new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.TYPE, new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPOTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInObject()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> <http://pred/> rdf:Alt, rdf:Bag.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), RDFVocabulary.RDF.ALT)));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), RDFVocabulary.RDF.BAG)));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPBTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> <http://pred/> _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPBTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInSubject()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}rdf:Alt <http://pred/> _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(RDFVocabulary.RDF.ALT, new RDFResource("http://pred/"), new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(RDFVocabulary.RDF.ALT, new RDFResource("http://pred/"), new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPBTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> rdf:Alt _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.ALT, new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.ALT, new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithSPBTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}<http://subj/> a _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.TYPE, new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("http://subj/"), RDFVocabulary.RDF.TYPE, new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 <http://pred/> <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), new RDFResource("http://pred/"), new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), new RDFResource("http://pred/"), new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 rdf:Alt <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.ALT, new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.ALT, new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 a <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.TYPE, new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.TYPE, new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInObject()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 <http://pred/> rdf:Alt, rdf:Bag.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), new RDFResource("http://pred/"), RDFVocabulary.RDF.ALT)));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), new RDFResource("http://pred/"), RDFVocabulary.RDF.BAG)));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 <http://pred/> _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), new RDFResource("http://pred/"), new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), new RDFResource("http://pred/"), new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 rdf:Alt _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.ALT, new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.ALT, new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}_:12345 a _:12345, _:54321.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.TYPE, new RDFResource("bnode:12345"))));
+            Assert.IsTrue(graph.ContainsTriple(new RDFTriple(new RDFResource("bnode:12345"), RDFVocabulary.RDF.TYPE, new RDFResource("bnode:54321"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] <http://pred/> <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] rdf:Alt <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.ALT) && t.Object.Equals(new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.ALT) && t.Object.Equals(new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] a <http://obj1/>, <http://obj2/>.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object.Equals(new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object.Equals(new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInObject()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] <http://pred/> rdf:Alt, rdf:Bag.");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(RDFVocabulary.RDF.ALT)));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(RDFVocabulary.RDF.BAG)));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBAnonymousTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] <http://pred/> [], [].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Count(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object is RDFResource objres && objres.IsBlank) == 2);
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBAnonymousTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] rdf:Alt [], [].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Count(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.ALT) && t.Object is RDFResource objres && objres.IsBlank) == 2);
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBAnonymousTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[] a [], [].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Count(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object is RDFResource objres && objres.IsBlank) == 2);
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousInlineTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ <http://pred/> <http://obj1/>, <http://obj2/> ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousInlineTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ rdf:Alt <http://obj1/>, <http://obj2/> ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.ALT) && t.Object.Equals(new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.ALT) && t.Object.Equals(new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousInlineTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ a <http://obj1/>, <http://obj2/> ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object.Equals(new RDFResource("http://obj1/"))));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object.Equals(new RDFResource("http://obj2/"))));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPOAnonymousInlineTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInObject()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ <http://pred/> rdf:Alt, rdf:Bag ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(RDFVocabulary.RDF.ALT)));
+            Assert.IsTrue(graph.Any(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object.Equals(RDFVocabulary.RDF.BAG)));
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBAnonymousInlineTriplesHavingSameSubjectAndPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ <http://pred/> [], [] ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Count(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(new RDFResource("http://pred/")) && t.Object is RDFResource objres && objres.IsBlank) == 2);
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBAnonymousInlineTriplesHavingSameSubjectAndPredicateAndUsingRegisteredNamespaceInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ rdf:Alt [], [] ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Count(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.ALT) && t.Object is RDFResource objres && objres.IsBlank) == 2);
+        }
+
+        [TestMethod]
+        public void ShouldDeserializeGraphWithBPBAnonymousInlineTriplesHavingSameSubjectAndPredicateAndUsingTypeInPredicate()
+        {
+            MemoryStream stream = new MemoryStream();
+            using (StreamWriter writer = new StreamWriter(stream))
+                writer.WriteLine($"@prefix rdf: <{RDFVocabulary.RDF.BASE_URI}>.{Environment.NewLine}@base <{RDFNamespaceRegister.DefaultNamespace}>.{Environment.NewLine}[ a [], [] ].");
+            RDFGraph graph = RDFTurtle.Deserialize(new MemoryStream(stream.ToArray()), null);
+
+            Assert.IsNotNull(graph);
+            Assert.IsTrue(graph.TriplesCount == 2);
+            Assert.IsTrue(graph.Count(t => t.Subject is RDFResource subjRes && subjRes.IsBlank && t.Predicate.Equals(RDFVocabulary.RDF.TYPE) && t.Object is RDFResource objres && objres.IsBlank) == 2);
+        }
+
         [TestCleanup]
         public void Cleanup()
         {


Generator checks for required fields.

Generator checks for required fields.

--- ReleaseNotes/Generators/ReleaseNotesGenerator.cs
+++ ReleaseNotes/Generators/ReleaseNotesGenerator.cs
@@ -30,9 +30,20 @@
         public ReleaseNotesGenerator(NamedLookup settings)
         {
             this.settings = settings;
+            checkRequiredFields();
             this.TFS = TFSAccessor.TFSAccessorFactory(settings["Team Project Path"], settings["Project Name"], settings["Iteration"]);
             this.logger = new Logger();
             this.silent = false;
+        }
+
+        public void checkRequiredFields()
+        {
+            List<bool> keysAlright = new List<bool>();
+            keysAlright.Add(settings.getLookup().ContainsKey("Team Project Path"));
+            keysAlright.Add(settings.getLookup().ContainsKey("Project Name"));
+            keysAlright.Add(settings.getLookup().ContainsKey("Iteration"));
+            if (keysAlright.Where(a => a == false).ToList().Count() > 0)
+                throw new Exception("Expected params not found.");
         }

         public void addPropertiesList(string name, Dictionary<string, string> lookup)
@@ -102,7 +113,7 @@
                 createTitle(settings["Doc Type"]);

                 // create horizontal table paragraph
-                createHorizontalTable(getDefaultExecutiveSummary(), 2, false);
+                createHorizontalTable(getDefaultExecutiveSummary(), 2, true);

                 // create access section
                 createNamedSection("Access", "Application is accessible at: ", settings["Web Location"]);


Correct version number and increased max wait time

--- Rhino.ServiceBus.SqlQueues/SqlQueuesTransport.cs
+++ Rhino.ServiceBus.SqlQueues/SqlQueuesTransport.cs
@@ -28,7 +28,7 @@
         private bool haveStarted;
         private readonly int numberOfRetries;
         private readonly IMessageBuilder<MessagePayload> messageBuilder;
-        private const int SleepMax = 5000;
+        private const int SleepMax = 15000;

         [ThreadStatic]
         private static SqlQueueCurrentMessageInformation currentMessageInformation;


Fixed line-ending issues causing build to fail on TeamCity

--- Runtime/CoreLib.TestScript/IteratorBlockTests.cs
+++ Runtime/CoreLib.TestScript/IteratorBlockTests.cs
@@ -91,6 +91,10 @@
 			}
 		}

+		private void AssertEqual(string actual, string expected, string message = null) {
+			Assert.AreEqual(actual.Replace("\r\n", "\n"), expected.Replace("\r\n", "\n"), message);
+		}
+
 		[Test]
 		public void TypeReturnedByIteratorBlockReturningIEnumeratorImplementsThatInterfaceAndIDisposable() {
 			var enm = new C(null).GetEnumerator(0);
@@ -108,7 +112,7 @@
 				sb.AppendLine("got " + enm.Current);
 			}

-			Assert.AreEqual(sb.ToString().Replace("\r\n", "\n"),
+			AssertEqual(sb.ToString(),
 @"yielding 0
 got 0
 yielding 1
@@ -116,7 +120,7 @@
 yielding -1
 got -1
 in finally
-".Replace("\r\n", "\n"));
+");
 		}

 		[Test]
@@ -130,13 +134,13 @@
 			}
 			enm.Dispose();

-			Assert.AreEqual(sb.ToString().Replace("\r\n", "\n"),
+			AssertEqual(sb.ToString(),
 @"yielding 0
 got 0
 yielding 1
 got 1
 in finally
-".Replace("\r\n", "\n"));
+");
 		}

 		[Test]
@@ -155,7 +159,7 @@
 				sb.AppendLine("caught exception");
 			}

-			Assert.AreEqual(sb.ToString(),
+			AssertEqual(sb.ToString(),
 @"yielding 1
 got 1
 yielding 2
@@ -184,7 +188,7 @@
 			foreach (var i in enm)
 				sb.AppendLine("got " + i);

-			Assert.AreEqual(sb.ToString().Replace("\r\n", "\n"),
+			AssertEqual(sb.ToString(),
 @"yielding 0
 got 0
 yielding 1
@@ -200,7 +204,7 @@
 yielding -1
 got -1
 in finally
-".Replace("\r\n", "\n"));
+");
 		}

 		[Test]
@@ -213,7 +217,7 @@
 					break;
 			}

-			Assert.AreEqual(sb.ToString(),
+			AssertEqual(sb.ToString(),
 @"yielding 0
 got 0
 yielding 1
@@ -239,7 +243,7 @@
 				sb.AppendLine("caught exception");
 			}

-			Assert.AreEqual(sb.ToString(),
+			AssertEqual(sb.ToString(),
 @"yielding 1
 got 1
 yielding 2
@@ -260,7 +264,7 @@
 			foreach (int i in enm)
 				sb.AppendLine(i);

-			Assert.AreEqual(sb.ToString(),
+			AssertEqual(sb.ToString(),
 @"3
 2
 1
@@ -284,7 +288,7 @@
 				sb.AppendLine(enm2.Current);
 			}

-			Assert.AreEqual(sb.ToString(),
+			AssertEqual(sb.ToString(),
 @"0
 0
 1


fixed some bugs

fixed some bugs

--- SIMDPrototyping/Trees/SingleArray/Tree_Refine.cs
+++ SIMDPrototyping/Trees/SingleArray/Tree_Refine.cs
@@ -275,21 +275,23 @@
             //Reify each one in sequence.
             for (int i = 0; i < internalNode->ChildCount; ++i)
             {
-                if (internalNodeChildren[i] < 0)
-                {
-                    Console.WriteLine("ASDf");
-                }
+                //The internalNodeChildren[i] can be negative, as a result of a subtree being encountered in CollapseTree.
+                //tempNodes[internalNodeChildren[i]].A is never negative for any internal node (internalNodeChildren[i] >= 0),
+                //because we pre-collapsed that reference in CollapseTree for convenience.

                 if (internalNodeChildren[i] >= 0)
                 {
                     //It's still an internal node.
+                    if (tempNodes[internalNodeChildren[i]].A < 0)
+                    {
+                        Console.WriteLine("that shouldn't happen");
+                    }
                     internalNodeChildren[i] = BuildChild(internalNodeIndex, i, tempNodes, internalNodeChildren[i], collapseCount, ref subtrees, ref internalNodes);
                 }
                 else
                 {
                     //It's a subtree. Just take pull the pointers until you're pointing back at the real node.
-                    var potentialSubtreeIndex = tempNodes[internalNodeChildren[i]].A;
-                    var childNodeIndex = subtrees.Elements[Encode(potentialSubtreeIndex)];
+                    var childNodeIndex = subtrees.Elements[Encode(internalNodeChildren[i])];
                     internalNodeChildren[i] = childNodeIndex;
                     if (childNodeIndex < 0)
                     {
@@ -306,29 +308,43 @@
             return internalNodeIndex;
         }

-        unsafe void CollapseTree(int depthRemaining, TempNode* nodes, int nodeIndex, int* nodeChildren, ref int childCount, BoundingBox* nodeBounds, int* leafCounts)
-        {
-            var node = nodes + nodeIndex;
-            if (node->A >= 0)
+        unsafe void CollapseTree(int depthRemaining, TempNode* tempNodes, int nodeIndex, int* nodeChildren, ref int childCount, BoundingBox* nodeBounds, int* leafCounts)
+        {
+            var tempNode = tempNodes + nodeIndex;
+            if (tempNode->A >= 0)
             {
                 //Internal node.
                 if (depthRemaining > 0)
                 {
                     depthRemaining -= 1;
-                    CollapseTree(depthRemaining, nodes, node->A, nodeChildren, ref childCount, nodeBounds, leafCounts);
-                    CollapseTree(depthRemaining, nodes, node->B, nodeChildren, ref childCount, nodeBounds, leafCounts);
+                    CollapseTree(depthRemaining, tempNodes, tempNode->A, nodeChildren, ref childCount, nodeBounds, leafCounts);
+                    CollapseTree(depthRemaining, tempNodes, tempNode->B, nodeChildren, ref childCount, nodeBounds, leafCounts);
                 }
                 else
                 {
                     //Reached the bottom of the recursion. Add the collected children.
                     int a = childCount++;
                     int b = childCount++;
-                    nodeBounds[a] = nodes[node->A].BoundingBox;
-                    nodeBounds[b] = nodes[node->B].BoundingBox;
-                    nodeChildren[a] = node->A;
-                    nodeChildren[b] = node->B;
-                    leafCounts[a] = nodes[node->A].LeafCount;
-                    leafCounts[b] = nodes[node->B].LeafCount;
+                    nodeBounds[a] = tempNodes[tempNode->A].BoundingBox;
+                    nodeBounds[b] = tempNodes[tempNode->B].BoundingBox;
+                    //If the child is a leaf, collapse it. Slightly less annoying to handle it here than later.
+                    //This is a byproduct of the awkward data layout for tempnodes...
+                    if (tempNodes[tempNode->A].A >= 0)
+                        nodeChildren[a] = tempNode->A;
+                    else
+                        nodeChildren[a] = tempNodes[tempNode->A].A; //It's a leaf.
+                    if (tempNodes[tempNode->B].A >= 0)
+                        nodeChildren[b] = tempNode->B;
+                    else
+                        nodeChildren[b] = tempNodes[tempNode->B].A; //It's a leaf. Leaf index is always stored in A...
+                    leafCounts[a] = tempNodes[tempNode->A].LeafCount;
+                    leafCounts[b] = tempNodes[tempNode->B].LeafCount;
+
+                    if (nodeChildren[a] >= 0 && tempNodes[nodeChildren[a]].A < 0)
+                        Console.WriteLine("not suppose to happ");
+                    if (nodeChildren[b] >= 0 && tempNodes[nodeChildren[b]].A < 0)
+                        Console.WriteLine("not suppose to happ");
+
                 }

             }
@@ -336,8 +352,8 @@
             {
                 //Leaf node.
                 var index = childCount++;
-                nodeBounds[index] = node->BoundingBox;
-                nodeChildren[index] = node->A;
+                nodeBounds[index] = tempNode->BoundingBox;
+                nodeChildren[index] = tempNode->A;
                 leafCounts[index] = 1;
             }
         }


Modernized

Modernized

--- SerilogAnalyzer/SerilogAnalyzer/PropertyToken.cs
+++ SerilogAnalyzer/SerilogAnalyzer/PropertyToken.cs
@@ -1,4 +1,4 @@
-// Based on https://github.com/serilog/serilog/blob/023d57c282dcb5ddedee9401c68743a713fa0c8c/src/Serilog/Parsing/PropertyToken.cs
+// Based on https://github.com/serilog/serilog/blob/e205c078b9fd0704e7bd778e2a214049472535df/src/Serilog/Parsing/PropertyToken.cs
 // Copyright 2013-2015 Serilog Contributors
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +21,7 @@
     /// <summary>
     /// A message template token representing a log event property.
     /// </summary>
-    class PropertyToken : MessageTemplateToken
+    sealed class PropertyToken : MessageTemplateToken
     {
         readonly string _rawText;
         readonly int? _position;
@@ -29,10 +29,8 @@
         public PropertyToken(int startIndex, string propertyName, string rawText)
             : base(startIndex, rawText.Length)
         {
-            if (propertyName == null) throw new ArgumentNullException(nameof(propertyName));
-            if (rawText == null) throw new ArgumentNullException(nameof(rawText));
-            PropertyName = propertyName;
-            _rawText = rawText;
+            PropertyName = propertyName ?? throw new ArgumentNullException(nameof(propertyName));
+            _rawText = rawText ?? throw new ArgumentNullException(nameof(rawText));

             int position;
             if (int.TryParse(PropertyName, NumberStyles.None, CultureInfo.InvariantCulture, out position) &&
@@ -51,6 +49,8 @@
         /// True if the property name is a positional index; otherwise, false.
         /// </summary>
         public bool IsPositional => _position.HasValue;
+
+        internal string RawText => _rawText;

         /// <summary>
         /// Try to get the integer value represented by the property name.


TypesByEntityTarject

TypesByEntityTarject

--- Signum.Engine.Extensions/DiffLog/DiffLogLogic.cs
+++ Signum.Engine.Extensions/DiffLog/DiffLogLogic.cs
@@ -16,7 +16,8 @@
 {
     public static class DiffLogLogic
     {
-        public static Polymorphic<Func<IOperation, bool>> Types = new Polymorphic<Func<IOperation, bool>>(minimumType: typeof(Entity));
+        public static Polymorphic<Func<IOperation, bool>> Types = new Polymorphic<Func<IOperation, bool>>(minimumType: typeof(Entity));
+        public static Polymorphic<Func<IEntity, bool>> TypesByEntityTarject = new Polymorphic<Func<IEntity, bool>>(minimumType: typeof(Entity));

         public static void Start(SchemaBuilder sb, DynamicQueryManager dqm)
         {
@@ -37,9 +38,18 @@

         static IDisposable OperationLogic_SurroundOperation(IOperation operation, OperationLogEntity log, Entity entity, object[] args)
         {
+            bool? strategy = null;
+
+            var byEntity = TypesByEntityTarject.TryGetValue(entity.GetType());
+            if (byEntity != null)
+            {
+                strategy = byEntity(entity);
+                if (strategy == false)
+                    return null;
+            }
+
             var type = operation.OperationType == OperationType.Execute && operation.OperationType == OperationType.Delete ? entity.GetType() : null;
-
-            bool? strategy = type == null ? (bool?)null : Types.GetValue(type)(operation);
+            strategy = type == null ? (bool?)null : Types.GetValue(type)(operation);

             if (strategy == false)
                 return null;


add ViewLogLogic.IsStarted

add ViewLogLogic.IsStarted

--- Signum.Engine.Extensions/ViewLog/ViewLogLogic.cs
+++ Signum.Engine.Extensions/ViewLog/ViewLogLogic.cs
@@ -34,12 +34,16 @@
         public static Func<Type, bool> LogType = type => true;
         public static Func<BaseQueryRequest, DynamicQueryContainer.ExecuteType, bool> LogQuery = (request, type) => true;
         public static Func<BaseQueryRequest, StringWriter, string> GetData = (request, sw) => request.QueryUrl + "\r\n\r\n" + sw.ToString();
-
+
+
+        public static bool IsStarted = false;

         public static void Start(SchemaBuilder sb, HashSet<Type> registerExpression)
         {
             if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
             {
+                IsStarted = true;
+
                 sb.Include<ViewLogEntity>()
                     .WithQuery(() => e => new
                     {
@@ -52,7 +56,7 @@
                         e.StartDate,
                         e.EndDate,
                     });
-
+
                 ExceptionLogic.DeleteLogs += ExceptionLogic_DeleteLogs;

                 var exp = Signum.Utilities.ExpressionTrees.Linq.Expr((Entity entity) => entity.ViewLogs());
@@ -132,6 +136,8 @@

         public static IDisposable? LogView(Lite<IEntity> entity, string viewAction)
         {
+            if (!IsStarted)
+                return null;

             if (entity == null || !LogType(entity.EntityType) || UserHolder.Current == null)
                 return null;


fix Logout

fix Logout

--- Signum.React.Extensions.Selenium/BrowserProxy.cs
+++ Signum.React.Extensions.Selenium/BrowserProxy.cs
@@ -113,7 +113,7 @@

         public virtual void Logout()
         {
-            Selenium.FindElement(By.Id("sf-login-dropdown")).Click();
+            Selenium.FindElement(By.Id("sfLoginDropdown")).Click();
             Selenium.FindElement(By.Id("sf-auth-logout")).Click();    //SelectElement();
             Selenium.Wait(() => GetCurrentUser() == null);
             Selenium.Url = Url("Auth/Login");


GameObjectManager Bugfix #FIX: Fixed GameObjectManager triggering add and removed events with empty object lists.

--- Source/Core/Duality/Utility/GameObjectManager.cs
+++ Source/Core/Duality/Utility/GameObjectManager.cs
@@ -201,23 +201,29 @@

 		private void OnObjectsAdded(List<GameObject> objList)
 		{
+			if (objList.Count == 0) return;
+
 			foreach (GameObject obj in objList)
 			{
 				this.RegisterEvents(obj);
 				if (this.GameObjectAdded != null)
 					this.GameObjectAdded(this, new GameObjectEventArgs(obj));
 			}
+
 			if (this.GameObjectsAdded != null)
 				this.GameObjectsAdded(this, new GameObjectGroupEventArgs(objList));
 		}
 		private void OnObjectsRemoved(List<GameObject> objList)
 		{
+			if (objList.Count == 0) return;
+
 			foreach (GameObject obj in objList)
 			{
 				this.UnregisterEvents(obj);
 				if (this.GameObjectRemoved != null)
 					this.GameObjectRemoved(this, new GameObjectEventArgs(obj));
 			}
+
 			if (this.GameObjectsRemoved != null)
 				this.GameObjectsRemoved(this, new GameObjectGroupEventArgs(objList));
 		}


(GH-249) Add default branch property to configuration

--- Source/GitReleaseManager/Configuration/Config.cs
+++ Source/GitReleaseManager/Configuration/Config.cs
@@ -49,6 +49,8 @@
                 IssueComments = false,
                 IssueCommentFormat = IssueCommentFormat,
             };
+
+            DefaultBranch = "master";

             Labels = new List<LabelConfig>
             {
@@ -148,6 +150,10 @@
         [YamlMember(Alias = "close")]
         public CloseConfig Close { get; private set; }

+        [Description("The name of the default branch.")]
+        [YamlMember(Alias = "default-branch")]
+        public string DefaultBranch { get; private set; }
+
         [Description("Configuration values used when creating labels")]
         [YamlMember(Alias = "labels")]
         public IList<LabelConfig> Labels { get; private set; }


Error Handling

Error Handling

--- SpotifyAPI/Local/Models/SpotifyUri.cs
+++ SpotifyAPI/Local/Models/SpotifyUri.cs
@@ -12,12 +12,19 @@
         public string Type { get; internal set; }
         public string Id { get; internal set; }

-        public SpotifyUri(string Uri)
+        public SpotifyUri(string uri)
         {
-            string[] props = Uri.Split(':');
-            this.Base = props[0];
-            this.Type = props[1];
-            this.Id = props[2];
+            if (String.IsNullOrEmpty(uri))
+                throw new ArgumentNullException("Uri");
+
+            string[] props = uri.Split(':');
+
+            if (props.Length != 3)
+                throw new ArgumentException("Unexpected Uri");
+
+            Base = props[0];
+            Type = props[1];
+            Id = props[2];
         }
     }
 }


Update Database.cs

Update Database.cs

Fixed comment spacing

--- SqlEditor/Models/Database/Database.cs
+++ SqlEditor/Models/Database/Database.cs
@@ -25,12 +25,8 @@
         /// <summary>
         /// Initializes a new instance of the <see cref="Database"/> class.
         /// </summary>
-        /// <param name="settings">
-        /// The connection string settings settings.
-        /// </param>
-        /// <param name="config">
-        /// The config.
-        /// </param>
+        /// <param name="settings">The connection string settings settings.</param>
+        /// <param name="config">The config.</param>
         [DefaultConstructor]
         public Database(ConnectionStringSettings settings, IConfig config)
         {
@@ -41,8 +37,8 @@
         /// <summary>
         /// Initializes a new instance of the <see cref="Database"/> class.
         /// </summary>
-        /// <param name="config"> The config. </param>
-        /// <param name="name"> The connection string settings name. </param>
+        /// <param name="config">The config.</param>
+        /// <param name="name">The connection string settings name.</param>
         public Database(IConfig config, string name)
         {
             this.settings = config.GetConnectionSettings(name);
@@ -109,4 +105,4 @@
             return new ConnectionStringSettings(this.settings.Name, connectionString, this.settings.ProviderName);
         }
     }
-}+}


added ability to view .cev files

added ability to view .cev files

--- Source/Tools/XDAWaveformDataParser/FileViewer.cs
+++ Source/Tools/XDAWaveformDataParser/FileViewer.cs
@@ -231,9 +231,18 @@
                 parsedFile = EventFile.Parse(dialog.FileName);

                 // Convert to common channel format
-                m_channels = parsedFile.EventReports
-                    .SelectMany(report => report.AnalogSection.AnalogChannels.Select(channel => MakeParsedChannel(report, channel)))
-                    .ToList();
+                if(parsedFile.EventReports.Count > 0)
+                {
+                    m_channels = parsedFile.EventReports
+                        .SelectMany(report => report.AnalogSection.AnalogChannels.Select(channel => MakeParsedChannel(report, channel)))
+                        .ToList();
+                }
+                else if( parsedFile.CommaSeparatedEventReports.Count > 0)
+                {
+                    m_channels = parsedFile.CommaSeparatedEventReports
+                        .SelectMany(report => report.AnalogSection.AnalogChannels.Select(channel => MakeParsedChannel(report, channel)))
+                        .ToList();
+                }

                 // Clear the list box and data chart
                 ChannelListBox.Items.Clear();
@@ -517,6 +526,29 @@
             return parsedChannel;
         }

+        private ParsedChannel MakeParsedChannel(CommaSeparatedEventReport report, Channel<double> channel)
+        {
+            List<DateTime> timeSamples = report.AnalogSection.TimeChannel.Samples.ToList();
+
+            List<object> xValues = timeSamples
+                .Select(time => time - timeSamples[0])
+                .Select(timeSpan => timeSpan.TotalSeconds)
+                .Cast<object>()
+                .ToList();
+
+            ParsedChannel parsedChannel = new ParsedChannel()
+            {
+                Name = string.Format("({0}) {1}", report.Command, channel.Name),
+                TimeValues = timeSamples,
+                XValues = xValues,
+                YValues = channel.Samples.Cast<object>().ToList()
+            };
+
+            return parsedChannel;
+        }
+
+
+
         private void ExportToCSV(string location)
         {
             IList<IList<ParsedChannel>> groupedChannels = new List<IList<ParsedChannel>>();


minor bug fixes in the SqlClientProvider

Encapsulated all collection name in brackets, this allows the usage of more collection names without conflicting with T-SQL keywords.

Fixed a bug when enumerating a collection.

--- SqlNoSql/SqlNoSql/SqlClient/SqlClientProvider.cs
+++ SqlNoSql/SqlNoSql/SqlClient/SqlClientProvider.cs
@@ -80,13 +80,13 @@
             if (reservedNames.Any(x => x.Equals(name, StringComparison.InvariantCultureIgnoreCase)))
             {
                 throw new ArgumentException(
-                    string.Format("{0} cannot be used, since it is a reserved name", name),
+                    string.Format("'{0}' cannot be used, since it is a reserved name", name),
                     name);
             }
             if (this.CollectionExists(name))
             {
                 throw new ArgumentException(
-                    string.Format("A collection named {0} already exists", name),
+                    string.Format("A collection named '{0}' already exists", name),
                     name);
             }
             using (var connection = this.GetConnection() as SqlConnection)
@@ -101,7 +101,7 @@
                         else
                             this.CreateJsonTable(name, connection, transaction);
                         connection.Execute("INSERT INTO _collections (Name, Format) VALUES (@Name, @Format)",
-                            new { Name = name, Format = format },
+                            new { Name = name, Format = format.ToString() },
                             transaction: transaction);
                         transaction.Commit();
                         return true;
@@ -131,7 +131,7 @@
                 {
                     try
                     {
-                        connection.Execute(string.Format("DROP TABLE {0}", name), transaction: transaction);
+                        connection.Execute(string.Format("DROP TABLE [{0}]", name), transaction: transaction);
                         connection.Execute("DELETE FROM _collections WHERE Name = @Name",
                             new { Name = name },
                             transaction: transaction);
@@ -167,7 +167,7 @@
             {
                 connection.Open();
                 return connection.Query<JsonRecord>(
-                    string.Format("SELECT Id, Data FROM {0} WHERE Id = @Id", collectionName),
+                    string.Format("SELECT Id, Data FROM [{0}] WHERE Id = @Id", collectionName),
                     new { Id = id }).SingleOrDefault();
             }
         }
@@ -178,7 +178,7 @@
             {
                 connection.Open();
                 return connection.Query<BsonRecord>(
-                    string.Format("SELECT Id, Data FROM {0} WHERE Id = @Id", collectionName),
+                    string.Format("SELECT Id, Data FROM [{0}] WHERE Id = @Id", collectionName),
                     new { Id = id }).SingleOrDefault();
             }
         }
@@ -188,10 +188,14 @@
             using (var connection = this.GetConnection() as SqlConnection)
             {
                 connection.Open();
-                return connection.Query<JsonRecord>(
-                    string.Format("SELECT Id, Data FROM {0}", collectionName),
-                    buffered: false);
-            }
+                foreach (var record in connection.Query<JsonRecord>(
+                    string.Format("SELECT Id, Data FROM [{0}]", collectionName),
+                    buffered: false))
+                {
+                    yield return record;
+                }
+            }
+            yield break;
         }

         public IEnumerable<BsonRecord> EnumerateBsonCollection(string collectionName)
@@ -199,10 +203,14 @@
             using (var connection = this.GetConnection() as SqlConnection)
             {
                 connection.Open();
-                return connection.Query<BsonRecord>(
-                    string.Format("SELECT Id, Data FROM {0}", collectionName),
-                    buffered: false);
-            }
+                foreach (var record in connection.Query<BsonRecord>(
+                    string.Format("SELECT Id, Data FROM [{0}]", collectionName),
+                    buffered: false))
+                {
+                    yield return record;
+                }
+            }
+            yield break;
         }

         public bool AddOrUpdateRecord(BsonRecord record, string collectionName)
@@ -211,7 +219,7 @@
             {
                 connection.Open();
                 return connection.Execute(
-                    string.Format("INSERT INTO {0} (Id, Data) VALUES (@Id, @Data)", collectionName),
+                    string.Format("INSERT INTO [{0}] (Id, Data) VALUES (@Id, @Data)", collectionName),
                     record) > 0;
             }
         }
@@ -221,16 +229,16 @@
             using (var connection = this.GetConnection() as SqlConnection)
             {
                 connection.Open();
-                if (connection.Query<int>(string.Format("SELECT CAST(COUNT(*) AS INT) FROM {0} WHERE Id = @Id", collectionName), record).Single() == 0)
+                if (connection.Query<int>(string.Format("SELECT CAST(COUNT(*) AS INT) FROM [{0}] WHERE Id = @Id", collectionName), record).Single() == 0)
                 {
                     return connection.Execute(
-                        string.Format("INSERT INTO {0} (Id, Data) VALUES (@Id, @Data)", collectionName),
+                        string.Format("INSERT INTO [{0}] (Id, Data) VALUES (@Id, @Data)", collectionName),
                         record) > 0;
                 }
                 else
                 {
                     return connection.Execute(
-                        string.Format("Update {0} SET Data = @Data WHERE Id = @Id", collectionName),
+                        string.Format("Update [{0}] SET Data = @Data WHERE Id = @Id", collectionName),
                         record) > 0;
                 }
             }
@@ -242,7 +250,7 @@
             {
                 connection.Open();
                 return connection.Execute(
-                    string.Format("DELETE FROM {0} WHERE Id = @Id", collectionName),
+                    string.Format("DELETE FROM [{0}] WHERE Id = @Id", collectionName),
                     new { Id = id }) > 0;
             }
         }
@@ -250,7 +258,7 @@
         private void CreateJsonTable(string name, SqlConnection connection, IDbTransaction transaction)
         {
             connection.Execute(string.Format(
-                "CREATE TABLE {0} ( " +
+                "CREATE TABLE [{0}] ( " +
                 "Id UNIQUEIDENTIFIER PRIMARY KEY NOT NULL, " +
                 "Data NVARCHAR(MAX) NOT NULL)", name),
                 transaction: transaction);
@@ -259,7 +267,7 @@
         private void CreateBsonTable(string name, SqlConnection connection, IDbTransaction transaction)
         {
             connection.Execute(string.Format(
-                "CREATE TABLE {0} ( " +
+                "CREATE TABLE [{0}] ( " +
                 "Id UNIQUEIDENTIFIER PRIMARY KEY NOT NULL, " +
                 "Data VARBINARY(MAX) NOT NULL)", name),
                 transaction: transaction);
@@ -273,7 +281,7 @@
                 connection.Execute(
                     "IF (OBJECT_ID('_collections', 'U') IS NULL) " +
                     "BEGIN " +
-                    "CREATE TABLE _collections ( " +
+                    "CREATE TABLE [_collections] ( " +
                     "Name NVARCHAR(450) PRIMARY KEY NOT NULL, " +
                     "Format NVARCHAR(MAX) NOT NULL) " +
                     "END");


[update]アセンブリバージョンの更新

[update]アセンブリバージョンの更新

--- Src/KIBOTTER/KIBOTTER/Properties/AssemblyInfo.cs
+++ Src/KIBOTTER/KIBOTTER/Properties/AssemblyInfo.cs
@@ -10,7 +10,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("KIBOTTER")]
-[assembly: AssemblyCopyright("Copyright ©KIBOU811 2016-2017")]
+[assembly: AssemblyCopyright("Copyright ©KIBOU811 2016-2018")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

@@ -32,5 +32,5 @@
 // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を
 // 既定値にすることができます:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.4.2.0")]
-[assembly: AssemblyFileVersion("1.4.2.0")]
+[assembly: AssemblyVersion("1.4.3.0")]
+[assembly: AssemblyFileVersion("1.4.3.0")]


Incremented version number

Incremented version number

--- Src/TranslatorService/Properties/AssemblyInfo.cs
+++ Src/TranslatorService/Properties/AssemblyInfo.cs
@@ -11,7 +11,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("TranslatorService")]
-[assembly: AssemblyCopyright("Copyright © Marco Minerva 2016")]
+[assembly: AssemblyCopyright("Copyright © Marco Minerva 2017")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
@@ -26,5 +26,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.*")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyVersion("1.0.1.*")]
+[assembly: AssemblyFileVersion("1.0.1.0")]


Additional fields added to PurchaseOrderLine

Several fields were missing on the PurchaseOrderLine, added most of them to the model.

--- Visma.net/Models/PurchaseOrderLine.cs
+++ Visma.net/Models/PurchaseOrderLine.cs
@@ -2,6 +2,7 @@
 using ONIT.VismaNetApi.Lib;
 using ONIT.VismaNetApi.Models.CustomDto;
 using ONIT.VismaNetApi.Models.Enums;
+using System;

 namespace ONIT.VismaNetApi.Models
 {
@@ -65,5 +66,120 @@
             get => Get<string>();
             set => Set(value);
         }
+        public NumberName branch
+        {
+            get => Get<NumberName>();
+            set => Set(value);
+        }
+        public double qtyOnReceipts
+        {
+            get => Get<double>();
+            set => Set(value);
+        }
+        public DescriptiveDto warehouse
+        {
+            get => Get<DescriptiveDto>();
+            set => Set(value);
+        }
+        public decimal unitCost
+        {
+            get => Get<decimal>();
+            set => Set(value);
+        }
+        public decimal unitCostInBaseCurrency
+        {
+            get => Get<decimal>();
+            set => Set(value);
+        }
+        public decimal extCost
+        {
+            get => Get<decimal>();
+            set => Set(value);
+        }
+        public decimal discountPercent
+        {
+            get => Get<decimal>();
+            set => Set(value);
+        }
+        public decimal discountAmount
+        {
+            get => Get<decimal>();
+            set => Set(value);
+        }
+        public bool manualDiscount
+        {
+            get => Get<bool>();
+            set => Set(value);
+        }
+        public NumberDescription discountCode
+        {
+            get => Get<NumberDescription>();
+            set => Set(value);
+        }
+        public decimal receivedAmt
+        {
+            get => Get<decimal>();
+            set => Set(value);
+        }
+        public string alternateId
+        {
+            get => Get<string>();
+            set => Set(value);
+        }
+        public double minReceipt
+        {
+            get => Get<double>();
+            set => Set(value);
+        }
+        public double maxReceipt
+        {
+            get => Get<double>();
+            set => Set(value);
+        }
+        public double completeOn
+        {
+            get => Get<double>();
+            set => Set(value);
+        }
+        public DescriptiveDto project
+        {
+            get => Get<DescriptiveDto>();
+            set => Set(value);
+        }
+        public DescriptiveDto projectTask
+        {
+            get => Get<DescriptiveDto>();
+            set => Set(value);
+        }
+        public DateTime requested
+        {
+            get => Get<DateTime>();
+            set => Set(value);
+        }
+        public DateTime promised
+        {
+            get => Get<DateTime>();
+            set => Set(value);
+        }
+        public bool completed
+        {
+            get => Get<bool>();
+            set => Set(value);
+        }
+        public bool canceled
+        {
+            get => Get<bool>();
+            set => Set(value);
+        }
+        public string orderNumber
+        {
+            get => Get<string>();
+            set => Set(value);
+        }
+        public string note
+        {
+            get => Get<string>();
+            set => Set(value);
+        }
     }
 }


Added additional unit tests.

Added additional unit tests.

--- Test/Compression/Integers/FibbonaciCodecTests.cs
+++ Test/Compression/Integers/FibbonaciCodecTests.cs
@@ -6,7 +6,8 @@
 using Xunit;

 namespace InvertedTomato.Compression.Integers {
-	public class FibonacciCodecTests { // TODO: Check Compress and Decompress's "used" value is correct
+	public class FibonacciCodecTests {
+		// TODO: Check Compress and Decompress's "used" value is correct
 		public readonly Codec Codec = new FibonacciCodec();

 		public String CompressMany(UInt64[] input, Int32 outputBufferSize = 8) {
@@ -94,40 +95,72 @@
 		public void Compress_13() {
 			Assert.Equal("10000110", CompressOne(13));
 		}
-
-
+
+
 		[Fact]
 		public void Compress_20() {
 			Assert.Equal("00000011", CompressOne(20)); // Exactly one byte
 		}
-
+
 		[Fact]
 		public void Compress_33() {
 			Assert.Equal("00000001 10000000", CompressOne(33)); // Termination bit is on next byte
 		}
-
+
 		[Fact]
 		public void Compress_54() {
 			Assert.Equal("00000000 11000000", CompressOne(54)); // Final and termination bits on next byte
 		}
-
-
+
+
 		[Fact]
 		public void Compress_986() {
 			Assert.Equal("00000000 00000011", CompressOne(986)); // Exactly one byte
 		}
-
+
 		[Fact]
 		public void Compress_1596() {
 			Assert.Equal("00000000 00000001 10000000", CompressOne(1596)); // Termination bit is on next byte
 		}
-
+
 		[Fact]
 		public void Compress_2583() {
 			Assert.Equal("00000000 00000000 11000000", CompressOne(2583)); // Final and termination bits on next byte
 		}
-
-
+
+
+		[Fact]
+		public void Compress_20_0_1() {
+			Assert.Equal("00000011 11011000", CompressMany(new UInt64[] {20, 0, 1})); // Exactly one byte
+		}
+
+		[Fact]
+		public void Compress_33_0_1() {
+			Assert.Equal("00000001 11101100", CompressMany(new UInt64[] {33, 0, 1})); // Termination bit is on next byte
+		}
+
+		[Fact]
+		public void Compress_54_0_1() {
+			Assert.Equal("00000000 11110110", CompressMany(new UInt64[] {54, 0, 1})); // Final and termination bits on next byte
+		}
+
+
+		[Fact]
+		public void Compress_986_0_1() {
+			Assert.Equal("00000000 00000011 11011000", CompressMany(new UInt64[] {986, 0, 1})); // Exactly one byte
+		}
+
+		[Fact]
+		public void Compress_1596_0_1() {
+			Assert.Equal("00000000 00000001 11101100", CompressMany(new UInt64[] {1596, 0, 1})); // Termination bit is on next byte
+		}
+
+		[Fact]
+		public void Compress_2583_0_1() {
+			Assert.Equal("00000000 00000000 11110110", CompressMany(new UInt64[] {2583, 0, 1})); // Final and termination bits on next byte
+		}
+
+
 		[Fact]
 		public void Compress_Max() {
 			Assert.Equal("01010000 01010001 01000001 00010101 00010010 00100100 00000010 01000100 10001000 10100000 10001010 01011000", CompressOne(FibonacciCodec.MaxValue, 32)); // Not completely sure about this value
@@ -136,6 +169,11 @@
 		[Fact]
 		public void Compress_0_1_2() {
 			Assert.Equal("11011001 10000000", CompressMany(new UInt64[] {0, 1, 2}));
+		}
+
+		[Fact]
+		public void Compress_0_1_2_3_4_5_6() {
+			Assert.Equal("11011001 11011000 11100110 10110000", CompressMany(new UInt64[] {0, 1, 2, 3, 4, 5, 6}));
 		}

 		[Fact]
@@ -232,40 +270,91 @@
 		public void Decompress_11() {
 			Assert.Equal((UInt64) 11, DecompressOne("101011 00"));
 		}
-
-
+
+
 		[Fact]
 		public void Decompress_20() {
 			Assert.Equal((UInt64) 20, DecompressOne("00000011")); // Exactly one byte
 		}
-
+
 		[Fact]
 		public void Decompress_33() {
 			Assert.Equal((UInt64) 33, DecompressOne("000000011 0000000")); // Termination bit is on next byte
 		}
-
+
 		[Fact]
 		public void Decompress_54() {
 			Assert.Equal((UInt64) 54, DecompressOne("0000000011 000000")); // Final and termination bits on next byte
 		}

-
+
 		[Fact]
 		public void Decompress_986() {
 			Assert.Equal((UInt64) 986, DecompressOne("00000000 00000011")); // Exactly two bytes
 		}
-
+
 		[Fact]
 		public void Decompress_1596() {
 			Assert.Equal((UInt64) 1596, DecompressOne("00000000 000000011 0000000")); // Termination bit is on next byte
 		}
-
+
 		[Fact]
 		public void Decompress_2583() {
 			Assert.Equal((UInt64) 2583, DecompressOne("00000000 0000000011 000000")); // Final and termination bits on next byte
 		}
-
-
+
+
+
+		[Fact]
+		public void Decompress_20_0_1() {
+			var symbols = DecompressMany("00000011 11011000", 3);
+			Assert.Equal((UInt64) 20, symbols[0]);
+			Assert.Equal((UInt64) 0, symbols[1]);
+			Assert.Equal((UInt64) 1, symbols[2]);
+		}
+
+		[Fact]
+		public void Decompress_33_0_1() {
+			var symbols = DecompressMany("00000001 11101100", 3);
+			Assert.Equal((UInt64) 33, symbols[0]);
+			Assert.Equal((UInt64) 0, symbols[1]);
+			Assert.Equal((UInt64) 1, symbols[2]);
+		}
+
+		[Fact]
+		public void Decompress_54_0_1() {
+			var symbols = DecompressMany("00000000 11110110", 3);
+			Assert.Equal((UInt64) 54, symbols[0]);
+			Assert.Equal((UInt64) 0, symbols[1]);
+			Assert.Equal((UInt64) 1, symbols[2]);
+		}
+
+
+		[Fact]
+		public void Decompress_986_0_1() {
+			var symbols = DecompressMany("00000000 00000011 11011000", 3);
+			Assert.Equal((UInt64) 986, symbols[0]);
+			Assert.Equal((UInt64) 0, symbols[1]);
+			Assert.Equal((UInt64) 1, symbols[2]);
+		}
+
+		[Fact]
+		public void Decompress_1596_0_1() {
+			var symbols = DecompressMany("00000000 00000001 11101100", 3);
+			Assert.Equal((UInt64) 1596, symbols[0]);
+			Assert.Equal((UInt64) 0, symbols[1]);
+			Assert.Equal((UInt64) 1, symbols[2]);
+		}
+
+		[Fact]
+		public void Decompress_2583_0_1() {
+			var symbols = DecompressMany("00000000 00000000 11110110", 3);
+			Assert.Equal((UInt64) 2583, symbols[0]);
+			Assert.Equal((UInt64) 0, symbols[1]);
+			Assert.Equal((UInt64) 1, symbols[2]);
+		}
+
+
 		[Fact]
 		public void Decompress_Max() {
 			Assert.Equal(FibonacciCodec.MaxValue, DecompressOne("01010000 01010001 01000001 00010101 00010010 00100100 00000010 01000100 10001000 10100000 10001010 01011 000"));
@@ -289,6 +378,18 @@
 			Assert.Equal((UInt64) 0, symbols[0]);
 			Assert.Equal((UInt64) 1, symbols[1]);
 			Assert.Equal((UInt64) 2, symbols[2]);
+		}
+
+		[Fact]
+		public void Decompress_0_1_2_4_5_6() {
+			var symbols = DecompressMany("11 011 0011 1011 00011 10011 01011 0000", 7); // 0 1 2 3 4 5 6
+			Assert.Equal((UInt64) 0, symbols[0]);
+			Assert.Equal((UInt64) 1, symbols[1]);
+			Assert.Equal((UInt64) 2, symbols[2]);
+			Assert.Equal((UInt64) 3, symbols[3]);
+			Assert.Equal((UInt64) 4, symbols[4]);
+			Assert.Equal((UInt64) 5, symbols[5]);
+			Assert.Equal((UInt64) 6, symbols[6]);
 		}

 		[Fact]


[Skip CI] PGP sign test - Visual Studio

[Skip CI] PGP sign test - Visual Studio

--- WalletWasabi.Tests/LiveServerTests.cs
+++ WalletWasabi.Tests/LiveServerTests.cs
@@ -7,7 +7,6 @@
 using WalletWasabi.Backend.Models;
 using WalletWasabi.Backend.Models.Responses;
 using WalletWasabi.Crypto;
-using WalletWasabi.Models;
 using WalletWasabi.Services;
 using WalletWasabi.Tests.XunitConfiguration;
 using WalletWasabi.TorSocks5;


Fix disguisting folder named "Data"

Fix disguisting folder named "Data"

--- WalletWasabi/Helpers/RuntimeParams.cs
+++ WalletWasabi/Helpers/RuntimeParams.cs
@@ -40,7 +40,7 @@

 		public static void SetDataDir(string dataDir)
 		{
-			FileDir = Path.Combine(dataDir, "Data");
+			FileDir = Path.Combine(dataDir);
 		}

 		public async Task SaveAsync()


Added throttling

Added throttling

--- Web/Controllers/TerminalController.cs
+++ Web/Controllers/TerminalController.cs
@@ -19,6 +19,7 @@
 		}

 		[HttpPost, Route("terminal/command")]
+		[Throttle(Name = "CommandThrottle", Milliseconds = 50)]
 		public JsonResult Command(string inputJson)
 		{
 			var input = JsonConvert.DeserializeObject<UserInput>(inputJson);
@@ -28,6 +29,7 @@
 		}

 		[HttpPost, Route("terminal/tab/complete")]
+		[Throttle(Name = "CommandThrottle", Milliseconds = 50)]
 		public JsonResult TabComplete(string inputJson)
 		{
 			var input = JsonConvert.DeserializeObject<TabCompleteInput>(inputJson);


Additional logic for All-in preflop check

--- TexasHoldemGameEngine-master/Source/Bot/Ignat.cs
+++ TexasHoldemGameEngine-master/Source/Bot/Ignat.cs
@@ -24,9 +24,9 @@
             }

             preflopCount["allin"] = preflopCount["allin"] + 1;
-            if (preflopCount["allin"] > 3)
+            if (preflopCount["allin"] > 3 && probability > 0.5)
             {
-
+                return PlayerAction.CheckOrCall();
             }
             #region Preflop
             if (context.RoundType == GameRoundType.PreFlop)
@@ -104,13 +104,13 @@
                         return PlayerAction.CheckOrCall();
                     }
                 }
-                else if (context.MoneyToCall > context.SmallBlind * 10)
+                else if (context.MoneyToCall > context.SmallBlind * 10 && probability > 0.6)
                 {
-                    // var playHand = HandCheck.PreFlop(this.FirstCard, this.SecondCard);
-                    // if (this.FirstCard.Type == 12 && this.SecondCard.Type == 12)
-                    // {
-                    //     return PlayerAction.CheckOrCall();
-                    // }
+                    return PlayerAction.CheckOrCall();
+                }
+                else
+                {
+                    return PlayerAction.Fold();
                 }

             }


Bumped version for the CGIProxyHandler

Bumped version for the CGIProxyHandler

--- Tools/CGIProxyHandler/Properties/AssemblyInfo.cs
+++ Tools/CGIProxyHandler/Properties/AssemblyInfo.cs
@@ -1,4 +1,4 @@
-using System.Reflection;
+using System.Reflection;
 using System.Runtime.CompilerServices;

 // Information about this assembly is defined by the following attributes.
@@ -17,7 +17,7 @@
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.

-[assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.0.0.7")]

 // The following attributes are used to specify the signing key for the assembly,
 // if desired. See the Mono documentation for more information about signing.


Adding additional error handling to markdown migration script.

--- Trifolia.Powershell/GetMigrateMarkdownCommand.cs
+++ Trifolia.Powershell/GetMigrateMarkdownCommand.cs
@@ -317,7 +317,19 @@
             cleanHtml = this.CleanHtml(cleanHtml);

             var converter = new Html2Markdown.Converter();
-            string markdown = converter.Convert(cleanHtml);
+            string markdown;
+
+            try
+            {
+                markdown = converter.Convert(cleanHtml);
+            }
+            catch (Exception ex)
+            {
+                this.WriteVerbose("Error converting to html: " + ex.Message);
+                this.WriteVerbose(cleanHtml);
+                return html;
+            }
+
             markdown = this.CleanMarkdown(markdown);

             if (html != markdown)


Punctuation is never used.

Punctuation is never used.

--- VisualStudio/LanguageService/XSharpClassifier.cs
+++ VisualStudio/LanguageService/XSharpClassifier.cs
@@ -32,7 +32,6 @@
         static private IClassificationType xsharpIdentifierType;
         static private IClassificationType xsharpCommentType;
         static private IClassificationType xsharpOperatorType;
-        static private IClassificationType xsharpPunctuationType;
         static private IClassificationType xsharpStringType;
         static private IClassificationType xsharpNumberType;
         static private IClassificationType xsharpPPType;
@@ -109,7 +108,6 @@
                 xsharpIdentifierType = registry.GetClassificationType("identifier");
                 xsharpCommentType = registry.GetClassificationType("comment");
                 xsharpOperatorType = registry.GetClassificationType("operator");
-                xsharpPunctuationType = registry.GetClassificationType("punctuation");
                 xsharpPPType = registry.GetClassificationType("preprocessor keyword");
                 xsharpNumberType = registry.GetClassificationType("number");
                 xsharpStringType = registry.GetClassificationType("string");


Add missing parameters (v5.92)

Add missing parameters (v5.92)

--- VkNet/Model/RequestParams/Wall/WallEditParams.cs
+++ VkNet/Model/RequestParams/Wall/WallEditParams.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Converters;
@@ -137,6 +137,19 @@
 		public bool? MarkAsAds { get; set; }

 		/// <summary>
+		/// Флаг, может принимать значения 1 или 0
+		/// </summary>
+		[JsonProperty(propertyName: "close_comments")]
+		public bool? CloseComments { get; set; }
+
+		/// <summary>
+		/// No description.
+		/// Положительное число
+		/// </summary>
+		[JsonProperty(propertyName: "poster_bkg_id")]
+		public long? PosterBackgroundId { get; set; }
+
+		/// <summary>
 		/// Привести к типу VkParameters.
 		/// </summary>
 		/// <param name="p"> Параметры. </param>
@@ -145,20 +158,22 @@
 		{
 			var parameters = new VkParameters
 			{
-					{ "owner_id", p.OwnerId }
-					, { "post_id", p.PostId }
-					, { "friends_only", p.FriendsOnly }
-					, { "message", p.Message }
-					, { "attachments", p.Attachments }
-					, { "services", p.Services }
-					, { "signed", p.Signed }
-					, { "publish_date", p.PublishDate }
-					, { "lat", p.Lat }
-					, { "long", p.Long }
-					, { "place_id", p.PlaceId }
-					, { "captcha_sid", p.CaptchaSid }
-					, { "captcha_key", p.CaptchaKey }
-					, { "mark_as_ads", p.MarkAsAds }
+				{ "owner_id", p.OwnerId },
+				{ "post_id", p.PostId },
+				{ "friends_only", p.FriendsOnly },
+				{ "message", p.Message },
+				{ "attachments", p.Attachments },
+				{ "services", p.Services },
+				{ "signed", p.Signed },
+				{ "publish_date", p.PublishDate },
+				{ "lat", p.Lat },
+				{ "long", p.Long },
+				{ "place_id", p.PlaceId },
+				{ "captcha_sid", p.CaptchaSid },
+				{ "captcha_key", p.CaptchaKey },
+				{ "mark_as_ads", p.MarkAsAds },
+				{ "close_comments", p.CloseComments },
+				{ "poster_bkg_id", p.PosterBackgroundId }
 			};

 			return parameters;


Update anonymity set in a safer and more generic way.

--- WalletWasabi/Models/ChaumianCoinJoin/CcjRound.cs
+++ WalletWasabi/Models/ChaumianCoinJoin/CcjRound.cs
@@ -528,8 +528,7 @@
 				if (didNotConfirmeCount > 0)
 				{
 					// Adjust anonymity set.
-					AnonymitySet = aliceCountAfterConnectionConfirmationTimeout;
-					Logger.LogInfo<CcjRound>($"{didNotConfirmeCount} Alices did not confirm their connection. Anonymity set is lowered to {AnonymitySet}.");
+					UpdateAnonymitySet(aliceCountAfterConnectionConfirmationTimeout);
 				}
 				// Progress to the next phase, which will be OutputRegistration
 				await ExecuteNextPhaseAsync(CcjRoundPhase.OutputRegistration);
@@ -939,9 +938,9 @@
 		{
 			using (RoundSynchronizerLock.Lock())
 			{
-				if ((Phase != CcjRoundPhase.InputRegistration) || Status != CcjRoundStatus.Running)
-				{
-					throw new InvalidOperationException($"Updating anonymity set is only allowed in {nameof(CcjRoundPhase.InputRegistration)} phase.");
+				if ((Phase != CcjRoundPhase.InputRegistration && Phase != CcjRoundPhase.ConnectionConfirmation) || Status != CcjRoundStatus.Running)
+				{
+					throw new InvalidOperationException($"Updating anonymity set is not allowed in {Phase.ToString()} phase.");
 				}
 				AnonymitySet = anonymitySet;
 			}


Fix shuffle on coin join inputs and outputs (#1927)

Fix shuffle on coin join inputs and outputs

--- WalletWasabi/Models/ChaumianCoinJoin/CcjRound.cs
+++ WalletWasabi/Models/ChaumianCoinJoin/CcjRound.cs
@@ -398,20 +398,20 @@
 							transaction.Outputs.AddWithOptimize(coordinatorFee, coordinatorAddress);
 						}

-						// 7. Shuffle. NBitcoin's shuffle does not work: https://github.com/MetacoSA/NBitcoin/issues/713
-						transaction.Inputs.Shuffle();
-						transaction.Outputs.Shuffle();
-						transaction.Outputs.SortByAmount(); // So the coinjoin looks better in block explorer.
-
-						// 8. Create the unsigned transaction.
+						// 7. Create the unsigned transaction.
 						var builder = Network.CreateTransactionBuilder();
 						UnsignedCoinJoin = builder
 							.ContinueToBuild(transaction)
 							.AddCoins(spentCoins) // It makes sure the UnsignedCoinJoin goes through TransactionBuilder optimizations.
 							.BuildTransaction(false);

-						// 9. Try optimize fees.
+						// 8. Try optimize fees.
 						await TryOptimizeFeesAsync(spentCoins);
+
+						// 9. Shuffle.
+						UnsignedCoinJoin.Inputs.Shuffle();
+						UnsignedCoinJoin.Outputs.Shuffle();
+						UnsignedCoinJoin.Outputs.SortByAmount(); // So the coinjoin looks better in block explorer.

 						SignedCoinJoin = Transaction.Parse(UnsignedCoinJoin.ToHex(), Network);


memory traffic

memory traffic

--- _Src/Container/ContainerExtensions.cs
+++ _Src/Container/ContainerExtensions.cs
@@ -25,7 +25,7 @@
 		public static object Get(this IContainer container, Type type, string contract = null,
 			bool dumpConstructionLog = false)
 		{
-			var resolvedService = container.Resolve(type, string.IsNullOrEmpty(contract) ? new string[0] : new[] {contract});
+			var resolvedService = container.Resolve(type, string.IsNullOrEmpty(contract) ? InternalHelpers.emptyStrings : new[] {contract});
 			resolvedService.Run(dumpConstructionLog);
 			return resolvedService.Single();
 		}
@@ -33,7 +33,7 @@
 		public static ResolvedService Create(this IContainer container, Type type, string contract = null,
 			object arguments = null)
 		{
-			var result = container.Create(type, string.IsNullOrEmpty(contract) ? new string[0] : new[] {contract}, arguments);
+			var result = container.Create(type, string.IsNullOrEmpty(contract) ? InternalHelpers.emptyStrings : new[] { contract }, arguments);
 			result.Run();
 			return result;
 		}


Check if the event we are updating a room for is a AC event or not.  If AC event and we are removing all groups set event to cancelled.  If AC event and we are adding groups set to not cancelled.  This is so we can ignore sub events that AC events that are cancelled.

--- SignInCheckIn/SignInCheckIn/Services/RoomService.cs
+++ SignInCheckIn/SignInCheckIn/Services/RoomService.cs
@@ -211,12 +211,21 @@

         public EventRoomDto UpdateEventRoomAgesAndGrades(string authenticationToken, int eventId, int roomId, EventRoomDto eventRoom)
         {
+            var eventDto = _eventRepository.GetEventById(eventId);
+            eventRoom.AdventureClub = eventDto.ParentEventId.HasValue && eventDto.EventTypeId == _applicationConfiguration.AdventureClubEventTypeId;
+
             // Start by deleting all current event groups for this room reservation (if any)
             DeleteCurrentEventGroupsForRoomReservation(authenticationToken, eventId, roomId);

-            // Check to see if anything is selected on input - if not, nothing else to do
+            // Check to see if anything is selected on input if not and this was a AC event then cancel
             if (!eventRoom.AssignedGroups.Exists(g => g.Selected || g.HasSelectedRanges))
             {
+                // Cancel the AC event as there is no longer a room associated with it
+                if (!eventRoom.AdventureClub) return eventRoom;
+
+                eventDto.Cancelled = true;
+                _eventRepository.UpdateSubEvent(authenticationToken, eventDto);
+                eventRoom.AdventureClub = false;
                 return eventRoom;
             }

@@ -263,6 +272,11 @@
             CreateEventGroups(authenticationToken,
                               eventRoom,
                               eventRoom.AssignedGroups.FindAll(g => (g.Selected || g.HasSelectedRanges) && g.TypeId == _applicationConfiguration.GradesAttributeTypeId), false);
+
+            // If an AC event room make sure the AC event is not cancelled
+            if (!eventRoom.AdventureClub) return eventRoom;
+            eventDto.Cancelled = false;
+            _eventRepository.UpdateSubEvent(authenticationToken, eventDto);

             return eventRoom;
         }


Authorization module - Always start user operations

--- Signum.Engine.Extensions/Authorization/AuthLogic.cs
+++ Signum.Engine.Extensions/Authorization/AuthLogic.cs
@@ -64,6 +64,8 @@
                 sb.Schema.Initializing[InitLevel.Level1SimpleEntities] += Schema_Initializing;
                 sb.Schema.EntityEvents<RoleDN>().Saving += Schema_Saving;

+                AuthLogic.StartUserGraph(sb);
+
                 dqm[typeof(RoleDN)] = (from r in Database.Query<RoleDN>()
                                        select new
                                        {
@@ -98,7 +100,7 @@
             }
         }

-        public static void StartUserGraph(SchemaBuilder sb)
+        private static void StartUserGraph(SchemaBuilder sb)
         {
             if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
             {


fix Upgrade_20221108_DotNet7

fix Upgrade_20221108_DotNet7

--- Signum.Upgrade/Upgrades/Upgrade_20221108_DotNet7.cs
+++ Signum.Upgrade/Upgrades/Upgrade_20221108_DotNet7.cs
@@ -22,6 +22,7 @@
         uctx.ChangeCodeFile(@"Southwind.React\Dockerfile", file =>
         {
             file.Replace("dotnet/aspnet:6.0.0", "dotnet/aspnet:7.0.0");
+            file.Replace("dotnet/aspnet:6.0", "dotnet/aspnet:7.0.0");
             file.Replace("dotnet/sdk:6.0.100", "dotnet/sdk:7.0.100");
         });
     }


Adds a failing unit test that won't work with the current implementation.

--- SlackBotRedux.Tests/Data.Sql/TVariableRepository.cs
+++ SlackBotRedux.Tests/Data.Sql/TVariableRepository.cs
@@ -78,6 +78,14 @@
                 Subject.ValidateAddingValue("vegetable", "$root")
                        .Should().Be(ValidateAddingValueResult.Success);
             }
+
+            [TestMethod]
+            public void ShouldReturnSuccessWhenAddingToVariableWithMatchingSubstring()
+            {
+                InsertNewVariableValue("food", "$vegetable").Should().Be(2);
+                Subject.ValidateAddingValue("vegetable", "$foodstuff")
+                       .Should().Be(ValidateAddingValueResult.Success);
+            }
         }
     }
 }


Add TODO to remove extracted file after translating it

--- SmartMeter.Business/Translator/TranslatorService.cs
+++ SmartMeter.Business/Translator/TranslatorService.cs
@@ -24,6 +24,8 @@
             .WithFilename(_CreateFilename(extractedFile))
             .WithContents(serializedTelegram)
             .Write();
+
+          //TODO: Remove extracted file after created translated file
         }
         catch (Exception ex) {
           Console.WriteLine($"An error occured while translating file '{extractedFile.FullName}': {ex}");


fix comment

fix comment

--- SolidworksAddinFramework/PropertyManagerPageBase.cs
+++ SolidworksAddinFramework/PropertyManagerPageBase.cs
@@ -469,7 +469,7 @@
                     return WrapControlAndDisposable(box, new CompositeDisposable(d0,d1));
                 });
             var d3 = changeObs.Subscribe(x => onChange(box, x));
-            // When calling e.g. `IPropertyManagerPageNUmberbox::SetRange2` disabling the control doesn't work before the PMP is activated.
+            // When calling e.g. `IPropertyManagerPageNumberbox::SetRange2` disabling the control doesn't work before the PMP is activated.
             // That's why we wait for the PMP activation here to deactivate the control.
             var d4 = _AfterActivation.Subscribe(_ => ((IPropertyManagerPageControl) box).Enabled = enable);
             return new CompositeDisposable(d2, d3, d4);


Changed format of ServerStatus, Total CPU Time to match Server Runtime. (#1095)

--- Source/ACE.Server/Command/Handlers/AdminCommands.cs
+++ Source/ACE.Server/Command/Handlers/AdminCommands.cs
@@ -1730,7 +1730,7 @@
             var runTime = DateTime.Now - proc.StartTime;
             sb.Append($"Server Runtime: {runTime.Hours}h {runTime.Minutes}m {runTime.Seconds}s{'\n'}");

-            sb.Append($"Total CPU Time: {proc.TotalProcessorTime.TotalSeconds:N1} sec, Threads: {proc.Threads.Count}{'\n'}");
+            sb.Append($"Total CPU Time: {proc.TotalProcessorTime.Hours}h {proc.TotalProcessorTime.Minutes}m {proc.TotalProcessorTime.Seconds}s, Threads: {proc.Threads.Count}{'\n'}");

             // todo, add actual system memory used/avail
             sb.Append($"{(proc.PrivateMemorySize64 >> 20)} MB used{'\n'}");  // sb.Append($"{(proc.PrivateMemorySize64 >> 20)} MB used, xxxx / yyyy MB physical mem free.{'\n'}");


VERY crude loadalllandblocks command

VERY crude loadalllandblocks command

--- Source/ACE.Server/Command/Handlers/DebugCommands.cs
+++ Source/ACE.Server/Command/Handlers/DebugCommands.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Threading.Tasks;

 using ACE.DatLoader;
 using ACE.DatLoader.FileTypes;
@@ -380,6 +381,27 @@
             session.SaveSessionPlayer();
         }

+        /// <summary>
+        /// This is a VERY crude test. It should never be used on a live server.
+        /// There isn't really much point to this command other than making sure landblocks can load and are semi-efficient.
+        /// </summary>
+        [CommandHandler("loadalllandblocks", AccessLevel.Developer, CommandHandlerFlag.None, "Loads all Landblocks. This is VERY crude. Do NOT use it on a live server!!!")]
+        public static void HandleLoadAllLandblocks(Session session, params string[] parameters)
+        {
+            session.Network.EnqueueSend(new GameMessageSystemChat("Loading landblocks... Prepare to be disconnected.", ChatMessageType.System));
+
+            for (int x = 0; x <= 0xFF; x++)
+            {
+                var x1 = x;
+                Parallel.For(0, 0xFF, y =>
+                {
+                    LandblockManager.ForceLoadLandBlock(new LandblockId((byte)x1, (byte)y));
+                });
+            }
+
+            session.Network.EnqueueSend(new GameMessageSystemChat("All Landblocks loaded.", ChatMessageType.System));
+        }
+

         // ==================================
         // Player Properties


Labels- fix hit test for wrap label in independent resolution

--- Source/Engine/AGS.Engine/UI/Text/GLLabelRenderer.cs
+++ Source/Engine/AGS.Engine/UI/Text/GLLabelRenderer.cs
@@ -199,7 +199,7 @@
                     _boundingBoxBuilder.Build(_labelBoundingBoxes, BaseSize.Width, BaseSize.Height, labelMatrices, buildRenderBox, buildHitTestBox);
                     updateText(glText, GLText.EmptySize, resolutionFactor, (int?)BaseSize.Width);
                     _boundingBoxBuilder.Build(_textBoundingBoxes, glText.BitmapWidth, glText.BitmapHeight, textMatrices, buildRenderBox, buildHitTestBox);
-                    _boundingBoxBuilder.Build(_labelBoundingBoxes, glText.Width, glText.Height, labelMatrices, buildRenderBox, buildHitTestBox);
+                    _boundingBoxBuilder.Build(_labelBoundingBoxes, glText.Width / resolutionFactor.X, glText.Height / resolutionFactor.Y, labelMatrices, buildRenderBox, buildHitTestBox);

                     _usedLabelBoundingBoxes = _labelBoundingBoxes;
                     _usedTextBoundingBoxes = _textBoundingBoxes;


MySQL connection string has "allow user variables=true;" by default.

git-tfs-id: [http://falcon:8080/tfs/Projects]$/Phalanger/Main;C1379

--- Source/Extensions/PhalangerMySql/Extension/MySql.cs
+++ Source/Extensions/PhalangerMySql/Extension/MySql.cs
@@ -428,7 +428,7 @@
         string connection_string = PhpMyDbConnection.BuildConnectionString(
           server, user, password,

-          String.Format("allowzerodatetime=true;connect timeout={0};Port={1};SSL Mode={2};Use Compression={3}{4}{5}",
+          String.Format("allowzerodatetime=true;allow user variables=true;connect timeout={0};Port={1};SSL Mode={2};Use Compression={3}{4}{5}",
             (local.ConnectTimeout > 0) ? local.ConnectTimeout : Int32.MaxValue,
             port,
             (flags & ConnectFlags.SSL) != 0 ? "Preferred" : "None",     // (since Connector 6.2.1.) ssl mode={None|Preferred|Required|VerifyCA|VerifyFull}   // (Jakub) use ssl={true|false} has been deprecated


removed internal to security constants

removed internal to security constants

--- Source/GSoft.Dynamite/Security/SecurityConstants.cs
+++ Source/GSoft.Dynamite/Security/SecurityConstants.cs
@@ -8,25 +8,25 @@
 {
     /// <summary>The security constants.</summary>
     public class SecurityConstants
-    {
+    {
         /// <summary>
         /// The approve permission.
         /// </summary>
-        internal const string Approve = "Approve";
+        public const string Approve = "Approve";

         /// <summary>
         /// The contribute permission.
         /// </summary>
-        internal const string Contribute = "Contribute";
+        public const string Contribute = "Contribute";

         /// <summary>
         /// The read permission.
         /// </summary>
-        internal const string Read = "Read";
+        public const string Read = "Read";

         /// <summary>
         /// The full.
         /// </summary>
-        internal const string Full = "Full Control";
+        public const string Full = "Full Control";
     }
 }


Fixed build error (probably from the rebase)

--- Source/TestingServices/Runtime/BugFindingRuntime.cs
+++ Source/TestingServices/Runtime/BugFindingRuntime.cs
@@ -80,12 +80,6 @@
         /// Map from task ids to machines.
         /// </summary>
         private ConcurrentDictionary<int, Machine> TaskMap;
-
-        /// <summary>
-        /// A map from unique machine ids to action traces.
-        /// Only used for dynamic data race detection.
-        /// </summary>
-        internal IDictionary<MachineId, MachineActionTrace> MachineActionTraceMap;

         /// <summary>
         /// Set of all machine Ids created by this runtime.


Added IsHttp[METHOD]Request() extension methods.

--- Sources/NET4.SrkToolkit.Web/SrkRequestExtensions.cs
+++ Sources/NET4.SrkToolkit.Web/SrkRequestExtensions.cs
@@ -12,6 +12,12 @@
     /// </summary>
     public static class SrkRequestExtensions
     {
+        private static readonly string[] xhrValues = new string[]
+        {
+            "XMLHttpRequest".ToUpperInvariant(),
+            "XHR",
+        };
+
         /// <summary>
         /// Determines whether the specified request is made via AJAX.
         /// </summary>
@@ -25,12 +31,7 @@
             if (string.IsNullOrEmpty(header))
                 return false;

-            string[] values = new string[]
-            {
-                "XMLHttpRequest".ToUpperInvariant(),
-                "XHR",
-            };
-            return values.Contains(header.ToUpperInvariant());
+            return xhrValues.Contains(header.ToUpperInvariant());
         }

         /// <summary>
@@ -46,32 +47,87 @@
             if (string.IsNullOrEmpty(header))
                 return false;

-            string[] values = new string[]
-            {
-                "XMLHttpRequest".ToUpperInvariant(),
-                "XHR",
-            };
-            return values.Contains(header.ToUpperInvariant());
-        }
-
-        /// <summary>
-        /// Determines whether [is HTTP post request].
+            return xhrValues.Contains(header.ToUpperInvariant());
+        }
+
+        /// <summary>
+        /// Determines whether the HTTP method is POST.
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns></returns>
         public static bool IsHttpPostRequest(this HttpRequest request)
         {
-            return request.HttpMethod.ToUpperInvariant() == "POST";
-        }
-
-        /// <summary>
-        /// Determines whether [is HTTP post request].
+            return "POST".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether the HTTP method is POST.
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns></returns>
         public static bool IsHttpPostRequest(this HttpRequestBase request)
         {
-            return request.HttpMethod.ToUpperInvariant() == "POST";
+            return "POST".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether the HTTP method is DELETE.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <returns></returns>
+        public static bool IsHttpDeleteRequest(this HttpRequest request)
+        {
+            return "DELETE".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether is HTTP method is DELETE.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <returns></returns>
+        public static bool IsHttpDeleteRequest(this HttpRequestBase request)
+        {
+            return "DELETE".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether the HTTP method is PUT.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <returns></returns>
+        public static bool IsHttpPutRequest(this HttpRequest request)
+        {
+            return "PUT".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether is HTTP method is PUT.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <returns></returns>
+        public static bool IsHttpPutRequest(this HttpRequestBase request)
+        {
+            return "PUT".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether the HTTP method is HEAD.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <returns></returns>
+        public static bool IsHttpHeadRequest(this HttpRequest request)
+        {
+            return "HEAD".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
+        }
+
+        /// <summary>
+        /// Determines whether is HTTP method is HEAD.
+        /// </summary>
+        /// <param name="request">The request.</param>
+        /// <returns></returns>
+        public static bool IsHttpHeadRequest(this HttpRequestBase request)
+        {
+            return "HEAD".Equals(request.HttpMethod, StringComparison.OrdinalIgnoreCase);
         }

         /// <summary>


Improved text

Improved text

--- SqlServerValidationToolkit.Configurator/App.xaml.cs
+++ SqlServerValidationToolkit.Configurator/App.xaml.cs
@@ -22,7 +22,7 @@
                 ConnectionStringUpdater.UpdateDbConnectionString(
                     () =>
                     {
-                        MessageBox.Show("The toolkit was succesfully installed, go to 'Data'->'Update entities from database' or press Ctrl+U to import the tables you want to validate");
+                        MessageBox.Show("The toolkit was succesfully installed, press Ctrl+U to import the tables from the database that you want to validate. Then create some rules and press Ctrl+V to execute the validation. Under 'Wrong values' the validation results are listed.");
                     },
                     (ex) =>
                     {