diff --git a/useful/stg312/.data.out b/useful/stg312/.data.out
index 475f41c0ae5e31e70ad6599a70aac9e3526909e6..d1e10cde50140361b6234b15184cc7c900090a51 100644
--- a/useful/stg312/.data.out
+++ b/useful/stg312/.data.out
@@ -1 +1 @@
-{"login":"root","name":"MEGA ROOT","email":"root@root.com","city":null,"status":"ok","msg":"Get informations of user successful","code":"002"}
\ No newline at end of file
+{"login":"root","name":"Alessandro Elias","email":"ae11@c3sl.ufpr.br","city":null,"status":"ok","msg":"Get informations of user successful","code":"002"}
\ No newline at end of file
diff --git a/useful/stg312/.size.out b/useful/stg312/.size.out
index b2a5411b4f58dd832e211adebe54449bc667b1ac..d0b3492b0333971d9accd1f181b7fb2cefe411b4 100644
--- a/useful/stg312/.size.out
+++ b/useful/stg312/.size.out
@@ -1 +1 @@
-1725600	testando-sem-crc-2.r1.tar.gz
+1725528	testando.r1.tar.gz
diff --git a/useful/stg312/.upid.out b/useful/stg312/.upid.out
index c39cab2506cdae4bac0191b7f65efca588bed9d7..8409c26bf6945242cf9ebac5fe37e28b24baa8cd 100644
--- a/useful/stg312/.upid.out
+++ b/useful/stg312/.upid.out
@@ -1 +1 @@
-{"uploadid":"QzD0kFOzZ5W22miyHCooFOsN85ypK4ZsjRp","status":"ok","code":"003","msg":"New upload succesful"}
\ No newline at end of file
+{"uploadid":"0EFU45ZEhSpi7r3vRDv2zZW7stBu76SC10g","status":"ok","code":"003","msg":"New upload succesful"}
\ No newline at end of file
diff --git a/useful/stg312/openslx_gui b/useful/stg312/openslx_gui
index f85970bf66db33352eb881a20c42cd7551632f7a..42d6d6efe29a28946333710762d873f60041222c 100755
Binary files a/useful/stg312/openslx_gui and b/useful/stg312/openslx_gui differ
diff --git a/useful/stg312/openslx_gui.c b/useful/stg312/openslx_gui.c
index a9dfc385f89da08bad5b858461ad6f1362333a54..d02d7163ad85a92ae57e103b660dced0ddd96690 100644
--- a/useful/stg312/openslx_gui.c
+++ b/useful/stg312/openslx_gui.c
@@ -23,11 +23,11 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){
     char *old_upload;
     old_upload = malloc(255*sizeof(char));
 
-    dados *data_ant = p;
+    dados *data_ant = p; //Pega os dados recebidos pela chamada da função
     janela_ant = (GtkWidget*) data_ant->dado1;
 
-    builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+    builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
 
 	button_continua_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_continua_upload"));
 	button_nao_continua = GTK_WIDGET(gtk_builder_get_object(builder, "button_nao_continua"));
@@ -66,10 +66,10 @@ void tela_principal(GtkWidget *w,gpointer p){
         g_spawn_command_line_sync("./squash.sh 1", NULL, NULL, &status, NULL); // Executa o script
     }
 
-    builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+    builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
 
-    dados *data_ant = p;
+    dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 
     FILE *upload_antigo = fopen(".progress.out", "w");
     fclose(upload_antigo);
@@ -129,8 +129,8 @@ void tela_login(){
 	GtkWidget *window_login, *button_login, *entry_login, *entry_passwd, *label_login_erro;
 	GtkBuilder *builder;
 
-	builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+	builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
     printf("Linha %d\n", __LINE__);
 
 	window_login = GTK_WIDGET(gtk_builder_get_object(builder, "window_login"));
diff --git a/useful/stg312/openslx_gui_v01.glade b/useful/stg312/openslx_gui_v01.glade
index 4d6be6a086ac38402d68d4ad6aba2ecff3abab00..00e5f3ce6a29b7b604642f5a4bd1e704e408c88b 100644
--- a/useful/stg312/openslx_gui_v01.glade
+++ b/useful/stg312/openslx_gui_v01.glade
@@ -4,8 +4,11 @@
   <requires lib="gtk+" version="3.10"/>
   <object class="GtkMessageDialog" id="error_dialog">
     <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <property name="window_position">center</property>
     <property name="icon">openslx_icon</property>
     <property name="type_hint">dialog</property>
+    <property name="gravity">center</property>
     <property name="message_type">error</property>
     <property name="buttons">ok</property>
     <property name="text" translatable="yes">Algum dos passos do processo não foi completado com sucesso.              </property>
@@ -58,6 +61,7 @@ O programa irá sair agora.</property>
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="margin_left">10</property>
+        <property name="margin_bottom">5</property>
         <property name="row_spacing">10</property>
         <property name="column_spacing">10</property>
         <child>
@@ -476,6 +480,7 @@ Se precisar de ajuda, ative
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="margin_left">10</property>
+        <property name="margin_bottom">5</property>
         <property name="row_spacing">35</property>
         <property name="column_spacing">10</property>
         <property name="column_homogeneous">True</property>
@@ -486,6 +491,7 @@ Se precisar de ajuda, ative
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
             <property name="tooltip_text" translatable="yes">Segue com a geração da imagem.</property>
+            <property name="margin_right">5</property>
           </object>
           <packing>
             <property name="left_attach">2</property>
@@ -567,6 +573,7 @@ instalar softwares</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
             <property name="tooltip_text" translatable="yes">Abre o software Gerenciador de Pacotes do Ubuntu para te auxiliar a instalar os pacotes desejados. Essa opção pode ser demorada pois o software é pesado. Se estiver utilizando um computador mais velho tente optar pelo Shell.</property>
+            <property name="margin_right">5</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
@@ -702,6 +709,7 @@ disponível no nosso site.
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="margin_left">10</property>
+        <property name="margin_bottom">5</property>
         <property name="row_spacing">15</property>
         <property name="column_spacing">10</property>
         <child>
@@ -1251,6 +1259,8 @@ em outras máquinas!</property>
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="margin_left">10</property>
+        <property name="margin_right">5</property>
+        <property name="margin_bottom">5</property>
         <property name="row_spacing">5</property>
         <child>
           <object class="GtkGrid" id="grid8">
@@ -1417,6 +1427,10 @@ em outras máquinas!</property>
       <object class="GtkGrid" id="grid10">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
+        <property name="margin_left">5</property>
+        <property name="margin_right">5</property>
+        <property name="margin_top">5</property>
+        <property name="margin_bottom">5</property>
         <child>
           <object class="GtkFrame" id="frame5">
             <property name="visible">True</property>
diff --git a/useful/stg312/stg4.c b/useful/stg312/stg4.c
index f7fcee3783c100df18c8389cfac4c783fd050afe..a8a2f3df6dcd0e2bd7b76514a2eafcd8fdd55593 100644
--- a/useful/stg312/stg4.c
+++ b/useful/stg312/stg4.c
@@ -12,18 +12,31 @@
 #include <gdk/gdk.h>
 #include <glib.h>
 
-void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p){
+//void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p){
+void stg4_tela_confirmacao_upload(GPid pid, gint status,gpointer p){
 	//pid_t pid; // Para quando for implementado
 	GtkWidget *window_stg4_upload_confirm, *janela_ant, *button_return_upload_confirm; //*loading_screen; // Para quando for implementado
 	GtkBuilder *builder;
 
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
+
+	/////////
+	GtkWidget *loading;
+	loading = data_ant->dado6;
+	pid = data_ant->pid;
+	//gtk_widget_show(window);
+	checa_sucesso();
+	g_spawn_close_pid(pid);
+    /////////////
+
     puts("Aqui");
 
-	dados *data_ant = p;
+
 	puts("Aqui8");
 	janela_ant = (GtkWidget*) data_ant->dado1;
 	puts("Aqui7");
-	builder = data_ant->builder;
+    builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
 
     puts("Aqui6");
 
@@ -51,6 +64,7 @@ void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p){
 
 	gtk_widget_hide(janela_ant);
 	puts("Aqui4");
+	gtk_widget_hide(loading);
 	gtk_widget_show_all(window_stg4_upload_confirm);
 	puts("Aqui5");
 }
@@ -60,7 +74,7 @@ void stg4_tela_img_select(GtkWidget *w,gpointer p){
 	GtkWidget *window_escolha_imagem, *janela_ant, *button_update_img; //*loading_screen; // Para quando for implementado
 	GtkBuilder *builder;
 
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	janela_ant = (GtkWidget*) data_ant->dado1;
 	builder = data_ant->builder;
 	int status;
@@ -82,7 +96,78 @@ void stg4_tela_img_select(GtkWidget *w,gpointer p){
 	gtk_widget_hide(janela_ant);
 	gtk_widget_show_all(window_escolha_imagem);
 }
+
 // // A função que exibe a 3a tela do programa, a tela final
+void stg4_2a_tela(GPid pid, gint status,gpointer p){
+
+	GtkWidget *window_stg4_final, *button_stg4_final_sair, *janela_ant, *button_help_4at, *button_stg4_upload, *label_tempo_upload;
+	GtkBuilder *builder;
+    char *texto_tempo_upload, *temp;
+    texto_tempo_upload = malloc(255*sizeof(char));
+    temp = malloc(255*sizeof(char));
+
+
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
+	janela_ant = (GtkWidget*) data_ant->dado1;
+	builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
+
+
+    GtkWidget *loading;
+	loading = data_ant->dado6;
+	pid = data_ant->pid;
+
+	//gtk_widget_show(window);
+	checa_sucesso();
+	g_spawn_close_pid(pid);
+
+	window_stg4_final = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_final"));
+	g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL);
+
+	struct dados *data = malloc(sizeof(*data));
+
+
+    data->dado2 = window_stg4_final;
+    data->control = 0;
+
+    button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at"));
+    button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair"));
+    button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload"));
+    label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload"));
+    printf("Linha %d\n", __LINE__);
+    strcpy(texto_tempo_upload, "Tempo estimado de upload: ");
+    sprintf(temp, "%d",calcula_tempo_upload() );
+    printf("Linha %d\n", __LINE__);
+    strcat(texto_tempo_upload, temp);
+    printf("Linha %d\n", __LINE__);
+    strcat(texto_tempo_upload, " segundos");
+    printf("Linha %d\n", __LINE__);
+    gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload);
+    printf("Linha %d\n", __LINE__);
+    data->dado2 = button_stg4_final_sair;
+    data->dado3 = data_ant->dado4;
+    data->dado4 = data_ant->dado3;
+    data->dado5 = data_ant->dado5;
+    data->dado1 = window_stg4_final;
+    data->builder = builder;
+    printf("Linha %d\n", __LINE__);
+    g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla
+    g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL);
+    printf("Linha %d\n", __LINE__);
+    //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data);
+    g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data);
+    //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_dummy), data);
+    printf("Linha %d\n", __LINE__);
+    g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data);
+    printf("Linha %d\n", __LINE__);
+    gtk_widget_hide(janela_ant);
+    printf("Linha %d\n", __LINE__);
+    gtk_widget_hide(loading);
+    gtk_widget_show_all(window_stg4_final);
+    printf("Linha %d\n", __LINE__);
+
+}
+
 void stg4_clique_2a_tela(GtkWidget *w,gpointer p){
 
 	GPid pid;
@@ -104,7 +189,7 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){
     texto_tempo_upload = malloc(255*sizeof(char));
     temp = malloc(255*sizeof(char));
 
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	janela_ant = (GtkWidget*) data_ant->dado1;
 	builder = data_ant->builder;
 
@@ -116,119 +201,102 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){
 
 	struct dados *data = malloc(sizeof(*data));
 
-		//tmscripts = acha_tm_scripts();
-		acha_tm_scripts(tmscripts);
-
-		strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4)));
-
-		strcat(version, ".r1");
-
-		strcpy(home, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3)));
-
-		strcpy(pasta_do_stg4, home);
-		strcat(home, "/pasta-");
-		strcat(home, version);
-		strcat(tmscripts, "/scripts");
-
-		//gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags,
-		// GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error);
-
-		//strcpy(argv[0], CLONE_STG4_SCRIPT_DUMMY);
-		strcpy(argv[0], CLONE_STG4_SCRIPT);
-
-		strcpy(argv[1], tmscripts);
-
-		strcpy(argv[2], pasta_do_stg4);
-
-		strcpy(argv[3], "local");
-
-		strcpy(argv[4], home	);
-
-		strcpy(argv[5], version);
-
-		if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6)))
-			strcpy(argv[6], "1");
-		else
-			strcpy(argv[6], "0");
-
-        sprintf(number_of_parts_str, "%d", NUMBER_OF_PARTS);
-        strcpy(argv[7], number_of_parts_str);
-
-		argv[8] =  NULL;
-
-		if(g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL)){
-            puts("Deu certo o spawn");
-		}
-		//, environ);
-
-		data->dado6 = loading_screen;
-		data->dado2 = window_stg4_final;
-		data->control = 0;
-
-		data->pid = pid;
-
-		handler = sai_do_script;
-
-		g_child_watch_add(pid, handler, data);
-        printf("Linha %d\n", __LINE__);
-
-
-		/*
-		 * checa_sucesso(); //Checa se o script foi executado corretamente
-
-			strcpy(pasta_do_stg4, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3)));
-			strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4)));
-			strcat(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado5)));
-			//strcpy(local, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado2)));
-			strcpy(local,  gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3)));
-			strcat(local, "/pasta-");
-			strcat(local, version);
-
-			if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6))){
-				execlp("./squash.sh", "./squash.sh", "0", local, version, "1",pasta_do_stg4, NULL);// se o usuário decidiu remover os arquivos não compactados
-			}else{
-				execlp("./squash.sh", "./squash.sh", "0", local, version, "0",pasta_do_stg4, NULL);// Se o usuário decidiu não remover os arquivos compactados
-			}
-			* */
-
-
-
-            printf("Linha %d\n", __LINE__);
-			button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at"));
-			button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair"));
-            button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload"));
-            label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload"));
-            printf("Linha %d\n", __LINE__);
-            strcpy(texto_tempo_upload, "Tempo estimado de upload: ");
-            sprintf(temp, "%d",calcula_tempo_upload() );
-            printf("Linha %d\n", __LINE__);
-            strcat(texto_tempo_upload, temp);
-            printf("Linha %d\n", __LINE__);
-            strcat(texto_tempo_upload, " segundos");
-            printf("Linha %d\n", __LINE__);
-            gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload);
-            printf("Linha %d\n", __LINE__);
-			data->dado2 = button_stg4_final_sair;
-			data->dado3 = data_ant->dado4;
-			data->dado4 = data_ant->dado3;
-			data->dado5 = data_ant->dado5;
-			data->dado1 = window_stg4_final;
-			data->builder = builder;
-            printf("Linha %d\n", __LINE__);
-			g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla
-			g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL);
-            printf("Linha %d\n", __LINE__);
-			g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data);
-			//g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data);
-			//g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_dummy), data);
-            printf("Linha %d\n", __LINE__);
-			g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data);
-            printf("Linha %d\n", __LINE__);
-			gtk_widget_hide(janela_ant);
-			printf("Linha %d\n", __LINE__);
-			gtk_widget_show_all(window_stg4_final);
-			printf("Linha %d\n", __LINE__);
-
+    acha_tm_scripts(tmscripts);
+
+    strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4)));
+
+    strcat(version, ".r1");
+
+    strcpy(home, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3)));
+
+    strcpy(pasta_do_stg4, home);
+    strcat(home, "/pasta-");
+    strcat(home, version);
+    strcat(tmscripts, "/scripts");
+
+    //gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags,
+    // GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error);
+
+    strcpy(argv[0], CLONE_STG4_SCRIPT_DUMMY);
+    //strcpy(argv[0], CLONE_STG4_SCRIPT);
+
+    strcpy(argv[1], tmscripts);
+
+    strcpy(argv[2], pasta_do_stg4);
+
+    strcpy(argv[3], "local");
+
+    strcpy(argv[4], home	);
+
+    strcpy(argv[5], version);
+
+    if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6)))
+        strcpy(argv[6], "1");
+    else
+        strcpy(argv[6], "0");
+
+    sprintf(number_of_parts_str, "%d", NUMBER_OF_PARTS);
+    strcpy(argv[7], number_of_parts_str);
+
+    argv[8] =  NULL;
+
+    if(g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL)){
+        puts("Deu certo o spawn");
+    }
+
+
+    data->dado6 = loading_screen;
+    data->dado2 = window_stg4_final;
+    data->dado4 = data_ant->dado4;
+    data->dado3 = data_ant->dado3;
+    data->dado5 = data_ant->dado5;
+    data->control = 0;
+    data->dado1 = data_ant->dado1;
+
+    data->pid = pid;
+
+    handler = stg4_2a_tela;
+    //handler = sai_do_script_teste;
+
+    g_child_watch_add(pid, handler, data);
+   /* printf("Linha %d\n", __LINE__);
+
+    printf("Linha %d\n", __LINE__);
+    button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at"));
+    button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair"));
+    button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload"));
+    label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload"));
+    printf("Linha %d\n", __LINE__);
+    strcpy(texto_tempo_upload, "Tempo estimado de upload: ");
+    sprintf(temp, "%d",calcula_tempo_upload() );
+    printf("Linha %d\n", __LINE__);
+    strcat(texto_tempo_upload, temp);
+    printf("Linha %d\n", __LINE__);
+    strcat(texto_tempo_upload, " segundos");
+    printf("Linha %d\n", __LINE__);
+    gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload);
+    printf("Linha %d\n", __LINE__);
+    data->dado2 = button_stg4_final_sair;
+    data->dado3 = data_ant->dado4;
+    data->dado4 = data_ant->dado3;
+    data->dado5 = data_ant->dado5;
+    data->dado1 = window_stg4_final;
+    data->builder = builder;
+    printf("Linha %d\n", __LINE__);
+    g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla
+    g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL);
+    printf("Linha %d\n", __LINE__);
+    //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data);
+    g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data);
+    //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_dummy), data);
+    printf("Linha %d\n", __LINE__);
+    g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data);
+    printf("Linha %d\n", __LINE__);
+    gtk_widget_hide(janela_ant);
+    printf("Linha %d\n", __LINE__);
+    gtk_widget_show_all(window_stg4_final);
+    printf("Linha %d\n", __LINE__);
+*/
 
 }
 
