Agregando código fuente. El algoritmo es muy largo y >se come código<