######## ######## ##       ########  ##     ##    ###    ##    ##  ######      ##       ##     ## 
##       ##       ##       ##     ## ###   ###   ## ##   ###   ## ##    ##     ##       ##     ## 
##       ##       ##       ##     ## #### ####  ##   ##  ####  ## ##           ##       ##     ## 
######   ######   ##       ##     ## ## ### ## ##     ## ## ## ##  ######      ##       ##     ## 
##       ##       ##       ##     ## ##     ## ######### ##  ####       ##     ##        ##   ##  
##       ##       ##       ##     ## ##     ## ##     ## ##   ### ##    ## ### ##         ## ##   
##       ######## ######## ########  ##     ## ##     ## ##    ##  ######  ### ########    ###