-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------==+++++***********************+++*++++++==--------------------------------------------------------
-----------------------------------------------------------------=*#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#*+----------------------------------------------------
--------------------------------------------------------------=#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+-------------------------------------------------
------------------------------------------------------------+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+-----------------------------------------------
-----------------------------------------------------------*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*----------------------------------------------
----------------------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#---------------------------------------------
---------------------------------------------------------+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+--------------------------------------------
---------------------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#--------------------------------------------
---------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------......:::::::::::::::::::::::::::::::::::::::::::::::::::::#%%%%%%%%%%%%--------------------------------------------
--------------------------------------------------- #%%%%%%%%%%%%--------------------------------------------
--------------------------------------------------------------------------------------------------------------#%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#%%%%%%%%%%%%--------------------------------------------
------------------------------:. .. *%%%%%%%%%%%%--------------------------------------------
------------------------------: *%%%%%%%%%%%%--------------------------------------------
-------------------------------===============================================================================#%%%%%%%%%%%%--------------------------------------------
------------------------------=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#%%%%%%%%%%%%--------------------------------------------
------------------------------: *%%%%%%%%%%%%--------------------------------------------
------------------------------: *%%%%%%%%%%%%--------------------------------------------
------------------------------::::::::::::::::::::::-=+***####################################################%%%%%%%%%%%%%--------------------------------------------
-------------------------------------------------+*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
-----------------------------------------------*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
---------------------------------------------+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
--------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
-------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
-----------------------------------=+++++++++++++++++++++++++++#%%%%%%%%%%##################+++++######################%%%%:::::::::::::-------------------------------
-----------------------------------*%%%%%%*....................+%%%%%%%%%%+****************+.::::**********************#%%%:............-------------------------------
-----------------------------------*%%%%%%*....................*%%%%%%%%%%+****************+:::::**********************#%%%.............-------------------------------
-----------------------------------*%%%%%%*....................*%%%%%%%%%%+****************+.::::**********************#%%%.............-------------------------------
-----------------------------------*%%%%%%*.....-==============*%%%%%%%%%%+**-----=########*-----*******-------*#######%%%%========.....-------------------------------
-----------------------------------*%%%%%%*.....*%%%%%%%%%%%%%%%%%%%%%%%%%*** -%%%%%%%%+**********+ .#%%%%%%%%%%%%%%%%%%.....-------------------------------
-----------------------------------*%%%%%%*:::::*%%%%%%%%%%%%%%%%%%%%%%%%%*** :#%%%%%%+**********+ .*%%%%%%%%%%%%%%%%%:::::-------------------------------
-----------------------------------*%%%%%%#-----#%%%%%%%%%%%%%%%%%%%%%%%%%*** .*%%%%%+**********+ =%%%%%%%%%%%%%%%%------------------------------------
-----------------------------------*%%%%%%#-----*%%%%%%%%%%%%%%%%%%%%%%%%%*** ----=+**********+ :---#%%%%%%%%%%%------------------------------------
-----------------------------------*%%%%%%#--------------------*%%%%%%%%%%*** ***********+ *%%%--------------------------------------------
-----------------------------------*%%%%%%#--------------------*%%%%%%%%%%*** ***********+ *%%%--------------------------------------------
-----------------------------------*%%%%%%%#####################*************+++++++++++++++************++++++*########%#+=--------------------------------------------
-----------------------------------*%%%%%%%%%%%%%%%%%%%%%%%%%%%#**********************************************#%%%%%%%%%#----------------------------------------------
---------------------------------------------------------%%%%%%#********************-........................:*%%#-----------------------------------------------------
---------------------------------------------------------%%%%%%#********************-........................:#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%#********************:....:=====...-=====:..:::#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%*---------=*****-----:...:-*****.::-+****:..:::#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%*.........-*****:........:-*****.::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%*.........-*****:........:-*****.::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------#%%%%%*::-----::=+++++:........:-*****.::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.............:-*****:::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:..............-****+...-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......------..::::::...::::::..::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.....:+****+....................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......=*****:...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......:*****-...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......:+****=...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:::.....=****+...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:::.....-*****:....................:#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.......:*****=.....................#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:........-****+=:...................#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.........-*****++==================#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:..........:+***********************#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:............:-=+*******************#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:................:::::::::::::::::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%************************************%%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+-------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+---------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%##############################**+=-----------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+++*************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+**************++----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%****************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+*****+++*******+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------