commit a53b1de83cf5a61cb2b3ac61592dba2f29019155
Author: A-Konig <alex-nebulae@seznam.cz>
Date:   Mon May 24 20:49:05 2021 +0200

    re #8933 Testing DataParser, JisParser and WeatherParser

diff --git a/Server/ServerApp/DataDownload/DataDownloader.cs b/Server/ServerApp/DataDownload/DataDownloader.cs
index ded22bc..ebf1b98 100644
--- a/Server/ServerApp/DataDownload/DataDownloader.cs
+++ b/Server/ServerApp/DataDownload/DataDownloader.cs
@@ -388,7 +388,6 @@ namespace ServerApp.DataDownload
 			if (startDate == null || endDate == null)
 				return GetData(subDirectory);
 
-
 			string[] files = Directory.GetFiles(subDirectory);
 			List<string> found00Files = new List<string>();
 			List<string> relevantFiles = new List<string>();
diff --git a/Server/ServerApp/Parser/InputData/CsvDataLoader.cs b/Server/ServerApp/Parser/InputData/CsvDataLoader.cs
index b196784..1d36908 100644
--- a/Server/ServerApp/Parser/InputData/CsvDataLoader.cs
+++ b/Server/ServerApp/Parser/InputData/CsvDataLoader.cs
@@ -40,6 +40,9 @@ namespace ServerApp.Parser.InputData
         public List<JisInstance> LoadJisFile(string pathToFile)
         {
             var lines = LoadCsv(pathToFile);
+            if (lines == null)
+                return null;
+
             List<JisInstance> list = new List<JisInstance>();
 
             if (lines == null)
@@ -75,6 +78,9 @@ namespace ServerApp.Parser.InputData
         public List<LogInInstance> LoadLoginFile(string pathToFile)
         {
             var lines = LoadCsv(pathToFile);
+            if (lines == null)
+                return null;
+
             List<LogInInstance> list = new List<LogInInstance>();
 
             if (lines == null)
@@ -120,6 +126,9 @@ namespace ServerApp.Parser.InputData
         public List<WeatherInstance> LoadWeatherFile(string pathToFile)
         {
             var lines = LoadCsv(pathToFile);
+            if (lines == null)
+                return null;
+
             List<WeatherInstance> list = new List<WeatherInstance>();
 
             if (lines == null)
diff --git a/Server/ServerApp/Parser/InputData/IDataLoader.cs b/Server/ServerApp/Parser/InputData/IDataLoader.cs
index f0772dd..cabdcd7 100644
--- a/Server/ServerApp/Parser/InputData/IDataLoader.cs
+++ b/Server/ServerApp/Parser/InputData/IDataLoader.cs
@@ -10,7 +10,7 @@ namespace ServerApp.Parser.InputData
     /// Interface that every DataLoader should implement
     /// </summary>
     /// <author>A. Konig</author>
-    interface IDataLoader
+    public interface IDataLoader
     {
         /// <summary>
         /// Load jis data from file
diff --git a/Server/ServerApp/Parser/InputData/JisInstance.cs b/Server/ServerApp/Parser/InputData/JisInstance.cs
index 82af5e9..d9b3927 100644
--- a/Server/ServerApp/Parser/InputData/JisInstance.cs
+++ b/Server/ServerApp/Parser/InputData/JisInstance.cs
@@ -18,7 +18,7 @@ namespace ServerApp.Parser.InputData
     ///     [place tag];[date time];[amount]
     /// </summary>
     /// <author>A. Konig</author>
-    class JisInstance
+    public class JisInstance
     {
         /// <summary> Place tag  </summary>
         // index 0
diff --git a/Server/ServerApp/Parser/InputData/LogInInstance.cs b/Server/ServerApp/Parser/InputData/LogInInstance.cs
index 7fba2c2..14f7423 100644
--- a/Server/ServerApp/Parser/InputData/LogInInstance.cs
+++ b/Server/ServerApp/Parser/InputData/LogInInstance.cs
@@ -25,7 +25,7 @@ namespace ServerApp.Parser.InputData
     ///     [datum];[amount];[lesson];[lesson start];[lesson end];[building];[room type];[room];[hostname]
     /// </summary>
     /// <author>A. Konig</author>
-    class LogInInstance
+    public class LogInInstance
     {
         /// <summary> Date time </summary>
         // index 0
diff --git a/Server/ServerApp/Parser/InputData/WeatherInstance.cs b/Server/ServerApp/Parser/InputData/WeatherInstance.cs
index 7ee6ef6..b95ab47 100644
--- a/Server/ServerApp/Parser/InputData/WeatherInstance.cs
+++ b/Server/ServerApp/Parser/InputData/WeatherInstance.cs
@@ -14,7 +14,7 @@ namespace ServerApp.Parser.InputData
     ///     [date time];[temperature];[wind];[rain];[luminance]
     /// </summary>
     /// <author>A. Konig</author>
-    class WeatherInstance
+    public class WeatherInstance
     {
         /// <summary> Date and time </summary>
         // index 0
@@ -48,5 +48,20 @@ namespace ServerApp.Parser.InputData
             this.rain = rain;
             this.lum = lum;
         }
+
+        /// <summary>
+        /// Eqquals
+        /// </summary>
+        /// <param name="obj"> Other object </param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            WeatherInstance other = (WeatherInstance) obj;
+
+            if (dateTime == other.dateTime && temp == other.temp && wind == other.wind && rain == other.rain && lum == other.lum)
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs b/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs
index d3321a9..986b2f3 100644
--- a/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs
+++ b/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs
@@ -45,5 +45,21 @@ namespace ServerApp.Parser.OutputInfo
         {
             return $"{startTime} \t {building} \t {amount}";
         }
+
+
+        /// <summary>
+        /// Compares object to other instance
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            ActivityInfo other = (ActivityInfo)obj;
+
+            if (building == other.building && amount == other.amount && startTime == other.startTime && intervalLength == other.intervalLength)
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs b/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs
index 09c0813..7e1f3e5 100644
--- a/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs
+++ b/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs
@@ -35,7 +35,7 @@ namespace ServerApp.Parser.OutputInfo
         /// </summary>
         /// <param name="condition">Weather conditions</param>
         /// <returns>Lux value</returns>
-        internal static double TransferConditionsToLux(WeatherConditions condition)
+        public static double TransferConditionsToLux(WeatherConditions condition)
         {
             if (condition == WeatherConditions.Sunny)
                 return 60_000;
diff --git a/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs b/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs
index 8ba044b..e032a7f 100644
--- a/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs
+++ b/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs
@@ -85,5 +85,19 @@ namespace ServerApp.Parser.OutputInfo
             return $"{startTime} \t {temp}°C \t {rain}% \t {wind}m/s \t {condition.ToString()} \t {lum}";
         }
 
+        /// <summary>
+        /// Eqquals
+        /// </summary>
+        /// <param name="obj"> Other object </param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            WeatherInfo other = (WeatherInfo) obj;
+
+            if (startTime == other.startTime && temp == other.temp && wind == other.wind && rain == other.rain && condition == other.condition)
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/Server/ServerApp/Parser/Parsers/DataParser.cs b/Server/ServerApp/Parser/Parsers/DataParser.cs
index 24ab8fa..223fdc6 100644
--- a/Server/ServerApp/Parser/Parsers/DataParser.cs
+++ b/Server/ServerApp/Parser/Parsers/DataParser.cs
@@ -34,7 +34,6 @@ namespace ServerApp.Parser.Parsers
         /// <summary> ActivityInfo representing login activity</summary>
         List<ActivityInfo> loginList;
 
-
         /// <summary>
         /// Constructor
         /// </summary>
@@ -70,12 +69,12 @@ namespace ServerApp.Parser.Parsers
             string pathLogIn = downloader.DataSubDirectories[DataType.STROJE];
 
             // get all files that should be parsed
-            Date start = null;
-            Date end = null;
-            if (startTime != null || endTime != null)
+            Date start = new Date((uint)startTime.Month, (uint)startTime.Year);
+            Date end = new Date((uint)endTime.Month, (uint)endTime.Year);
+            if (startTime == DateTime.MinValue || endTime == DateTime.MaxValue)
             {
-                start = new Date((uint)startTime.Month, (uint)startTime.Year);
-                end = new Date((uint)endTime.Month, (uint)endTime.Year);
+                start = null;
+                end = null;
             }
 
             var weatherFiles = downloader.GetData(pathWeather, start, end);
@@ -183,7 +182,7 @@ namespace ServerApp.Parser.Parsers
                     
                     
             if (indexLogin < loginList.Count)
-                res.AddRange(jisList.GetRange(indexLogin, loginList.Count - indexLogin));
+                res.AddRange(loginList.GetRange(indexLogin, loginList.Count - indexLogin));
 
             return res;
         }
diff --git a/Server/ServerApp/Parser/Parsers/JisParser.cs b/Server/ServerApp/Parser/Parsers/JisParser.cs
index 1a2914d..0d1d3d0 100644
--- a/Server/ServerApp/Parser/Parsers/JisParser.cs
+++ b/Server/ServerApp/Parser/Parsers/JisParser.cs
@@ -15,7 +15,7 @@ namespace ServerApp.Parser.Parsers
     /// Data parsed from 7am (included) to 18pm (included)
     /// </summary>
     /// <author>A. Konig</author>
-    class JisParser
+    public class JisParser
     {
 
         /// <summary> Datafile loader  </summary>
@@ -78,10 +78,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<ActivityInfo> jisInfo = new List<ActivityInfo>();
             
-            if (!File.Exists(path))
-                return jisInfo;
-
             List<JisInstance> list =  loader.LoadJisFile(path);
+            if (list == null)
+                return jisInfo;
 
             // data for each faculty
             int[] recordedAmount = new int[TagInfo.buildings.Length];
@@ -107,7 +106,8 @@ namespace ServerApp.Parser.Parsers
                     for (int k = 0; k < TagInfo.buildings.Length; k++)
                     {
                         ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartTime, range);
-                        jisInfo.Add(dayInfo);
+                        if (recordedAmount[k] != 0)
+                            jisInfo.Add(dayInfo);
                     }
 
                     recordedAmount = new int[TagInfo.buildings.Length];
@@ -141,7 +141,8 @@ namespace ServerApp.Parser.Parsers
             for (int k = 0; k < TagInfo.buildings.Length; k++)
             {
                 ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartTime, range);
-                jisInfo.Add(dayInfo);
+                if (recordedAmount[k] != 0)
+                    jisInfo.Add(dayInfo);
             }
 
             return jisInfo;
@@ -158,11 +159,10 @@ namespace ServerApp.Parser.Parsers
         private List<ActivityInfo> ProcessOneJisFileAsIntervals(string path, int interval, DateTime startTime, DateTime endTime)
         {
             List<ActivityInfo> jisInfo = new List<ActivityInfo>();
-            
-            if (!File.Exists(path))
-                return jisInfo;
 
             List<JisInstance> list = loader.LoadJisFile(path);
+            if (list == null)
+                return jisInfo;
 
             // data for each faculty
             int[] recordedAmount = new int[TagInfo.buildings.Length];
@@ -207,6 +207,8 @@ namespace ServerApp.Parser.Parsers
                     // start time of last interval
                     DateTime stTime = new DateTime(lastStartTime.Year, lastStartTime.Month, lastStartTime.Day, startingTime, 0, 0);
 
+                    // TODO zjistit kolik se vynechalo a přidat tolik nul?
+
                     // find end and start time
                     if (!trigger)
                         index++;
@@ -223,7 +225,8 @@ namespace ServerApp.Parser.Parsers
                     for (int k = 0; k < TagInfo.buildings.Length; k++)
                     {
                         ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], stTime, interval);
-                        jisInfo.Add(dayInfo);
+                        if (recordedAmount[k] != 0)
+                            jisInfo.Add(dayInfo);
                     }
 
                     recordedAmount = new int[TagInfo.buildings.Length];
@@ -254,10 +257,12 @@ namespace ServerApp.Parser.Parsers
             }
 
             // last day
+            DateTime startT = new DateTime(lastStartTime.Year, lastStartTime.Month, lastStartTime.Day, startingTime, 0, 0);
             for (int k = 0; k < TagInfo.buildings.Length; k++)
             {
-                ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartTime, interval);
-                jisInfo.Add(dayInfo);
+                ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], startT, interval);
+                if (recordedAmount[k] != 0)
+                    jisInfo.Add(dayInfo);
             }
 
             return jisInfo;
