It would be a good challenge to do it programmatically.