Whole Code with Updates 12/12/2019