diff --git a/Server/ServerApp/Parser/Parsers/LogInParser.cs b/Server/ServerApp/Parser/Parsers/LogInParser.cs
index 32e53a2..7247eae 100644
--- a/Server/ServerApp/Parser/Parsers/LogInParser.cs
+++ b/Server/ServerApp/Parser/Parsers/LogInParser.cs
@@ -77,10 +77,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<ActivityInfo> loginInfo = new List<ActivityInfo>();
 
-            if (!File.Exists(path))
-                return loginInfo;
-
             List<LogInInstance> list = loader.LoadLoginFile(path);
+            if (list == null)
+                return loginInfo;
 
             // data for each faculty
             int[] recordedAmount = new int[TagInfo.buildings.Length];
@@ -161,10 +160,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<ActivityInfo> loginInfo = new List<ActivityInfo>();
             
-            if (!File.Exists(path))
-                return loginInfo;
-
             List<LogInInstance> list = loader.LoadLoginFile(path);
+            if (list == null)
+                return loginInfo;
 
             // min/max hour taken into account
             int[] minmaxHour = new int[] { 7, 18 };
diff --git a/Server/ServerApp/Parser/Parsers/TagInfo.cs b/Server/ServerApp/Parser/Parsers/TagInfo.cs
index da5006b..3a74b49 100644
--- a/Server/ServerApp/Parser/Parsers/TagInfo.cs
+++ b/Server/ServerApp/Parser/Parsers/TagInfo.cs
@@ -10,7 +10,7 @@ namespace ServerApp.Parser.Parsers
     /// Class with Tags used in application
     /// </summary>
     /// <author>Alex Konig</author>
