public static void Execute(Beatmap beatmap)
        {
            try
            {
                var tuples = new List <Tuple <string, string, List <KeyValuePair <string, string> > > >();

                groupYmlContextLines(readAllLinesFromFile(beatmap.FullPath.Replace(".dat", ".yml")), tuples, beatmap.SongInfo.FullFolderPath);

                var walls  = new List <ObjectData>();
                var events = new List <EventData>();

                var firstTuple = tuples.First();

                if (firstTuple.Item1.Invariant("default"))
                {
                    var defaultGenerator = new WallGenerator();
                    var generatorList    = new List <WallGenerator>();

                    Global.Instance.Logger.Info("Setting all generators");
                    setGenerators(tuples, generatorList, defaultGenerator);

                    var wallList  = new List <Wall>();
                    var eventList = new List <Event>();

                    Global.Instance.Logger.Info("Generating nodes");
                    foreach (var wallGenerator in generatorList)
                    {
                        wallList.AddRange(wallGenerator.GenerateWallsFinalized());
                        eventList.AddRange(wallGenerator.GenerateEventsFinalized());
                    }

                    Global.Instance.Logger.Info("Converting nodes to objects");
                    walls.AddRange(wallList.Select(t => t.GenerateObstacle()).OrderBy(t => t.Time));
                    events.AddRange(eventList.SelectMany(t => t.GenerateEvent()).OrderBy(t => t.Time));

                    if (defaultGenerator.FlipOuterProps)
                    {
                        var eventsChanged = new int[5][] { new int[2] {
                                                               0, 0
                                                           }, new int[2] {
                                                               0, 0
                                                           }, new int[2] {
                                                               0, 0
                                                           }, new int[2] {
                                                               0, 0
                                                           }, new int[2] {
                                                               0, 0
                                                           } };
                        for (var i = 0; i <= 4; i++)
                        {
                            var highestProp = (int)defaultGenerator.GetType().GetProperties().First(f => f.Name.Invariant($"HighestProp{i}")).GetValue(defaultGenerator);
                            var lowestProp  = (int)defaultGenerator.GetType().GetProperties().First(f => f.Name.Invariant($"LowestProp{i}")).GetValue(defaultGenerator);
                            var evHigh      = events.Where(t => t.Type == i && t.CustomData.PropID == highestProp).ToArray();
                            var evLow       = events.Where(t => t.Type == i && t.CustomData.PropID == lowestProp).ToArray();
                            foreach (var ev in events)
                            {
                                if (ev.Type == i && ev.CustomData.PropID == highestProp)
                                {
                                    ev.CustomData.PropID = lowestProp;
                                    eventsChanged[i][0]++;
                                }
                                else if (ev.Type == i && ev.CustomData.PropID == lowestProp)
                                {
                                    ev.CustomData.PropID = highestProp;
                                    eventsChanged[i][1]++;
                                }
                            }
                        }
                        Global.Instance.Logger.Info($"Changed {eventsChanged.SelectMany(t => t).Sum()} events where:{Environment.NewLine}{string.Join(Environment.NewLine, eventsChanged.Select((t, i) => $"{i} type had {t[0]} highs changed and {t[1]} lows changed."))}");
                    }
                }
                else if (firstTuple.Item1.Invariant("mergeFiles"))
                {
                    var jObjects = new List <JObject>();
                    foreach (var file in firstTuple.Item3.Find(t => t.Key.Invariant("files")).Value.Split(','))
                    {
                        jObjects.Add(JObject.Parse(File.ReadAllText(Path.Combine(beatmap.SongInfo.FullFolderPath, file))));
                    }
                    foreach (var fileJObject in jObjects)
                    {
                        var eventObjects = fileJObject["_events"].ToEvent();
                        var eventOverlap = eventObjects.Where(e => events.Any(es => e.Time.Within(es.Time, timeConst))).ToArray();
                        if (eventOverlap.Length > 0)
                        {
                            foreach (var overlappedEvent in eventOverlap)
                            {
                                Global.Instance.Logger.Log(LogLevel.Warn, $"Found event overlap with constraint of {timeConst} event data:{overlappedEvent}");
                            }
                        }
                        eventObjects.CheckZoomCountEven();
                        events.AddRange(eventObjects);
                    }
                }

                var jObject          = JObject.Parse(File.ReadAllText(beatmap.FullPath));
                var oldObstaclesPath = getOldPath(beatmap, "Obstacles");
                var oldEventsPath    = getOldPath(beatmap, "Events");

                if (walls.Any())
                {
                    Global.Instance.Logger.Info("Writing wall objects and storing old objects");
                    using (var s = File.OpenWrite(Path.Combine(oldObstaclesPath, $"{DateTime.Now:yy-MM-dd hh.mm.ss}.obstacles.json")))
                        using (var sw = new StreamWriter(s))
                            using (var writer = new JsonTextWriter(sw))
                            {
                                var serializer = new JsonSerializer {
                                    Formatting = Formatting.None
                                };
                                serializer.Serialize(writer, jObject["_obstacles"]);
                            }
                    jObject["_obstacles"] = walls.ToJArray();
                }

                if (events.Any())
                {
                    Global.Instance.Logger.Info("Writing event objects and storing old objects");
                    using (var s = File.OpenWrite(Path.Combine(oldEventsPath, $"{DateTime.Now:yy-MM-dd hh.mm.ss}.events.json")))
                        using (var sw = new StreamWriter(s))
                            using (var writer = new JsonTextWriter(sw))
                            {
                                var serializer = new JsonSerializer {
                                    Formatting = Formatting.None
                                };
                                serializer.Serialize(writer, jObject["_events"]);
                            }
                    jObject["_events"] = events.ToJArray();
                }
                beatmap.EventCount    = jObject["_events"].Children().Count();
                beatmap.ObstacleCount = jObject["_obstacles"].Children().Count();
                beatmap.NoteCount     = jObject["_notes"].Children().Count();

                Global.Instance.Logger.Info("Writing finalized file");
                using (var s = File.OpenWrite(beatmap.FullPath))
                    using (var sw = new StreamWriter(s))
                        using (var writer = new JsonTextWriter(sw))
                        {
                            var serializer = new JsonSerializer {
                                Formatting = Formatting.None
                            };
                            serializer.Serialize(writer, jObject);
                        }
            }
            catch (Exception e)
            {
                Global.Instance.Logger.Error(e, e.Message);
            }
            Global.Instance.Logger.Info($"Compleated Run {++beatmap.GenCount} of  {beatmap.SongInfo.SongName}, {beatmap.Difficulty}{beatmap.BeatmapSet.CharacteristicString}");
        }