Le agregue casi todo el cadigo