-    class TagInfo
+    public class TagInfo
     {
         public static string[] buildings;
 
diff --git a/Server/ServerApp/Parser/Parsers/WeatherParser.cs b/Server/ServerApp/Parser/Parsers/WeatherParser.cs
index f8754a1..e814186 100644
--- a/Server/ServerApp/Parser/Parsers/WeatherParser.cs
+++ b/Server/ServerApp/Parser/Parsers/WeatherParser.cs
@@ -15,7 +15,7 @@ namespace ServerApp.Parser.Parsers
     /// Data parsed from 7am (included) to 18pm (included)
     /// </summary>
     /// <author>A. Konig</author>
-    class WeatherParser
+    public class WeatherParser
     {
 
         /// <summary> Datafile loader  </summary>
@@ -44,7 +44,7 @@ namespace ServerApp.Parser.Parsers
         {
             List<WeatherInfo> list = new List<WeatherInfo>();
 
-            if (weatherFiles == null || startTime == null || endTime == null || interval <= 0)
+            if (weatherFiles == null || interval <= 0)
                 return list;
 
             // get all files in folder
@@ -80,10 +80,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<WeatherInfo> weatherInfo = new List<WeatherInfo>();
 
-            if (!File.Exists(path))
-                return weatherInfo;
-
             List<WeatherInstance> list = loader.LoadWeatherFile(path);
+            if (list == null)
+                return weatherInfo;
 
             // array with data [temp, rain, wind, lum]
             double[] recordedAmount = new double[4];
@@ -116,8 +115,10 @@ namespace ServerApp.Parser.Parsers
                 }
 
                 // if not in allowed time window -> discard
-                if (list[i].dateTime < startTime|| list[i].dateTime > endTime)
+                if (list[i].dateTime < startTime || list[i].dateTime > endTime)
+                {
                     continue;
+                }
 
                 // aggregate data
                 recordedAmount[0] += list[i].temp;
@@ -125,14 +126,19 @@ namespace ServerApp.Parser.Parsers
                 recordedAmount[2] += list[i].wind;
 
                 if (ValueToConditions.TransferLuxToConditions(list[i].lum * 1000) != WeatherConditions.Dark)
+                {
                     recordedAmount[3] += list[i].lum * 1000; weatherValues++;
+                }
 
                 values++;
             }
 
             // data from last day
-            WeatherInfo dayInfo2 = new WeatherInfo(lastStartDay, recordedAmount[0] / values, (int)(recordedAmount[1] / values * 100), recordedAmount[2] / values, recordedAmount[3] / values, range); 
-            weatherInfo.Add(dayInfo2);
+            if (values != 0)
+            {
+                WeatherInfo dayInfo2 = new WeatherInfo(lastStartDay, recordedAmount[0] / values, (int)(recordedAmount[1] / values * 100), recordedAmount[2] / values, recordedAmount[3] / weatherValues, range);
+                weatherInfo.Add(dayInfo2);
+            }
 
             return weatherInfo;
         }
@@ -149,10 +155,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<WeatherInfo> weatherInfo = new List<WeatherInfo>();
 
-            if (!File.Exists(path))
-                return weatherInfo;
-
             List<WeatherInstance> list = loader.LoadWeatherFile(path);
+            if (list == null)
+                return weatherInfo;
 
             // min/max hour taken into account
             int[] minmaxHour = new int[] { 7, 18 };
@@ -169,6 +174,7 @@ namespace ServerApp.Parser.Parsers
             {
                 to[i] = minmaxHour[0] + interval * (i + 1);
                 data[i] = new double[4];
+                count[i] = 0;
             }
 
             // first day
@@ -208,7 +214,10 @@ namespace ServerApp.Parser.Parsers
                     lastStartTime = date;
                     count = new int[indices];
                     for (int l = 0; l < data.Length; l++)
+                    {
                         data[l] = new double[4];
+                        count[l] = 0;
+                    }
                 }
 
                 // if not in allowed time window -> discard