@@ -238,7 +306,7 @@ void stg4_clique_1a_tela(GtkWidget *w,gpointer p){
 	GtkWidget *window_stg4_escolha, *janela_ant, *button_clonar, *entry_imagem, *file_chooser_local, *button_help_2at, *check_button_remove;
 	GtkBuilder *builder;
 
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	janela_ant = (GtkWidget*) data_ant->dado1;
 	builder = data_ant->builder;
 
@@ -281,7 +349,7 @@ void stg4_inicio(GtkWidget *w,gpointer p){
 	GtkWidget *window_stg4_inic, *janela_ant, *button_geren, *button_stg4_proximo, *button_help_1at;
 	GtkBuilder *builder;
 
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	janela_ant = (GtkWidget*) data_ant->dado1;
 	builder = data_ant->builder;
 
diff --git a/useful/stg312/stg4.h b/useful/stg312/stg4.h
index 461788452af71ef4c6cce5d2dcf57c16877d58d8..2a866f0f2a389d41a17d74fd90416310e015dcc0 100644
--- a/useful/stg312/stg4.h
+++ b/useful/stg312/stg4.h
@@ -8,7 +8,8 @@
 #include <sys/wait.h>
 
 
-void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p);
+//void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p);
+void stg4_tela_confirmacao_upload(GPid pid, gint status,gpointer p);
 
 // A função que exibe a quarta tela do programa, a tela final
 
diff --git a/useful/stg312/upload-utils.c b/useful/stg312/upload-utils.c
index e9a0785cc2044ab3fcbdacfeed18c7d9329d04ff..324a3452b45d10c07bd3dffcdd97bf045e842d4d 100644
--- a/useful/stg312/upload-utils.c
+++ b/useful/stg312/upload-utils.c
@@ -17,6 +17,32 @@
 #include <sys/types.h>
 #include <signal.h>
 
+
+void logout(){
+
+    CURL *curl;
+
+
+    curl = curl_easy_init();
+    if(curl) {
+
+        curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0");
+        curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 );
+        curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie");
+        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie");
+
+        curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);
+        curl_easy_setopt(curl, CURLOPT_HEADER, 0);
+
+        //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice");
+        curl_easy_setopt(curl, CURLOPT_URL, API_URL);
+        curl_easy_setopt(curl, CURLOPT_POST, 1);
+        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "request=logout");
+        curl_easy_perform(curl);
+    }
+
+}
+
 int checa_upload_antigo(){
 
     FILE *upload_in_progress;
@@ -287,14 +313,14 @@ int checa_sucesso_get_info(){
 //Função que faz o Login do usuario no sistema. Utiliza a biblioteca Libcurlc para realizar as requisições http.
 // Guarda as saidas em arquivos para uso posterios. Guarda o cookie para uso posterios tbm
 int faz_login_dummy(GtkWidget *w, gpointer p){
-    dados *data_ant = p;
+    dados *data_ant = p; //Pega os dados recebidos pela chamada da função
     tela_principal(NULL, data_ant);
     return 1;
 }
 
 int faz_login(GtkWidget *w, gpointer p){
 
-    dados *data_ant = p;
+    dados *data_ant = p; //Pega os dados recebidos pela chamada da função
     CURL *curl;
     char *data = malloc(255*sizeof(char));
     strcpy(data, "login=");
@@ -381,7 +407,7 @@ int faz_login(GtkWidget *w, gpointer p){
 
 //Função que faz o upload da imagem + dados para a api do site. Atualmente faz upload só de UM arquivo
 void faz_upload_dummy(GtkWidget *w, gpointer p){
-    stg4_tela_confirmacao_upload(NULL, p);
+   // stg4_tela_confirmacao_upload(NULL, p);
 }//Função de teste dummy
 
 //função de teste que faz upload da imagem teste.r1
@@ -389,6 +415,7 @@ void faz_upload_teste(GtkWidget *w, gpointer p){
 
     GtkWidget *loading, *window_stg4_upload_confirm;
 	GtkBuilder *builder;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
     int i;
     struct dados *data = malloc(sizeof(*data));
     GPid pid;
@@ -399,8 +426,8 @@ void faz_upload_teste(GtkWidget *w, gpointer p){
 		argv[i] = malloc(255*sizeof(char));
 	}
 
-    builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+    builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
     loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen"));
     window_stg4_upload_confirm = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_upload_confirm"));
 
@@ -411,19 +438,20 @@ void faz_upload_teste(GtkWidget *w, gpointer p){
     strcpy(argv[3], ".r1");
     argv[4] = NULL;
     g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL);
-    handler = sai_do_script;
+    handler = stg4_tela_confirmacao_upload;
     data->dado6 = loading;
-    data->dado1 = window_stg4_upload_confirm;
+    data->dado1 = data_ant->dado1;
     data->pid = pid;
     g_child_watch_add(pid, handler, data);
-    stg4_tela_confirmacao_upload(NULL, p);
+   // stg4_tela_confirmacao_upload(NULL, p);
 
 }
 
 void faz_upload(GtkWidget *w, gpointer p){
 
-    GtkWidget *loading;
-	dados *data_ant = p;
+    printf("Linha faz upload %d\n", __LINE__);
+    GtkWidget *loading, *window_stg4_upload_confirm;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	GtkBuilder *builder;
     struct dados *data = malloc(sizeof(*data));
     int i;
@@ -434,22 +462,33 @@ void faz_upload(GtkWidget *w, gpointer p){
 	for (i=0; i < 10; i++){
 		argv[i] = malloc(255*sizeof(char));
 	}
+    printf("Linha %d\n", __LINE__);
 
-    builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+    builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
     loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen"));
+    window_stg4_upload_confirm = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_upload_confirm"));
+
+    printf("Linha %d\n", __LINE__);
 
     gtk_widget_show_all(loading);
+    printf("Linha %d\n", __LINE__);
     strcpy(argv[0], "./upload");
     strcpy(argv[1], gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado4)));
     strcpy(argv[2], gtk_entry_get_text(GTK_ENTRY(data_ant->dado3)));
     strcpy(argv[3], ".r1");
     argv[4] = NULL;
+    printf("Linha %d\n", __LINE__);
     g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL);
-    handler = sai_do_script;
+
+    printf("Linha %d\n", __LINE__);
+
+    handler = stg4_tela_confirmacao_upload;
     data->dado6 = loading;
+    data->dado1 = data_ant->dado1;
     data->pid = pid;
+    printf("Linha %d\n", __LINE__);
     g_child_watch_add(pid, handler, data);
-    stg4_tela_confirmacao_upload(NULL, p);
+    //stg4_tela_confirmacao_upload(NULL, p);
 
 }
diff --git a/useful/stg312/upload-utils.h b/useful/stg312/upload-utils.h
index f021d4813501fa1d1649fe0b206505d858504635..f7f0fa6f12d9088326147c52d95c9e2479523599 100644
--- a/useful/stg312/upload-utils.h
+++ b/useful/stg312/upload-utils.h
@@ -6,7 +6,7 @@
 #include <errno.h>
 #include <sys/wait.h>
 
-
+void logout();
 int checa_upload_antigo();
 int calcula_tempo_upload();
 void gera_arquivo_dados_usuario();
diff --git a/useful/stg312/utils.c b/useful/stg312/utils.c
index 34370a58fbfe629989e3a7560efec5345b49a23d..ce290603f398453fff1d67f6b2982d9b1147c250 100644
--- a/useful/stg312/utils.c
+++ b/useful/stg312/utils.c
@@ -35,12 +35,12 @@ void acha_tm_scripts(char *path){
 }
 
 
-
-gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ //funcção que lida com os inputs do teclado. Ver https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h para uma lista completa das Macros de teclas.
+//função que lida com os inputs do teclado. Ver https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h para uma lista completa das Macros de teclas.
+gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){
 
 	gpointer window, button;
 	window = w;
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	button = data_ant->dado2; //Botão que da continuidade ao software, dado->2 por comodidade.
 
 	switch (event->keyval){
@@ -70,51 +70,26 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ //funcçã
 return FALSE;
 }
 
+//Função que abre o software center do sistema
 void abre_software_center(GtkWidget *w, gpointer p){
 
     int status;
     puts("software center");
-    g_spawn_command_line_sync("software-center", NULL, NULL, &status, NULL);
-	/*pid_t pid;
-	int status;
-
-	pid = fork();
-
-	//pid = 2;
-	if(pid == 0){
-		execlp("software-center", "", NULL);
-		perror("O comando não foi executado corretamente. Erro: Saindo do programa. "); // Caso ocorra algum erro com o execlp.
+    g_spawn_command_line_sync("software-center", NULL, NULL, &status, NULL); //o comando "software-center" ainda não funciona, trocar por um outro funcional
 
-		gtk_main_quit();
-		exit(1);
-	}
-	waitpid(pid, &status, 0); // Espera o script terminar de rodar*/
 }
 
+//Função que abre um shell para instalar os pacotes.
 void abre_shell(GtkWidget *w, gpointer p){
 
     int status;
 
-    g_spawn_command_line_sync("x-terminal-emulator", NULL, NULL, &status, NULL); // Executa o script
-
-
-	/*pid_t pid;
-	int status;
-
-	pid = fork();
+    g_spawn_command_line_sync("x-terminal-emulator", NULL, NULL, &status, NULL); // Abre o shell
 
 
-	//pid = 2;
-	if(pid == 0){
-		execlp("x-terminal-emulator", "", NULL);
-		perror("O comando não foi executado corretamente. Erro: Saindo do programa. "); // Caso ocorra algum erro com o execlp.
-
-		gtk_main_quit();
-		exit(1);
-	}
-	waitpid(pid, &status, 0); // Espera o script terminar de rodar*/
 }
 
+/*
 void logout(){
 
     CURL *curl;
@@ -138,8 +113,10 @@ void logout(){
         curl_easy_perform(curl);
     }
 
-}
+}*/
 
+
+//Função que sai do programa, fazendo logout antes
 void sair(GtkWidget *w, gpointer p){
 
     logout();
@@ -157,17 +134,15 @@ int checa_sucesso(){
     GtkWidget *dialogo;
 	GtkBuilder *builder;
 
-	builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
-
-	//controle = (char*) malloc(5*sizeof(char));
+	builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
 
-    dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "error_dialog"));
+    dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "error_dialog")); //Carrega o dialogo de erro
 
 	resultado = fopen(".result.out", "r"); // .result.out é o arquivo que armazena se o script foi executado corretamente ou não
 
 	if(resultado != NULL){
-		fread(&controle, sizeof(char), 1, resultado);
+		fread(&controle, sizeof(char), 1, resultado); //Lê a saida do script
 		printf("Controle = %c\n", controle);
 
 		if(controle == 's'){ //Caso o script não tenha sido executado com sucesso o programa informa o usuário por meio de uma janela de dialogo do GTK
@@ -178,7 +153,7 @@ int checa_sucesso(){
 
 				return(1);
 			}else{
-				gtk_dialog_run(GTK_DIALOG(dialogo));
+				gtk_dialog_run(GTK_DIALOG(dialogo)); //Mostra a janela de erro
 				gtk_widget_destroy(dialogo);
 				system("rm .result.out"); // Remove o arquivo após a verificação para não dar conflito com o segundo script e execuções futuras do programa
 				gtk_main_quit();
@@ -186,7 +161,7 @@ int checa_sucesso(){
 			}
 		}
 
-	}else{ //Se o arquivo não existir algo de errado aconteceu na execução do programa, como por exemplo o usuário não informou nenhum campo na segunda tela.
+	}else{ //Se o arquivo não existir algo de errado aconteceu na execução do programa, como por exemplo o usuário não informou nenhum campo na tela de clonagem.
 		puts("Arquivo não encontrado, erro crítico. Saíndo do programa.");
 		gtk_main_quit();
 		exit(1);
@@ -194,39 +169,38 @@ int checa_sucesso(){
 return(0);
 }
 
-// Acha o caminho para o tm-scripts
-
 
+// Função que verifica se o usuário inseriu um nome com espaços no campo nome da imagem
 void stg4_clique_2a_tela_caller(GtkWidget *w, gpointer p){
     GtkWidget *entry;
-    dados *data_ant = p;
+    dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 
     GtkWidget *dialogo;
 	GtkBuilder *builder;
 
-	builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+	builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
 
-    dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "space_dialog"));
+    dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "space_dialog")); //Carrega o dialogo de erro caso ele tenha utilizado espaços
 
 	entry = data_ant->dado4;
 
