haven't looked at this in a while. updated