public static void main(String[] args) throws InterruptedException
    {
        Logger.initialize();
        Logger.setLoggingLevel(LoggingLevel.DEFAULT);

        // kontrola typu operacniho systemu
        if (!SystemCheck.isSupported()) {
            String message = String.format("Vas operacni system neni aplikaci podporovan. Podporovane systemy jsou pouze %s",
                    SystemType.getSupportedSystems());
            LOGGER.error("main", message);
            Message.error(message);
            exit();
        }

        config = Config.load(CONFIG_FILE);

        // pokud konfiguracni soubor neexistuje nebo bude mit spatny format, tak zobrazime okno s vyberem verzi
        // minecraftu a vygenerujem konfiguracni soubor
        if (config == null) {
            VersionSelector selector = new VersionSelector(new Executor()
            {
                @Override
                public void execute(Object source, Object userData)
                {
                    if (userData == null) {
                        LOGGER.warning("main", "Verze minecraftu nebyla vybrana a aplikace bude ukoncena");
                        exit();
                    }
                    MinecraftVersion version = (MinecraftVersion) userData;
                    config = MinecraftVersionFactory.createConfig(version);

                    // muze nastat v pripade, ze verze existuje, ale neni nastavena ve factory
                    if (config == null) {
                        LOGGER.error("main", "Verze minecraftu neni zatim inicializovana");
                        return;
                    }
                    if (!Config.save(CONFIG_FILE, config)) {
                        exit();
                    }
                }
            });
            selector.setVisible(true);
        }
        // kontrola spravne verze konfigurace a aplikace
        if (!config.application.version.equals(VERSION)) {
            String message = String.format("Verze konfiguracniho souboru %s neodpovida verzi aplikace %s",
                    config.application.version,
                    VERSION);
            LOGGER.error("main", message);
            Message.error(message);
            exit();
        }
        Logger.setLoggingLevel(config.application.loggingLevel);

        // vytvori kopii puvodni nactene konfigurace, protoze do te originalni upravime tagove hodnoty
        // do teto kopie se pozdeji prenactou knihovny a opet se ulozi
        Config returnConfig = new Config(config);

        // nacte vsechny tagy ze trid a upravi hodnoty konfiguracniho souboru "config"
        TagBuilder.addClass(Config.class, config);
        TagBuilder.addClass(JavaConfig.class, config.java);
        TagBuilder.addClass(MinecraftConfig.class, config.minecraft);
        TagBuilder.addClass(MinecraftDirectoriesConfig.class, config.minecraft.directories);
        TagBuilder.addClass(MinecraftParametersConfig.class, config.minecraft.parameters);
        TagBuilder.addClass(ApplicationConfig.class, config.application);
        TagBuilder.rebuild();

        // nacte knihovny z adresare podle nacteneho konfiguracniho souboru a soubor nize opet ulozi
        config.minecraft.availableLibs = Minecraft.loadLibraries(config.minecraft);
        returnConfig.minecraft.availableLibs = config.minecraft.availableLibs;

        if (!Config.save(CONFIG_FILE, returnConfig)) {
            exit();
        }

        // odebere vsechny soubory s logy v adresari s hrou
        if (config.application.removeLogs) {
            LogsRemover.remove(config.minecraft.directories.game);
        }

        // spusti minecraft
        MinecraftRunner mcRunner = new MinecraftRunner(config);
        mcRunner.start();

        if (config.application.consoleOutput) {
            mcRunner.join();
        } else {
            Thread.sleep(1000); // prodleva pro dokonceni zapisu do logu a uzavreni logu
        }
        exit();
    }