/**
~~~~=~~~~~=~~~=~=~~~==~~======~~====~~~~~~~=~~==~=~==~~~~::~~::~::::::::::~~~:~~~~~~~==~~~++=~~~:=~::~:::~~~~=====~==~~~~:::~:~:=====+=~~~=~
~~~~~~~~~~~~~~~~~~~~~~~:~~~=~::~=:=~~~~:~~~~~~~~~~~~~:~~::::~:::::,:::~~~~~~~~=~======~=+===~:~::~=~:::~::~~~~=:=====~~=~:~~~:~~~====~~~=~~~
~==~==~~~~~~~:~~~~~~=:~~~:::~::~:~~::::::~~~::~:~:~~~~~~~=====~:~:::~:~~~~:~~~=====:~=~~===~~~~~::::~::::~~~~:~:===~====~~~~~~~~====~=====~~
~=~~==~~====~~~~~~~~~=:~:~~~~:~~~~::~~::::::~::~~~:=~+7Z8DDDDDDD8ZI+?77???+I????=++++==~~=~=~::::~::,:~:::::::~:~~~~~~~~~~~~~::~~~==~~~=~===
=~~=~~~==~~=~~~=~~~==~:~~~~:~:~~:~::~~:::~:~=~=?IIODNNNNNNNNNNNNNNNDDDDNDDDDD88Z7?+++++~~:=~~::::~~~~:~::::::~~~~~======~~=~~=~~~~~~~~======
~~~~~~~~~~~~:~~~~~~~~~~~~~~~~~~~~~~~=~~~=~~=7ODNNDNNDNNNNNNNNNNNNNNNDNNNNNNNNNNNNNND8$?+====~~~:~=~~:~~~:~:~:~~~~~~~~=~====~~~~=~~~~~~=====+
~~~~:~~~:~~~~~~~~:~:~~~:~~~=~~~~~~~~~===I$8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDZ?=~~~~~:~::::::::~::~::~:~:~===~~==~~~~~~~~~~=====~
~~~~~~~~~~~~~~=:~~~:~:~~~~~~~::~:~~~~?78DDNNNNNNDNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNDNO?==~~~~~::::~::,::::::~:~=~====?+===~~~:~~~~~~~=
==~~~~~~~~=~~~~~~~~::::~::::::::~:=IZDNDNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDO+~+~~~~::~~:::=~~~~~~~~~======~==~~====~=====
==~~~~~~~~~~~:~~~~~~::~~::::::~:~78DNNNNNNNNNNDDDNNNNNNNNNNNNNNNNNNNDDDDNNNNNNNNNNNNNNNNNNNNNNNDZ?=~:~::~::~::~:~:~:~~::~~~=~=======~~~==~~~
~=~~~~~=~~~:::~:::~~~~~::~~~~~+INNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDODNDNNNNNNNNNNNNNNNNNNNNNNNDNZ=~:::~::~~::::~:~:~~~~=~========~===~==~~
==~~===~~~~~~::~~:~:~:::~~~~=?8DNNDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDD8DDNNNNNNNNNNNNNNNNNNDNNNNNNNNNN++~~~~::~:~=~:~~:~~~~~~~=:====++==+==~~~
=======~~~~~~~~~::~~::,:::~=ZDNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNDDDD88DDNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNDZ=:~:~:~~=~::~~~~::::~~:::~~~==~~~==:~~
~====~==~~~~~~~~:~::::::::=ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDDDDDDD8DNNNNNNNNNNNNMNNNNNNNNNNNNNDNNNDNO==~~:=~~:~::~:~~::~~~::~~=~~=========
=======~=~~~~~~~::~~:~:~=ZDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDDDDNNDDDDDNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNDDO?~:~~~~~~::~~~~:~~::~:~~=~==:~~~~~=~
+====~~==~~~~~~::~~::~~?8DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDDDDDDD8NDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND8?=~~::::~~~::~:~:~:~~~~~:~~~~======
==========~~:::::::::~=8NNNNNNNNNNNNNNNNNNNNDNDNDNNNNDDDNDDD8DDDDD88DDDDDNNNNNNNNNDNNNNNNNNNNNNNNNNNNNDDND+~~~~~~~:~~~=~::=~~:~~::~~~~~~:~=~
==~===~==~~~~::::::::=ODNNNNNNNNNNNNNNNNNNNNDDDNNNNDDDDNDDDODDDD8OO8D88DD8DDNDDNNNNNNDNNNNNNDNNNNNNNNNDDNND?=~~::~~~~~~:~:~~~~:~:~~~~~~~~:~=
==~~~~~~~~~~~~~~~~:~~ZNDNNNNNNNNNNNNNNNNNDDDDDNDDDD88D8OOZ$8DD8OZ7$88ZOZ88ODDDDNDDNNDDDNDNNNDNNNNNNNNNNDDDND+:::~:~~~:~~=~~=~==~~==~~=~~~~~~
======~~~~~~~~~~~~~=ZDNNNNNNNNNNNNNNNNNDD8O88D8D8D8D8Z$O777ZO777++7$7I$ZZZ$ZO8DDDDDDNNDDDNDDNDDNNNDDDNNNDDNN8?~~:~~~~=~~~~~~~~~~~~==~~~~~~~~
====~~~~=~~~~:~~~==ZNNDNNNNNNNNNNNNNND8DZ888DDD8OD8O7II?I$ZI?+?+=+?Z?+I77II??7OD8DZDDDDD88DDDNNNNDNNNN8DDDDDD8+~::~::=:::~~~~===~===========
=~~~~~~~~=~~:~~~~~?NNNNNNNNNNNNNNNNDD88ZOO88DZZ88O7I?++I77=~~~+~~~?I~~~=+~+++?+Z8OOZDDDD88ODNNDDDDNDDDDNDDDDDDO=~~:::~::~~:===~~~~=~~~====~=
~~=~~~~~~~~~~~~~~~ZNNNNNNNNNNNNNND8OOZ7$OOOOI7ZOZI??=7?I+~:::~~=:~++~~:=~:~?====$$O7I8DD8OO88D8DDDDDDNDNDDNDDNNO=~:::~:::~::~:~~=~~~~~===~==
=~=~~~~~~~~~~~~~~=8NNNNNNNNNNNNND88OZ$$ZZZO$$ZZ$I+?77$I:::::~:::::=~::,~:,:~~~~~=7OOI7Z888OZ88DNND8DDNNND8DDDNND+~::::~::~:~::~~~::~::~~~~=~
=~~~~~~====~~~===$NNNNNNNNNNDDDDDOO77$ZO877I??+==?II?=::,,~~:,,,,:~:~:,::::::~=~~=I$7=?$88OOZZO8DDDDODDDDDDDNNND8~~::~,:::,,:::~~~~:~~~=~~~~
~~~~~~~~~~~~~~===ONNNNNNNNNNND88Z$$I$O88Z$?+=~~=+I?=:,:::::::,,,,:::,:::,,::,,~~,:~?7+=+$88O7$ZOD888O8DDDDDDNNND8I~~,::,::::~:~~:~:~~::~~~:~
~~~~~~~~~~=~~~==?DNNNNNNNNNNDDD8$Z77O8DOI?+==~=7I~,,:,,,::,,,,,,,,,,:,::,,::,:::~~~~=I=~+7OOO$$7$D8ZOZ8DDNDNDDDDD8=~::::::~:::~~~~~~~=~~~~~~
==~~~~~~~~~:~~~=ZNNNNNNNNNNDDD8ZZ777D8Z+=+~==II=:,,,,,,,,:,::,,,,,,,,,,:,::::::::~~~~+?~~+OIZ77IIZZ$Z$OODNDNDNNNNDI=:,~:::~:~:~~~~~~~::~~:~~
=~~~~~~~~~~~:~~+8DNNNNNNNNNND8OZ$$Z88I++===+I=~::,,,,,,,,,,,,:,,:,,.,,,,,,,,,,:,,,::~=?I=~+I?7II7IOZOOZ88DDNNNNNNDZ=~~~~~~=:~~::~~=~~~~=~~=~
~=~~~=~~~~~~~~~?DNNNNNNNNNNND8OZ7OD87??+~~==::::,,,,,.,,,,,,,,,,:,,.,,,.,,,.:,:,,,,,::++==~+++?+I77Z8ZO7$8DNNNNNDN8=~===~~~~===~~~=~~~~=~~~=
==~~~~~~~~~~~==IDNDDNNNNNNNDDDZ7ZDD$I7?==+=:,,,:,,,,,,,,,,,,,,:::,,,,:...,..,,,,,,.,,,:+?I+=~~=?=IZZ88Z$7$DNNNNDDDZ==~~:~::~~~~~:~===+======
===~~~=~~~~~~==7DNNDNNNNNNNNDDO$OD$??+==~~:,,,,,,,,,,,,,.,,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,:~+==~~+I=?7ZZ777$8NNNDDDDD?=~~~~~~====~~~~~:~~~~===
~~~=~~~~~~~=~==ZNNNNNNNNNNNND8ZZ8$====+==~:,,,,,,,,,,,,,,.,,.,,,,,,::,.,,,.,,,,,,,...,,,,~~==~::=?=I7ZII??8NNNDDDDDI~~::~:,:::::~~:~~~~~~===
=~~=~~~~~~====+8NDNDNNNNNNNDND788?===~~~~::::,,,.,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,:,,,.,,...,~==::~==~=I??+ZDDDDDNDDDZ+~~~~~~~~:::~~:::::~=~~=
~=~~~~~~~:~==+?8DNDNNNNNNNNNDD8D8I+=~==::,::::,,,,,,,::,:,,,,,.,,,,:,,,.,,..:,,,,.,...,.,,,,,~~:,:+~~~=7?78DDNNNNDNO=~,:,:::::::~~:~~:=~:~~=
~~~~~~~~~~~~~=+8NDNNNNDNNDNNDDDDOI?==~~::::::,,,,,,,,,,,,,,,,.,:,,,:,,,,,,,,:,,,:::,,,.,,,,,:~::::~~,~=I?$8DDNDDNDD8+~~~~~::~::~~~:~~~~~~~==
~~~~~~~~~~~~~=?DNNNNNDNNNNNNDDDD$I++=~=:::::,:,:,,,:,.,:,,,,,,,,..,,,,,,,,...,,,,,,.,..,,,:::::,:,,:~==+?ZD8DDDDDDDD=:,:::::~=~~:~~~~~~~~===
~~~~~~~~~~~~:~+8NNNNDNDNNNNDD8D8I+==~~~:::,:,,,,:,,,.,..,,,,,,,.,,,,,,,,,,.,,,,,,,,,,,,,,.,:::::,,,:~~~??ODDDDNDDDD8+~::~~~::~~~~~~~~===~==~
~~~~~~~~~~~~~~+ONNNDNNNNNDNDD8DZ+=====~::::::::,:,:,,,,.,,,,,:,,,,,.,::,,,,..,,,,,:,,,,,,,:::,,,,,,,:~~+?ODDDDDDDDD8I:::::~~~~~~~~~~~~~~====
~~~~~~~~~~:~~~+8NNNNNNNNDDNN88O?+=~~~~~::::::,,,,,,,,,,,.,.,,,.,.,,,,:,,,,,:,,,,,::,,,,,,,,,,::::...,:~+I8DDDDDDDDD8?~~:::=~~==~~===~~~~~~~=
~~~~~~~~~~~~~~+8NNNNNNNNDDD8OZ7+=====~~::::::::,,,,,,,,,,,,,,,,,,,...,,:,,,,,,,,,,,,.,,,,,,,::,,,,,,::~+?ZDDNDDDDDDD?~~~=~~~~~~~~~~~~~~=~=~~
~~~~~~~~~~~~~~?DNNNNNNNNNND87?+=~=~:~:~:::::::,:,,:,,,:,,,,,,,,:,,,,,,,,,,::,,,,,,,::,:...,,,,:,,,,,,:~?+788NDDDDDDD?~~~~~~~~==~~~~~~:~~~~==
~~~~~=~~~~~~~~+ZDDNNNNNNND8$?===~~~~~~~~~:::::::::,::,,,,,,,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,:,,::,:,,,,:~=+I8DDDDDDD8D?~~~~~~~~~~=~~~~~~~~~~~=
~~~~~~~~~~~~~~+$$DDNNNNND8$7+====~=~~~~~~~::~~=~~~~=~~:::,:,,,:,,,:,,,,,,:,,,,..,,,:,,,,,,:~:::,,,,:,:~~=+$DDDDDDDDZ===~~~~~~:~~:~~~~==~====
~~~~~~~~~:~~~~=II$DDDNNNDDZI===~~~~~~~~~~~::~~:~:~~~~::~::,,,,:,,,,,,,,,,,,,,.,,,,,:::~:::~~:~~~:,,,:~~~=~+88NDDNDDI~=~:~=~~~~~~=~~~~~======
~~~~~~~~~::~~~~~==?8DNDDD8O?+=~~~~~~~~~~~~~~~::::::::~:~:~:~:,,:,:,::,,.,,,,,,.,,,::::::::~~~::::~:::~~~~~?8DDD87?$+~=~~~~~:~~~~~~======~===
~~~~~~~~~~:~~~~~~~:~IDNNNDO?==~:~~=~:::~~~:::::::::,::,::~:::::,,,,::,,,,,:,,,,,,,:~:::::,,:,::,,::~:~~~~~=8DDD?:~=~~~~:~=~:~~~~~===+======~
~~~~~~::~~~:~~~~++~:~ZDDD8Z?=~~:~~~~~~:::::::,,:::,:::,,:,:::,,:,,,,,,,,,,,,,.,,,,,:::,,,,:::::,::::,~~~~~+8DDI~~====~::::~~~~==~~===~=====+
~~~~~~~:::::~:~~+=~::=8888Z?=~~~~~:~~~::::::::::,,,::::,,,::::,,,,,,:,,.,,,,:,:.,,,::,,,.::::,,,,,,::~~:::=8DD=~~=~~~~::~~~:~=+===~=:=~=~~~=
~~~~::~:~::::::~~~~:,:?$ZOZ?=~~~~::~:::::::::::::::::::,,,,:::,:,:::,,,,,,,,,::,,,,::::,:,:::::::,,::~:~::~$O+~~~~~~:~::~~~~=+=====~~======+
~~~~~~~~:~~~~~~~~~::,:~=+$Z?=~~~~:::::::~::::~=~=++++=~~~:::::,,,,:,,:,,,,,,,,,,,,,:::::::~~~~:,:::::::~::=I~:~====~~~::~~==+==~~::~~~===~=+
~~~~~~~~~~~~~~~~~::,,:==+$$?=~~:~:::::::~::~~=?Z8DD8DD87+~::::::::,,,,,,,,.,:::,,,::~+IZO8O7+=~~::::::::,:~+::~~~~~~~~~~~~===+=~~~:~~~====++
~~~~~:~~~~::~~~=Z7::,:~~=I$?=~~::::::,::::~~+$Z?$NIOD?7$~==~::::::,,,,:,,,,,,:::,,:=7$ID7I8I?ZO+:,,:::::,,:~::=~~~::::~====~~~~~~~~~======+=
~~~~~~~~~:~::~=+ZDI:::~::~+?==:::::::::,:::~==~~+DDDO8DI:,:~::,,,,,,,,,,,.,,,:,,,:::+8D8888=:~=?=:,::::::,:::I?==~~~~:~~=~~=~:~~~~~~=~==+=~=
~~~~~~~~:~~~~~~=I88=::~:::~+=~~::,::,,:,,:::::::~+O888+::::::,::::,,,:,,,,,,,,,,,,,::7888O?::~~:,,::,,,,,:::~DO=~~~~::======~~~~~~=========~
~~~~~~~~:~~~~~=+Z8DO=::~::~==~~:::,,,,,:,,:::::::::~=~:::::::,:,::::,,:::,,,,::,,,,::~~~~,::::::,,,:::,,,:::7DDI~::~~~=~~~:~:=~=~===~===~=~~
~~~~~~~~~~~~~~=$DDD8$:::=~~~=~~::,,,,,,,,,::::::::,:::,::::::,,,,:,,,,,:,,,.,,,,,,,:,::,,,::::::,::::::::~~7DND8=~::~~=~~~~~:~~~===~~~~~~~~=
==~~~~~~~~~~~=?8DDDDNI:::~~:~~~:::,,,,,,,,,,,,::,,::::::::::,:,,,,,,,:,,,,,,,,,,,,,,::,,,,:,:,,,,,:,:,,:::INNDDO=~~~~===~~~~~========~~=====
===~=~~~~~~~~~$NNDNDDD+:::::~~~~:::,,,,,,,,:,,,:::::::::,,,,::,,:,:::,,,:::,::,:,,,:,:,,,,,:::,,,,,::::::=DNNNNZ=~~~~=~:~~~~~===+~~~~~~====+
====~~~~~~~~~=8DNNDDNND+~:,,:~~::::,,,,,,,,,,,,,:,:,::::,,,,,,,,,::::,,,,,:,::::,,,,:::,,,,::::,,:,:::::~ZDDNDD?:~~~==~~~~~:~===~~~=:~~==+=~
======~~~~~~~+ONDNDDDDDZ=::::~~~~::,:,,,,,,,,,,,,::,,,,,,,,,,:,,,::,:,,,::,,:,::,,,,,::,,,::::,,,,:::,,:~$DNND8+~~~~=~:~~~~===+===~~~=~=++=~
=======~~~~~=+ONNNDNNND8+~::::=~:::,,,,,,,,,,,,,,,:,,,,,,,,,,,,,,,,:,,,,,,::::::,,,,,,,,,,,,,,,,,,::::::~ZNNDDDZ=~=~~=::~~==+==~=~~~====+===
=====~~~~~~~==7DDNNDDNND7~:::::~~::,,,,,,,,,,,,,,,,,,,,,,,:,,,::,,:::,,,,,::,,::::,,,:,,,,,,::,,,::::,,:~DDNNNDNI===~~:~~~~==~~~~~~~==++==~~
====~=~~~~~~==+ZDDNDNNNDD+:::::~~~:::::,,,,,,,,,,,,,,,,,,:,,,::::::::,:,,,::::::::,,,:::,,,,:::,,::::::=ODNNNNNND?==~~~:~~=====~~~~==++==~~=
=====~~~~~==~~~?ONNDDNNDND?=~~:~=~::::,,:,,,,,:,,,,,,,,,:::,,:~:::::,:,,,:::::::::,,,,::,,,:,::,,::::~IDNDNNNNNNN$+=~~~~=====~~~~=======~===
==========~~~=++$DDNNNNNNNNNO$7I?=~:::,,,,,,,,,::,,,,,,,,,::::::::,::,:,,,,::::::::,,::,,,:,:,,,,::~:=DDNNNNNNNNNO+~~~=~~~~=~~=~~=======~==+
===~======~~~+?ONNNNNNNNNNNDNNNDD?=~~:::::,,,,,:,,,,,::,,:::::::::,,::,,,,:::::::::,,::,,,,,,:,,,:::~+NNNNNNNNNDN$=~::~====~~~=+~====~~==+++
========~===++$DNNNNNNNNNNNNNNNNNO+~~:::,,:::,,,,,,,,:,::::::::::::,,,,,,,:::::::::,,::,,,,::::,,::~=$NNNNNNNNNND?=~~:====~~~======~~~===+=+
======~~~~===IDNNNNNNNNNNNNNNNDDD8$~~:::,,:::,,,::,:,,::::::::,::::::::::::::~:::::,::::,,,:::,,,:~~+DNNNDNNNNDD7==~:~====~~~=====~==~==+++=
++=+==~====+?ZNNNNNNNNNNNNNNDNDNDD$=~:::::::,:,:,:::,,::,,:::::~==~~:~~::::~~~:::::::::::,,:::,:,::~7DDNNNNNNNNNZ+=~~~====~~~===========++=+
+++========+?ONNNNNNNNNNNNNNNDDDD7?+~~::::::::::::,:,:::::::::::::~~::~~::::~:::::::,:::::,:::::,:~=8NNNNNDNNNNNN$=~~~====~~==+===~======++=
++++=+=====+?ZNNNNNNNNNNNNNNNNNNNI+==~:::::::::,:::::::::,:::,,,::::::::::::::::::::,:::,,,:::::::=INNNNNDNNNNNNN8+~~===~=~~~=====~=+=+=====
++++++=+===++ZNNNNNNDDNNNNNNNNNNN$+==~::::::::::::,,::::::,::,,:::::,::::,::::::::::,:::,::,:::::~=8DNNDNDNNNNNNND?~===~~~~~=====~~=++=+===+
++++++======+7NNNNNNNNNNNNNNNNNNNO?===~::::::::::::::::::::::::::::::,:,:,::::::::~~::::::,:::,::~IDNNDNNNNNDNNNNN+===~=~~===+==~===++=+==++
+++++=======+?ODNNNNNNNNNNNNNNNND$?====~~:::::::::,:::::::::::::::::,,:::::::~~~=++~:::::,::::::~=?DDNNNNNNNNNNNN8+===~~~~==+==~===++++===+?
+++++========?8NNNNNNNNNNNNNNNNNO?++====~~::::::::::::::~==++=+==~~~~~~~~=~~+O7I?+=~~,:::,::::::~=?$NNNNNNNNNNNNN7===+~~==++=~~~===++===++++
+++++++=====++?$777Z8DDNNNNNNND$+=++=====~~~::::::::::::~~~=++I7+=~~~~:~~??+=+=~~~~~:::::::::::~~++?ODNNNDNNNDN8I~~===~~===+=~~~++++====?+++
+++=+=+=======~:::::~=?8NNNN87?+=======~==~~::::::::::::::::::~~~:~:~~::~~~:~~~~:::::::::::::~~~==+++?ONNNND8?=~:~===========~====+====+?+++
+++++=========~~~:~~~=+ION87+====~~======~===~~::::::::::::::::::::,:,::::::~~~:::::,:::::::~==~~===~=+7OD8$?+$OD8~~==~=+=======+=+==+=+?+?=
++++=+========?8DDDDD8Z$$I=====~=~~=======++=~~~:::::::::::::::::::::::::::::~~::::::,::~::~==~~~~=~~~=+?$7ODDD87=~~====+~==~~=+=+++==++?++=
++=+======+++?8NNNNNNNND7+====~~====~~==~==+==~~~~:::::::::::,::::::~::::~~:::::::::::::~~~~~=~~~~=~~====+7$88$I?7O88$?+++==~==++===++++++++
?+++===+++?7ZDNNNNNNNNNN8I===========~=====+++==~~~~:::::::::,,:::::::::::::::::::::::~~~=~~~~~~~=~~~~~==~=IOD8NNNNNNDDDO$I?+=+++===+???++=+
+?+++++?IZ8NNNNNNNNNNNNNDDZI?+====+======~=++====~~~:::::::::,:,:::::::::::::::::::~~::~==~~~~~~~==~~=~====+8DNNNNNNNDNDNDDDZ$III==++????+++
????II7Z8NNNNNNNNNNNNNNNNNNDZ7?++====~==~~=+?+===~~=~~::::::::::::,,::::::,:::::::::~~~~=+=~~=~~~=======~~=I8NNNNNNDNNNDNNNNNDDD8888ZZ$7??+?
??I?$O8NNNNNNNNNNNNNNNNNNNNDNN8$?=========+??==~~=~~~~:::::::::,::,,,:::::,::::::::~~~~~~+?======+?+=++===+ZDNNNNNNDDDDNNDNDNNNDDDDOOO$7I??I
??I7ODNNNNNNNNNNNNNDDNNNNNNNNNNDOI?+=====+II?+=~~~~~~~~~:::::::::,,::::::::::::::~~~::~~~=??+++?+???===+++IONNNDNNNDDDNDNDNNNNNDDDDN887$7I?+
II$ODNNNNNNNNNNNNNNNDNNNNNNNNNNNNDZ+====?$7?++~~~~~~:~~~~~~~:::::::::::::::::::::::::::~~+?I$OZ77ZO$I++++?$DNNNNNNNDNDDDDDDDDNNNNNNNDD8Z$7?+
?7ODNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNI+?7O8O7?++=~~~~~:::::~~~:~:~:::::::~:::~~~:::::::::~~=+?Z8DDD8ND$$III?ZNNNDNNDNNDDDDDDDDNNNNDNNNNDDD$II?
IZ8NDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDD88O$I?+==~:~~~:::::::::::~~~~~~~~~~~~~~::::::::::~===?I888DDDDD8OZ$ZDNNNNNNNDDDDDN8DDNNNNNNNDNNDNDDZI+
7ZDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDD8O7I+===~~~:~:::::::~:::~::::::~~:::~::::::::::::~=~+I8DNDDDNNNNNDNNNNNNNNNNDNNNNNDNNNNNNDNDNNDDNDD$I
$ZDNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNDNDDDZI+==~~~~~~~~:::~::::::::::::::::::::::~::::::~~~===?ODDNNNNNNNNDNNNNNNNNNNNNNNNNNDNNDNNNNNNNNDNNDO7
7ZDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND8$I=~~~~~~~:~:~:~::::::::::::::::::::::::~::::~~~~~~~=I8DNNNNNNNNNNNNNNNNNNNDNNDNNDNDDDNNNNDNNNDDND8$
7ZDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDD8O7+=~~~~~~~~:::~~::::::::::::::::::::::::::~::~::~~~~~+I7DNNNNNNNNNNNNNNNNNNDNNDNNNNNDDDNNNNNNNDDDD8$
7ZDNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNDD8$I+~~~~::~~~~~~:~~:~::::::::::::::::::::::::::~~:~~:~~=?I78DDDNNNNNNNDNNNNNNNDNDNNNNDDNNNNNNNNNDDDDD$
I$ODNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND8OI++~~~~~~~~:::~:~::::::::::::~::::::::::::::::~~~:~~~~~=~+?7IZDDNNNNNNNNNNNNNNNNNNNNDDDNNNNNDNNNNNNO7
I7ZDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND8Z?==~~~~~~:::::~:::::::::::::::::::~:::::::~::~~:~~~~:~=?===~~~+$DNNNNNNNNNNNNDNNDNNDNNNDNNND88DDNNDZ7
III$8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDZ7+=~~~~:~:::::::::::::::::::::~::~~:::::::::~~:~:::~:~~++~~~::::~+I8DNNNNNNNNNNNNNNNNNNNNNNNDD8DDNND7I
$I??78NNNNNNNNNNNNNNNNNNNNNNNNNNNDDDZI+=~~~~~~~~~:~~~~:~:::::::::::~::~:~:~::~~~~~~:~::::~~~~?=~=~::::::~+78DNNNNNNNNNNNNDDNNNNNNNDD8DDN8O7I
ZI???$ONDDNNNNNNNNNNNNNNNNNNNND8OZ$$?+=~~~~~~~~~:~~~~~:::::::::~~:::~~~~~~~~::~~~:::~::::=~:~?+=~~:::::::~=IZDDNNNDNNNDDNDDDNNNNDDDDDDDDZ7II
II+++?IZ8D88DDNNNNNNNNDDD888O$ZZ$???+==~~~~~~~~~~~~~~~~~:::~:~:~~:~:::~~~~~~~~~:~~~:~:~~:~~~+=~~~~:::::::~==?$77I?7$ZZZZ7II7O8OODD8D8OZ$7III
??++=++I7ZZOZ$$$$$$$$IIII??++++?+==??=~~=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=++===~~::::::~~~~=~~:::~=====~~~+??7$OZ7IIIIIIII
?+===+=+??I??=++===++==~==~~====+===+======~~~~~~~~~~~~~~~~~~~~~:~~~~~~~~~~~~~~~~~~~:~~::~~++~==~:~:~~:::~~~~~~~:::::~~~~~~~==I7II?+++?IIIII
+++++===++++===========~~~~~~~=====++=====~~~=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++===~~~:~~~::~~~~~~::~~:~::~~~~~~~=+??+===++??II
?++=+====+============~~~~=~=====+=====~==~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~====~~~~::~:::~~~~~~::~~~:::~::~~~~+?===~=~===+?I
+++++======================~==~~===+==~=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=~~~===~~~~~~~~~~~~==~==~~~~~~~~~~~~~~~~~::~~~~~~~~~~~=++?+======++?
+++====+++=================~=~~~===++==~=~~~~~~~~~~~~~~~~~~~~~~~~~~~=~~~~~~~~~~~~~~~~~~~~~~=++==~~~~~~~~~~~~~~=~~~~~~~~~~~~~~~=++==+=====+++
?+++++=+++===================~====+==+====~====~~~~~~~~~~~~=~~~~~~~=~~=~~~~~~~===~~~~~~~~~==~+=~~~~~~~~~~~=~~==~~~~~~~~~~~~====?+=+++=====++
 */

