modified some information from the fork of SATYAJIT RANJEEV's blog