input abstraction