initial import from net.adamcin.granite.client