first version(final)