public void Init()
 {
     if(Instance!=null) throw new InvalidOperationException("Bootstrap already initialized");
     var builder = new ContainerBuilder();
     builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
     Container = builder.Build();
     Instance = this;            
 }
        private void Initialize()
        {
            using (var logSubscribe = FormsLogInjectionModule.NextLoggingEvent().ToObservable(
                System.Reactive.Concurrency.Scheduler.NewThread)
                .Where(l=>l!=null)
                .Subscribe(l => SetProgressAsync(-1, l.RenderedMessage)))
            {
                try
                {
                    SetProgressAsync(0, "Building factory");
                    var bs = new Bootstrap();
                    bs.Init();
                    SetProgressAsync(30, "Init database");

                    //trackers
                    //var pTracker = bs.Container.Resolve<PerformanceCountersTracker>();
                    //pTracker.Start(TimeSpan.FromSeconds(10), "Performance");

                    //var rTracker = bs.Container.Resolve<RandomTracker>();
                    //rTracker.Start(TimeSpan.FromSeconds(1), "Random");

                    var dbCtx = bs.Container.Resolve<IDbContext>();

                    int step = 50;
                    SetProgressAsync(step, "Unpacking zip files");

                    var packagesFolder = Path.Combine(Environment.CurrentDirectory, "JS", "Packages");
                    var packagesOutputFolder = Path.Combine(Environment.CurrentDirectory, "JS");
                    if (!Directory.Exists(packagesFolder)) throw new Exception("Component folder not found: " + packagesFolder);

                    if (!ModalBootstrapConfigSection.GetConfig().JsComponents.Disabled)
                    {
                        var packStep = 20 / Math.Max(1,ModalBootstrapConfigSection.GetConfig().JsComponents.Count);
                        Action<NameValueConfigElement> Unpack =
                            (element) =>
                            {
                                step += packStep;
                                SetProgressAsync(step, "Unpacking: " + element.Name);
                                ZipFunctions.ExtractZipFile(
                                    Path.Combine(packagesFolder, element.Name),
                                    Path.Combine(packagesOutputFolder, element.Value), ZipFunctions.Functions.IfNewer);
                            }; 
                        foreach (NameValueConfigElement elem in ModalBootstrapConfigSection.GetConfig().JsComponents)
                            Unpack(elem);
                    }
                    SetProgressAsync(70, "Unpack done");

                    step = 71;
                    SetProgressAsync(step, "Restoring");

                    if (!ModalBootstrapConfigSection.GetConfig().Restore.Disabled)
                    {
                        var packStep = 10 / Math.Max(1, ModalBootstrapConfigSection.GetConfig().Restore.Count);
                        Action<string, string> Restore =
                            (filename, stringType) =>
                                {
                                    var type = Type.GetType(stringType);
                                    if(type==null) throw new Exception(stringType +" can not be resolved.");
                                    if (File.Exists(filename))
                                    {
                                        step += packStep;
                                        SetProgressAsync(step, filename + " restore");
                                        INHibernateFileBackupBase httpProxyBackup = Bootstrap.Instance.Container.Resolve(type)
                                                                          as INHibernateFileBackupBase;
                                        httpProxyBackup.BackupFile = filename;
                                        httpProxyBackup.Restore();
                                    }
                                    else
                                    {
                                        MessageBox.Show(filename + " not found");
                                    }
                                };

                        ModalBootstrapConfigSection.GetConfig().Restore.Cast<NameValueConfigElement>()
                            .ToList().ForEach(e=>Restore(e.Name, e.Value));
                    }

                    //foreach (var restor in restore) Restore(restor.Item1, restor.Item2);
                    SetProgressAsync(80, "Build menu");

                    bs.Container.Resolve<CoreContextExtensions>().getMenu();

                    SetProgressAsync(99, "Setting up registry");
                    if (!ModalBootstrapConfigSection.GetConfig().Registry.Disabled)
                    {
                        throw new NotImplementedException("registry section read is not implemented, disable it!");
                    }
                    //TODO: if not mono
                    var executableFilename = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location);
                    var keys = new[] { executableFilename, "BinaryAnalysis.GUI.vshost.exe" };

                    Action<string, object, string> SetRegistryKeyOrFail =
                        (key, val, regStr) =>
                            {
                                var reg =
                                    Registry.CurrentUser.CreateSubKey(regStr);
                                if (reg == null) throw new Exception("Failed registry: " + regStr);
                                reg.SetValue(key, val);
                            };

                    foreach (var key in keys)
                    {
                        SetRegistryKeyOrFail(key, 0, @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BLOCK_LMZ_IMG");
                        SetRegistryKeyOrFail(key, 0, @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT");
                    }

                    Thread.Sleep(500);
                    SetProgressAsync(100, "All done");
                    IsInitialized = true;
                }catch(Exception ex)
                {
                    log.Error(ex);
                    MessageBox.Show(ex.Message, "Error in init.");
                    SetProgressAsync(100);
                }
            }
        }