/**
 * Created on 2018-08-16 03:50
 * @summary
 * Don't let 'em say you ain't beautiful.
 * They can all get fucked.
 * Just stay true to you.
 * @author yong
 */
pragma solidity ^0.4.23;


library SafeMath {

    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }

        c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  constructor() public {
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

contract ERC20 is Ownable {

    using SafeMath for uint256;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    mapping(address => uint256) balances;
    mapping (address => mapping (address => uint256)) internal allowed;

    uint256 totalSupply_;

    function ()
        public
        payable {
    }

    function totalSupply() public view returns (uint256) {
        return totalSupply_;
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    function balanceOf(address _owner) public view returns (uint256) {
        return balances[_owner];
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
        public
        returns (bool)
    {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(
        address _owner,
        address _spender
     )
        public
        view
        returns (uint256)
    {
        return allowed[_owner][_spender];
    }

    function increaseApproval(
        address _spender,
        uint _addedValue
    )
        public
        returns (bool)
    {
        allowed[msg.sender][_spender] = (
            allowed[msg.sender][_spender].add(_addedValue));
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    function decreaseApproval(
        address _spender,
        uint _subtractedValue
    )
        public
        returns (bool)
    {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    function withdraw()
        public
        onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

}


contract ERC223ReceivingContract { 
    function tokenFallback(address _from, uint _value, bytes _data) public;
}


contract ERC223 is ERC20 {

    function transfer(address _to, uint256 _value)
        public
        returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);

        bytes memory empty;
        uint256 codeLength;

        assembly {
            codeLength := extcodesize(_to)
        }

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        if(codeLength > 0) {
            ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
            receiver.tokenFallback(msg.sender, _value, empty);
        }
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _value)
        public
        returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        bytes memory empty;
        uint256 codeLength;

        assembly {
            codeLength := extcodesize(_to)
        }

        balances[_from] = balances[_from].sub(_value);

        if(codeLength > 0) {
            ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
            receiver.tokenFallback(msg.sender, _value, empty);
        }

        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

}


/**
 * ╔╗░░╔╦╗░░╔╗╔╗░░░░░░░░░░░░╔═══╦╗░╔╗░░░░░░░
 * ║╚╗╔╝║╚╗╔╝║║║░░░░░░░░░░░░║╔═╗║║░║║░░░░░░░
 * ╚╗╚╝╔╩╗╚╝╔╝║║░░╔══╦╗╔╦══╗║║░╚╣╚═╣║╔══╦══╗
 * ░╚╗╔╝░╚╗╔╝░║║░╔╣╔╗║╚╝║║═╣║║░╔╣╔╗║║║╔╗║║═╣
 * ░░║║░░░║║░░║╚═╝║╚╝╠╗╔╣║═╣║╚═╝║║║║╚╣╚╝║║═╣
 * ░░╚╝░░░╚╝░░╚═══╩══╝╚╝╚══╝╚═══╩╝╚╩═╩══╩══╝
 */
contract Chloe is ERC223 {

    string public constant name = "Shuhan Liao";
    string public constant symbol = "Chloe";
    uint8 public constant decimals = 0;
    string public message;

    /* constructor */
    constructor()
        public {

        totalSupply_ = 2;
        balances[owner] = totalSupply_;
        emit Transfer(0x0, owner, totalSupply_);

        message = "Happy Valentines Day!";
    }
}