diff --git a/Server/ServerApp/Program.cs b/Server/ServerApp/Program.cs
index 145f31b..68531c1 100644
--- a/Server/ServerApp/Program.cs
+++ b/Server/ServerApp/Program.cs
@@ -33,7 +33,6 @@ namespace ServerApp
         {
 
 			// SETUP FOLDERS
-
 			Config config = FillConfigInfo(args);
 			if (config == null)
 			{
diff --git a/Server/TestProject/ParserTests/TestingParser.cs b/Server/TestProject/ParserTests/TestingParser.cs
new file mode 100644
index 0000000..c6d86bf
--- /dev/null
+++ b/Server/TestProject/ParserTests/TestingParser.cs
@@ -0,0 +1,711 @@
+﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using ServerApp.Parser.Parsers;
+using System.Collections.Generic;
+using ServerApp.Parser.OutputInfo;
+using Moq;
+using ServerApp.Parser.InputData;
+
+// 1h
+// 0.5h to edit parsers 
+
+namespace TestProject
+{
+
+    [TestClass]
+    public class TestingParser
+    {
+        [TestMethod]
+        public void AbstactClassTest()
+        {
+            IDataParser p = new DataParser(null);
+            List<ActivityInfo> aa = p.AttendanceList;
+            List<WeatherInfo> wa = p.WeatherList;
+
+            DataParser pp = (DataParser)p;
+            List<ActivityInfo> ap = pp.AttendanceList;
+            List<WeatherInfo> wp = pp.WeatherList;
+
+            Assert.AreEqual(aa, ap);
+            Assert.AreEqual(wa, wp);
+        }
+
+        // ------------------------------------ MERGE LISTS -------------------------------------
+
+        #region Merge lists
+        [TestMethod]
+        public void MergeListsNull()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = null;
+            List<ActivityInfo> pc = null;
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+            Assert.AreEqual(0, retVal.Count);
+        }
+
+        [TestMethod]
+        public void MergeListsJisNull()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = null;
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+            Assert.AreEqual(pc, retVal);
+        }
+
+        [TestMethod]
+        public void MergeListsPcNull()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = null;
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+            Assert.AreEqual(jis, retVal);
+        }
+
+        [TestMethod]
+        public void MergeListsOneNoOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 18, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 18, 0, 0), 3), retVal[1]);
+        }
+
+        [TestMethod]
+        public void MergeListsOneOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 8, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[0]);
+        }
+
+        [TestMethod]
+        public void MergeListsTwoNoOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3));
+            jis.Add(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 18, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 18, 0, 0), 3), retVal[3]);
+        }
+
+        [TestMethod]
+        public void MergeListsTwoOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3));
+            jis.Add(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[2]);
+        }
+
+        [TestMethod]
+        public void MergeListsMultiple()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 10, 9, 0, 0), 3));
+            jis.Add(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            jis.Add(new ActivityInfo("FDU", 3, new DateTime(2001, 4, 1, 15, 0, 0), 3));
+
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 4, 1, 15, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 10, 9, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FDU", 3, new DateTime(2001, 4, 1, 15, 0, 0), 3), retVal[3]);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 4, 1, 15, 0, 0), 3), retVal[4]);
+        }
+        #endregion
+
+        // ------------------------------ WEATHER PARSER ----------------------------------------
+
+        #region Weather parser
+
+        #region Parse days
+        [TestMethod]
+        public void ParseWeatherDayOne()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 7, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 10, 3, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 12, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 8, 50, 1.25, 10_000, 18-7), retVal[0]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherDayOneFiltering()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 7, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 10, 3, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 12, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 13, 0, 0), 12, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1, 9, 0, 0), new DateTime(2000, 1, 1, 15, 0, 0));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 9.75, 25, 1.75, 10_000, 18 - 7), retVal[0]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherDayTwo()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 6, 100, 1, 10_000, 18-7), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 7, 0, 0), 10, 25, 2, 10_000, 18-7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherDayTwoFiltering()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1, 8, 0, 0), new DateTime(2000, 1, 1, 11, 0, 0));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 6, 100, 1, 10_000, 18 - 7), retVal[0]);
+            //Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 7, 0, 0), 10, 25, 2, 10_000, 18 - 7), retVal[1]);
+        }
+        #endregion
+
+        #region Parse hours
+        [TestMethod]
+        public void ParseWeatherHourOne()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 8, 0, 0), new DateTime(2001, 1, 1, 11, 0, 0));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0),  5, 100, 0, (double)0, 2), retVal[0]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherHourMultiple()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            // day 2
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Sunny) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 15, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 8, 0, 0), new DateTime(2001, 1, 1, 11, 0, 0));
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 5, 100, 0, (double)0, 2), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 9, 0, 0), 6.5, 100, 1.5, 10_000, 2), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 11, 0, 0), 5, 0, 2, 60_000, 2), retVal[2]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 13, 0, 0), 10, 25, 2, 10_000, 2), retVal[3]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 15, 0, 0), 15, 40, 2, 10_000, 2), retVal[4]);
+        }
+
+
+        [TestMethod]
+        public void ParseWeatherHourFiltering()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            // day 2
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Sunny) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 15, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 9, 0, 0), new DateTime(2000, 2, 1, 13, 0, 0));
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 9, 0, 0), 6.5, 100, 1.5, 10_000, 2), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 11, 0, 0), 5, 0, 2, 60_000, 2), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 13, 0, 0), 10, 33, 2, 10_000, 2), retVal[2]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherHourNone()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            // day 2
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 17, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 10, 0, 0), new DateTime(2000, 2, 1, 15, 0, 0));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+        #endregion
+
+        #endregion
+
+        #region Jis parser
+
+        #region Parse days
+        [TestMethod]
+        public void ParseJisDayOne()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayOneFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 6, 0, 0), 2));
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 17, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 1, 1, 16, 0, 0));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayTwo()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+            
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 2, 1, 8, 0, 0), 8));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 2, 1, 12, 0, 0), 2));
+            data.Add(new JisInstance("A2", new DateTime(2000, 2, 1, 16, 0, 0), 1));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 2, 1, 16, 0, 0));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+
+            Assert.AreEqual(new ActivityInfo("MENZA", 10, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 1, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[3]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayTwoFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 6, 0, 0), 2));
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 2, 1, 8, 0, 0), 8));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 2, 1, 12, 0, 0), 2));
+            data.Add(new JisInstance("A2", new DateTime(2000, 2, 1, 16, 0, 0), 1));
+            data.Add(new JisInstance("A2", new DateTime(2000, 2, 1, 17, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 2, 1, 16, 0, 0));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+
+            Assert.AreEqual(new ActivityInfo("MENZA", 10, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 1, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[3]);
+        }
+
+
+        [TestMethod]
+        public void ParseJisDayNone()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 2, 15, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 3), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+        #endregion
+
+        #region Parse hours
+        [TestMethod]
+        public void ParseJisHourlyOne()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 15, 0), 3));
+
+            /*
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+            */
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 2, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 6, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayHourlyMultiple()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 15, 0), 3));
+
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 11, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 11, 10, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 11, 20, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 2, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 6, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("MENZA", 6, new DateTime(2000, 1, 1, 11, 0, 0), 2), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 2, new DateTime(2000, 1, 1, 11, 0, 0), 2), retVal[3]);
+        }
+
+        [TestMethod]
+        public void ParseJisHourlyNone()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 3, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 4, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 5, 15, 0), 3));
+
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 19, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 19, 10, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 19, 20, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+
+        [TestMethod]
+        public void ParseJisHourlyFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 6, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 15, 0), 3));
+
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 11, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 18, 10, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 19, 20, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("KARMA", 6, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("MENZA", 5, new DateTime(2000, 1, 1, 11, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("MENZA", 1, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[2]);
+        }
+
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/Server/TestProject/TestProject.csproj b/Server/TestProject/TestProject.csproj
index f3a73e8..c7574f6 100644
--- a/Server/TestProject/TestProject.csproj
+++ b/Server/TestProject/TestProject.csproj
@@ -63,7 +63,7 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="TestingParser.cs" />
+    <Compile Include="ParserTests\TestingParser.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
diff --git a/Server/TestProject/TestingParser.cs b/Server/TestProject/TestingParser.cs
deleted file mode 100644
index bf0cb90..0000000
--- a/Server/TestProject/TestingParser.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
-using System;
-using ServerApp.Parser.Parsers;
-using System.Collections.Generic;
-using ServerApp.Parser.OutputInfo;
-
-namespace TestProject
-{
-    [TestClass]
-    public class TestingParser
-    {
-        [TestMethod]
-        public void AbstactClassTest()
-        {
-            IDataParser p = new DataParser(null);
-            List<ActivityInfo> aa = p.AttendanceList;
-            List<WeatherInfo> wa = p.WeatherList;
-
-            DataParser pp = (DataParser)p;
-            List<ActivityInfo> ap = pp.AttendanceList;
-            List<WeatherInfo> wp = pp.WeatherList;
-
-            Assert.AreEqual(aa, ap);
-            Assert.AreEqual(wa, wp);
-        }
-
-        [TestMethod]
-        public void MergeListsNull()
-        {
-            DataParser target = new DataParser(null);
-            PrivateObject obj = new PrivateObject(target);
-
-            List<ActivityInfo> jis = null;
-            List<ActivityInfo> pc = null;
-
-            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
-            Assert.AreEqual(0, retVal.Count);
-        }
-
-        [TestMethod]
-        public void MergeListsJisNull()
-        {
-            DataParser target = new DataParser(null);
-            PrivateObject obj = new PrivateObject(target);
-
-            List<ActivityInfo> jis = null;
-            List<ActivityInfo> pc = new List<ActivityInfo>();
-
-            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
-            Assert.AreEqual(pc, retVal);
-        }
-
-        [TestMethod]
-        public void MergeListsPcNull()
-        {
-            DataParser target = new DataParser(null);
-            PrivateObject obj = new PrivateObject(target);
-
-            List<ActivityInfo> jis = new List<ActivityInfo>();
-            List<ActivityInfo> pc = null;
-
-            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
-            Assert.AreEqual(jis, retVal);
-        }
-    }
-}
diff --git a/TextureEditing/.vs/TextureEditing/DesignTimeBuild/.dtbcache.v2 b/TextureEditing/.vs/TextureEditing/DesignTimeBuild/.dtbcache.v2
new file mode 100644
index 0000000..04ceab7
Binary files /dev/null and b/TextureEditing/.vs/TextureEditing/DesignTimeBuild/.dtbcache.v2 differ
diff --git a/TextureEditing/.vs/TextureEditing/v16/.suo b/TextureEditing/.vs/TextureEditing/v16/.suo
new file mode 100644
index 0000000..519a727
Binary files /dev/null and b/TextureEditing/.vs/TextureEditing/v16/.suo differ
diff --git a/TextureEditing/bin/Debug/net5.0/Microsoft.Win32.SystemEvents.dll b/TextureEditing/bin/Debug/net5.0/Microsoft.Win32.SystemEvents.dll
new file mode 100644
index 0000000..d62f333
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/Microsoft.Win32.SystemEvents.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/System.Drawing.Common.dll b/TextureEditing/bin/Debug/net5.0/System.Drawing.Common.dll
new file mode 100644
index 0000000..6ab3e30
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/System.Drawing.Common.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.deps.json b/TextureEditing/bin/Debug/net5.0/TextureEditing.deps.json
new file mode 100644
index 0000000..af1786f
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/TextureEditing.deps.json
@@ -0,0 +1,92 @@
+{
+  "runtimeTarget": {
+    "name": ".NETCoreApp,Version=v5.0",
+    "signature": ""
+  },
+  "compilationOptions": {},
+  "targets": {
+    ".NETCoreApp,Version=v5.0": {
+      "TextureEditing/1.0.0": {
+        "dependencies": {
+          "System.Drawing.Common": "5.0.2"
+        },
+        "runtime": {
+          "TextureEditing.dll": {}
+        }
+      },
+      "Microsoft.NETCore.Platforms/5.0.0": {},
+      "Microsoft.Win32.SystemEvents/5.0.0": {
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "5.0.0"
+        },
+        "runtime": {
+          "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll": {
+            "assemblyVersion": "5.0.0.0",
+            "fileVersion": "5.0.20.51904"
+          }
+        },
+        "runtimeTargets": {
+          "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll": {
+            "rid": "win",
+            "assetType": "runtime",
+            "assemblyVersion": "5.0.0.0",
+            "fileVersion": "5.0.20.51904"
+          }
+        }
+      },
+      "System.Drawing.Common/5.0.2": {
+        "dependencies": {
+          "Microsoft.Win32.SystemEvents": "5.0.0"
+        },
+        "runtime": {
+          "lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "assemblyVersion": "5.0.0.2",
+            "fileVersion": "5.0.421.11614"
+          }
+        },
+        "runtimeTargets": {
+          "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "rid": "unix",
+            "assetType": "runtime",
+            "assemblyVersion": "5.0.0.2",
+            "fileVersion": "5.0.421.11614"
+          },
+          "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "rid": "win",
+            "assetType": "runtime",
+            "assemblyVersion": "5.0.0.2",
+            "fileVersion": "5.0.421.11614"
+          }
+        }
+      }
+    }
+  },
+  "libraries": {
+    "TextureEditing/1.0.0": {
+      "type": "project",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "Microsoft.NETCore.Platforms/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
+      "path": "microsoft.netcore.platforms/5.0.0",
+      "hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
+    },
+    "Microsoft.Win32.SystemEvents/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
+      "path": "microsoft.win32.systemevents/5.0.0",
+      "hashPath": "microsoft.win32.systemevents.5.0.0.nupkg.sha512"
+    },
+    "System.Drawing.Common/5.0.2": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-rvr/M1WPf24ljpvvrVd74+NdjRUJu1bBkspkZcnzSZnmAUQWSvanlQ0k/hVHk+cHufZbZfu7vOh/vYc0q5Uu/A==",
+      "path": "system.drawing.common/5.0.2",
+      "hashPath": "system.drawing.common.5.0.2.nupkg.sha512"
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.dll b/TextureEditing/bin/Debug/net5.0/TextureEditing.dll
new file mode 100644
index 0000000..4246ccd
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.exe b/TextureEditing/bin/Debug/net5.0/TextureEditing.exe
new file mode 100644
index 0000000..f74f3d9
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.exe differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.pdb b/TextureEditing/bin/Debug/net5.0/TextureEditing.pdb
new file mode 100644
index 0000000..b0270eb
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.pdb differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.dev.json b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.dev.json
new file mode 100644
index 0000000..d80adca
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.dev.json
@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "additionalProbingPaths": [
+      "C:\\Users\\Daemon\\.dotnet\\store\\|arch|\\|tfm|",
+      "C:\\Users\\Daemon\\.nuget\\packages",
+      "D:\\Instalace\\VS\\Shared\\NuGetPackages"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.json b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.json
new file mode 100644
index 0000000..a8e7e82
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.json
@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "tfm": "net5.0",
+    "framework": {
+      "name": "Microsoft.NETCore.App",
+      "version": "5.0.0"
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.zip b/TextureEditing/bin/Debug/net5.0/TextureEditing.zip
new file mode 100644
index 0000000..082307f
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.zip differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/CIV.png b/TextureEditing/bin/Debug/net5.0/data/CIV.png
new file mode 100644
index 0000000..1d27eaf
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/CIV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FAV.png b/TextureEditing/bin/Debug/net5.0/data/FAV.png
new file mode 100644
index 0000000..58222bd
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FAV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FDU.png b/TextureEditing/bin/Debug/net5.0/data/FDU.png
new file mode 100644
index 0000000..74e685d
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FDU.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FEL.png b/TextureEditing/bin/Debug/net5.0/data/FEL.png
new file mode 100644
index 0000000..0140f02
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FEL.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FST+FEK.png b/TextureEditing/bin/Debug/net5.0/data/FST+FEK.png
new file mode 100644
index 0000000..5b5ad46
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FST+FEK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/LIB.png b/TextureEditing/bin/Debug/net5.0/data/LIB.png
new file mode 100644
index 0000000..d7c3506
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/LIB.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/MENZA.png b/TextureEditing/bin/Debug/net5.0/data/MENZA.png
new file mode 100644
index 0000000..49b69fe
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/MENZA.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/REK.png b/TextureEditing/bin/Debug/net5.0/data/REK.png
new file mode 100644
index 0000000..d0aa400
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/REK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/CIV.png b/TextureEditing/bin/Debug/net5.0/output/CIV.png
new file mode 100644
index 0000000..ca90239
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/CIV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FAV.png b/TextureEditing/bin/Debug/net5.0/output/FAV.png
new file mode 100644
index 0000000..adf071f
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FAV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FDU.png b/TextureEditing/bin/Debug/net5.0/output/FDU.png
new file mode 100644
index 0000000..f4632a0
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FDU.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FEL.png b/TextureEditing/bin/Debug/net5.0/output/FEL.png
new file mode 100644
index 0000000..b944401
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FEL.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FST+FEK.png b/TextureEditing/bin/Debug/net5.0/output/FST+FEK.png
new file mode 100644
index 0000000..c4831ba
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FST+FEK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/LIB.png b/TextureEditing/bin/Debug/net5.0/output/LIB.png
new file mode 100644
index 0000000..2e404be
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/LIB.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/MENZA.png b/TextureEditing/bin/Debug/net5.0/output/MENZA.png
new file mode 100644
index 0000000..388b9ce
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/MENZA.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/REK.png b/TextureEditing/bin/Debug/net5.0/output/REK.png
new file mode 100644
index 0000000..3a773a2
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/REK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/output.csv b/TextureEditing/bin/Debug/net5.0/output/output.csv
new file mode 100644
index 0000000..3881a6d
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/output/output.csv
@@ -0,0 +1,8 @@
+CIV.png;57.287598;57.359966;49.24623;51.86722
+FAV.png;49.70703;78.37603;55.79119;50.74627
+FDU.png;31.066895;54.99349;44.702843;50.73314
+FEL.png;34.375;38.276165;52.941177;49.06015
+FST+FEK.png;36.8042;51.693443;47.44898;46.205357
+LIB.png;56.82373;60.92054;47.22222;59.360733
+MENZA.png;54.284668;37.342598;46.785713;47.482014
+REK.png;50.12207;36.60443;49.450546;50.549454
diff --git a/TextureEditing/bin/Debug/net5.0/ref/TextureEditing.dll b/TextureEditing/bin/Debug/net5.0/ref/TextureEditing.dll
new file mode 100644
index 0000000..1df0c24
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/ref/TextureEditing.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll b/TextureEditing/bin/Debug/net5.0/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll
new file mode 100644
index 0000000..8b95164
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll
new file mode 100644
index 0000000..b5aa0c4
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll
new file mode 100644
index 0000000..b80b430
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll differ
diff --git a/TextureEditing/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs b/TextureEditing/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..2f7e5ec
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+// <autogenerated />
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v5.0", FrameworkDisplayName = "")]
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfo.cs b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfo.cs
new file mode 100644
index 0000000..bd2ef73
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("TextureEditing")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyProductAttribute("TextureEditing")]
+[assembly: System.Reflection.AssemblyTitleAttribute("TextureEditing")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfoInputs.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..b441f6f
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+a034e858309ca5736878c994bb335596cdb135cd
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.GeneratedMSBuildEditorConfig.editorconfig b/TextureEditing/obj/Debug/net5.0/TextureEditing.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..d7e2983
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,8 @@
+is_global = true
+build_property.TargetFramework = net5.0
+build_property.TargetPlatformMinVersion = 
+build_property.UsingMicrosoftNETSdkWeb = 
+build_property.ProjectTypeGuids = 
+build_property.PublishSingleFile = 
+build_property.IncludeAllContentForSelfExtract = 
+build_property._SupportedPlatformList = Android,iOS,Linux,macOS,Windows
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.assets.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.assets.cache
new file mode 100644
index 0000000..e3a9198
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.assets.cache differ
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CopyComplete b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CoreCompileInputs.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..be2a405
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+a810736e97c3df7a632e96bee5699fa73ad790a8
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.FileListAbsolute.txt b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..ebe06b2
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.FileListAbsolute.txt
@@ -0,0 +1,30 @@
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.exe
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.deps.json
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.runtimeconfig.json
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.runtimeconfig.dev.json
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\ref\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.pdb
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.csprojAssemblyReference.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.GeneratedMSBuildEditorConfig.editorconfig
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.AssemblyInfoInputs.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.AssemblyInfo.cs
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.csproj.CoreCompileInputs.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\ref\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.pdb
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.genruntimeconfig.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\Microsoft.Win32.SystemEvents.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\System.Drawing.Common.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\runtimes\win\lib\netcoreapp3.0\Microsoft.Win32.SystemEvents.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\runtimes\unix\lib\netcoreapp3.0\System.Drawing.Common.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\runtimes\win\lib\netcoreapp3.0\System.Drawing.Common.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.csproj.CopyComplete
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\CIV.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FAV.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FDU.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FEL.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FST+FEK.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\LIB.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\MENZA.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\REK.png
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csprojAssemblyReference.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.csprojAssemblyReference.cache
new file mode 100644
index 0000000..d1c0ec5
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.csprojAssemblyReference.cache differ
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.dll b/TextureEditing/obj/Debug/net5.0/TextureEditing.dll
new file mode 100644
index 0000000..4246ccd
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.dll differ
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.genruntimeconfig.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.genruntimeconfig.cache
new file mode 100644
index 0000000..2daf8a6
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.genruntimeconfig.cache
@@ -0,0 +1 @@
+f7f8983b33080f7ed179e61676b834a08b448cf3
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.pdb b/TextureEditing/obj/Debug/net5.0/TextureEditing.pdb
new file mode 100644
index 0000000..b0270eb
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.pdb differ
diff --git a/TextureEditing/obj/Debug/net5.0/apphost.exe b/TextureEditing/obj/Debug/net5.0/apphost.exe
new file mode 100644
index 0000000..f74f3d9
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/apphost.exe differ
diff --git a/TextureEditing/obj/Debug/net5.0/ref/TextureEditing.dll b/TextureEditing/obj/Debug/net5.0/ref/TextureEditing.dll
new file mode 100644
index 0000000..1df0c24
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/ref/TextureEditing.dll differ
diff --git a/TextureEditing/obj/TextureEditing.csproj.nuget.dgspec.json b/TextureEditing/obj/TextureEditing.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..c93e968
--- /dev/null
+++ b/TextureEditing/obj/TextureEditing.csproj.nuget.dgspec.json
@@ -0,0 +1,72 @@
+{
+  "format": 1,
+  "restore": {
+    "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj": {}
+  },
+  "projects": {
+    "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj": {
+      "version": "1.0.0",
+      "restore": {
+        "projectUniqueName": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+        "projectName": "TextureEditing",
+        "projectPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+        "packagesPath": "C:\\Users\\Daemon\\.nuget\\packages\\",
+        "outputPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\obj\\",
+        "projectStyle": "PackageReference",
+        "fallbackFolders": [
+          "D:\\Instalace\\VS\\Shared\\NuGetPackages"
+        ],
+        "configFilePaths": [
+          "C:\\Users\\Daemon\\AppData\\Roaming\\NuGet\\NuGet.Config",
+          "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+          "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+        ],
+        "originalTargetFrameworks": [
+          "net5.0"
+        ],
+        "sources": {
+          "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+          "https://api.nuget.org/v3/index.json": {}
+        },
+        "frameworks": {
+          "net5.0": {
+            "targetAlias": "net5.0",
+            "projectReferences": {}
+          }
+        },
+        "warningProperties": {
+          "warnAsError": [
+            "NU1605"
+          ]
+        }
+      },
+      "frameworks": {
+        "net5.0": {
+          "targetAlias": "net5.0",
+          "dependencies": {
+            "System.Drawing.Common": {
+              "target": "Package",
+              "version": "[5.0.2, )"
+            }
+          },
+          "imports": [
+            "net461",
+            "net462",
+            "net47",
+            "net471",
+            "net472",
+            "net48"
+          ],
+          "assetTargetFallback": true,
+          "warn": true,
+          "frameworkReferences": {
+            "Microsoft.NETCore.App": {
+              "privateAssets": "all"
+            }
+          },
+          "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.201\\RuntimeIdentifierGraph.json"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/obj/TextureEditing.csproj.nuget.g.props b/TextureEditing/obj/TextureEditing.csproj.nuget.g.props
new file mode 100644
index 0000000..4721039
--- /dev/null
+++ b/TextureEditing/obj/TextureEditing.csproj.nuget.g.props
@@ -0,0 +1,19 @@
+﻿<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+    <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
+    <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
+    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
+    <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
+    <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Daemon\.nuget\packages\;D:\Instalace\VS\Shared\NuGetPackages</NuGetPackageFolders>
+    <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
+    <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">5.9.0</NuGetToolVersion>
+  </PropertyGroup>
+  <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+    <SourceRoot Include="C:\Users\Daemon\.nuget\packages\" />
+    <SourceRoot Include="D:\Instalace\VS\Shared\NuGetPackages\" />
+  </ItemGroup>
+  <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/TextureEditing/obj/TextureEditing.csproj.nuget.g.targets b/TextureEditing/obj/TextureEditing.csproj.nuget.g.targets
new file mode 100644
index 0000000..53cfaa1
--- /dev/null
+++ b/TextureEditing/obj/TextureEditing.csproj.nuget.g.targets
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/TextureEditing/obj/project.assets.json b/TextureEditing/obj/project.assets.json
new file mode 100644
index 0000000..c4a5c27
--- /dev/null
+++ b/TextureEditing/obj/project.assets.json
@@ -0,0 +1,219 @@
+{
+  "version": 3,
+  "targets": {
+    "net5.0": {
+      "Microsoft.NETCore.Platforms/5.0.0": {
+        "type": "package",
+        "compile": {
+          "lib/netstandard1.0/_._": {}
+        },
+        "runtime": {
+          "lib/netstandard1.0/_._": {}
+        }
+      },
+      "Microsoft.Win32.SystemEvents/5.0.0": {
+        "type": "package",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "5.0.0"
+        },
+        "compile": {
+          "ref/netstandard2.0/_._": {}
+        },
+        "runtime": {
+          "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll": {}
+        },
+        "runtimeTargets": {
+          "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll": {
+            "assetType": "runtime",
+            "rid": "win"
+          }
+        }
+      },
+      "System.Drawing.Common/5.0.2": {
+        "type": "package",
+        "dependencies": {
+          "Microsoft.Win32.SystemEvents": "5.0.0"
+        },
+        "compile": {
+          "ref/netcoreapp3.0/System.Drawing.Common.dll": {}
+        },
+        "runtime": {
+          "lib/netcoreapp3.0/System.Drawing.Common.dll": {}
+        },
+        "runtimeTargets": {
+          "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "assetType": "runtime",
+            "rid": "unix"
+          },
+          "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "assetType": "runtime",
+            "rid": "win"
+          }
+        }
+      }
+    }
+  },
+  "libraries": {
+    "Microsoft.NETCore.Platforms/5.0.0": {
+      "sha512": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
+      "type": "package",
+      "path": "microsoft.netcore.platforms/5.0.0",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "THIRD-PARTY-NOTICES.TXT",
+        "lib/netstandard1.0/_._",
+        "microsoft.netcore.platforms.5.0.0.nupkg.sha512",
+        "microsoft.netcore.platforms.nuspec",
+        "runtime.json",
+        "useSharedDesignerContext.txt",
+        "version.txt"
+      ]
+    },
+    "Microsoft.Win32.SystemEvents/5.0.0": {
+      "sha512": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
+      "type": "package",
+      "path": "microsoft.win32.systemevents/5.0.0",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "THIRD-PARTY-NOTICES.TXT",
+        "lib/net461/Microsoft.Win32.SystemEvents.dll",
+        "lib/net461/Microsoft.Win32.SystemEvents.xml",
+        "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll",
+        "lib/netstandard2.0/Microsoft.Win32.SystemEvents.xml",
+        "microsoft.win32.systemevents.5.0.0.nupkg.sha512",
+        "microsoft.win32.systemevents.nuspec",
+        "ref/net461/Microsoft.Win32.SystemEvents.dll",
+        "ref/net461/Microsoft.Win32.SystemEvents.xml",
+        "ref/netstandard2.0/Microsoft.Win32.SystemEvents.dll",
+        "ref/netstandard2.0/Microsoft.Win32.SystemEvents.xml",
+        "runtimes/win/lib/netcoreapp2.0/Microsoft.Win32.SystemEvents.dll",
+        "runtimes/win/lib/netcoreapp2.0/Microsoft.Win32.SystemEvents.xml",
+        "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll",
+        "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.xml",
+        "useSharedDesignerContext.txt",
+        "version.txt"
+      ]
+    },
+    "System.Drawing.Common/5.0.2": {
+      "sha512": "rvr/M1WPf24ljpvvrVd74+NdjRUJu1bBkspkZcnzSZnmAUQWSvanlQ0k/hVHk+cHufZbZfu7vOh/vYc0q5Uu/A==",
+      "type": "package",
+      "path": "system.drawing.common/5.0.2",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "THIRD-PARTY-NOTICES.TXT",
+        "lib/MonoAndroid10/_._",
+        "lib/MonoTouch10/_._",
+        "lib/net461/System.Drawing.Common.dll",
+        "lib/netcoreapp3.0/System.Drawing.Common.dll",
+        "lib/netcoreapp3.0/System.Drawing.Common.xml",
+        "lib/netstandard2.0/System.Drawing.Common.dll",
+        "lib/xamarinios10/_._",
+        "lib/xamarinmac20/_._",
+        "lib/xamarintvos10/_._",
+        "lib/xamarinwatchos10/_._",
+        "ref/MonoAndroid10/_._",
+        "ref/MonoTouch10/_._",
+        "ref/net461/System.Drawing.Common.dll",
+        "ref/netcoreapp3.0/System.Drawing.Common.dll",
+        "ref/netcoreapp3.0/System.Drawing.Common.xml",
+        "ref/netstandard2.0/System.Drawing.Common.dll",
+        "ref/xamarinios10/_._",
+        "ref/xamarinmac20/_._",
+        "ref/xamarintvos10/_._",
+        "ref/xamarinwatchos10/_._",
+        "runtimes/unix/lib/netcoreapp2.0/System.Drawing.Common.dll",
+        "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll",
+        "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.xml",
+        "runtimes/win/lib/netcoreapp2.0/System.Drawing.Common.dll",
+        "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll",
+        "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.xml",
+        "system.drawing.common.5.0.2.nupkg.sha512",
+        "system.drawing.common.nuspec",
+        "useSharedDesignerContext.txt",
+        "version.txt"
+      ]
+    }
+  },
+  "projectFileDependencyGroups": {
+    "net5.0": [
+      "System.Drawing.Common >= 5.0.2"
+    ]
+  },
+  "packageFolders": {
+    "C:\\Users\\Daemon\\.nuget\\packages\\": {},
+    "D:\\Instalace\\VS\\Shared\\NuGetPackages": {}
+  },
+  "project": {
+    "version": "1.0.0",
+    "restore": {
+      "projectUniqueName": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+      "projectName": "TextureEditing",
+      "projectPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+      "packagesPath": "C:\\Users\\Daemon\\.nuget\\packages\\",
+      "outputPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\obj\\",
+      "projectStyle": "PackageReference",
+      "fallbackFolders": [
+        "D:\\Instalace\\VS\\Shared\\NuGetPackages"
+      ],
+      "configFilePaths": [
+        "C:\\Users\\Daemon\\AppData\\Roaming\\NuGet\\NuGet.Config",
+        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+      ],
+      "originalTargetFrameworks": [
+        "net5.0"
+      ],
+      "sources": {
+        "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+        "https://api.nuget.org/v3/index.json": {}
+      },
+      "frameworks": {
+        "net5.0": {
+          "targetAlias": "net5.0",
+          "projectReferences": {}
+        }
+      },
+      "warningProperties": {
+        "warnAsError": [
+          "NU1605"
+        ]
+      }
+    },
+    "frameworks": {
+      "net5.0": {
+        "targetAlias": "net5.0",
+        "dependencies": {
+          "System.Drawing.Common": {
+            "target": "Package",
+            "version": "[5.0.2, )"
+          }
+        },
+        "imports": [
+          "net461",
+          "net462",
+          "net47",
+          "net471",
+          "net472",
+          "net48"
+        ],
+        "assetTargetFallback": true,
+        "warn": true,
+        "frameworkReferences": {
+          "Microsoft.NETCore.App": {
+            "privateAssets": "all"
+          }
+        },
+        "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.201\\RuntimeIdentifierGraph.json"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/obj/project.nuget.cache b/TextureEditing/obj/project.nuget.cache
new file mode 100644
index 0000000..4d4aece
--- /dev/null
+++ b/TextureEditing/obj/project.nuget.cache
@@ -0,0 +1,12 @@
+{
+  "version": 2,
+  "dgSpecHash": "PbHx0EN0q80PFjgXOEN544QPt8IiL8YyGrk5uz82rCO8saJ6wJprm+/TdpnxpbYhQxQqVduh+VA4aD37VGgsBQ==",
+  "success": true,
+  "projectFilePath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+  "expectedPackageFiles": [
+    "C:\\Users\\Daemon\\.nuget\\packages\\microsoft.netcore.platforms\\5.0.0\\microsoft.netcore.platforms.5.0.0.nupkg.sha512",
+    "C:\\Users\\Daemon\\.nuget\\packages\\microsoft.win32.systemevents\\5.0.0\\microsoft.win32.systemevents.5.0.0.nupkg.sha512",
+    "C:\\Users\\Daemon\\.nuget\\packages\\system.drawing.common\\5.0.2\\system.drawing.common.5.0.2.nupkg.sha512"
+  ],
+  "logs": []
+}
\ No newline at end of file
