contract LucisDollar is StandardToken, Pausable, Claimable {
    string public constant name = "Lucis Dollar";
    string public constant symbol = "LUCD";
    uint8  public constant decimals = 4;
    address public distributor;

    modifier validDestination(address to) {
        require(to != address(this));
        _;
    }

    modifier isTradeable() {
        require(
            !paused || msg.sender == owner || msg.sender == distributor
        );
        _;
    }

    constructor() public {
        totalSupply_ = 25000000 * (10 ** uint256(decimals)); // 25 million
        balances[msg.sender] = totalSupply_;
        emit Transfer(address(0x0), msg.sender, totalSupply_);
    }

    // ERC20 Methods

    function transfer(address to, uint256 value) public validDestination(to) isTradeable returns (bool) {
        return super.transfer(to, value);
    }

    function transferFrom(address from, address to, uint256 value) public validDestination(to) isTradeable returns (bool) {
        return super.transferFrom(from, to, value);
    }

    function approve(address spender, uint256 value) public isTradeable returns (bool) {
        return super.approve(spender, value);
    }

    function increaseApproval(address spender, uint addedValue) public isTradeable returns (bool) {
        return super.increaseApproval(spender, addedValue);
    }

    function decreaseApproval(address spender, uint subtractedValue) public isTradeable returns (bool) {
        return super.decreaseApproval(spender, subtractedValue);
    }

    //CORP Distributor
    function setDistributor(address newDistributor) external onlyOwner {
        distributor = newDistributor;
    }
    // Token Drain
    function emergencyERC20Drain(ERC20 token, uint256 amount) external onlyOwner {
        token.transfer(owner, amount);
    }

    /**
        * @dev Distribute tokens to multiple addresses in a single transaction
        *
        * @param addresses A list of addresses to distribute to
        * @param values A corresponding list of amounts to distribute to each address
        */
    function batchTransfer(address[] addresses, uint[] values) onlyOwner external {
        require(addresses.length == values.length);
        for(uint i = 0; i < addresses.length; i++) {
            if(values[i] > 0) {
                transfer(addresses[i], values[i]);
            }
        }
    }

}
function batchTransfer(address[] addresses, uint[] values) onlyOwner external {
    require(addresses.length == values.length);
    for(uint i = 0; i < addresses.length; i++) {
        if(values[i] > 0) {
            transfer(addresses[i], values[i]);
        }
    }
}

/**
 * @dev Distribute tokens to multiple addresses in a single transaction
 *
 * @param addresses A list of addresses to distribute to
 * @param values A corresponding list of amounts to distribute to each address
 */