-    if(strchr(gtk_entry_get_text(GTK_ENTRY(entry)), ' ') == NULL){
-        stg4_clique_2a_tela(w, p);
+    if(strchr(gtk_entry_get_text(GTK_ENTRY(entry)), ' ') == NULL){ //Verifica se ele utilizou espaços
+        stg4_clique_2a_tela(w, p); //Caso ele não tenha inserido espaços
     }else{
-        gtk_dialog_run(GTK_DIALOG(dialogo));
+        gtk_dialog_run(GTK_DIALOG(dialogo)); //Caso tenha inserido espaços
         gtk_widget_destroy(dialogo);
     }
 }
 
-
+//Altera o texto da janela de ajuda
 void altera_texto_help(GtkWidget *w, gpointer p){
 
 	const char *nome;
 	int nome_int;
 	GtkWidget *label;
 
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	label = data_ant->dado1;
 
 	nome = gtk_widget_get_name(w);
@@ -259,13 +233,14 @@ void altera_texto_help(GtkWidget *w, gpointer p){
 
 }
 
+//Janela de ajuda
 void help_screen(GtkWidget *w, gpointer p){
 	GtkWidget *window_help, *button_help_inicio, *button_help_2a_tela, *button_help_3a_tela, *button_help_4a_tela, *button_help_5a_tela, *label_help_info;
 	GtkBuilder *builder;
 
 
-	builder = gtk_builder_new();
-	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL);
+	builder = gtk_builder_new(); //Cria um novo Builder gtk
+	gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets
 
 	button_help_inicio = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_inicio"));
 	button_help_2a_tela = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_2a_tela"));
@@ -291,21 +266,23 @@ void help_screen(GtkWidget *w, gpointer p){
 
 }
 
+//Sai do script chamado, verificando o sucesso
 void sai_do_script(GPid pid, gint status, gpointer p){
 
 	GtkWidget *loading;
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	loading = data_ant->dado6;
 	pid = data_ant->pid;
-	gtk_widget_hide(loading);
+	gtk_widget_hide(loading); //Esconde a tela de loading
 	//gtk_widget_show(window);
-	checa_sucesso();
-	g_spawn_close_pid(pid);
+	checa_sucesso(); //Checa se o script foi executdo corretamente
+	g_spawn_close_pid(pid); //Mata o processo do script
 
 }
 
+//Fecha a janela que chama essa função e mostra a janela principal
 void mata_janela_e_chama_tela_principal(GtkWidget *w, gpointer p){
-	dados *data_ant = p;
+	dados *data_ant = p; //Pega os dados recebidos pela chamada da função
 	puts("teste3");
 	GtkWidget *janela_ant;
 	puts("teste2");
@@ -317,6 +294,7 @@ void mata_janela_e_chama_tela_principal(GtkWidget *w, gpointer p){
     puts("teste5");
 }
 
+//Chama a tela principal
 void chama_tela_principal(GtkWidget *w, gpointer p){
     struct dados *data = malloc(sizeof(*data));
     data->dado1 = NULL;
diff --git a/useful/stg312/utils.h b/useful/stg312/utils.h
index 0d2cb2a978352e0623e1ea9a0947fae39d13a002..47cf084d0bd41f2497cbbe31ee6380f62f401242 100644
--- a/useful/stg312/utils.h
+++ b/useful/stg312/utils.h
@@ -11,7 +11,8 @@
 #include "upload-utils.h"
 
 static const char UPLOAD_REQUEST[] = "request=newupload&nparts=10&name="; //nparts HAS to be the same as NUMBER_OF_PARTS
-static const char API_URL[] = "http://192.168.0.6/slx-admin/api.php?do=webservice";
+//static const char API_URL[] = "http://192.168.0.6/slx-admin/api.php?do=webservice";
+static const char API_URL[] = "http://slxboxdev.c3sl.ufpr.br/slx-admin/api.php?do=webservice";
 static const int NUMBER_OF_PARTS = 10; //
 static const char CLONE_STG4_SCRIPT[] = "./clone_stage4.sh";
 static const char CLONE_STG4_SCRIPT_DUMMY[] = "./clone_stage4-dummy.sh";