ETH Price: $2,724.38 (+4.50%)

Token

Polymath Test Token (WE.R.LIVE)
 

Overview

Max Total Supply

261,016.66666666665 WE.R.LIVE

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,000 WE.R.LIVE

Value
$0.00
0x669B91d9237d8F504472212c6DE23166b469158a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SecurityToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-31
*/

pragma solidity ^0.4.24;

/**
 * @title Math
 * @dev Assorted math operations
 */
library Math {
  function max64(uint64 a, uint64 b) internal pure returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal pure returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint256 a, uint256 b) internal pure returns (uint256) {
    return a >= b ? a : b;
  }

  function min256(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public returns (bool);

  function approve(address spender, uint256 value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

contract IERC20 is ERC20 {

    function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    returns (bool);

    function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    returns (bool);
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  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;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  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;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  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;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  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;
  }

}

/**
 * @title DetailedERC20 token
 * @dev The decimals are only for visualization purposes.
 * All the operations are done using the smallest and indivisible token unit,
 * just as on Ethereum all the operations are done in wei.
 */
contract DetailedERC20 is ERC20 {
  string public name;
  string public symbol;
  uint8 public decimals;

  constructor(string _name, string _symbol, uint8 _decimals) public {
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
  }
}

/**
 * @title Interface for the ST20 token standard
 */
contract IST20 is StandardToken, DetailedERC20 {

    // off-chain hash
    string public tokenDetails;

    //transfer, transferFrom must respect use respect the result of verifyTransfer
    function verifyTransfer(address _from, address _to, uint256 _amount) public returns (bool success);

    /**
     * @notice mints new tokens and assigns them to the target _investor.
     * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet)
     */
    function mint(address _investor, uint256 _amount) public returns (bool success);

    /**
     * @notice Burn function used to burn the securityToken
     * @param _value No. of token that get burned
     */
    function burn(uint256 _value) public;

    event Minted(address indexed to, uint256 amount);
    event Burnt(address indexed _burner, uint256 _value);

}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

/**
 * @title Interface for all security tokens
 */
contract ISecurityToken is IST20, Ownable {

    uint8 public constant PERMISSIONMANAGER_KEY = 1;
    uint8 public constant TRANSFERMANAGER_KEY = 2;
    uint8 public constant STO_KEY = 3;
    uint8 public constant CHECKPOINT_KEY = 4;
    uint256 public granularity;

    // Value of current checkpoint
    uint256 public currentCheckpointId;

    // Total number of non-zero token holders
    uint256 public investorCount;

    // List of token holders
    address[] public investors;

    // Permissions this to a Permission module, which has a key of 1
    // If no Permission return false - note that IModule withPerm will allow ST owner all permissions anyway
    // this allows individual modules to override this logic if needed (to not allow ST owner all permissions)
    function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool);

    /**
     * @notice returns module list for a module type
     * @param _moduleType is which type of module we are trying to remove
     * @param _moduleIndex is the index of the module within the chosen type
     */
    function getModule(uint8 _moduleType, uint _moduleIndex) public view returns (bytes32, address);

    /**
     * @notice returns module list for a module name - will return first match
     * @param _moduleType is which type of module we are trying to remove
     * @param _name is the name of the module within the chosen type
     */
    function getModuleByName(uint8 _moduleType, bytes32 _name) public view returns (bytes32, address);

    /**
     * @notice Queries totalSupply as of a defined checkpoint
     * @param _checkpointId Checkpoint ID to query as of
     */
    function totalSupplyAt(uint256 _checkpointId) public view returns(uint256);

    /**
     * @notice Queries balances as of a defined checkpoint
     * @param _investor Investor to query balance for
     * @param _checkpointId Checkpoint ID to query as of
     */
    function balanceOfAt(address _investor, uint256 _checkpointId) public view returns(uint256);

    /**
     * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy
     */
    function createCheckpoint() public returns(uint256);

    /**
     * @notice gets length of investors array
     * NB - this length may differ from investorCount if list has not been pruned of zero balance investors
     * @return length
     */
    function getInvestorsLength() public view returns(uint256);

}

/**
 * @title Interface that any module factory contract should implement
 */
contract IModuleFactory is Ownable {

    ERC20 public polyToken;
    uint256 public setupCost;
    uint256 public usageCost;
    uint256 public monthlySubscriptionCost;

    event LogChangeFactorySetupFee(uint256 _oldSetupcost, uint256 _newSetupCost, address _moduleFactory);
    event LogChangeFactoryUsageFee(uint256 _oldUsageCost, uint256 _newUsageCost, address _moduleFactory);
    event LogChangeFactorySubscriptionFee(uint256 _oldSubscriptionCost, uint256 _newMonthlySubscriptionCost, address _moduleFactory);
    event LogGenerateModuleFromFactory(address _module, bytes32 indexed _moduleName, address indexed _moduleFactory, address _creator, uint256 _timestamp);

    /**
     * @notice Constructor
     * @param _polyAddress Address of the polytoken
     */
    constructor (address _polyAddress, uint256 _setupCost, uint256 _usageCost, uint256 _subscriptionCost) public {
      polyToken = ERC20(_polyAddress);
      setupCost = _setupCost;
      usageCost = _usageCost;
      monthlySubscriptionCost = _subscriptionCost;
    }

    //Should create an instance of the Module, or throw
    function deploy(bytes _data) external returns(address);

    /**
     * @notice Type of the Module factory
     */
    function getType() public view returns(uint8);

    /**
     * @notice Get the name of the Module
     */
    function getName() public view returns(bytes32);

    /**
     * @notice Get the description of the Module
     */
    function getDescription() public view returns(string);

    /**
     * @notice Get the title of the Module
     */
    function getTitle() public view returns(string);

    /**
     * @notice Get the Instructions that helped to used the module
     */
    function getInstructions() public view returns (string);

    /**
     * @notice Get the tags related to the module factory
     */
    function getTags() public view returns (bytes32[]);

    //Pull function sig from _data
    function getSig(bytes _data) internal pure returns (bytes4 sig) {
        uint len = _data.length < 4 ? _data.length : 4;
        for (uint i = 0; i < len; i++) {
            sig = bytes4(uint(sig) + uint(_data[i]) * (2 ** (8 * (len - 1 - i))));
        }
    }

    /**
     * @notice used to change the fee of the setup cost
     * @param _newSetupCost new setup cost
     */
    function changeFactorySetupFee(uint256 _newSetupCost) public onlyOwner {
        emit LogChangeFactorySetupFee(setupCost, _newSetupCost, address(this));
        setupCost = _newSetupCost;
    }

    /**
     * @notice used to change the fee of the usage cost
     * @param _newUsageCost new usage cost
     */
    function changeFactoryUsageFee(uint256 _newUsageCost) public onlyOwner {
        emit LogChangeFactoryUsageFee(usageCost, _newUsageCost, address(this));
        usageCost = _newUsageCost;
    }

    /**
     * @notice used to change the fee of the subscription cost
     * @param _newSubscriptionCost new subscription cost
     */
    function changeFactorySubscriptionFee(uint256 _newSubscriptionCost) public onlyOwner {
        emit LogChangeFactorySubscriptionFee(monthlySubscriptionCost, _newSubscriptionCost, address(this));
        monthlySubscriptionCost = _newSubscriptionCost;
        
    }

}

/**
 * @title Interface that any module contract should implement
 */
contract IModule {

    address public factory;

    address public securityToken;

    bytes32 public constant FEE_ADMIN = "FEE_ADMIN";

    ERC20 public polyToken;

    /**
     * @notice Constructor
     * @param _securityToken Address of the security token
     * @param _polyAddress Address of the polytoken
     */
    constructor (address _securityToken, address _polyAddress) public {
        securityToken = _securityToken;
        factory = msg.sender;
        polyToken = ERC20(_polyAddress);
    }

    /**
     * @notice This function returns the signature of configure function
     */
    function getInitFunction() public pure returns (bytes4);

    //Allows owner, factory or permissioned delegate
    modifier withPerm(bytes32 _perm) {
        bool isOwner = msg.sender == ISecurityToken(securityToken).owner();
        bool isFactory = msg.sender == factory;
        require(isOwner||isFactory||ISecurityToken(securityToken).checkPermission(msg.sender, address(this), _perm), "Permission check failed");
        _;
    }

    modifier onlyOwner {
        require(msg.sender == ISecurityToken(securityToken).owner(), "Sender is not owner");
        _;
    }

    modifier onlyFactory {
        require(msg.sender == factory, "Sender is not factory");
        _;
    }

    modifier onlyFactoryOwner {
        require(msg.sender == IModuleFactory(factory).owner(), "Sender is not factory owner");
        _;
    }

    /**
     * @notice Return the permissions flag that are associated with Module
     */
    function getPermissions() public view returns(bytes32[]);

    /**
     * @notice used to withdraw the fee by the factory owner
     */
    function takeFee(uint256 _amount) public withPerm(FEE_ADMIN) returns(bool) {
        require(polyToken.transferFrom(address(this), IModuleFactory(factory).owner(), _amount), "Unable to take fee");
        return true;
    }
}

/**
 * @title Interface for the polymath module registry contract
 */
contract IModuleRegistry {

    /**
     * @notice Called by a security token to notify the registry it is using a module
     * @param _moduleFactory is the address of the relevant module factory
     */
    function useModule(address _moduleFactory) external;

    /**
     * @notice Called by moduleFactory owner to register new modules for SecurityToken to use
     * @param _moduleFactory is the address of the module factory to be registered
     */
    function registerModule(address _moduleFactory) external returns(bool);

    /**
     * @notice Use to get all the tags releated to the functionality of the Module Factory.
     * @param _moduleType Type of module
     */
    function getTagByModuleType(uint8 _moduleType) public view returns(bytes32[]);

}

/**
 * @title Utility contract to allow pausing and unpausing of certain functions
 */
contract Pausable {

    event Pause(uint256 _timestammp);
    event Unpause(uint256 _timestamp);

    bool public paused = false;

    /**
    * @notice Modifier to make a function callable only when the contract is not paused.
    */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
    * @notice Modifier to make a function callable only when the contract is paused.
    */
    modifier whenPaused() {
        require(paused);
        _;
    }

   /**
    * @notice called by the owner to pause, triggers stopped state
    */
    function _pause() internal {
        require(!paused);
        paused = true;
        emit Pause(now);
    }

    /**
    * @notice called by the owner to unpause, returns to normal state
    */
    function _unpause() internal {
        require(paused);
        paused = false;
        emit Unpause(now);
    }

}

/**
 * @title Interface to be implemented by all Transfer Manager modules
 */
contract ITransferManager is IModule, Pausable {

    //If verifyTransfer returns:
    //  FORCE_VALID, the transaction will always be valid, regardless of other TM results
    //  INVALID, then the transfer should not be allowed regardless of other TM results
    //  VALID, then the transfer is valid for this TM
    //  NA, then the result from this TM is ignored
    enum Result {INVALID, NA, VALID, FORCE_VALID}

    function verifyTransfer(address _from, address _to, uint256 _amount, bool _isTransfer) public returns(Result);

    function unpause() onlyOwner public {
        super._unpause();
    }

    function pause() onlyOwner public {
        super._pause();
    }
}

/**
 * @title Interface to be implemented by all permission manager modules
 */
contract IPermissionManager is IModule {

    function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool);

    function changePermission(address _delegate, address _module, bytes32 _perm, bool _valid) public returns(bool);

    function getDelegateDetails(address _delegate) public view returns(bytes32);

}

/**
 * @title Interface for the token burner contract
 */
interface ITokenBurner {

    function burn(address _burner, uint256  _value ) external returns(bool);

}

/**
 * @title Utility contract to allow owner to retreive any ERC20 sent to the contract
 */
contract ReclaimTokens is Ownable {

    /**
    * @notice Reclaim all ERC20Basic compatible tokens
    * @param _tokenContract The address of the token contract
    */
    function reclaimERC20(address _tokenContract) external onlyOwner {
        require(_tokenContract != address(0));
        ERC20Basic token = ERC20Basic(_tokenContract);
        uint256 balance = token.balanceOf(address(this));
        require(token.transfer(owner, balance));
    }
}

/**
 * @title Core functionality for registry upgradability
 */
contract PolymathRegistry is ReclaimTokens {

    mapping (bytes32 => address) public storedAddresses;

    event LogChangeAddress(string _nameKey, address indexed _oldAddress, address indexed _newAddress);

    /**
     * @notice Get the contract address
     * @param _nameKey is the key for the contract address mapping
     * @return address
     */
    function getAddress(string _nameKey) view public returns(address) {
        bytes32 key = keccak256(bytes(_nameKey));
        require(storedAddresses[key] != address(0), "Invalid address key");
        return storedAddresses[key];
    }

    /**
     * @notice change the contract address
     * @param _nameKey is the key for the contract address mapping
     * @param _newAddress is the new contract address
     */
    function changeAddress(string _nameKey, address _newAddress) public onlyOwner {
        bytes32 key = keccak256(bytes(_nameKey));
        emit LogChangeAddress(_nameKey, storedAddresses[key], _newAddress);
        storedAddresses[key] = _newAddress;
    }


}

