public void ImportingTaskStart()
        {
            var temporaryDirectory = TemporaryFileService.AllocateTemporaryDirectory(TimeSpan.FromHours(1));

            DirectoryHelpers.DirectoryCopy(Modification.RepositoryPath, temporaryDirectory, true);
            Directory.Move(temporaryDirectory, finalRepositoryPath);
            Modification = ModificationLoader.FromPath(finalRepositoryPath);
            PhaseFactory.SetModification(Modification);
            ViewModel.SetModification(Modification);

            var enabledComponent = Modification.GetComponent <EnabledComponent>();

            enabledComponent.IsEnabled = true;

            var thumbnailDirectory = Path.Combine(finalRepositoryPath, "thumbnails");

            FileSystemProxy.PrepareDirectory(thumbnailDirectory);
            var thumbnailGenerationTask = Task.Factory.StartNew(() => {
                using (var ms = new MemoryStream())
                    using (var writer = new BinaryWriter(ms)) {
                        PofSerializer.Serialize(writer, new ThumbnailGenerationParameters {
                            DestinationDirectory = thumbnailDirectory,
                            SourceDirectory      = importedDirectoryPath,
                            ThumbnailsToGenerate = 3
                        });
                        ExeggutorService.SpawnHatchling(
                            "thumbnail-generator",
                            new SpawnConfiguration {
                            InstanceName = "thumbnail-generator-" + DateTime.UtcNow.GetUnixTime(),
                            Arguments    = ms.GetBuffer()
                        });
                        var thumbnailComponent = Modification.GetComponent <ThumbnailComponent>();
                        thumbnailComponent.SelectThumbnailIfUnselected();
                    }
            }, TaskCreationOptions.LongRunning);

            var contentDirectory = Path.Combine(finalRepositoryPath, "content");

            FileSystemProxy.PrepareDirectory(contentDirectory);
            for (var i = 0; i < relativeImportedFilePaths.Length; i++)
            {
                var sourceFile      = Path.Combine(importedDirectoryPath, relativeImportedFilePaths[i]);
                var destinationFile = Path.Combine(contentDirectory, relativeImportedFilePaths[i]);
                FileSystemProxy.PrepareParentDirectory(destinationFile);
                FileSystemProxy.CopyFile(sourceFile, destinationFile);
                UpdateProgress(0.333 * ((double)i / relativeImportedFilePaths.Length));
            }

            LeagueBuildUtilities.ResolveModification(Modification, CancellationToken.None);
            UpdateProgress(0.666);

            LeagueBuildUtilities.CompileModification(Modification, CancellationToken.None);
            UpdateProgress(1);
            thumbnailGenerationTask.Wait();
            PhaseManager.Transition(PhaseFactory.Idle());
        }
        public void SpawnTrinket(IProcess targetProcess, TrinketSpawnConfiguration trinketSpawnConfiguration)
        {
            var components = new List <TrinketComponent>();

            if (trinketSpawnConfiguration.IsDebugEnabled)
            {
                components.Add(new DebugComponent());
            }
            if (trinketSpawnConfiguration.IsFileSystemHookingEnabled)
            {
                components.Add(new FilesystemComponent(trinketSpawnConfiguration.IsFileSystemOverridingEnabled));
            }
            if (trinketSpawnConfiguration.Name != null)
            {
                components.Add(new NameComponent(trinketSpawnConfiguration.Name));
            }
            if (trinketSpawnConfiguration.IsLoggingEnabled)
            {
                components.Add(new VerboseLoggerComponent());
            }
            if (trinketSpawnConfiguration.IsCommandingEnabled)
            {
                components.Add(new CommandListComponent(trinketSpawnConfiguration.CommandList));
            }
            if (trinketSpawnConfiguration.IsProcessSuspensionEnabled)
            {
                components.Add(new ProcessSuspensionComponent(trinketSpawnConfiguration.SuspendedProcessNames));
            }

            var targetProcessId      = targetProcess.Id;
            var startupConfiguration = new TrinketStartupConfigurationImpl(targetProcessId, components);

            using (var ms = streamFactory.CreateMemoryStream()) {
                pofSerializer.Serialize(ms.Writer, startupConfiguration);
                exeggutorService.SpawnHatchling(
                    kTrinketEggName,
                    new SpawnConfiguration {
                    Arguments    = ms.ToArray(),
                    InstanceName = kTrinketEggName + "_" + targetProcessId,
                    StartFlags   = HatchlingStartFlags.StartAsynchronously
                });
            }
        }