Final version, refactored + cleaned up