contract RegistryUpdater is Ownable {

    address public polymathRegistry;
    address public moduleRegistry;
    address public securityTokenRegistry;
    address public tickerRegistry;
    address public polyToken;

    constructor (address _polymathRegistry) public {
        require(_polymathRegistry != address(0));
        polymathRegistry = _polymathRegistry;
    }

    function updateFromRegistry() onlyOwner public {
        moduleRegistry = PolymathRegistry(polymathRegistry).getAddress("ModuleRegistry");
        securityTokenRegistry = PolymathRegistry(polymathRegistry).getAddress("SecurityTokenRegistry");
        tickerRegistry = PolymathRegistry(polymathRegistry).getAddress("TickerRegistry");
        polyToken = PolymathRegistry(polymathRegistry).getAddress("PolyToken");
    }

}

/**
 * @title Helps contracts guard agains reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>
 * @notice If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {

  /**
   * @dev We use a single lock for the whole contract.
   */
  bool private reentrancyLock = false;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * @notice If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one nonReentrant function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and a `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    require(!reentrancyLock);
    reentrancyLock = true;
    _;
    reentrancyLock = false;
  }

}

/**
* @title Security Token contract
* @notice SecurityToken is an ERC20 token with added capabilities:
* @notice - Implements the ST-20 Interface
* @notice - Transfers are restricted
* @notice - Modules can be attached to it to control its behaviour
* @notice - ST should not be deployed directly, but rather the SecurityTokenRegistry should be used
*/
contract SecurityToken is ISecurityToken, ReentrancyGuard, RegistryUpdater {
    using SafeMath for uint256;

    bytes32 public constant securityTokenVersion = "0.0.1";

    // Reference to token burner contract
    ITokenBurner public tokenBurner;

    // Use to halt all the transactions
    bool public freeze = false;

    struct ModuleData {
        bytes32 name;
        address moduleAddress;
    }

    // Structures to maintain checkpoints of balances for governance / dividends
    struct Checkpoint {
        uint256 checkpointId;
        uint256 value;
    }

    mapping (address => Checkpoint[]) public checkpointBalances;
    Checkpoint[] public checkpointTotalSupply;

    bool public finishedIssuerMinting = false;
    bool public finishedSTOMinting = false;

    mapping (bytes4 => bool) transferFunctions;

    // Module list should be order agnostic!
    mapping (uint8 => ModuleData[]) public modules;

    uint8 public constant MAX_MODULES = 20;

    mapping (address => bool) public investorListed;

    // Emit at the time when module get added
    event LogModuleAdded(
        uint8 indexed _type,
        bytes32 _name,
        address _moduleFactory,
        address _module,
        uint256 _moduleCost,
        uint256 _budget,
        uint256 _timestamp
    );

    // Emit when the token details get updated
    event LogUpdateTokenDetails(string _oldDetails, string _newDetails);
    // Emit when the granularity get changed
    event LogGranularityChanged(uint256 _oldGranularity, uint256 _newGranularity);
    // Emit when Module get removed from the securityToken
    event LogModuleRemoved(uint8 indexed _type, address _module, uint256 _timestamp);
    // Emit when the budget allocated to a module is changed
    event LogModuleBudgetChanged(uint8 indexed _moduleType, address _module, uint256 _budget);
    // Emit when all the transfers get freeze
    event LogFreezeTransfers(bool _freeze, uint256 _timestamp);
    // Emit when new checkpoint created
    event LogCheckpointCreated(uint256 indexed _checkpointId, uint256 _timestamp);
    // Emit when the minting get finished for the Issuer
    event LogFinishMintingIssuer(uint256 _timestamp);
    // Emit when the minting get finished for the STOs
    event LogFinishMintingSTO(uint256 _timestamp);
    // Change the STR address in the event of a upgrade
    event LogChangeSTRAddress(address indexed _oldAddress, address indexed _newAddress);

    // If _fallback is true, then for STO module type we only allow the module if it is set, if it is not set we only allow the owner
    // for other _moduleType we allow both issuer and module.
    modifier onlyModule(uint8 _moduleType, bool _fallback) {
      //Loop over all modules of type _moduleType
        bool isModuleType = false;
        for (uint8 i = 0; i < modules[_moduleType].length; i++) {
            isModuleType = isModuleType || (modules[_moduleType][i].moduleAddress == msg.sender);
        }
        if (_fallback && !isModuleType) {
            if (_moduleType == STO_KEY)
                require(modules[_moduleType].length == 0 && msg.sender == owner, "Sender is not owner or STO module is attached");
            else
                require(msg.sender == owner, "Sender is not owner");
        } else {
            require(isModuleType, "Sender is not correct module type");
        }
        _;
    }

    modifier checkGranularity(uint256 _amount) {
        require(_amount % granularity == 0, "Unable to modify token balances at this granularity");
        _;
    }

    // Checks whether the minting is allowed or not, check for the owner if owner is no the msg.sender then check
    // for the finishedSTOMinting flag because only STOs and owner are allowed for minting
    modifier isMintingAllowed() {
        if (msg.sender == owner) {
            require(!finishedIssuerMinting, "Minting is finished for Issuer");
        } else {
            require(!finishedSTOMinting, "Minting is finished for STOs");
        }
        _;
    }

    /**
     * @notice Constructor
     * @param _name Name of the SecurityToken
     * @param _symbol Symbol of the Token
     * @param _decimals Decimals for the securityToken
     * @param _granularity granular level of the token
     * @param _tokenDetails Details of the token that are stored off-chain (IPFS hash)
     * @param _polymathRegistry Contract address of the polymath registry
     */
    constructor (
        string _name,
        string _symbol,
        uint8 _decimals,
        uint256 _granularity,
        string _tokenDetails,
        address _polymathRegistry
    )
    public
    DetailedERC20(_name, _symbol, _decimals)
    RegistryUpdater(_polymathRegistry)
    {
        //When it is created, the owner is the STR
        updateFromRegistry();
        tokenDetails = _tokenDetails;
        granularity = _granularity;
        transferFunctions[bytes4(keccak256("transfer(address,uint256)"))] = true;
        transferFunctions[bytes4(keccak256("transferFrom(address,address,uint256)"))] = true;
        transferFunctions[bytes4(keccak256("mint(address,uint256)"))] = true;
        transferFunctions[bytes4(keccak256("burn(uint256)"))] = true;
    }

    /**
     * @notice Function used to attach the module in security token
     * @param _moduleFactory Contract address of the module factory that needs to be attached
     * @param _data Data used for the intialization of the module factory variables
     * @param _maxCost Maximum cost of the Module factory
     * @param _budget Budget of the Module factory
     */
    function addModule(
        address _moduleFactory,
        bytes _data,
        uint256 _maxCost,
        uint256 _budget
    ) external onlyOwner nonReentrant {
        _addModule(_moduleFactory, _data, _maxCost, _budget);
    }

    /**
    * @notice _addModule handles the attachment (or replacement) of modules for the ST
    * @dev  E.G.: On deployment (through the STR) ST gets a TransferManager module attached to it
    * @dev to control restrictions on transfers.
    * @dev You are allowed to add a new moduleType if:
    * @dev - there is no existing module of that type yet added
    * @dev - the last member of the module list is replacable
    * @param _moduleFactory is the address of the module factory to be added
    * @param _data is data packed into bytes used to further configure the module (See STO usage)
    * @param _maxCost max amount of POLY willing to pay to module. (WIP)
    */
    function _addModule(address _moduleFactory, bytes _data, uint256 _maxCost, uint256 _budget) internal {
        //Check that module exists in registry - will throw otherwise
        IModuleRegistry(moduleRegistry).useModule(_moduleFactory);
        IModuleFactory moduleFactory = IModuleFactory(_moduleFactory);
        uint8 moduleType = moduleFactory.getType();
        require(modules[moduleType].length < MAX_MODULES, "Limit of MAX MODULES is reached");
        uint256 moduleCost = moduleFactory.setupCost();
        require(moduleCost <= _maxCost, "Max Cost is always be greater than module cost");
        //Approve fee for module
        require(ERC20(polyToken).approve(_moduleFactory, moduleCost), "Not able to approve the module cost");
        //Creates instance of module from factory
        address module = moduleFactory.deploy(_data);
        //Approve ongoing budget
        require(ERC20(polyToken).approve(module, _budget), "Not able to approve the budget");
        //Add to SecurityToken module map
        bytes32 moduleName = moduleFactory.getName();
        modules[moduleType].push(ModuleData(moduleName, module));
        //Emit log event
        emit LogModuleAdded(moduleType, moduleName, _moduleFactory, module, moduleCost, _budget, now);
    }

    /**
    * @notice Removes a module attached to the SecurityToken
    * @param _moduleType is which type of module we are trying to remove
    * @param _moduleIndex is the index of the module within the chosen type
    */
    function removeModule(uint8 _moduleType, uint8 _moduleIndex) external onlyOwner {
        require(_moduleIndex < modules[_moduleType].length,
        "Module index doesn't exist as per the choosen module type");
        require(modules[_moduleType][_moduleIndex].moduleAddress != address(0),
        "Module contract address should not be 0x");
        //Take the last member of the list, and replace _moduleIndex with this, then shorten the list by one
        emit LogModuleRemoved(_moduleType, modules[_moduleType][_moduleIndex].moduleAddress, now);
        modules[_moduleType][_moduleIndex] = modules[_moduleType][modules[_moduleType].length - 1];
        modules[_moduleType].length = modules[_moduleType].length - 1;
    }

    /**
     * @notice Returns module list for a module type
     * @param _moduleType is which type of module we are trying to get
     * @param _moduleIndex is the index of the module within the chosen type
     * @return bytes32
     * @return address
     */
    function getModule(uint8 _moduleType, uint _moduleIndex) public view returns (bytes32, address) {
        if (modules[_moduleType].length > 0) {
            return (
                modules[_moduleType][_moduleIndex].name,
                modules[_moduleType][_moduleIndex].moduleAddress
            );
        } else {
            return ("", address(0));
        }

    }

    /**
     * @notice returns module list for a module name - will return first match
     * @param _moduleType is which type of module we are trying to get
     * @param _name is the name of the module within the chosen type
     * @return bytes32
     * @return address
     */
    function getModuleByName(uint8 _moduleType, bytes32 _name) public view returns (bytes32, address) {
        if (modules[_moduleType].length > 0) {
            for (uint256 i = 0; i < modules[_moduleType].length; i++) {
                if (modules[_moduleType][i].name == _name) {
                  return (
                      modules[_moduleType][i].name,
                      modules[_moduleType][i].moduleAddress
                  );
                }
            }
            return ("", address(0));
        } else {
            return ("", address(0));
        }
    }

    /**
    * @notice allows the owner to withdraw unspent POLY stored by them on the ST.
    * @dev Owner can transfer POLY to the ST which will be used to pay for modules that require a POLY fee.
    * @param _amount amount of POLY to withdraw
    */
    function withdrawPoly(uint256 _amount) public onlyOwner {
        require(ERC20(polyToken).transfer(owner, _amount), "In-sufficient balance");
    }

    /**
    * @notice allows owner to approve more POLY to one of the modules
    * @param _moduleType module type
    * @param _moduleIndex module index
    * @param _budget new budget
    */
    function changeModuleBudget(uint8 _moduleType, uint8 _moduleIndex, uint256 _budget) public onlyOwner {
        require(_moduleType != 0, "Module type cannot be zero");
        require(_moduleIndex < modules[_moduleType].length, "Incorrrect module index");
        uint256 _currentAllowance = IERC20(polyToken).allowance(address(this), modules[_moduleType][_moduleIndex].moduleAddress);
        if (_budget < _currentAllowance) {
            require(IERC20(polyToken).decreaseApproval(modules[_moduleType][_moduleIndex].moduleAddress, _currentAllowance.sub(_budget)), "Insufficient balance to decreaseApproval");
        } else {
            require(IERC20(polyToken).increaseApproval(modules[_moduleType][_moduleIndex].moduleAddress, _budget.sub(_currentAllowance)), "Insufficient balance to increaseApproval");
        }
        emit LogModuleBudgetChanged(_moduleType, modules[_moduleType][_moduleIndex].moduleAddress, _budget);
    }

    /**
     * @notice change the tokenDetails
     * @param _newTokenDetails New token details
     */
    function updateTokenDetails(string _newTokenDetails) public onlyOwner {
        emit LogUpdateTokenDetails(tokenDetails, _newTokenDetails);
        tokenDetails = _newTokenDetails;
    }

    /**
    * @notice allows owner to change token granularity
    * @param _granularity granularity level of the token
    */
    function changeGranularity(uint256 _granularity) public onlyOwner {
        require(_granularity != 0, "Granularity can not be 0");
        emit LogGranularityChanged(granularity, _granularity);
        granularity = _granularity;
    }

    /**
    * @notice keeps track of the number of non-zero token holders
    * @param _from sender of transfer
    * @param _to receiver of transfer
    * @param _value value of transfer
    */
    function adjustInvestorCount(address _from, address _to, uint256 _value) internal {
        if ((_value == 0) || (_from == _to)) {
            return;
        }
        // Check whether receiver is a new token holder
        if ((balanceOf(_to) == 0) && (_to != address(0))) {
            investorCount = investorCount.add(1);
        }
        // Check whether sender is moving all of their tokens
        if (_value == balanceOf(_from)) {
            investorCount = investorCount.sub(1);
        }
        //Also adjust investor list
        if (!investorListed[_to] && (_to != address(0))) {
            investors.push(_to);
            investorListed[_to] = true;
        }

    }

    /**
    * @notice removes addresses with zero balances from the investors list
    * @param _start Index in investor list at which to start removing zero balances
    * @param _iters Max number of iterations of the for loop
    * NB - pruning this list will mean you may not be able to iterate over investors on-chain as of a historical checkpoint
    */
    function pruneInvestors(uint256 _start, uint256 _iters) public onlyOwner {
        for (uint256 i = _start; i < Math.min256(_start.add(_iters), investors.length); i++) {
            if ((i < investors.length) && (balanceOf(investors[i]) == 0)) {
                investorListed[investors[i]] = false;
                investors[i] = investors[investors.length - 1];
                investors.length--;
            }
        }
    }

    /**
     * @notice gets length of investors array
     * NB - this length may differ from investorCount if list has not been pruned of zero balance investors
     * @return length
     */
    function getInvestorsLength() public view returns(uint256) {
        return investors.length;
    }

    /**
     * @notice freeze all the transfers
     */
    function freezeTransfers() public onlyOwner {
        require(!freeze);
        freeze = true;
        emit LogFreezeTransfers(freeze, now);
    }

    /**
     * @notice un-freeze all the transfers
     */
    function unfreezeTransfers() public onlyOwner {
        require(freeze);
        freeze = false;
        emit LogFreezeTransfers(freeze, now);
    }

    /**
     * @notice adjust totalsupply at checkpoint after minting or burning tokens
     */
    function adjustTotalSupplyCheckpoints() internal {
        adjustCheckpoints(checkpointTotalSupply, totalSupply());
    }

    /**
     * @notice adjust token holder balance at checkpoint after a token transfer
     * @param _investor address of the token holder affected
     */
    function adjustBalanceCheckpoints(address _investor) internal {
        adjustCheckpoints(checkpointBalances[_investor], balanceOf(_investor));
    }

    /**
     * @notice store the changes to the checkpoint objects
     * @param _checkpoints the affected checkpoint object array
     * @param _newValue the new value that needs to be stored
     */
    function adjustCheckpoints(Checkpoint[] storage _checkpoints, uint256 _newValue) internal {
        //No checkpoints set yet
        if (currentCheckpointId == 0) {
            return;
        }
        //No previous checkpoint data - add current balance against checkpoint
        if (_checkpoints.length == 0) {
            _checkpoints.push(
                Checkpoint({
                    checkpointId: currentCheckpointId,
                    value: _newValue
                })
            );
            return;
        }
        //No new checkpoints since last update
        if (_checkpoints[_checkpoints.length - 1].checkpointId == currentCheckpointId) {
            return;
        }
        //New checkpoint, so record balance
        _checkpoints.push(
            Checkpoint({
                checkpointId: currentCheckpointId,
                value: _newValue
            })
        );
    }

    /**
     * @notice Overloaded version of the transfer function
     * @param _to receiver of transfer
     * @param _value value of transfer
     * @return bool success
     */
    function transfer(address _to, uint256 _value) public returns (bool success) {
        adjustInvestorCount(msg.sender, _to, _value);
        require(verifyTransfer(msg.sender, _to, _value), "Transfer is not valid");
        adjustBalanceCheckpoints(msg.sender);
        adjustBalanceCheckpoints(_to);
        require(super.transfer(_to, _value));
        return true;
    }

    /**
     * @notice Overloaded version of the transferFrom function
     * @param _from sender of transfer
     * @param _to receiver of transfer
     * @param _value value of transfer
     * @return bool success
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        adjustInvestorCount(_from, _to, _value);
        require(verifyTransfer(_from, _to, _value), "Transfer is not valid");
        adjustBalanceCheckpoints(_from);
        adjustBalanceCheckpoints(_to);
        require(super.transferFrom(_from, _to, _value));
        return true;
    }

    /**
     * @notice validate transfer with TransferManager module if it exists
     * @dev TransferManager module has a key of 2
     * @param _from sender of transfer
     * @param _to receiver of transfer
     * @param _amount value of transfer
     * @return bool
     */
    function verifyTransfer(address _from, address _to, uint256 _amount) public checkGranularity(_amount) returns (bool) {
        if (!freeze) {
            bool isTransfer = false;
            if (transferFunctions[getSig(msg.data)]) {
              isTransfer = true;
            }
            if (modules[TRANSFERMANAGER_KEY].length == 0) {
                return true;
            }
            bool isInvalid = false;
            bool isValid = false;
            bool isForceValid = false;
            for (uint8 i = 0; i < modules[TRANSFERMANAGER_KEY].length; i++) {
                ITransferManager.Result valid = ITransferManager(modules[TRANSFERMANAGER_KEY][i].moduleAddress).verifyTransfer(_from, _to, _amount, isTransfer);
                if (valid == ITransferManager.Result.INVALID) {
                    isInvalid = true;
                }
                if (valid == ITransferManager.Result.VALID) {
                    isValid = true;
                }
                if (valid == ITransferManager.Result.FORCE_VALID) {
                    isForceValid = true;
                }
            }
            return isForceValid ? true : (isInvalid ? false : isValid);
      }
      return false;
    }

    /**
     * @notice End token minting period permanently for Issuer
     */
    function finishMintingIssuer() public onlyOwner {
        finishedIssuerMinting = true;
        emit LogFinishMintingIssuer(now);
    }

    /**
     * @notice End token minting period permanently for STOs
     */
    function finishMintingSTO() public onlyOwner {
        finishedSTOMinting = true;
        emit LogFinishMintingSTO(now);
    }

    /**
     * @notice mints new tokens and assigns them to the target _investor.
     * @dev Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet)
     * @param _investor Address to whom the minted tokens will be dilivered
     * @param _amount Number of tokens get minted
     * @return success
     */
    function mint(address _investor, uint256 _amount) public onlyModule(STO_KEY, true) checkGranularity(_amount) isMintingAllowed() returns (bool success) {
        require(_investor != address(0), "Investor address should not be 0x");
        adjustInvestorCount(address(0), _investor, _amount);
        require(verifyTransfer(address(0), _investor, _amount), "Transfer is not valid");
        adjustBalanceCheckpoints(_investor);
        adjustTotalSupplyCheckpoints();
        totalSupply_ = totalSupply_.add(_amount);
        balances[_investor] = balances[_investor].add(_amount);
        emit Minted(_investor, _amount);
        emit Transfer(address(0), _investor, _amount);
        return true;
    }

    /**
     * @notice mints new tokens and assigns them to the target _investor.
     * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet)
     * @param _investors A list of addresses to whom the minted tokens will be dilivered
     * @param _amounts A list of number of tokens get minted and transfer to corresponding address of the investor from _investor[] list
     * @return success
     */
    function mintMulti(address[] _investors, uint256[] _amounts) public onlyModule(STO_KEY, true) returns (bool success) {
        require(_investors.length == _amounts.length, "Mis-match in the length of the arrays");
        for (uint256 i = 0; i < _investors.length; i++) {
            mint(_investors[i], _amounts[i]);
        }
        return true;
    }

    /**
     * @notice Validate permissions with PermissionManager if it exists, If no Permission return false
     * @dev Note that IModule withPerm will allow ST owner all permissions anyway
     * @dev this allows individual modules to override this logic if needed (to not allow ST owner all permissions)
     * @param _delegate address of delegate
     * @param _module address of PermissionManager module
     * @param _perm the permissions
     * @return success
     */
    function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool) {
        if (modules[PERMISSIONMANAGER_KEY].length == 0) {
            return false;
        }

        for (uint8 i = 0; i < modules[PERMISSIONMANAGER_KEY].length; i++) {
            if (IPermissionManager(modules[PERMISSIONMANAGER_KEY][i].moduleAddress).checkPermission(_delegate, _module, _perm)) {
                return true;
            }
        }
    }

    /**
     * @notice used to set the token Burner address. It only be called by the owner
     * @param _tokenBurner Address of the token burner contract
     */
    function setTokenBurner(address _tokenBurner) public onlyOwner {
        tokenBurner = ITokenBurner(_tokenBurner);
    }

    /**
     * @notice Burn function used to burn the securityToken
     * @param _value No. of token that get burned
     */
    function burn(uint256 _value) checkGranularity(_value) public {
        adjustInvestorCount(msg.sender, address(0), _value);
        require(tokenBurner != address(0), "Token Burner contract address is not set yet");
        require(verifyTransfer(msg.sender, address(0), _value), "Transfer is not valid");
        require(_value <= balances[msg.sender], "Value should no be greater than the balance of msg.sender");
        adjustBalanceCheckpoints(msg.sender);
        adjustTotalSupplyCheckpoints();
        // no need to require value <= totalSupply, since that would imply the
        // sender's balance is greater than the totalSupply, which *should* be an assertion failure

        balances[msg.sender] = balances[msg.sender].sub(_value);
        require(tokenBurner.burn(msg.sender, _value), "Token burner process is not validated");
        totalSupply_ = totalSupply_.sub(_value);
        emit Burnt(msg.sender, _value);
        emit Transfer(msg.sender, address(0), _value);
    }

    /**
     * @notice Get function signature from _data
     * @param _data passed data
     * @return bytes4 sig
     */
    function getSig(bytes _data) internal pure returns (bytes4 sig) {
        uint len = _data.length < 4 ? _data.length : 4;
        for (uint i = 0; i < len; i++) {
            sig = bytes4(uint(sig) + uint(_data[i]) * (2 ** (8 * (len - 1 - i))));
        }
    }

    /**
     * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy
     * @return uint256
     */
    function createCheckpoint() public onlyModule(CHECKPOINT_KEY, true) returns(uint256) {
        require(currentCheckpointId < 2**256 - 1);
        currentCheckpointId = currentCheckpointId + 1;
        emit LogCheckpointCreated(currentCheckpointId, now);
        return currentCheckpointId;
    }

    /**
     * @notice Queries totalSupply as of a defined checkpoint
     * @param _checkpointId Checkpoint ID to query
     * @return uint256
     */
    function totalSupplyAt(uint256 _checkpointId) public view returns(uint256) {
        return getValueAt(checkpointTotalSupply, _checkpointId, totalSupply());
    }

    /**
     * @notice Queries value at a defined checkpoint
     * @param checkpoints is array of Checkpoint objects
     * @param _checkpointId Checkpoint ID to query
     * @param _currentValue Current value of checkpoint
     * @return uint256
     */
    function getValueAt(Checkpoint[] storage checkpoints, uint256 _checkpointId, uint256 _currentValue) internal view returns(uint256) {
        require(_checkpointId <= currentCheckpointId);
        //Checkpoint id 0 is when the token is first created - everyone has a zero balance
        if (_checkpointId == 0) {
          return 0;
        }
        if (checkpoints.length == 0) {
            return _currentValue;
        }
        if (checkpoints[0].checkpointId >= _checkpointId) {
            return checkpoints[0].value;
        }
        if (checkpoints[checkpoints.length - 1].checkpointId < _checkpointId) {
            return _currentValue;
        }
        if (checkpoints[checkpoints.length - 1].checkpointId == _checkpointId) {
            return checkpoints[checkpoints.length - 1].value;
        }
        uint256 min = 0;
        uint256 max = checkpoints.length - 1;
        while (max > min) {
            uint256 mid = (max + min) / 2;
            if (checkpoints[mid].checkpointId == _checkpointId) {
                max = mid;
                break;
            }
            if (checkpoints[mid].checkpointId < _checkpointId) {
                min = mid + 1;
            } else {
                max = mid;
            }
        }
        return checkpoints[max].value;
    }

    /**
     * @notice Queries balances as of a defined checkpoint
     * @param _investor Investor to query balance for
     * @param _checkpointId Checkpoint ID to query as of
     */
    function balanceOfAt(address _investor, uint256 _checkpointId) public view returns(uint256) {
        return getValueAt(checkpointBalances[_investor], _checkpointId, balanceOf(_investor));
    }

}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"freezeTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investorListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint8"}],"name":"removeModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMintingSTO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_granularity","type":"uint256"}],"name":"changeGranularity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finishedSTOMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenBurner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tickerRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unfreezeTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"securityTokenVersion","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"investors","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint256"}],"name":"getModule","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investors","type":"address[]"},{"name":"_amounts","type":"uint256[]"}],"name":"mintMulti","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"},{"name":"_checkpointId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentCheckpointId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"granularity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_MODULES","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint8"},{"name":"_budget","type":"uint256"}],"name":"changeModuleBudget","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"freeze","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STO_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"polyToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"},{"name":"","type":"uint256"}],"name":"modules","outputs":[{"name":"name","type":"bytes32"},{"name":"moduleAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newTokenDetails","type":"string"}],"name":"updateTokenDetails","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"polymathRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"checkpointTotalSupply","outputs":[{"name":"checkpointId","type":"uint256"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_delegate","type":"address"},{"name":"_module","type":"address"},{"name":"_perm","type":"bytes32"}],"name":"checkPermission","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TRANSFERMANAGER_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_checkpointId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"verifyTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finishedIssuerMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_name","type":"bytes32"}],"name":"getModuleByName","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finishMintingIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PERMISSIONMANAGER_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenBurner","type":"address"}],"name":"setTokenBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"moduleRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CHECKPOINT_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"},{"name":"_iters","type":"uint256"}],"name":"pruneInvestors","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"securityTokenRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenDetails","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInvestorsLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateFromRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_moduleFactory","type":"address"},{"name":"_data","type":"bytes"},{"name":"_maxCost","type":"uint256"},{"name":"_budget","type":"uint256"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawPoly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"checkpointBalances","outputs":[{"name":"checkpointId","type":"uint256"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"createCheckpoint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"_granularity","type":"uint256"},{"name":"_tokenDetails","type":"string"},{"name":"_polymathRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_type","type":"uint8"},{"indexed":false,"name":"_name","type":"bytes32"},{"indexed":false,"name":"_moduleFactory","type":"address"},{"indexed":false,"name":"_module","type":"address"},{"indexed":false,"name":"_moduleCost","type":"uint256"},{"indexed":false,"name":"_budget","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldDetails","type":"string"},{"indexed":false,"name":"_newDetails","type":"string"}],"name":"LogUpdateTokenDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldGranularity","type":"uint256"},{"indexed":false,"name":"_newGranularity","type":"uint256"}],"name":"LogGranularityChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_type","type":"uint8"},{"indexed":false,"name":"_module","type":"address"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogModuleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_moduleType","type":"uint8"},{"indexed":false,"name":"_module","type":"address"},{"indexed":false,"name":"_budget","type":"uint256"}],"name":"LogModuleBudgetChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_freeze","type":"bool"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogFreezeTransfers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_checkpointId","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogCheckpointCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogFinishMintingIssuer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogFinishMintingSTO","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldAddress","type":"address"},{"indexed":true,"name":"_newAddress","type":"address"}],"name":"LogChangeSTRAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_burner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Burnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

6080604052600c805460ff191690556011805460a060020a60ff02191690556014805461ffff191690553480156200003657600080fd5b5060405162004ee538038062004ee58339810160409081528151602080840151928401516060850151608086015160a08701519487018051909796870196939592949190930192829188918891889162000097916003919086019062000635565b508151620000ad90600490602085019062000635565b506005805460ff90921660ff19909216919091179055505060078054600160a060020a03191633179055600160a060020a0381161515620000ed57600080fd5b600c8054600160a060020a039092166101000261010060a860020a031990921691909117905562000126640100000000620002a6810204565b81516200013b90600690602085019062000635565b5050506008555050604080517f7472616e7366657228616464726573732c75696e743235362900000000000000815281519081900360190181207fffffffff00000000000000000000000000000000000000000000000000000000908116600090815260156020818152858320805460ff1990811660019081179092557f7472616e7366657246726f6d28616464726573732c616464726573732c75696e87527f74323536290000000000000000000000000000000000000000000000000000008388015287519687900360250187208616855283835287852080548216831790557f6d696e7428616464726573732c75696e743235362900000000000000000000008752875196879003840187208616855283835287852080548216831790557f6275726e2875696e7432353629000000000000000000000000000000000000008752875196879003600d01909620909416835252929092208054909116909117905550620006da565b600754600160a060020a03163314620002be57600080fd5b600c54604080517fbf40fac1000000000000000000000000000000000000000000000000000000008152602060048201819052600e60248301527f4d6f64756c65526567697374727900000000000000000000000000000000000060448301529151610100909304600160a060020a03169263bf40fac1926064808401939192918290030181600087803b1580156200035657600080fd5b505af11580156200036b573d6000803e3d6000fd5b505050506040513d60208110156200038257600080fd5b5051600d8054600160a060020a031916600160a060020a03928316179055600c54604080517fbf40fac1000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f5365637572697479546f6b656e52656769737472790000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b1580156200043057600080fd5b505af115801562000445573d6000803e3d6000fd5b505050506040513d60208110156200045c57600080fd5b5051600e8054600160a060020a031916600160a060020a03928316178155600c54604080517fbf40fac100000000000000000000000000000000000000000000000000000000815260206004820181905260248201949094527f5469636b65725265676973747279000000000000000000000000000000000000604482015290516101009092049093169263bf40fac19260648083019391928290030181600087803b1580156200050c57600080fd5b505af115801562000521573d6000803e3d6000fd5b505050506040513d60208110156200053857600080fd5b5051600f8054600160a060020a031916600160a060020a03928316179055600c54604080517fbf40fac1000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f506f6c79546f6b656e0000000000000000000000000000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b158015620005e657600080fd5b505af1158015620005fb573d6000803e3d6000fd5b505050506040513d60208110156200061257600080fd5b505160108054600160a060020a031916600160a060020a03909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200067857805160ff1916838001178555620006a8565b82800160010185558215620006a8579182015b82811115620006a85782518255916020019190600101906200068b565b50620006b6929150620006ba565b5090565b620006d791905b80821115620006b65760008155600101620006c1565b90565b6147fb80620006ea6000396000f3006080604052600436106102c65763ffffffff60e060020a6000350416630150246081146102cb57806306fdde03146102e2578063095ea7b31461036c5780630c72a835146103a457806318160ddd146103c55780631b2ae899146103ec5780631bc125f31461040d578063210a8d0e14610422578063219371921461043a57806323b872dd1461044f5780632996f972146104795780632a858126146104aa578063313ce567146104bf57806331c420d4146104ea5780633876e6d3146104ff5780633feb5f2b1461051457806340c10f191461052c57806342966c681461055057806346b65ffd1461056857806346e4959d146105a75780634ee2cd7e146106355780635488cc8014610659578063556f0dc71461066e5780635f1e8c1b146106835780635fcc62771461069857806362a5af3b146106bc5780636604ca6b146106d157806366188463146106e65780636faa22a51461070a57806370a082311461071f578063715018a614610740578063729d20e21461075557806373826a931461077357806377282b70146107cc5780637e8937d9146107e15780638658b8b9146108125780638da5cb5b1461083c57806391415ce91461085157806395d89b4114610866578063981b24d01461087b5780639a4b1d5c146108935780639c3fe721146108bd5780639f45b45c146108d2578063a3f7e26d146108f0578063a8ef4b6614610905578063a9059cbb1461091a578063b0af768b1461093e578063b95459e41461095f578063bcddd64e14610974578063c5bac42114610989578063ce4dbdff146109a4578063d6abe110146109b9578063d73dd623146109ce578063d7e64c00146109f2578063dd62ed3e14610a07578063e3cc65e214610a2e578063f2fde38b14610a43578063f433262f14610a64578063f5efbd2d14610a79578063f8a4cc3314610aac578063fbaa401914610ac4578063ff0b9c9014610ae8575b600080fd5b3480156102d757600080fd5b506102e0610afd565b005b3480156102ee57600080fd5b506102f7610b97565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610331578181015183820152602001610319565b50505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037857600080fd5b50610390600160a060020a0360043516602435610c25565b604080519115158252519081900360200190f35b3480156103b057600080fd5b50610390600160a060020a0360043516610c8b565b3480156103d157600080fd5b506103da610ca0565b60408051918252519081900360200190f35b3480156103f857600080fd5b506102e060ff60043581169060243516610ca7565b34801561041957600080fd5b506102e0610f47565b34801561042e57600080fd5b506102e0600435610fa2565b34801561044657600080fd5b50610390611052565b34801561045b57600080fd5b50610390600160a060020a0360043581169060243516604435611060565b34801561048557600080fd5b5061048e6110ee565b60408051600160a060020a039092168252519081900360200190f35b3480156104b657600080fd5b5061048e6110fd565b3480156104cb57600080fd5b506104d461110c565b6040805160ff9092168252519081900360200190f35b3480156104f657600080fd5b506102e0611115565b34801561050b57600080fd5b506103da6111ab565b34801561052057600080fd5b5061048e6004356111cf565b34801561053857600080fd5b50610390600160a060020a03600435166024356111f7565b34801561055c57600080fd5b506102e0600435611736565b34801561057457600080fd5b5061058660ff60043516602435611afc565b60408051928352600160a060020a0390911660208301528051918290030190f35b3480156105b357600080fd5b506040805160206004803580820135838102808601850190965280855261039095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611b9a9650505050505050565b34801561064157600080fd5b506103da600160a060020a0360043516602435611e9d565b34801561066557600080fd5b506103da611ecf565b34801561067a57600080fd5b506103da611ed5565b34801561068f57600080fd5b506104d4611edb565b3480156106a457600080fd5b506102e060ff60043581169060243516604435611ee0565b3480156106c857600080fd5b506103906123d2565b3480156106dd57600080fd5b506104d46123e2565b3480156106f257600080fd5b50610390600160a060020a03600435166024356123e7565b34801561071657600080fd5b5061048e6124d7565b34801561072b57600080fd5b506103da600160a060020a03600435166124e6565b34801561074c57600080fd5b506102e0612501565b34801561076157600080fd5b5061058660ff60043516602435612562565b34801561077f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102e09436949293602493928401919081908401838280828437509497506125a69650505050505050565b3480156107d857600080fd5b5061048e6126e9565b3480156107ed57600080fd5b506107f96004356126fd565b6040805192835260208301919091528051918290030190f35b34801561081e57600080fd5b50610390600160a060020a0360043581169060243516604435612729565b34801561084857600080fd5b5061048e6128b0565b34801561085d57600080fd5b506104d46128bf565b34801561087257600080fd5b506102f76128c4565b34801561088757600080fd5b506103da60043561291f565b34801561089f57600080fd5b50610390600160a060020a0360043581169060243516604435612935565b3480156108c957600080fd5b50610390612c81565b3480156108de57600080fd5b5061058660ff60043516602435612c8a565b3480156108fc57600080fd5b506102e0612d8a565b34801561091157600080fd5b506104d4612de3565b34801561092657600080fd5b50610390600160a060020a0360043516602435612de8565b34801561094a57600080fd5b506102e0600160a060020a0360043516612e74565b34801561096b57600080fd5b5061048e612ead565b34801561098057600080fd5b506104d4612ebc565b34801561099557600080fd5b506102e0600435602435612ec1565b3480156109b057600080fd5b5061048e613006565b3480156109c557600080fd5b506102f7613015565b3480156109da57600080fd5b50610390600160a060020a0360043516602435613070565b3480156109fe57600080fd5b506103da613109565b348015610a1357600080fd5b506103da600160a060020a036004358116906024351661310f565b348015610a3a57600080fd5b506103da61313a565b348015610a4f57600080fd5b506102e0600160a060020a0360043516613140565b348015610a7057600080fd5b506102e0613163565b348015610a8557600080fd5b506102e060048035600160a060020a0316906024803590810191013560443560643561348d565b348015610ab857600080fd5b506102e0600435613510565b348015610ad057600080fd5b506107f9600160a060020a036004351660243561361b565b348015610af457600080fd5b506103da613656565b600754600160a060020a03163314610b1457600080fd5b60115460a060020a900460ff1615610b2b57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a90811791829055604080519190920460ff161515815242602082015281517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b3929181900390910190a1565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b820191906000526020600020905b815481529060010190602001808311610c0057829003601f168201915b505050505081565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60176020526000908152604090205460ff1681565b6001545b90565b600754600160a060020a03163314610cbe57600080fd5b60ff80831660009081526016602052604090205490821610610d50576040805160e560020a62461bcd02815260206004820152603960248201527f4d6f64756c6520696e64657820646f65736e277420657869737420617320706560448201527f72207468652063686f6f73656e206d6f64756c65207479706500000000000000606482015290519081900360840190fd5b60ff8083166000908152601660205260408120805491929091908416908110610d7557fe5b6000918252602090912060016002909202010154600160a060020a03161415610e0e576040805160e560020a62461bcd02815260206004820152602860248201527f4d6f64756c6520636f6e747261637420616464726573732073686f756c64206e60448201527f6f74206265203078000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8083166000818152601660205260409020805491927fe69a96f148bcf365cf82241853ecbeb32c5b01500d98bf3d93ee870cd951162c92908516908110610e5357fe5b60009182526020918290206001600290920201015460408051600160a060020a039092168252429282019290925281519081900390910190a260ff8216600090815260166020526040902080546000198101908110610eae57fe5b9060005260206000209060020201601660008460ff1660ff1681526020019081526020016000208260ff16815481101515610ee557fe5b600091825260208083208454600290930201918255600193840154939091018054600160a060020a031916600160a060020a039094169390931790925560ff8416815260169091526040902080546000190190610f42908261467b565b505050565b600754600160a060020a03163314610f5e57600080fd5b6014805461ff0019166101001790556040805142815290517fc3f76bdabdaf2a3983623e5efddd4deb49a4acdca62642d61969164d2a4441259181900360200190a1565b600754600160a060020a03163314610fb957600080fd5b801515611010576040805160e560020a62461bcd02815260206004820152601860248201527f4772616e756c61726974792063616e206e6f7420626520300000000000000000604482015290519081900360640190fd5b600854604080519182526020820183905280517fd13c95c3e8cd875fc20a3da70637bcd9e053e0414035532577769470649507dc9281900390910190a1600855565b601454610100900460ff1681565b600061106d8484846138d3565b611078848484612935565b15156110bc576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b6110c5846139fd565b6110ce836139fd565b6110d9848484613a27565b15156110e457600080fd5b5060019392505050565b601154600160a060020a031681565b600f54600160a060020a031681565b60055460ff1681565b600754600160a060020a0316331461112c57600080fd5b60115460a060020a900460ff16151561114457600080fd5b6011805474ff00000000000000000000000000000000000000001916908190556040805160a060020a90920460ff161515825242602083015280517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b39281900390910190a1565b7f302e302e3100000000000000000000000000000000000000000000000000000081565b600b8054829081106111dd57fe5b600091825260209091200154600160a060020a0316905081565b60006003600182805b60ff808516600090815260166020526040902054908216101561126f578180611265575060ff808516600090815260166020526040902080543392841690811061124657fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611200565b82801561127a575081155b1561139d5760ff8416600314156113365760ff84166000908152601660205260409020541580156112b55750600754600160a060020a031633145b1515611331576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611398565b600754600160a060020a03163314611398576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b61141a565b81151561141a576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b856008548181151561142857fe5b06156114a4576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a03163314156115175760145460ff1615611512576040805160e560020a62461bcd02815260206004820152601e60248201527f4d696e74696e672069732066696e697368656420666f72204973737565720000604482015290519081900360640190fd5b611577565b601454610100900460ff1615611577576040805160e560020a62461bcd02815260206004820152601c60248201527f4d696e74696e672069732066696e697368656420666f722053544f7300000000604482015290519081900360640190fd5b600160a060020a03881615156115fd576040805160e560020a62461bcd02815260206004820152602160248201527f496e766573746f7220616464726573732073686f756c64206e6f74206265203060448201527f7800000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611609600089896138d3565b61161560008989612935565b1515611659576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b611662886139fd565b61166a613b8c565b60015461167d908863ffffffff613b9b16565b600155600160a060020a0388166000908152602081905260409020546116a9908863ffffffff613b9b16565b600160a060020a038916600081815260208181526040918290209390935580518a8152905191927f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe92918290030190a2604080518881529051600160a060020a038a16916000916000805160206147b08339815191529181900360200190a3506001979650505050505050565b806008548181151561174457fe5b06156117c0576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b6117cc336000846138d3565b601154600160a060020a03161515611854576040805160e560020a62461bcd02815260206004820152602c60248201527f546f6b656e204275726e657220636f6e7472616374206164647265737320697360448201527f206e6f7420736574207965740000000000000000000000000000000000000000606482015290519081900360840190fd5b61186033600084612935565b15156118a4576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b33600090815260208190526040902054821115611931576040805160e560020a62461bcd02815260206004820152603960248201527f56616c75652073686f756c64206e6f2062652067726561746572207468616e2060448201527f7468652062616c616e6365206f66206d73672e73656e64657200000000000000606482015290519081900360840190fd5b61193a336139fd565b611942613b8c565b33600090815260208190526040902054611962908363ffffffff613ba816565b336000818152602081815260408083209490945560115484517f9dc29fac0000000000000000000000000000000000000000000000000000000081526004810194909452602484018790529351600160a060020a0390941693639dc29fac93604480820194918390030190829087803b1580156119de57600080fd5b505af11580156119f2573d6000803e3d6000fd5b505050506040513d6020811015611a0857600080fd5b50511515611a86576040805160e560020a62461bcd02815260206004820152602560248201527f546f6b656e206275726e65722070726f63657373206973206e6f742076616c6960448201527f6461746564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600154611a99908363ffffffff613ba816565b60015560408051838152905133917f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b1919081900360200190a260408051838152905160009133916000805160206147b08339815191529181900360200190a35050565b60ff82166000908152601660205260408120548190811015611b8c5760ff84166000908152601660205260409020805484908110611b3657fe5b6000918252602080832060029092029091015460ff8716835260169091526040909120805485908110611b6557fe5b6000918252602090912060016002909202010154909250600160a060020a03169050611b93565b5060009050805b9250929050565b6000806003600182805b60ff8085166000908152601660205260409020549082161015611c13578180611c09575060ff8085166000908152601660205260409020805433928416908110611bea57fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611ba4565b828015611c1e575081155b15611d415760ff841660031415611cda5760ff8416600090815260166020526040902054158015611c595750600754600160a060020a031633145b1515611cd5576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611d3c565b600754600160a060020a03163314611d3c576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b611dbe565b811515611dbe576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8651885114611e3d576040805160e560020a62461bcd02815260206004820152602560248201527f4d69732d6d6174636820696e20746865206c656e677468206f6620746865206160448201527f7272617973000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600094505b8751851015611e8f57611e838886815181101515611e5c57fe5b906020019060200201518887815181101515611e7457fe5b906020019060200201516111f7565b50600190940193611e42565b506001979650505050505050565b600160a060020a0382166000908152601260205260408120611ec89083611ec3866124e6565b613bba565b9392505050565b60095481565b60085481565b601481565b600754600090600160a060020a03163314611efa57600080fd5b60ff84161515611f54576040805160e560020a62461bcd02815260206004820152601a60248201527f4d6f64756c6520747970652063616e6e6f74206265207a65726f000000000000604482015290519081900360640190fd5b60ff80851660009081526016602052604090205490841610611fc0576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f727272656374206d6f64756c6520696e646578000000000000000000604482015290519081900360640190fd5b60105460ff80861660009081526016602052604090208054600160a060020a039093169263dd62ed3e92309291908816908110611ff957fe5b60009182526020808320600160029093020191909101546040805160e060020a63ffffffff8816028152600160a060020a03958616600482015294909116602485015251604480850194929391928390030190829087803b15801561205d57600080fd5b505af1158015612071573d6000803e3d6000fd5b505050506040513d602081101561208757600080fd5b50519050808210156121f45760105460ff80861660009081526016602052604090208054600160a060020a039093169263661884639287169081106120c857fe5b6000918252602090912060016002909202010154600160a060020a03166120f5848663ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561214757600080fd5b505af115801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b505115156121ef576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20646563726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612350565b60105460ff80861660009081526016602052604090208054600160a060020a039093169263d73dd62392871690811061222957fe5b6000918252602090912060016002909202010154600160a060020a0316612256858563ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156122a857600080fd5b505af11580156122bc573d6000803e3d6000fd5b505050506040513d60208110156122d257600080fd5b50511515612350576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20696e63726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8085166000818152601660205260409020805491927f56e65530d356ea53a7cecc9a37666884b4fe9f05a65df888abd3898548bc15f49290871690811061239557fe5b60009182526020918290206001600290920201015460408051600160a060020a03909216825291810186905281519081900390910190a250505050565b60115460a060020a900460ff1681565b600381565b336000908152600260209081526040808320600160a060020a03861684529091528120548083111561243c57336000908152600260209081526040808320600160a060020a0388168452909152812055612471565b61244c818463ffffffff613ba816565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b601054600160a060020a031681565b600160a060020a031660009081526020819052604090205490565b600754600160a060020a0316331461251857600080fd5b600754604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260078054600160a060020a0319169055565b60166020528160005260406000208181548110151561257d57fe5b600091825260209091206002909102018054600190910154909250600160a060020a0316905082565b600754600160a060020a031633146125bd57600080fd5b6040805181815260068054600260001961010060018416150201909116049282018390527fcef6c04f6d4bada4c1a1fcbb22cadbe4d4fb609cea3788e920628a6186e587659290918491819060208201906060830190869080156126625780601f1061263757610100808354040283529160200191612662565b820191906000526020600020905b81548152906001019060200180831161264557829003601f168201915b5050838103825284518152845160209182019186019080838360005b8381101561269657818101518382015260200161267e565b50505050905090810190601f1680156126c35780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a180516126e59060069060208401906146a7565b5050565b600c546101009004600160a060020a031681565b601380548290811061270b57fe5b60009182526020909120600290910201805460019091015490915082565b6001600090815260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49548190151561276857600091506128a8565b5060005b600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460ff821610156128a857600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49805460ff83169081106127dc57fe5b6000918252602080832060016002909302019190910154604080517f8658b8b9000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015289811660248301526044820189905291519190921693638658b8b993606480850194919392918390030190829087803b15801561286657600080fd5b505af115801561287a573d6000803e3d6000fd5b505050506040513d602081101561289057600080fd5b5051156128a057600191506128a8565b60010161276c565b509392505050565b600754600160a060020a031681565b600281565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b600061292f601383611ec3610ca0565b92915050565b6000806000806000806000876008548181151561294e57fe5b06156129ca576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b60115460a060020a900460ff161515612c6e576000965060156000612a1f6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843750613d65945050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016815260208101919091526040016000205460ff1615612a5f57600196505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648541515612a9a5760019750612c73565b600095506000945060009350600092505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff84161015612c4c57600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648805460ff8516908110612b1b57fe5b906000526020600020906002020160010160009054906101000a9004600160a060020a0316600160a060020a0316637915c9e08c8c8c8b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200182151515158152602001945050505050602060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b505191506000826003811115612c0457fe5b1415612c0f57600195505b6002826003811115612c1d57fe5b1415612c2857600194505b6003826003811115612c3657fe5b1415612c4157600193505b600190920191612aab565b83612c645785612c5c5784612c5f565b60005b612c67565b60015b9750612c73565b600097505b505050505050509392505050565b60145460ff1681565b60ff821660009081526016602052604081205481908190811015612d7a575060005b60ff8516600090815260166020526040902054811015612d7a5760ff85166000908152601660205260409020805485919083908110612ce757fe5b60009182526020909120600290910201541415612d725760ff85166000908152601660205260409020805482908110612d1c57fe5b6000918252602080832060029092029091015460ff8816835260169091526040909120805483908110612d4b57fe5b6000918252602090912060016002909202010154909350600160a060020a03169150612d82565b600101612cac565b600092508291505b509250929050565b600754600160a060020a03163314612da157600080fd5b6014805460ff191660011790556040805142815290517f10216e36c4b6dff3d74179d50b938f0f96afc610f073894ca04b4239299165679181900360200190a1565b600181565b6000612df53384846138d3565b612e00338484612935565b1515612e44576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b612e4d336139fd565b612e56836139fd565b612e608383613de6565b1515612e6b57600080fd5b50600192915050565b600754600160a060020a03163314612e8b57600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600d54600160a060020a031681565b600481565b600754600090600160a060020a03163314612edb57600080fd5b50815b612ef9612ef1848463ffffffff613b9b16565b600b54613eb5565b811015610f4257600b5481108015612f3a5750612f38600b82815481101515612f1e57fe5b600091825260209091200154600160a060020a03166124e6565b155b15612ffe57600060176000600b84815481101515612f5457fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff1916911515919091179055600b80546000198101908110612f9a57fe5b600091825260209091200154600b8054600160a060020a039092169183908110612fc057fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600b805490612ffc906000198301614725565b505b600101612ede565b600e54600160a060020a031681565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b336000908152600260209081526040808320600160a060020a03861684529091528120546130a4908363ffffffff613b9b16565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600a5481565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600b5490565b600754600160a060020a0316331461315757600080fd5b61316081613ecb565b50565b600754600160a060020a0316331461317a57600080fd5b600c546040805160e060020a63bf40fac1028152602060048201819052600e60248301527f4d6f64756c65526567697374727900000000000000000000000000000000000060448301529151610100909304600160a060020a03169263bf40fac1926064808401939192918290030181600087803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051600d8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052601560248301527f5365637572697479546f6b656e52656769737472790000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b1580156132bc57600080fd5b505af11580156132d0573d6000803e3d6000fd5b505050506040513d60208110156132e657600080fd5b5051600e8054600160a060020a031916600160a060020a03928316178155600c546040805160e060020a63bf40fac102815260206004820181905260248201949094527f5469636b65725265676973747279000000000000000000000000000000000000604482015290516101009092049093169263bf40fac19260648083019391928290030181600087803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b5051600f8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052600960248301527f506f6c79546f6b656e0000000000000000000000000000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b15801561344057600080fd5b505af1158015613454573d6000803e3d6000fd5b505050506040513d602081101561346a57600080fd5b505160108054600160a060020a031916600160a060020a03909216919091179055565b600754600160a060020a031633146134a457600080fd5b600c5460ff16156134b457600080fd5b600c805460ff19166001179055604080516020601f86018190048102820181019092528481526134ff9187919087908790819084018382808284378201915050505050508484613f3c565b5050600c805460ff19169055505050565b600754600160a060020a0316331461352757600080fd5b601054600754604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561359957600080fd5b505af11580156135ad573d6000803e3d6000fd5b505050506040513d60208110156135c357600080fd5b50511515613160576040805160e560020a62461bcd02815260206004820152601560248201527f496e2d73756666696369656e742062616c616e63650000000000000000000000604482015290519081900360640190fd5b60126020528160005260406000208181548110151561363657fe5b600091825260209091206002909102018054600190910154909250905082565b60006004600182805b60ff80851660009081526016602052604090205490821610156136ce5781806136c4575060ff80851660009081526016602052604090208054339284169081106136a557fe5b6000918252602090912060016002909202010154600160a060020a0316145b915060010161365f565b8280156136d9575081155b156137fc5760ff8416600314156137955760ff84166000908152601660205260409020541580156137145750600754600160a060020a031633145b1515613790576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b6137f7565b600754600160a060020a031633146137f7576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b613879565b811515613879576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6009546000191161388957600080fd5b60098054600101908190556040805142815290517feb3befa36ea6638fc3379fe62edc59509b81aeca57cfbb0f444b1e72b8ac93fe9181900360200190a260095494505050505090565b8015806138f1575081600160a060020a031683600160a060020a0316145b156138fb57610f42565b613904826124e6565b1580156139195750600160a060020a03821615155b1561393657600a5461393290600163ffffffff613b9b16565b600a555b61393f836124e6565b81141561395e57600a5461395a90600163ffffffff613ba816565b600a555b600160a060020a03821660009081526017602052604090205460ff1615801561398f5750600160a060020a03821615155b15610f4257600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018054600160a060020a038516600160a060020a031990911681179091556000908152601760205260409020805460ff19169091179055505050565b600160a060020a038116600090815260126020526040902061316090613a22836124e6565b6145b7565b6000600160a060020a0383161515613a3e57600080fd5b600160a060020a038416600090815260208190526040902054821115613a6357600080fd5b600160a060020a0384166000908152600260209081526040808320338452909152902054821115613a9357600080fd5b600160a060020a038416600090815260208190526040902054613abc908363ffffffff613ba816565b600160a060020a038086166000908152602081905260408082209390935590851681522054613af1908363ffffffff613b9b16565b600160a060020a03808516600090815260208181526040808320949094559187168152600282528281203382529091522054613b33908363ffffffff613ba816565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391926000805160206147b0833981519152929181900390910190a35060019392505050565b613b996013613a22610ca0565b565b8181018281101561292f57fe5b600082821115613bb457fe5b50900390565b6000806000806009548611151515613bd157600080fd5b851515613be15760009350613d5b565b86541515613bf157849350613d5b565b85876000815481101515613c0157fe5b600091825260209091206002909102015410613c3f57866000815481101515613c2657fe5b9060005260206000209060020201600101549350613d5b565b8654869088906000198101908110613c5357fe5b9060005260206000209060020201600001541015613c7357849350613d5b565b8654869088906000198101908110613c8757fe5b9060005260206000209060020201600001541415613cb157865487906000198101908110613c2657fe5b8654600093506000190191505b82821115613d38576002828401049050858782815481101515613cdd57fe5b9060005260206000209060020201600001541415613cfd57809150613d38565b858782815481101515613d0c57fe5b9060005260206000209060020201600001541015613d2f57806001019250613d33565b8091505b613cbe565b8682815481101515613d4657fe5b90600052602060002090600202016001015493505b5050509392505050565b60008060006004845110613d7a576004613d7d565b83515b9150600090505b81811015613ddf5780600183030360080260020a8482815181101515613da657fe5b90602001015160f860020a900460f860020a0260f860020a9004028360e060020a90040160e060020a0292508080600101915050613d84565b5050919050565b6000600160a060020a0383161515613dfd57600080fd5b33600090815260208190526040902054821115613e1957600080fd5b33600090815260208190526040902054613e39908363ffffffff613ba816565b3360009081526020819052604080822092909255600160a060020a03851681522054613e6b908363ffffffff613b9b16565b600160a060020a038416600081815260208181526040918290209390935580518581529051919233926000805160206147b08339815191529281900390910190a350600192915050565b6000818310613ec45781611ec8565b5090919050565b600160a060020a0381161515613ee057600080fd5b600754604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360078054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517fdc659907000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015291516000938493849384938493929092169163dc65990791602480820192869290919082900301818387803b158015613fae57600080fd5b505af1158015613fc2573d6000803e3d6000fd5b5050505088945084600160a060020a03166315dae03e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561400757600080fd5b505af115801561401b573d6000803e3d6000fd5b505050506040513d602081101561403157600080fd5b505160ff81166000908152601660205260409020549094506014116140a0576040805160e560020a62461bcd02815260206004820152601f60248201527f4c696d6974206f66204d4158204d4f44554c4553206973207265616368656400604482015290519081900360640190fd5b84600160a060020a0316637e363ffa6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156140de57600080fd5b505af11580156140f2573d6000803e3d6000fd5b505050506040513d602081101561410857600080fd5b505192508683111561418a576040805160e560020a62461bcd02815260206004820152602e60248201527f4d617820436f737420697320616c77617973206265206772656174657220746860448201527f616e206d6f64756c6520636f7374000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163095ea7b39160448083019260209291908290030181600087803b1580156141f957600080fd5b505af115801561420d573d6000803e3d6000fd5b505050506040513d602081101561422357600080fd5b505115156142a1576040805160e560020a62461bcd02815260206004820152602360248201527f4e6f742061626c6520746f20617070726f766520746865206d6f64756c65206360448201527f6f73740000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6040517e7743600000000000000000000000000000000000000000000000000000000081526020600482018181528a5160248401528a51600160a060020a0389169362774360938d939283926044019185019080838360005b838110156143125781810151838201526020016142fa565b50505050905090810190601f16801561433f5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d602081101561438857600080fd5b5051601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038085166004830152602482018b9052915193955091169163095ea7b3916044808201926020929091908290030181600087803b1580156143fb57600080fd5b505af115801561440f573d6000803e3d6000fd5b505050506040513d602081101561442557600080fd5b5051151561447d576040805160e560020a62461bcd02815260206004820152601e60248201527f4e6f742061626c6520746f20617070726f766520746865206275646765740000604482015290519081900360640190fd5b84600160a060020a03166317d7de7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156144bb57600080fd5b505af11580156144cf573d6000803e3d6000fd5b505050506040513d60208110156144e557600080fd5b505160ff8516600081815260166020908152604080832081518083018352868152600160a060020a0389811682860181815284546001808201875595895297879020935160029098029093019687559151959092018054600160a060020a031916958316959095179094558151868152908f16928101929092528181019290925260608101879052608081018a90524260a0820152905192935090917fc6c63fb8912a7f464252e66132ad69604864e7520f1bcf0dd77c8d51d810a6519160c0908290030190a2505050505050505050565b60095415156145c5576126e5565b8154151561460c57604080518082019091526009548152602080820183815284546001818101875560008781529390932093516002909102909301928355519101556126e5565b60095482548390600019810190811061462157fe5b906000526020600020906002020160000154141561463e576126e5565b6040805180820190915260095481526020808201928352835460018082018655600095865291909420915160029094029091019283559051910155565b815481835581811115610f4257600202816002028360005260206000209182019101610f429190614749565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146e857805160ff1916838001178555614715565b82800160010185558215614715579182015b828111156147155782518255916020019190600101906146fa565b50614721929150614775565b5090565b815481835581811115610f4257600083815260209020610f42918101908301614775565b610ca491905b808211156147215760008155600181018054600160a060020a031916905560020161474f565b610ca491905b80821115614721576000815560010161477b56005472616e73666572206973206e6f742076616c69640000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820d194fbde9329028efd78e81aaa560fc5fa644ba09ac0fcec999dd63d4617267d002900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000014000000000000000000000000006595656b93ce14834f0d22b7bbda4382d5ab5100000000000000000000000000000000000000000000000000000000000000013506f6c796d617468205465737420546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957452e522e4c495645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c65763ffffffff60e060020a6000350416630150246081146102cb57806306fdde03146102e2578063095ea7b31461036c5780630c72a835146103a457806318160ddd146103c55780631b2ae899146103ec5780631bc125f31461040d578063210a8d0e14610422578063219371921461043a57806323b872dd1461044f5780632996f972146104795780632a858126146104aa578063313ce567146104bf57806331c420d4146104ea5780633876e6d3146104ff5780633feb5f2b1461051457806340c10f191461052c57806342966c681461055057806346b65ffd1461056857806346e4959d146105a75780634ee2cd7e146106355780635488cc8014610659578063556f0dc71461066e5780635f1e8c1b146106835780635fcc62771461069857806362a5af3b146106bc5780636604ca6b146106d157806366188463146106e65780636faa22a51461070a57806370a082311461071f578063715018a614610740578063729d20e21461075557806373826a931461077357806377282b70146107cc5780637e8937d9146107e15780638658b8b9146108125780638da5cb5b1461083c57806391415ce91461085157806395d89b4114610866578063981b24d01461087b5780639a4b1d5c146108935780639c3fe721146108bd5780639f45b45c146108d2578063a3f7e26d146108f0578063a8ef4b6614610905578063a9059cbb1461091a578063b0af768b1461093e578063b95459e41461095f578063bcddd64e14610974578063c5bac42114610989578063ce4dbdff146109a4578063d6abe110146109b9578063d73dd623146109ce578063d7e64c00146109f2578063dd62ed3e14610a07578063e3cc65e214610a2e578063f2fde38b14610a43578063f433262f14610a64578063f5efbd2d14610a79578063f8a4cc3314610aac578063fbaa401914610ac4578063ff0b9c9014610ae8575b600080fd5b3480156102d757600080fd5b506102e0610afd565b005b3480156102ee57600080fd5b506102f7610b97565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610331578181015183820152602001610319565b50505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037857600080fd5b50610390600160a060020a0360043516602435610c25565b604080519115158252519081900360200190f35b3480156103b057600080fd5b50610390600160a060020a0360043516610c8b565b3480156103d157600080fd5b506103da610ca0565b60408051918252519081900360200190f35b3480156103f857600080fd5b506102e060ff60043581169060243516610ca7565b34801561041957600080fd5b506102e0610f47565b34801561042e57600080fd5b506102e0600435610fa2565b34801561044657600080fd5b50610390611052565b34801561045b57600080fd5b50610390600160a060020a0360043581169060243516604435611060565b34801561048557600080fd5b5061048e6110ee565b60408051600160a060020a039092168252519081900360200190f35b3480156104b657600080fd5b5061048e6110fd565b3480156104cb57600080fd5b506104d461110c565b6040805160ff9092168252519081900360200190f35b3480156104f657600080fd5b506102e0611115565b34801561050b57600080fd5b506103da6111ab565b34801561052057600080fd5b5061048e6004356111cf565b34801561053857600080fd5b50610390600160a060020a03600435166024356111f7565b34801561055c57600080fd5b506102e0600435611736565b34801561057457600080fd5b5061058660ff60043516602435611afc565b60408051928352600160a060020a0390911660208301528051918290030190f35b3480156105b357600080fd5b506040805160206004803580820135838102808601850190965280855261039095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611b9a9650505050505050565b34801561064157600080fd5b506103da600160a060020a0360043516602435611e9d565b34801561066557600080fd5b506103da611ecf565b34801561067a57600080fd5b506103da611ed5565b34801561068f57600080fd5b506104d4611edb565b3480156106a457600080fd5b506102e060ff60043581169060243516604435611ee0565b3480156106c857600080fd5b506103906123d2565b3480156106dd57600080fd5b506104d46123e2565b3480156106f257600080fd5b50610390600160a060020a03600435166024356123e7565b34801561071657600080fd5b5061048e6124d7565b34801561072b57600080fd5b506103da600160a060020a03600435166124e6565b34801561074c57600080fd5b506102e0612501565b34801561076157600080fd5b5061058660ff60043516602435612562565b34801561077f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102e09436949293602493928401919081908401838280828437509497506125a69650505050505050565b3480156107d857600080fd5b5061048e6126e9565b3480156107ed57600080fd5b506107f96004356126fd565b6040805192835260208301919091528051918290030190f35b34801561081e57600080fd5b50610390600160a060020a0360043581169060243516604435612729565b34801561084857600080fd5b5061048e6128b0565b34801561085d57600080fd5b506104d46128bf565b34801561087257600080fd5b506102f76128c4565b34801561088757600080fd5b506103da60043561291f565b34801561089f57600080fd5b50610390600160a060020a0360043581169060243516604435612935565b3480156108c957600080fd5b50610390612c81565b3480156108de57600080fd5b5061058660ff60043516602435612c8a565b3480156108fc57600080fd5b506102e0612d8a565b34801561091157600080fd5b506104d4612de3565b34801561092657600080fd5b50610390600160a060020a0360043516602435612de8565b34801561094a57600080fd5b506102e0600160a060020a0360043516612e74565b34801561096b57600080fd5b5061048e612ead565b34801561098057600080fd5b506104d4612ebc565b34801561099557600080fd5b506102e0600435602435612ec1565b3480156109b057600080fd5b5061048e613006565b3480156109c557600080fd5b506102f7613015565b3480156109da57600080fd5b50610390600160a060020a0360043516602435613070565b3480156109fe57600080fd5b506103da613109565b348015610a1357600080fd5b506103da600160a060020a036004358116906024351661310f565b348015610a3a57600080fd5b506103da61313a565b348015610a4f57600080fd5b506102e0600160a060020a0360043516613140565b348015610a7057600080fd5b506102e0613163565b348015610a8557600080fd5b506102e060048035600160a060020a0316906024803590810191013560443560643561348d565b348015610ab857600080fd5b506102e0600435613510565b348015610ad057600080fd5b506107f9600160a060020a036004351660243561361b565b348015610af457600080fd5b506103da613656565b600754600160a060020a03163314610b1457600080fd5b60115460a060020a900460ff1615610b2b57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a90811791829055604080519190920460ff161515815242602082015281517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b3929181900390910190a1565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b820191906000526020600020905b815481529060010190602001808311610c0057829003601f168201915b505050505081565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60176020526000908152604090205460ff1681565b6001545b90565b600754600160a060020a03163314610cbe57600080fd5b60ff80831660009081526016602052604090205490821610610d50576040805160e560020a62461bcd02815260206004820152603960248201527f4d6f64756c6520696e64657820646f65736e277420657869737420617320706560448201527f72207468652063686f6f73656e206d6f64756c65207479706500000000000000606482015290519081900360840190fd5b60ff8083166000908152601660205260408120805491929091908416908110610d7557fe5b6000918252602090912060016002909202010154600160a060020a03161415610e0e576040805160e560020a62461bcd02815260206004820152602860248201527f4d6f64756c6520636f6e747261637420616464726573732073686f756c64206e60448201527f6f74206265203078000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8083166000818152601660205260409020805491927fe69a96f148bcf365cf82241853ecbeb32c5b01500d98bf3d93ee870cd951162c92908516908110610e5357fe5b60009182526020918290206001600290920201015460408051600160a060020a039092168252429282019290925281519081900390910190a260ff8216600090815260166020526040902080546000198101908110610eae57fe5b9060005260206000209060020201601660008460ff1660ff1681526020019081526020016000208260ff16815481101515610ee557fe5b600091825260208083208454600290930201918255600193840154939091018054600160a060020a031916600160a060020a039094169390931790925560ff8416815260169091526040902080546000190190610f42908261467b565b505050565b600754600160a060020a03163314610f5e57600080fd5b6014805461ff0019166101001790556040805142815290517fc3f76bdabdaf2a3983623e5efddd4deb49a4acdca62642d61969164d2a4441259181900360200190a1565b600754600160a060020a03163314610fb957600080fd5b801515611010576040805160e560020a62461bcd02815260206004820152601860248201527f4772616e756c61726974792063616e206e6f7420626520300000000000000000604482015290519081900360640190fd5b600854604080519182526020820183905280517fd13c95c3e8cd875fc20a3da70637bcd9e053e0414035532577769470649507dc9281900390910190a1600855565b601454610100900460ff1681565b600061106d8484846138d3565b611078848484612935565b15156110bc576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b6110c5846139fd565b6110ce836139fd565b6110d9848484613a27565b15156110e457600080fd5b5060019392505050565b601154600160a060020a031681565b600f54600160a060020a031681565b60055460ff1681565b600754600160a060020a0316331461112c57600080fd5b60115460a060020a900460ff16151561114457600080fd5b6011805474ff00000000000000000000000000000000000000001916908190556040805160a060020a90920460ff161515825242602083015280517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b39281900390910190a1565b7f302e302e3100000000000000000000000000000000000000000000000000000081565b600b8054829081106111dd57fe5b600091825260209091200154600160a060020a0316905081565b60006003600182805b60ff808516600090815260166020526040902054908216101561126f578180611265575060ff808516600090815260166020526040902080543392841690811061124657fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611200565b82801561127a575081155b1561139d5760ff8416600314156113365760ff84166000908152601660205260409020541580156112b55750600754600160a060020a031633145b1515611331576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611398565b600754600160a060020a03163314611398576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b61141a565b81151561141a576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b856008548181151561142857fe5b06156114a4576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a03163314156115175760145460ff1615611512576040805160e560020a62461bcd02815260206004820152601e60248201527f4d696e74696e672069732066696e697368656420666f72204973737565720000604482015290519081900360640190fd5b611577565b601454610100900460ff1615611577576040805160e560020a62461bcd02815260206004820152601c60248201527f4d696e74696e672069732066696e697368656420666f722053544f7300000000604482015290519081900360640190fd5b600160a060020a03881615156115fd576040805160e560020a62461bcd02815260206004820152602160248201527f496e766573746f7220616464726573732073686f756c64206e6f74206265203060448201527f7800000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611609600089896138d3565b61161560008989612935565b1515611659576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b611662886139fd565b61166a613b8c565b60015461167d908863ffffffff613b9b16565b600155600160a060020a0388166000908152602081905260409020546116a9908863ffffffff613b9b16565b600160a060020a038916600081815260208181526040918290209390935580518a8152905191927f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe92918290030190a2604080518881529051600160a060020a038a16916000916000805160206147b08339815191529181900360200190a3506001979650505050505050565b806008548181151561174457fe5b06156117c0576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b6117cc336000846138d3565b601154600160a060020a03161515611854576040805160e560020a62461bcd02815260206004820152602c60248201527f546f6b656e204275726e657220636f6e7472616374206164647265737320697360448201527f206e6f7420736574207965740000000000000000000000000000000000000000606482015290519081900360840190fd5b61186033600084612935565b15156118a4576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b33600090815260208190526040902054821115611931576040805160e560020a62461bcd02815260206004820152603960248201527f56616c75652073686f756c64206e6f2062652067726561746572207468616e2060448201527f7468652062616c616e6365206f66206d73672e73656e64657200000000000000606482015290519081900360840190fd5b61193a336139fd565b611942613b8c565b33600090815260208190526040902054611962908363ffffffff613ba816565b336000818152602081815260408083209490945560115484517f9dc29fac0000000000000000000000000000000000000000000000000000000081526004810194909452602484018790529351600160a060020a0390941693639dc29fac93604480820194918390030190829087803b1580156119de57600080fd5b505af11580156119f2573d6000803e3d6000fd5b505050506040513d6020811015611a0857600080fd5b50511515611a86576040805160e560020a62461bcd02815260206004820152602560248201527f546f6b656e206275726e65722070726f63657373206973206e6f742076616c6960448201527f6461746564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600154611a99908363ffffffff613ba816565b60015560408051838152905133917f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b1919081900360200190a260408051838152905160009133916000805160206147b08339815191529181900360200190a35050565b60ff82166000908152601660205260408120548190811015611b8c5760ff84166000908152601660205260409020805484908110611b3657fe5b6000918252602080832060029092029091015460ff8716835260169091526040909120805485908110611b6557fe5b6000918252602090912060016002909202010154909250600160a060020a03169050611b93565b5060009050805b9250929050565b6000806003600182805b60ff8085166000908152601660205260409020549082161015611c13578180611c09575060ff8085166000908152601660205260409020805433928416908110611bea57fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611ba4565b828015611c1e575081155b15611d415760ff841660031415611cda5760ff8416600090815260166020526040902054158015611c595750600754600160a060020a031633145b1515611cd5576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611d3c565b600754600160a060020a03163314611d3c576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b611dbe565b811515611dbe576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8651885114611e3d576040805160e560020a62461bcd02815260206004820152602560248201527f4d69732d6d6174636820696e20746865206c656e677468206f6620746865206160448201527f7272617973000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600094505b8751851015611e8f57611e838886815181101515611e5c57fe5b906020019060200201518887815181101515611e7457fe5b906020019060200201516111f7565b50600190940193611e42565b506001979650505050505050565b600160a060020a0382166000908152601260205260408120611ec89083611ec3866124e6565b613bba565b9392505050565b60095481565b60085481565b601481565b600754600090600160a060020a03163314611efa57600080fd5b60ff84161515611f54576040805160e560020a62461bcd02815260206004820152601a60248201527f4d6f64756c6520747970652063616e6e6f74206265207a65726f000000000000604482015290519081900360640190fd5b60ff80851660009081526016602052604090205490841610611fc0576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f727272656374206d6f64756c6520696e646578000000000000000000604482015290519081900360640190fd5b60105460ff80861660009081526016602052604090208054600160a060020a039093169263dd62ed3e92309291908816908110611ff957fe5b60009182526020808320600160029093020191909101546040805160e060020a63ffffffff8816028152600160a060020a03958616600482015294909116602485015251604480850194929391928390030190829087803b15801561205d57600080fd5b505af1158015612071573d6000803e3d6000fd5b505050506040513d602081101561208757600080fd5b50519050808210156121f45760105460ff80861660009081526016602052604090208054600160a060020a039093169263661884639287169081106120c857fe5b6000918252602090912060016002909202010154600160a060020a03166120f5848663ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561214757600080fd5b505af115801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b505115156121ef576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20646563726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612350565b60105460ff80861660009081526016602052604090208054600160a060020a039093169263d73dd62392871690811061222957fe5b6000918252602090912060016002909202010154600160a060020a0316612256858563ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156122a857600080fd5b505af11580156122bc573d6000803e3d6000fd5b505050506040513d60208110156122d257600080fd5b50511515612350576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20696e63726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8085166000818152601660205260409020805491927f56e65530d356ea53a7cecc9a37666884b4fe9f05a65df888abd3898548bc15f49290871690811061239557fe5b60009182526020918290206001600290920201015460408051600160a060020a03909216825291810186905281519081900390910190a250505050565b60115460a060020a900460ff1681565b600381565b336000908152600260209081526040808320600160a060020a03861684529091528120548083111561243c57336000908152600260209081526040808320600160a060020a0388168452909152812055612471565b61244c818463ffffffff613ba816565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b601054600160a060020a031681565b600160a060020a031660009081526020819052604090205490565b600754600160a060020a0316331461251857600080fd5b600754604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260078054600160a060020a0319169055565b60166020528160005260406000208181548110151561257d57fe5b600091825260209091206002909102018054600190910154909250600160a060020a0316905082565b600754600160a060020a031633146125bd57600080fd5b6040805181815260068054600260001961010060018416150201909116049282018390527fcef6c04f6d4bada4c1a1fcbb22cadbe4d4fb609cea3788e920628a6186e587659290918491819060208201906060830190869080156126625780601f1061263757610100808354040283529160200191612662565b820191906000526020600020905b81548152906001019060200180831161264557829003601f168201915b5050838103825284518152845160209182019186019080838360005b8381101561269657818101518382015260200161267e565b50505050905090810190601f1680156126c35780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a180516126e59060069060208401906146a7565b5050565b600c546101009004600160a060020a031681565b601380548290811061270b57fe5b60009182526020909120600290910201805460019091015490915082565b6001600090815260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49548190151561276857600091506128a8565b5060005b600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460ff821610156128a857600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49805460ff83169081106127dc57fe5b6000918252602080832060016002909302019190910154604080517f8658b8b9000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015289811660248301526044820189905291519190921693638658b8b993606480850194919392918390030190829087803b15801561286657600080fd5b505af115801561287a573d6000803e3d6000fd5b505050506040513d602081101561289057600080fd5b5051156128a057600191506128a8565b60010161276c565b509392505050565b600754600160a060020a031681565b600281565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b600061292f601383611ec3610ca0565b92915050565b6000806000806000806000876008548181151561294e57fe5b06156129ca576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b60115460a060020a900460ff161515612c6e576000965060156000612a1f6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843750613d65945050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016815260208101919091526040016000205460ff1615612a5f57600196505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648541515612a9a5760019750612c73565b600095506000945060009350600092505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff84161015612c4c57600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648805460ff8516908110612b1b57fe5b906000526020600020906002020160010160009054906101000a9004600160a060020a0316600160a060020a0316637915c9e08c8c8c8b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200182151515158152602001945050505050602060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b505191506000826003811115612c0457fe5b1415612c0f57600195505b6002826003811115612c1d57fe5b1415612c2857600194505b6003826003811115612c3657fe5b1415612c4157600193505b600190920191612aab565b83612c645785612c5c5784612c5f565b60005b612c67565b60015b9750612c73565b600097505b505050505050509392505050565b60145460ff1681565b60ff821660009081526016602052604081205481908190811015612d7a575060005b60ff8516600090815260166020526040902054811015612d7a5760ff85166000908152601660205260409020805485919083908110612ce757fe5b60009182526020909120600290910201541415612d725760ff85166000908152601660205260409020805482908110612d1c57fe5b6000918252602080832060029092029091015460ff8816835260169091526040909120805483908110612d4b57fe5b6000918252602090912060016002909202010154909350600160a060020a03169150612d82565b600101612cac565b600092508291505b509250929050565b600754600160a060020a03163314612da157600080fd5b6014805460ff191660011790556040805142815290517f10216e36c4b6dff3d74179d50b938f0f96afc610f073894ca04b4239299165679181900360200190a1565b600181565b6000612df53384846138d3565b612e00338484612935565b1515612e44576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b612e4d336139fd565b612e56836139fd565b612e608383613de6565b1515612e6b57600080fd5b50600192915050565b600754600160a060020a03163314612e8b57600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600d54600160a060020a031681565b600481565b600754600090600160a060020a03163314612edb57600080fd5b50815b612ef9612ef1848463ffffffff613b9b16565b600b54613eb5565b811015610f4257600b5481108015612f3a5750612f38600b82815481101515612f1e57fe5b600091825260209091200154600160a060020a03166124e6565b155b15612ffe57600060176000600b84815481101515612f5457fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff1916911515919091179055600b80546000198101908110612f9a57fe5b600091825260209091200154600b8054600160a060020a039092169183908110612fc057fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600b805490612ffc906000198301614725565b505b600101612ede565b600e54600160a060020a031681565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b336000908152600260209081526040808320600160a060020a03861684529091528120546130a4908363ffffffff613b9b16565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600a5481565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600b5490565b600754600160a060020a0316331461315757600080fd5b61316081613ecb565b50565b600754600160a060020a0316331461317a57600080fd5b600c546040805160e060020a63bf40fac1028152602060048201819052600e60248301527f4d6f64756c65526567697374727900000000000000000000000000000000000060448301529151610100909304600160a060020a03169263bf40fac1926064808401939192918290030181600087803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051600d8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052601560248301527f5365637572697479546f6b656e52656769737472790000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b1580156132bc57600080fd5b505af11580156132d0573d6000803e3d6000fd5b505050506040513d60208110156132e657600080fd5b5051600e8054600160a060020a031916600160a060020a03928316178155600c546040805160e060020a63bf40fac102815260206004820181905260248201949094527f5469636b65725265676973747279000000000000000000000000000000000000604482015290516101009092049093169263bf40fac19260648083019391928290030181600087803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b5051600f8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052600960248301527f506f6c79546f6b656e0000000000000000000000000000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b15801561344057600080fd5b505af1158015613454573d6000803e3d6000fd5b505050506040513d602081101561346a57600080fd5b505160108054600160a060020a031916600160a060020a03909216919091179055565b600754600160a060020a031633146134a457600080fd5b600c5460ff16156134b457600080fd5b600c805460ff19166001179055604080516020601f86018190048102820181019092528481526134ff9187919087908790819084018382808284378201915050505050508484613f3c565b5050600c805460ff19169055505050565b600754600160a060020a0316331461352757600080fd5b601054600754604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561359957600080fd5b505af11580156135ad573d6000803e3d6000fd5b505050506040513d60208110156135c357600080fd5b50511515613160576040805160e560020a62461bcd02815260206004820152601560248201527f496e2d73756666696369656e742062616c616e63650000000000000000000000604482015290519081900360640190fd5b60126020528160005260406000208181548110151561363657fe5b600091825260209091206002909102018054600190910154909250905082565b60006004600182805b60ff80851660009081526016602052604090205490821610156136ce5781806136c4575060ff80851660009081526016602052604090208054339284169081106136a557fe5b6000918252602090912060016002909202010154600160a060020a0316145b915060010161365f565b8280156136d9575081155b156137fc5760ff8416600314156137955760ff84166000908152601660205260409020541580156137145750600754600160a060020a031633145b1515613790576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b6137f7565b600754600160a060020a031633146137f7576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b613879565b811515613879576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6009546000191161388957600080fd5b60098054600101908190556040805142815290517feb3befa36ea6638fc3379fe62edc59509b81aeca57cfbb0f444b1e72b8ac93fe9181900360200190a260095494505050505090565b8015806138f1575081600160a060020a031683600160a060020a0316145b156138fb57610f42565b613904826124e6565b1580156139195750600160a060020a03821615155b1561393657600a5461393290600163ffffffff613b9b16565b600a555b61393f836124e6565b81141561395e57600a5461395a90600163ffffffff613ba816565b600a555b600160a060020a03821660009081526017602052604090205460ff1615801561398f5750600160a060020a03821615155b15610f4257600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018054600160a060020a038516600160a060020a031990911681179091556000908152601760205260409020805460ff19169091179055505050565b600160a060020a038116600090815260126020526040902061316090613a22836124e6565b6145b7565b6000600160a060020a0383161515613a3e57600080fd5b600160a060020a038416600090815260208190526040902054821115613a6357600080fd5b600160a060020a0384166000908152600260209081526040808320338452909152902054821115613a9357600080fd5b600160a060020a038416600090815260208190526040902054613abc908363ffffffff613ba816565b600160a060020a038086166000908152602081905260408082209390935590851681522054613af1908363ffffffff613b9b16565b600160a060020a03808516600090815260208181526040808320949094559187168152600282528281203382529091522054613b33908363ffffffff613ba816565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391926000805160206147b0833981519152929181900390910190a35060019392505050565b613b996013613a22610ca0565b565b8181018281101561292f57fe5b600082821115613bb457fe5b50900390565b6000806000806009548611151515613bd157600080fd5b851515613be15760009350613d5b565b86541515613bf157849350613d5b565b85876000815481101515613c0157fe5b600091825260209091206002909102015410613c3f57866000815481101515613c2657fe5b9060005260206000209060020201600101549350613d5b565b8654869088906000198101908110613c5357fe5b9060005260206000209060020201600001541015613c7357849350613d5b565b8654869088906000198101908110613c8757fe5b9060005260206000209060020201600001541415613cb157865487906000198101908110613c2657fe5b8654600093506000190191505b82821115613d38576002828401049050858782815481101515613cdd57fe5b9060005260206000209060020201600001541415613cfd57809150613d38565b858782815481101515613d0c57fe5b9060005260206000209060020201600001541015613d2f57806001019250613d33565b8091505b613cbe565b8682815481101515613d4657fe5b90600052602060002090600202016001015493505b5050509392505050565b60008060006004845110613d7a576004613d7d565b83515b9150600090505b81811015613ddf5780600183030360080260020a8482815181101515613da657fe5b90602001015160f860020a900460f860020a0260f860020a9004028360e060020a90040160e060020a0292508080600101915050613d84565b5050919050565b6000600160a060020a0383161515613dfd57600080fd5b33600090815260208190526040902054821115613e1957600080fd5b33600090815260208190526040902054613e39908363ffffffff613ba816565b3360009081526020819052604080822092909255600160a060020a03851681522054613e6b908363ffffffff613b9b16565b600160a060020a038416600081815260208181526040918290209390935580518581529051919233926000805160206147b08339815191529281900390910190a350600192915050565b6000818310613ec45781611ec8565b5090919050565b600160a060020a0381161515613ee057600080fd5b600754604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360078054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517fdc659907000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015291516000938493849384938493929092169163dc65990791602480820192869290919082900301818387803b158015613fae57600080fd5b505af1158015613fc2573d6000803e3d6000fd5b5050505088945084600160a060020a03166315dae03e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561400757600080fd5b505af115801561401b573d6000803e3d6000fd5b505050506040513d602081101561403157600080fd5b505160ff81166000908152601660205260409020549094506014116140a0576040805160e560020a62461bcd02815260206004820152601f60248201527f4c696d6974206f66204d4158204d4f44554c4553206973207265616368656400604482015290519081900360640190fd5b84600160a060020a0316637e363ffa6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156140de57600080fd5b505af11580156140f2573d6000803e3d6000fd5b505050506040513d602081101561410857600080fd5b505192508683111561418a576040805160e560020a62461bcd02815260206004820152602e60248201527f4d617820436f737420697320616c77617973206265206772656174657220746860448201527f616e206d6f64756c6520636f7374000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163095ea7b39160448083019260209291908290030181600087803b1580156141f957600080fd5b505af115801561420d573d6000803e3d6000fd5b505050506040513d602081101561422357600080fd5b505115156142a1576040805160e560020a62461bcd02815260206004820152602360248201527f4e6f742061626c6520746f20617070726f766520746865206d6f64756c65206360448201527f6f73740000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6040517e7743600000000000000000000000000000000000000000000000000000000081526020600482018181528a5160248401528a51600160a060020a0389169362774360938d939283926044019185019080838360005b838110156143125781810151838201526020016142fa565b50505050905090810190601f16801561433f5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d602081101561438857600080fd5b5051601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038085166004830152602482018b9052915193955091169163095ea7b3916044808201926020929091908290030181600087803b1580156143fb57600080fd5b505af115801561440f573d6000803e3d6000fd5b505050506040513d602081101561442557600080fd5b5051151561447d576040805160e560020a62461bcd02815260206004820152601e60248201527f4e6f742061626c6520746f20617070726f766520746865206275646765740000604482015290519081900360640190fd5b84600160a060020a03166317d7de7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156144bb57600080fd5b505af11580156144cf573d6000803e3d6000fd5b505050506040513d60208110156144e557600080fd5b505160ff8516600081815260166020908152604080832081518083018352868152600160a060020a0389811682860181815284546001808201875595895297879020935160029098029093019687559151959092018054600160a060020a031916958316959095179094558151868152908f16928101929092528181019290925260608101879052608081018a90524260a0820152905192935090917fc6c63fb8912a7f464252e66132ad69604864e7520f1bcf0dd77c8d51d810a6519160c0908290030190a2505050505050505050565b60095415156145c5576126e5565b8154151561460c57604080518082019091526009548152602080820183815284546001818101875560008781529390932093516002909102909301928355519101556126e5565b60095482548390600019810190811061462157fe5b906000526020600020906002020160000154141561463e576126e5565b6040805180820190915260095481526020808201928352835460018082018655600095865291909420915160029094029091019283559051910155565b815481835581811115610f4257600202816002028360005260206000209182019101610f429190614749565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146e857805160ff1916838001178555614715565b82800160010185558215614715579182015b828111156147155782518255916020019190600101906146fa565b50614721929150614775565b5090565b815481835581811115610f4257600083815260209020610f42918101908301614775565b610ca491905b808211156147215760008155600181018054600160a060020a031916905560020161474f565b610ca491905b80821115614721576000815560010161477b56005472616e73666572206973206e6f742076616c69640000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820d194fbde9329028efd78e81aaa560fc5fa644ba09ac0fcec999dd63d4617267d0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000014000000000000000000000000006595656b93ce14834f0d22b7bbda4382d5ab5100000000000000000000000000000000000000000000000000000000000000013506f6c796d617468205465737420546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957452e522e4c495645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Polymath Test Token
Arg [1] : _symbol (string): WE.R.LIVE
Arg [2] : _decimals (uint8): 18
Arg [3] : _granularity (uint256): 1
Arg [4] : _tokenDetails (string): 0x00
Arg [5] : _polymathRegistry (address): 0x06595656b93ce14834f0d22b7bbDA4382d5ab510

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 00000000000000000000000006595656b93ce14834f0d22b7bbda4382d5ab510
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [7] : 506f6c796d617468205465737420546f6b656e00000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [9] : 57452e522e4c4956450000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [11] : 3078303000000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://d194fbde9329028efd78e81aaa560fc5fa644ba09ac0fcec999dd63d4617267d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.