public void SearchDir(string path)
        {
            var search = new ByteSearch(path, LoadResults()?.Select(x => x.File));

            var charGen = new CharacterGenerator();
            var models  = charGen.GetCharacterModels(true);

            models.AddRange(charGen.GetCharacterModels(false));

            var modelPatterns = models.Select(x => (x, x.Id.ToBytes())).ToList();

            var processed = new BlockingCollection <ByteSearchResult <CharacterModel> >();

            TrackProgress(processed);

            search.Search(modelPatterns, result =>
            {
                foreach (var item in result.Results)
                {
                    Console.WriteLine($"{item.Key} -> {result.File}");
                }
                processed.Add(result);
            });

            processed.CompleteAdding();

            var results = LoadResults().Where(x => x.Found);
            var refs    = new Dictionary <Model, HashSet <string> >();

            foreach (var result in results)
            {
                foreach (var entry in result.Results)
                {
                    if (!refs.TryGetValue(entry.Key, out var files))
                    {
                        files = new HashSet <string>();
                        refs.Add(entry.Key, files);
                    }

                    var fileName = result.File.Substring(path.Length + 1).Replace("\\", "/");
                    if (fileName.EndsWith(".core"))
                    {
                        fileName = fileName.Substring(0, fileName.Length - 5);
                    }

                    files.Add(fileName);
                }
            }

            var references = refs.Select(x => new CharacterReference()
            {
                Source = x.Key.Source,
                Name   = x.Key.Name,
                Files  = x.Value.ToArray()
            });
            var json = JsonConvert.SerializeObject(references, Formatting.Indented);

            File.WriteAllText(ReferencesFile, json);
        }