il codice è moooolto lungo... cmq adesso posto i passaggi principali...