ETH Price: $3,150.26 (-8.02%)

Token

INX Token (INX)
 

Overview

Max Total Supply

200,000,000 INX

Holders

9,926

Market

Price

$0.19 @ 0.000060 ETH (-5.00%)

Onchain Market Cap

$37,999,800.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
689.8435 INX

Value
$131.07 ( ~0.0416061136386715 Eth) [0.0003%]
0x3627925d3278d68c4c6822545b73a566776cefdf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Aiming to enable the listing and trading of regulated security tokens and cryptocurrencies for institutional and retail investors.

IEO Information

IEO Price : $0.90

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
InxToken

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-03
*/

// File: contracts/1404/IERC1404.sol

pragma solidity 0.5.8;

interface IERC1404 {
    /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
    /// @param from Sending address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    /// @dev Overwrite with your custom transfer restriction logic
    function detectTransferRestriction (address from, address to, uint256 value) external view returns (uint8);

    /// @notice Detects if a transferFrom will be reverted and if so returns an appropriate reference code
    /// @param sender Transaction sending address
    /// @param from Source of funds address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    /// @dev Overwrite with your custom transfer restriction logic
    function detectTransferFromRestriction (address sender, address from, address to, uint256 value) external view returns (uint8);

    /// @notice Returns a human-readable message for a given restriction code
    /// @param restrictionCode Identifier for looking up a message
    /// @return Text showing the restriction's reasoning
    /// @dev Overwrite with your custom message and restrictionCode handling
    function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory);
}

interface IERC1404getSuccessCode {
    /// @notice Return the uint256 that represents the SUCCESS_CODE
    /// @return uint256 SUCCESS_CODE
    function getSuccessCode () external view returns (uint256);
}

/**
 * @title IERC1404Success
 * @dev Combines IERC1404 and IERC1404getSuccessCode interfaces, to be implemented by the TransferRestrictions contract
 */
contract IERC1404Success is IERC1404getSuccessCode, IERC1404 {
}

// File: contracts/1404/IERC1404Validators.sol

pragma solidity 0.5.8;

/**
 * @title IERC1404Validators
 * @dev Interfaces implemented by the token contract to be called by the TransferRestrictions contract
 */
interface IERC1404Validators {
    /// @notice Returns the token balance for an account
    /// @param account The address to get the token balance of
    /// @return uint256 representing the token balance for the account
    function balanceOf (address account) external view returns (uint256);

    /// @notice Returns a boolean indicating the paused state of the contract
    /// @return true if contract is paused, false if unpaused
    function paused () external view returns (bool);

    /// @notice Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted
    /// @param from The address sending tokens.
    /// @param to The address receiving tokens.
    /// @return true if both accounts are whitelisted, false if not
    function checkWhitelists (address from, address to) external view returns (bool);

    /// @notice Determine if a users tokens are locked preventing a transfer
    /// @param _address the address to retrieve the data from
    /// @param amount the amount to send
    /// @param balance the token balance of the sending account
    /// @return true if user has sufficient unlocked token to transfer the requested amount, false if not
    function checkTimelock (address _address, uint256 amount, uint256 balance) external view returns (bool);
}

// File: @openzeppelin/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: contracts/roles/OwnerRole.sol

pragma solidity 0.5.8;


contract OwnerRole {
    using Roles for Roles.Role;

    event OwnerAdded(address indexed addedOwner, address indexed addedBy);
    event OwnerRemoved(address indexed removedOwner, address indexed removedBy);

    Roles.Role private _owners;

    modifier onlyOwner() {
        require(isOwner(msg.sender), "OwnerRole: caller does not have the Owner role");
        _;
    }

    function isOwner(address account) public view returns (bool) {
        return _owners.has(account);
    }

    function addOwner(address account) public onlyOwner {
        _addOwner(account);
    }

    function removeOwner(address account) public onlyOwner {
        require(msg.sender != account, "Owners cannot remove themselves as owner");
        _removeOwner(account);
    }

    function _addOwner(address account) internal {
        _owners.add(account);
        emit OwnerAdded(account, msg.sender);
    }

    function _removeOwner(address account) internal {
        _owners.remove(account);
        emit OwnerRemoved(account, msg.sender);
    }
}

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: 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
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

// File: contracts/roles/RevokerRole.sol

pragma solidity 0.5.8;


contract RevokerRole is OwnerRole {

    event RevokerAdded(address indexed addedRevoker, address indexed addedBy);
    event RevokerRemoved(address indexed removedRevoker, address indexed removedBy);

    Roles.Role private _revokers;

    modifier onlyRevoker() {
        require(isRevoker(msg.sender), "RevokerRole: caller does not have the Revoker role");
        _;
    }

    function isRevoker(address account) public view returns (bool) {
        return _revokers.has(account);
    }

    function addRevoker(address account) public onlyOwner {
        _addRevoker(account);
    }

    function removeRevoker(address account) public onlyOwner {
        _removeRevoker(account);
    }

    function _addRevoker(address account) internal {
        _revokers.add(account);
        emit RevokerAdded(account, msg.sender);
    }

    function _removeRevoker(address account) internal {
        _revokers.remove(account);
        emit RevokerRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Revocable.sol

pragma solidity 0.5.8;



/**
 * Allows an administrator to move tokens from a target account to their own.
 */
contract Revocable is ERC20, RevokerRole {

  event Revoke(address indexed revoker, address indexed from, uint256 amount);

  function revoke(
    address _from,
    uint256 _amount
  )
    public
    onlyRevoker
    returns (bool)
  {
    ERC20._transfer(_from, msg.sender, _amount);
    emit Revoke(msg.sender, _from, _amount);
    return true;
  }
}

// File: contracts/roles/WhitelisterRole.sol

pragma solidity 0.5.8;


contract WhitelisterRole is OwnerRole {

    event WhitelisterAdded(address indexed addedWhitelister, address indexed addedBy);
    event WhitelisterRemoved(address indexed removedWhitelister, address indexed removedBy);

    Roles.Role private _whitelisters;

    modifier onlyWhitelister() {
        require(isWhitelister(msg.sender), "WhitelisterRole: caller does not have the Whitelister role");
        _;
    }

    function isWhitelister(address account) public view returns (bool) {
        return _whitelisters.has(account);
    }

    function addWhitelister(address account) public onlyOwner {
        _addWhitelister(account);
    }

    function removeWhitelister(address account) public onlyOwner {
        _removeWhitelister(account);
    }

    function _addWhitelister(address account) internal {
        _whitelisters.add(account);
        emit WhitelisterAdded(account, msg.sender);
    }

    function _removeWhitelister(address account) internal {
        _whitelisters.remove(account);
        emit WhitelisterRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Whitelistable.sol

pragma solidity 0.5.8;


/**
 * @title Whitelistable
 * @dev Allows tracking whether addressess are allowed to hold tokens.
 */
contract Whitelistable is WhitelisterRole {

    event WhitelistUpdate(address _address, bool status, string data);

    // Tracks whether an address is whitelisted
    // data field can track any external field (like a hash of personal details)
    struct whiteListItem {
        bool status;
        string data;
    }

    // white list status
    mapping (address => whiteListItem) public whitelist;

    /**
    * @dev Set a white list address
    * @param to the address to be set
    * @param status the whitelisting status (true for yes, false for no)
    * @param data a string with data about the whitelisted address
    */
    function setWhitelist(address to, bool status, string memory data)  public onlyWhitelister returns(bool){
        whitelist[to] = whiteListItem(status, data);
        emit WhitelistUpdate(to, status, data);
        return true;
    }

    /**
    * @dev Get the status of the whitelist
    * @param _address the address to be check
    */
    function getWhitelistStatus(address _address) public view returns(bool){
        return whitelist[_address].status;
    }

    /**
    * @dev Get the data of and address in the whitelist
    * @param _address the address to retrieve the data from
    */
    function getWhitelistData(address _address) public view returns(string memory){
        return whitelist[_address].data;
    }

    /**
    * @dev Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted
    * @param from The address sending tokens.
    * @param to The address receiving tokens.
    */
    function checkWhitelists(address from, address to) external view returns (bool) {
        return whitelist[from].status && whitelist[to].status;
    }
}

// File: contracts/roles/TimelockerRole.sol

pragma solidity 0.5.8;


contract TimelockerRole is OwnerRole {

    event TimelockerAdded(address indexed addedTimelocker, address indexed addedBy);
    event TimelockerRemoved(address indexed removedTimelocker, address indexed removedBy);

    Roles.Role private _timelockers;

    modifier onlyTimelocker() {
        require(isTimelocker(msg.sender), "TimelockerRole: caller does not have the Timelocker role");
        _;
    }

    function isTimelocker(address account) public view returns (bool) {
        return _timelockers.has(account);
    }

    function addTimelocker(address account) public onlyOwner {
        _addTimelocker(account);
    }

    function removeTimelocker(address account) public onlyOwner {
        _removeTimelocker(account);
    }

    function _addTimelocker(address account) internal {
        _timelockers.add(account);
        emit TimelockerAdded(account, msg.sender);
    }

    function _removeTimelocker(address account) internal {
        _timelockers.remove(account);
        emit TimelockerRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Timelockable.sol

pragma solidity 0.5.8;



/**
 * @title INX Timelockable
 * @dev Lockup all or a portion of an accounts tokens until an expiration date
 */
contract Timelockable is TimelockerRole {

    using SafeMath for uint256;

    struct lockupItem {
        uint256 amount;
        uint256 releaseTime;
    }

    mapping (address => lockupItem) lockups;

    event AccountLock(address _address, uint256 amount, uint256 releaseTime);
    event AccountRelease(address _address, uint256 amount);


    /**
    * @dev lock address and amount and lock it, set the release time
    * @param _address the address to lock
    * @param amount the amount to lock
    * @param releaseTime of the locked amount (in seconds since the epoch)
    */
    function lock( address _address, uint256 amount, uint256 releaseTime) public onlyTimelocker returns (bool) {
        require(releaseTime > block.timestamp, "Release time needs to be in the future");
        require(_address != address(0), "Address must be valid for lockup");

        lockupItem memory _lockupItem = lockupItem(amount, releaseTime);
        lockups[_address] = _lockupItem;
        emit AccountLock(_address, amount, releaseTime);
        return true;
    }

    /**
    * @dev release locked amount
    * @param _address the address to retrieve the data from
    * @param amountToRelease the amount to check
    */
    function release( address _address, uint256 amountToRelease) public onlyTimelocker returns(bool) {
        require(_address != address(0), "Address must be valid for release");

        uint256 _lockedAmount = lockups[_address].amount;

        // nothing to release
        if(_lockedAmount == 0){
            emit AccountRelease(_address, 0);
            return true;
        }

        // extract release time for re-locking
        uint256 _releaseTime = lockups[_address].releaseTime;

        // delete the lock entry
        delete lockups[_address];

        if(_lockedAmount >= amountToRelease){
           uint256 newLockedAmount = _lockedAmount.sub(amountToRelease);

           // re-lock the new locked balance
           lock(_address, newLockedAmount, _releaseTime);
           emit AccountRelease(_address, amountToRelease);
           return true;
        } else {
            // if they requested to release more than the locked amount emit the event with the locked amount that has been released
            emit AccountRelease(_address, _lockedAmount);
            return true;
        }
    }

    /**
    * @dev return true if the given account has enough unlocked tokens to send the requested amount
    * @param _address the address to retrieve the data from
    * @param amount the amount to send
    * @param balance the token balance of the sending account
    */
    function checkTimelock(address _address, uint256 amount, uint256 balance) external view returns (bool) {
        // if the user does not have enough tokens to send regardless of lock return true here
        // the failure will still fail but this should make it explicit that the transfer failure is not
        // due to locked tokens but because of too low token balance
        if (balance < amount) {
            return true;
        }

        // get the sending addresses token balance that is not locked
        uint256 nonLockedAmount = balance.sub(lockups[_address].amount);

        // determine if the sending address has enough free tokens to send the entire amount
        bool notLocked = amount <= nonLockedAmount;

        // if the timelock is greater then the release time the time lock is expired
        bool timeLockExpired = block.timestamp > lockups[_address].releaseTime;

        // if the timelock is expired OR the requested amount is available the transfer is not locked
        if(timeLockExpired || notLocked){
            return true;

        // if the timelocked is not expired AND the requested amount is not available the tranfer is locked
        } else {
            return false;
        }
    }

    /**
    * @dev get address lockup info
    * @param _address the address to retrieve the data from
    * @return array of 2 uint256, release time (in seconds since the epoch) and amount (in INX)
    */
    function checkLockup(address _address) public view returns(uint256, uint256) {
        // copy lockup data into memory
        lockupItem memory _lockupItem = lockups[_address];

        return (_lockupItem.releaseTime, _lockupItem.amount);
    }
}

// File: contracts/roles/PauserRole.sol

pragma solidity 0.5.8;


contract PauserRole is OwnerRole {

    event PauserAdded(address indexed addedPauser, address indexed addedBy);
    event PauserRemoved(address indexed removedPauser, address indexed removedBy);

    Roles.Role private _pausers;

    modifier onlyPauser() {
        require(isPauser(msg.sender), "PauserRole: caller does not have the Pauser role");
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function removePauser(address account) public onlyOwner {
        _removePauser(account);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account, msg.sender);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Pausable.sol

pragma solidity 0.5.8;


/**
 * Allows transfers on a token contract to be paused by an administrator.
 */
contract Pausable is PauserRole {
    event Paused();
    event Unpaused();

    bool private _paused;

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() external view returns (bool) {
        return _paused;
    }

    /**
     * @dev internal function, triggers paused state
     */
    function _pause() internal {
        _paused = true;
        emit Paused();
    }

    /**
     * @dev internal function, returns to unpaused state
     */
    function _unpause() internal {
        _paused = false;
        emit Unpaused();
    }

     /**
     * @dev called by pauser role to pause, triggers stopped state
     */
    function pause() public onlyPauser {
        _pause();
    }

    /**
     * @dev called by pauer role to unpause, returns to normal state
     */
    function unpause() public onlyPauser {
        _unpause();
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

// File: contracts/InxToken.sol

pragma solidity 0.5.8;











contract InxToken is IERC1404, IERC1404Validators, IERC20, ERC20Detailed, OwnerRole, Revocable, Whitelistable, Timelockable, Pausable {

    // Token Details
    string constant TOKEN_NAME = "INX Token";
    string constant TOKEN_SYMBOL = "INX";
    uint8 constant TOKEN_DECIMALS = 18;

    // Token supply - 2 Hundred Million Tokens, with 18 decimal precision
    uint256 constant HUNDRED_MILLION = 100000000;
    uint256 constant TOKEN_SUPPLY = 2 * HUNDRED_MILLION * (10 ** uint256(TOKEN_DECIMALS));

    // This tracks the external contract where restriction logic is executed
    IERC1404Success private transferRestrictions;

    // Event tracking when restriction logic contract is updated
    event RestrictionsUpdated (address newRestrictionsAddress, address updatedBy);

    /**
    Constructor for the token to set readable details and mint all tokens
    to the specified owner.
    */
    constructor(address owner) public
        ERC20Detailed(TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS)
    {
        _mint(owner, TOKEN_SUPPLY);
        _addOwner(owner);
    }

    /**
    Function that can only be called by an owner that updates the address
    with the ERC1404 Transfer Restrictions defined
    */
    function updateTransferRestrictions(address _newRestrictionsAddress)
        public
        onlyOwner
        returns (bool)
    {
        transferRestrictions = IERC1404Success(_newRestrictionsAddress);
        emit RestrictionsUpdated(address(transferRestrictions), msg.sender);
        return true;
    }

    /**
    The address with the Transfer Restrictions contract
    */
    function getRestrictionsAddress () public view returns (address) {
        return address(transferRestrictions);
    }


    /**
    This function detects whether a transfer should be restricted and not allowed.
    If the function returns SUCCESS_CODE (0) then it should be allowed.
    */
    function detectTransferRestriction (address from, address to, uint256 amount)
        public
        view
        returns (uint8)
    {
        // Verify the external contract is valid
        require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set');

        // call detectTransferRestriction on the current transferRestrictions contract
        return transferRestrictions.detectTransferRestriction(from, to, amount);
    }

    /**
    This function detects whether a transferFrom should be restricted and not allowed.
    If the function returns SUCCESS_CODE (0) then it should be allowed.
    */
    function detectTransferFromRestriction (address sender, address from, address to, uint256 amount)
        public
        view
        returns (uint8)
    {
        // Verify the external contract is valid
        require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set');

        // call detectTransferFromRestriction on the current transferRestrictions contract
        return  transferRestrictions.detectTransferFromRestriction(sender, from, to, amount);
    }

    /**
    This function allows a wallet or other client to get a human readable string to show
    a user if a transfer was restricted.  It should return enough information for the user
    to know why it failed.
    */
    function messageForTransferRestriction (uint8 restrictionCode)
        external
        view
        returns (string memory)
    {
        // call messageForTransferRestriction on the current transferRestrictions contract
        return transferRestrictions.messageForTransferRestriction(restrictionCode);
    }

    /**
    Evaluates whether a transfer should be allowed or not.
    */
    modifier notRestricted (address from, address to, uint256 value) {
        uint8 restrictionCode = transferRestrictions.detectTransferRestriction(from, to, value);
        require(restrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(restrictionCode));
        _;
    }

    /**
    Evaluates whether a transferFrom should be allowed or not.
    */
    modifier notRestrictedTransferFrom (address sender, address from, address to, uint256 value) {
        uint8 transferFromRestrictionCode = transferRestrictions.detectTransferFromRestriction(sender, from, to, value);
        require(transferFromRestrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(transferFromRestrictionCode));
        _;
    }

    /**
    Overrides the parent class token transfer function to enforce restrictions.
    */
    function transfer (address to, uint256 value)
        public
        notRestricted(msg.sender, to, value)
        returns (bool success)
    {
        success = ERC20.transfer(to, value);
    }

    /**
    Overrides the parent class token transferFrom function to enforce restrictions.
    */
    function transferFrom (address from, address to, uint256 value)
        public
        notRestrictedTransferFrom(msg.sender, from, to, value)
        returns (bool success)
    {
        success = ERC20.transferFrom(from, to, value);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"amountToRelease","type":"uint256"}],"name":"release","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRestrictionsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferFromRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isTimelocker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[{"name":"to","type":"address"},{"name":"status","type":"bool"},{"name":"data","type":"string"}],"name":"setWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"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":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isWhitelister","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"}],"name":"checkWhitelists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"checkLockup","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"status","type":"bool"},{"name":"data","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"removeRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"balance","type":"uint256"}],"name":"checkTimelock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRestrictionsAddress","type":"address"}],"name":"updateTransferRestrictions","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"releaseTime","type":"uint256"}],"name":"lock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"revoke","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isRevoker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRestrictionsAddress","type":"address"},{"indexed":false,"name":"updatedBy","type":"address"}],"name":"RestrictionsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedPauser","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedPauser","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"releaseTime","type":"uint256"}],"name":"AccountLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"AccountRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedTimelocker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"TimelockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedTimelocker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"TimelockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"status","type":"bool"},{"indexed":false,"name":"data","type":"string"}],"name":"WhitelistUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedWhitelister","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"WhitelisterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedWhitelister","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"WhitelisterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"revoker","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedRevoker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"RevokerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedRevoker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"RevokerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedOwner","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedOwner","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"OwnerRemoved","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"},{"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"}]

60806040523480156200001157600080fd5b506040516020806200509a833981018060405260208110156200003357600080fd5b81019080805190602001909291905050506040518060400160405280600981526020017f494e5820546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f494e58000000000000000000000000000000000000000000000000000000000081525060128260009080519060200190620000ca929190620005cd565b508160019080519060200190620000e3929190620005cd565b5080600260006101000a81548160ff021916908360ff1602179055505050506200012481601260ff16600a0a6305f5e100600202026200013c60201b60201c565b62000135816200030860201b60201c565b506200067c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620001fc816005546200038060201b62003c511790919060201c565b6005819055506200025b81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200038060201b62003c511790919060201c565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b620003238160066200040960201b6200448b1790919060201c565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a350565b600080828401905083811015620003ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6200041b8282620004ed60201b60201c565b156200048f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000576576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620050786022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200061057805160ff191683800117855562000641565b8280016001018555821562000641579182015b828111156200064057825182559160200191906001019062000623565b5b50905062000650919062000654565b5090565b6200067991905b80821115620006755760008160009055506001016200065b565b5090565b90565b6149ec806200068c6000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637f4ab1dd11610151578063a9059cbb116100c3578063db0cc92a11610087578063db0cc92a146110f6578063dd62ed3e14611152578063e2ab691d146111ca578063eac449d91461123a578063eaf9144a146112a0578063f6c4b01f146112e457610274565b8063a9059cbb14610ef8578063c06f8b9414610f5e578063c697e4a314610fa2578063d4ce141514611012578063d9ba32fc1461109a57610274565b806395d89b411161011557806395d89b4114610c28578063961a66f614610cab57806399da091d14610cef5780639a6e292f14610d6b5780639b19251a14610dca578063a457c2d714610e9257610274565b80637f4ab1dd14610aa857806382c3f79c14610b5257806382dc1ec414610b96578063841aca4414610bda5780638456cb5914610c1e57610274565b80632f54bf6e116101ea5780635c975abb116101ae5780635c975abb1461088d57806368aa9813146108af5780636b2c0f551461096c5780637065cb48146109b057806370a08231146109f45780637d0c269f14610a4c57610274565b80632f54bf6e14610741578063313ce5671461079d57806339509351146107c15780633f4ba83a1461082757806346fbf68e1461083157610274565b8063095ea7b31161023c578063095ea7b3146104985780630c57133f146104fe578063173825d91461055a57806318160ddd1461059e57806323b872dd146105bc57806327ac19751461064257610274565b8063031d4053146102795780630357371d146102bd57806305557bd41461032357806306fdde031461036d5780630754cede146103f0575b600080fd5b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611340565b005b610309600480360360408110156102d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113aa565b604051808215151515815260200191505060405180910390f35b61032b611708565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610375611732565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b557808201518184015260208101905061039a565b50505050905090810190601f1680156103e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561040657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117d4565b604051808260ff1660ff16815260200191505060405180910390f35b6104e4600480360360408110156104ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119d1565b604051808215151515815260200191505060405180910390f35b6105406004803603602081101561051457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ef565b604051808215151515815260200191505060405180910390f35b61059c6004803603602081101561057057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a0c565b005b6105a6611afb565b6040518082815260200191505060405180910390f35b610628600480360360608110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b05565b604051808215151515815260200191505060405180910390f35b6107276004803603606081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803590602001906401000000008111156106a157600080fd5b8201836020820111156106b357600080fd5b803590602001918460018302840111640100000000831117156106d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ecb565b604051808215151515815260200191505060405180910390f35b6107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120a8565b604051808215151515815260200191505060405180910390f35b6107a56120c5565b604051808260ff1660ff16815260200191505060405180910390f35b61080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120dc565b604051808215151515815260200191505060405180910390f35b61082f61218f565b005b6108736004803603602081101561084757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121f7565b604051808215151515815260200191505060405180910390f35b610895612214565b604051808215151515815260200191505060405180910390f35b6108f1600480360360208110156108c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061222b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610931578082015181840152602081019050610916565b50505050905090810190601f16801561095e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109ae6004803603602081101561098257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061230f565b005b6109f2600480360360208110156109c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b005b610a3660048036036020811015610a0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e3565b6040518082815260200191505060405180910390f35b610a8e60048036036020811015610a6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061242c565b604051808215151515815260200191505060405180910390f35b610ad760048036036020811015610abe57600080fd5b81019080803560ff169060200190929190505050612449565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b17578082015181840152602081019050610afc565b50505050905090810190601f168015610b445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b9460048036036020811015610b6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061255c565b005b610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c6565b005b610c1c60048036036020811015610bf057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612630565b005b610c2661269a565b005b610c30612702565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c70578082015181840152602081019050610c55565b50505050905090810190601f168015610c9d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ced60048036036020811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127a4565b005b610d5160048036036040811015610d0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061280e565b604051808215151515815260200191505060405180910390f35b610dad60048036036020811015610d8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c0565b604051808381526020018281526020019250505060405180910390f35b610e0c60048036036020811015610de057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293f565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e56578082015181840152602081019050610e3b565b50505050905090810190601f168015610e835780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b610ede60048036036040811015610ea857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a08565b604051808215151515815260200191505060405180910390f35b610f4460048036036040811015610f0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ad5565b604051808215151515815260200191505060405180910390f35b610fa060048036036020811015610f7457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e63565b005b610ff860048036036060811015610fb857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612ecd565b604051808215151515815260200191505060405180910390f35b61107e6004803603606081101561102857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fb3565b604051808260ff1660ff16815260200191505060405180910390f35b6110dc600480360360208110156110b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061317b565b604051808215151515815260200191505060405180910390f35b6111386004803603602081101561110c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131d4565b604051808215151515815260200191505060405180910390f35b6111b46004803603604081101561116857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613337565b6040518082815260200191505060405180910390f35b611220600480360360608110156111e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506133be565b604051808215151515815260200191505060405180910390f35b6112866004803603604081101561125057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061360e565b604051808215151515815260200191505060405180910390f35b6112e2600480360360208110156112b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136e8565b005b611326600480360360208110156112fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613752565b604051808215151515815260200191505060405180910390f35b611349336120a8565b61139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6113a78161376f565b50565b60006113b5336119ef565b61140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149526021913960400191505060405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811415611556577f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1846000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050611702565b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055505083821061169057600061160b85846137e090919063ffffffff16565b90506116188682846133be565b507f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18686604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a160019350505050611702565b7f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18583604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001925050505b92915050565b6000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b15801561198c57600080fd5b505afa1580156119a0573d6000803e3d6000fd5b505050506040513d60208110156119b657600080fd5b81019080805190602001909291905050509050949350505050565b60006119e56119de61382a565b8484613832565b6001905092915050565b6000611a0582600a613a2990919063ffffffff16565b9050919050565b611a15336120a8565b611a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611aef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148816028913960400191505060405180910390fd5b611af881613b07565b50565b6000600554905090565b6000338484846000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b158015611c1c57600080fd5b505afa158015611c30573d6000803e3d6000fd5b505050506040513d6020811015611c4657600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015611cc157600080fd5b505afa158015611cd5573d6000803e3d6000fd5b505050506040513d6020811015611ceb57600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015611d7a57600080fd5b505afa158015611d8e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611db857600080fd5b810190808051640100000000811115611dd057600080fd5b82810190506020810184811115611de657600080fd5b8151856001820283011164010000000082111715611e0357600080fd5b505092919050505090611eb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e76578082015181840152602081019050611e5b565b50505050905090810190601f168015611ea35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50611ebd898989613b78565b955050505050509392505050565b6000611ed63361242c565b611f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806148f4603a913960400191505060405180910390fd5b6040518060400160405280841515815260200183815250600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001019080519060200190611fbd929190614623565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd5848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612061578082015181840152602081019050612046565b50505050905090810190601f16801561208e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600190509392505050565b60006120be826006613a2990919063ffffffff16565b9050919050565b6000600260009054906101000a900460ff16905090565b60006121856120e961382a565b8461218085600460006120fa61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b613832565b6001905092915050565b612198336121f7565b6121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b6121f5613cd9565b565b600061220d82600c613a2990919063ffffffff16565b9050919050565b6000600d60009054906101000a900460ff16905090565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123035780601f106122d857610100808354040283529160200191612303565b820191906000526020600020905b8154815290600101906020018083116122e657829003601f168201915b50505050509050919050565b612318336120a8565b61236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61237681613d22565b50565b612382336120a8565b6123d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6123e081613d93565b50565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000612442826008613a2990919063ffffffff16565b9050919050565b6060600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156124c457600080fd5b505afa1580156124d8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561250257600080fd5b81019080805164010000000081111561251a57600080fd5b8281019050602081018481111561253057600080fd5b815185600182028301116401000000008211171561254d57600080fd5b50509291905050509050919050565b612565336120a8565b6125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6125c381613e04565b50565b6125cf336120a8565b612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61262d81613e75565b50565b612639336120a8565b61268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61269781613ee6565b50565b6126a3336121f7565b6126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b612700613f57565b565b606060018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561279a5780601f1061276f5761010080835404028352916020019161279a565b820191906000526020600020905b81548152906001019060200180831161277d57829003601f168201915b5050505050905090565b6127ad336120a8565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61280b81613fa0565b50565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1680156128b85750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b905092915050565b6000806128cb6146a3565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050806020015181600001519250925050915091565b60096020528060005260406000206000915090508060000160009054906101000a900460ff1690806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129fe5780601f106129d3576101008083540402835291602001916129fe565b820191906000526020600020905b8154815290600101906020018083116129e157829003601f168201915b5050505050905082565b6000612acb612a1561382a565b84612ac6856040518060600160405280602581526020016149736025913960046000612a3f61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b6001905092915050565b60003383836000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b158015612bb757600080fd5b505afa158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5c57600080fd5b505afa158015612c70573d6000803e3d6000fd5b505050506040513d6020811015612c8657600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015612d1557600080fd5b505afa158015612d29573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612d5357600080fd5b810190808051640100000000811115612d6b57600080fd5b82810190506020810184811115612d8157600080fd5b8151856001820283011164010000000082111715612d9e57600080fd5b505092919050505090612e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e11578082015181840152602081019050612df6565b50505050905090810190601f168015612e3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50612e5787876140d1565b94505050505092915050565b612e6c336120a8565b612ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b612eca816140ef565b50565b600082821015612ee05760019050612fac565b6000612f37600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154846137e090919063ffffffff16565b905060008185111590506000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154421190508080612f935750815b15612fa45760019350505050612fac565b600093505050505b9392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561313757600080fd5b505afa15801561314b573d6000803e3d6000fd5b505050506040513d602081101561316157600080fd5b810190808051906020019092919050505090509392505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff169050919050565b60006131df336120a8565b613234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b81600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a160019050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006133c9336119ef565b61341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b428211613476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148a96026913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f41646472657373206d7573742062652076616c696420666f72206c6f636b757081525060200191505060405180910390fd5b6135216146a3565b604051806040016040528085815260200184815250905080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019150509392505050565b600061361933613752565b61366e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147586032913960400191505060405180910390fd5b613679833384614160565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b846040518082815260200191505060405180910390a36001905092915050565b6136f1336120a8565b613746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61374f8161441a565b50565b6000613768826007613a2990919063ffffffff16565b9050919050565b61378381600a61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714160405160405180910390a350565b600061382283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614011565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061492e6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147366022913960400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061485f6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613b1b81600661456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a350565b6000613b85848484614160565b613c4684613b9161382a565b613c418560405180606001604052806028815260200161483760289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000613bf761382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b600190509392505050565b600080828401905083811015613ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600d60006101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b613d3681600c61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e60405160405180910390a350565b613da781600661448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a350565b613e1881600861456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be60405160405180910390a350565b613e8981600c61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8160405160405180910390a350565b613efa81600a61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780660405160405180910390a350565b6001600d60006101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b613fb481600761448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019660405160405180910390a350565b60008383111582906140be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614083578082015181840152602081019050614068565b50505050905090810190601f1680156140b05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006140e56140de61382a565b8484614160565b6001905092915050565b61410381600761456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b60405160405180910390a350565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156141e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148cf6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561426c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146e36023913960400191505060405180910390fd5b6142d8816040518060600160405280602681526020016147c260269139600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061436d81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b61442e81600861448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced060405160405180910390a350565b6144958282613a29565b15614508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6145708282613a29565b6145c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148166021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061466457805160ff1916838001178555614692565b82800160010185558215614692579182015b82811115614691578251825591602001919060010190614676565b5b50905061469f91906146bd565b5090565b604051806040016040528060008152602001600081525090565b6146df91905b808211156146db5760008160009055506001016146c3565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657252656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a72305820fd2b7c0b63c2b263df6c412efa85ea764ada4d00a7fd7bffebfbf707855dd9f60029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373000000000000000000000000e0f92fb0d2634a5f814158eaecbdd752ebdac282

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637f4ab1dd11610151578063a9059cbb116100c3578063db0cc92a11610087578063db0cc92a146110f6578063dd62ed3e14611152578063e2ab691d146111ca578063eac449d91461123a578063eaf9144a146112a0578063f6c4b01f146112e457610274565b8063a9059cbb14610ef8578063c06f8b9414610f5e578063c697e4a314610fa2578063d4ce141514611012578063d9ba32fc1461109a57610274565b806395d89b411161011557806395d89b4114610c28578063961a66f614610cab57806399da091d14610cef5780639a6e292f14610d6b5780639b19251a14610dca578063a457c2d714610e9257610274565b80637f4ab1dd14610aa857806382c3f79c14610b5257806382dc1ec414610b96578063841aca4414610bda5780638456cb5914610c1e57610274565b80632f54bf6e116101ea5780635c975abb116101ae5780635c975abb1461088d57806368aa9813146108af5780636b2c0f551461096c5780637065cb48146109b057806370a08231146109f45780637d0c269f14610a4c57610274565b80632f54bf6e14610741578063313ce5671461079d57806339509351146107c15780633f4ba83a1461082757806346fbf68e1461083157610274565b8063095ea7b31161023c578063095ea7b3146104985780630c57133f146104fe578063173825d91461055a57806318160ddd1461059e57806323b872dd146105bc57806327ac19751461064257610274565b8063031d4053146102795780630357371d146102bd57806305557bd41461032357806306fdde031461036d5780630754cede146103f0575b600080fd5b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611340565b005b610309600480360360408110156102d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113aa565b604051808215151515815260200191505060405180910390f35b61032b611708565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610375611732565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b557808201518184015260208101905061039a565b50505050905090810190601f1680156103e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561040657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117d4565b604051808260ff1660ff16815260200191505060405180910390f35b6104e4600480360360408110156104ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119d1565b604051808215151515815260200191505060405180910390f35b6105406004803603602081101561051457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ef565b604051808215151515815260200191505060405180910390f35b61059c6004803603602081101561057057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a0c565b005b6105a6611afb565b6040518082815260200191505060405180910390f35b610628600480360360608110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b05565b604051808215151515815260200191505060405180910390f35b6107276004803603606081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803590602001906401000000008111156106a157600080fd5b8201836020820111156106b357600080fd5b803590602001918460018302840111640100000000831117156106d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ecb565b604051808215151515815260200191505060405180910390f35b6107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120a8565b604051808215151515815260200191505060405180910390f35b6107a56120c5565b604051808260ff1660ff16815260200191505060405180910390f35b61080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120dc565b604051808215151515815260200191505060405180910390f35b61082f61218f565b005b6108736004803603602081101561084757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121f7565b604051808215151515815260200191505060405180910390f35b610895612214565b604051808215151515815260200191505060405180910390f35b6108f1600480360360208110156108c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061222b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610931578082015181840152602081019050610916565b50505050905090810190601f16801561095e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109ae6004803603602081101561098257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061230f565b005b6109f2600480360360208110156109c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b005b610a3660048036036020811015610a0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e3565b6040518082815260200191505060405180910390f35b610a8e60048036036020811015610a6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061242c565b604051808215151515815260200191505060405180910390f35b610ad760048036036020811015610abe57600080fd5b81019080803560ff169060200190929190505050612449565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b17578082015181840152602081019050610afc565b50505050905090810190601f168015610b445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b9460048036036020811015610b6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061255c565b005b610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c6565b005b610c1c60048036036020811015610bf057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612630565b005b610c2661269a565b005b610c30612702565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c70578082015181840152602081019050610c55565b50505050905090810190601f168015610c9d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ced60048036036020811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127a4565b005b610d5160048036036040811015610d0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061280e565b604051808215151515815260200191505060405180910390f35b610dad60048036036020811015610d8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c0565b604051808381526020018281526020019250505060405180910390f35b610e0c60048036036020811015610de057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293f565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e56578082015181840152602081019050610e3b565b50505050905090810190601f168015610e835780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b610ede60048036036040811015610ea857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a08565b604051808215151515815260200191505060405180910390f35b610f4460048036036040811015610f0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ad5565b604051808215151515815260200191505060405180910390f35b610fa060048036036020811015610f7457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e63565b005b610ff860048036036060811015610fb857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612ecd565b604051808215151515815260200191505060405180910390f35b61107e6004803603606081101561102857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fb3565b604051808260ff1660ff16815260200191505060405180910390f35b6110dc600480360360208110156110b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061317b565b604051808215151515815260200191505060405180910390f35b6111386004803603602081101561110c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131d4565b604051808215151515815260200191505060405180910390f35b6111b46004803603604081101561116857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613337565b6040518082815260200191505060405180910390f35b611220600480360360608110156111e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506133be565b604051808215151515815260200191505060405180910390f35b6112866004803603604081101561125057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061360e565b604051808215151515815260200191505060405180910390f35b6112e2600480360360208110156112b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136e8565b005b611326600480360360208110156112fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613752565b604051808215151515815260200191505060405180910390f35b611349336120a8565b61139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6113a78161376f565b50565b60006113b5336119ef565b61140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149526021913960400191505060405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811415611556577f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1846000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050611702565b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055505083821061169057600061160b85846137e090919063ffffffff16565b90506116188682846133be565b507f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18686604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a160019350505050611702565b7f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18583604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001925050505b92915050565b6000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b15801561198c57600080fd5b505afa1580156119a0573d6000803e3d6000fd5b505050506040513d60208110156119b657600080fd5b81019080805190602001909291905050509050949350505050565b60006119e56119de61382a565b8484613832565b6001905092915050565b6000611a0582600a613a2990919063ffffffff16565b9050919050565b611a15336120a8565b611a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611aef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148816028913960400191505060405180910390fd5b611af881613b07565b50565b6000600554905090565b6000338484846000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b158015611c1c57600080fd5b505afa158015611c30573d6000803e3d6000fd5b505050506040513d6020811015611c4657600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015611cc157600080fd5b505afa158015611cd5573d6000803e3d6000fd5b505050506040513d6020811015611ceb57600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015611d7a57600080fd5b505afa158015611d8e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611db857600080fd5b810190808051640100000000811115611dd057600080fd5b82810190506020810184811115611de657600080fd5b8151856001820283011164010000000082111715611e0357600080fd5b505092919050505090611eb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e76578082015181840152602081019050611e5b565b50505050905090810190601f168015611ea35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50611ebd898989613b78565b955050505050509392505050565b6000611ed63361242c565b611f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806148f4603a913960400191505060405180910390fd5b6040518060400160405280841515815260200183815250600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001019080519060200190611fbd929190614623565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd5848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612061578082015181840152602081019050612046565b50505050905090810190601f16801561208e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600190509392505050565b60006120be826006613a2990919063ffffffff16565b9050919050565b6000600260009054906101000a900460ff16905090565b60006121856120e961382a565b8461218085600460006120fa61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b613832565b6001905092915050565b612198336121f7565b6121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b6121f5613cd9565b565b600061220d82600c613a2990919063ffffffff16565b9050919050565b6000600d60009054906101000a900460ff16905090565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123035780601f106122d857610100808354040283529160200191612303565b820191906000526020600020905b8154815290600101906020018083116122e657829003601f168201915b50505050509050919050565b612318336120a8565b61236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61237681613d22565b50565b612382336120a8565b6123d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6123e081613d93565b50565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000612442826008613a2990919063ffffffff16565b9050919050565b6060600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156124c457600080fd5b505afa1580156124d8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561250257600080fd5b81019080805164010000000081111561251a57600080fd5b8281019050602081018481111561253057600080fd5b815185600182028301116401000000008211171561254d57600080fd5b50509291905050509050919050565b612565336120a8565b6125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6125c381613e04565b50565b6125cf336120a8565b612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61262d81613e75565b50565b612639336120a8565b61268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61269781613ee6565b50565b6126a3336121f7565b6126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b612700613f57565b565b606060018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561279a5780601f1061276f5761010080835404028352916020019161279a565b820191906000526020600020905b81548152906001019060200180831161277d57829003601f168201915b5050505050905090565b6127ad336120a8565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61280b81613fa0565b50565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1680156128b85750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b905092915050565b6000806128cb6146a3565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050806020015181600001519250925050915091565b60096020528060005260406000206000915090508060000160009054906101000a900460ff1690806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129fe5780601f106129d3576101008083540402835291602001916129fe565b820191906000526020600020905b8154815290600101906020018083116129e157829003601f168201915b5050505050905082565b6000612acb612a1561382a565b84612ac6856040518060600160405280602581526020016149736025913960046000612a3f61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b6001905092915050565b60003383836000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b158015612bb757600080fd5b505afa158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5c57600080fd5b505afa158015612c70573d6000803e3d6000fd5b505050506040513d6020811015612c8657600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015612d1557600080fd5b505afa158015612d29573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612d5357600080fd5b810190808051640100000000811115612d6b57600080fd5b82810190506020810184811115612d8157600080fd5b8151856001820283011164010000000082111715612d9e57600080fd5b505092919050505090612e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e11578082015181840152602081019050612df6565b50505050905090810190601f168015612e3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50612e5787876140d1565b94505050505092915050565b612e6c336120a8565b612ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b612eca816140ef565b50565b600082821015612ee05760019050612fac565b6000612f37600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154846137e090919063ffffffff16565b905060008185111590506000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154421190508080612f935750815b15612fa45760019350505050612fac565b600093505050505b9392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561313757600080fd5b505afa15801561314b573d6000803e3d6000fd5b505050506040513d602081101561316157600080fd5b810190808051906020019092919050505090509392505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff169050919050565b60006131df336120a8565b613234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b81600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a160019050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006133c9336119ef565b61341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b428211613476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148a96026913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f41646472657373206d7573742062652076616c696420666f72206c6f636b757081525060200191505060405180910390fd5b6135216146a3565b604051806040016040528085815260200184815250905080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019150509392505050565b600061361933613752565b61366e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147586032913960400191505060405180910390fd5b613679833384614160565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b846040518082815260200191505060405180910390a36001905092915050565b6136f1336120a8565b613746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61374f8161441a565b50565b6000613768826007613a2990919063ffffffff16565b9050919050565b61378381600a61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714160405160405180910390a350565b600061382283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614011565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061492e6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147366022913960400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061485f6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613b1b81600661456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a350565b6000613b85848484614160565b613c4684613b9161382a565b613c418560405180606001604052806028815260200161483760289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000613bf761382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b600190509392505050565b600080828401905083811015613ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600d60006101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b613d3681600c61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e60405160405180910390a350565b613da781600661448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a350565b613e1881600861456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be60405160405180910390a350565b613e8981600c61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8160405160405180910390a350565b613efa81600a61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780660405160405180910390a350565b6001600d60006101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b613fb481600761448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019660405160405180910390a350565b60008383111582906140be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614083578082015181840152602081019050614068565b50505050905090810190601f1680156140b05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006140e56140de61382a565b8484614160565b6001905092915050565b61410381600761456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b60405160405180910390a350565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156141e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148cf6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561426c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146e36023913960400191505060405180910390fd5b6142d8816040518060600160405280602681526020016147c260269139600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061436d81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b61442e81600861448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced060405160405180910390a350565b6144958282613a29565b15614508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6145708282613a29565b6145c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148166021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061466457805160ff1916838001178555614692565b82800160010185558215614692579182015b82811115614691578251825591602001919060010190614676565b5b50905061469f91906146bd565b5090565b604051806040016040528060008152602001600081525090565b6146df91905b808211156146db5760008160009055506001016146c3565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657252656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a72305820fd2b7c0b63c2b263df6c412efa85ea764ada4d00a7fd7bffebfbf707855dd9f60029

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

000000000000000000000000e0f92fb0d2634a5f814158eaecbdd752ebdac282

-----Decoded View---------------
Arg [0] : owner (address): 0xe0f92Fb0d2634a5f814158EaeCBDD752EbDAC282

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e0f92fb0d2634a5f814158eaecbdd752ebdac282


Deployed Bytecode Sourcemap

38139:5248:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38139:5248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29070:99;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29070:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;31068:1142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31068:1142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39786:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37116:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37116:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40752:513;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;40752:513:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17911:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17911:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28945:117;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28945:117:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5302:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5302:180:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;16932:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43139:245;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43139:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27314:237;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27314:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;27314:237:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27314:237:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27314:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;27314:237:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5090:107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5090:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37968:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19248:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19248:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36331:66;;;:::i;:::-;;34691:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34691:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35661:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27933:128;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27933:128:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27933:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34907:97;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34907:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;5205:89;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5205:89:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17086:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17086:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25796:119;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25796:119:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41500:318;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41500:318:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;41500:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26032:107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26032:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34808:91;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34808:91:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;29177:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29177:105:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36173:62;;;:::i;:::-;;37318:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37318:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24241:93;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24241:93:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;28287:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28287:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33978:251;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33978:251:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;27019:51;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27019:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27019:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19961:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19961:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42830:199;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42830:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24342:99;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24342:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;32500:1259;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32500:1259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40090:476;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40090:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27667:123;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27667:123:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39389:315;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39389:315:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17630:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17630:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30416:482;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30416:482:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25044:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25044:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25923:101;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25923:101:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;24122:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24122:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29070:99;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29138:23;29153:7;29138:14;:23::i;:::-;29070:99;:::o;31068:1142::-;31159:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31204:1;31184:22;;:8;:22;;;;31176:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31257:21;31281:7;:17;31289:8;31281:17;;;;;;;;;;;;;;;:24;;;31257:48;;31369:1;31352:13;:18;31349:107;;;31391:27;31406:8;31416:1;31391:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;31440:4;31433:11;;;;;31349:107;31516:20;31539:7;:17;31547:8;31539:17;;;;;;;;;;;;;;;:29;;;31516:52;;31622:7;:17;31630:8;31622:17;;;;;;;;;;;;;;;;31615:24;;;;;;;;;;;;;;31672:15;31655:13;:32;31652:551;;31702:23;31728:34;31746:15;31728:13;:17;;:34;;;;:::i;:::-;31702:60;;31824:45;31829:8;31839:15;31856:12;31824:4;:45::i;:::-;;31888:41;31903:8;31913:15;31888:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;31950:4;31943:11;;;;;;;31652:551;32126:39;32141:8;32151:13;32126:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;32187:4;32180:11;;;;28928:1;31068:1142;;;;:::o;39786:120::-;39842:7;39877:20;;;;;;;;;;;39862:36;;39786:120;:::o;37116:83::-;37153:13;37186:5;37179:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37116:83;:::o;40752:513::-;40898:5;41020:1;40979:43;;40987:20;;;;;;;;;;;40979:43;;;;40971:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41181:20;;;;;;;;;;;:50;;;41232:6;41240:4;41246:2;41250:6;41181:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41181:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41181:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41181:76:0;;;;;;;;;;;;;;;;41173:84;;40752:513;;;;;;:::o;17911:152::-;17977:4;17994:39;18003:12;:10;:12::i;:::-;18017:7;18026:6;17994:8;:39::i;:::-;18051:4;18044:11;;17911:152;;;;:::o;28945:117::-;29005:4;29029:25;29046:7;29029:12;:16;;:25;;;;:::i;:::-;29022:32;;28945:117;;;:::o;5302:180::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5390:7;5376:21;;:10;:21;;;;5368:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5453:21;5466:7;5453:12;:21::i;:::-;5302:180;:::o;16932:91::-;16976:7;17003:12;;16996:19;;16932:91;:::o;43139:245::-;43301:12;43254:10;43266:4;43272:2;43276:5;42424:33;42460:20;;;;;;;;;;;:50;;;42511:6;42519:4;42525:2;42529:5;42460:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42460:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42460:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42460:75:0;;;;;;;;;;;;;;;;42424:111;;42585:20;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42585:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42585:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42585:37:0;;;;;;;;;;;;;;;;42554:27;:68;;;42624:20;;;;;;;;;;;:50;;;42675:27;42624:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42624:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42624:79:0;;;;;;39:16:-1;36:1;17:17;2:54;42624:79:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42624:79:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;42624:79:0;;;;;;42546:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42546:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43341:35;43360:4;43366:2;43370:5;43341:18;:35::i;:::-;43331:45;;43139:245;;;;;;;;;;:::o;27314:237::-;27413:4;25680:25;25694:10;25680:13;:25::i;:::-;25672:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27445:27;;;;;;;;27459:6;27445:27;;;;;;27467:4;27445:27;;;27429:9;:13;27439:2;27429:13;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;27488:33;27504:2;27508:6;27516:4;27488:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27488:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27539:4;27532:11;;27314:237;;;;;:::o;5090:107::-;5145:4;5169:20;5181:7;5169;:11;;:20;;;;:::i;:::-;5162:27;;5090:107;;;:::o;37968:83::-;38009:5;38034:9;;;;;;;;;;;38027:16;;37968:83;:::o;19248:210::-;19328:4;19345:83;19354:12;:10;:12::i;:::-;19368:7;19377:50;19416:10;19377:11;:25;19389:12;:10;:12::i;:::-;19377:25;;;;;;;;;;;;;;;:34;19403:7;19377:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;19345:8;:83::i;:::-;19446:4;19439:11;;19248:210;;;;:::o;36331:66::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36379:10;:8;:10::i;:::-;36331:66::o;34691:109::-;34747:4;34771:21;34784:7;34771:8;:12;;:21;;;;:::i;:::-;34764:28;;34691:109;;;:::o;35661:80::-;35702:4;35726:7;;;;;;;;;;;35719:14;;35661:80;:::o;27933:128::-;27997:13;28029:9;:19;28039:8;28029:19;;;;;;;;;;;;;;;:24;;28022:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27933:128;;;:::o;34907:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34974:22;34988:7;34974:13;:22::i;:::-;34907:97;:::o;5205:89::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5268:18;5278:7;5268:9;:18::i;:::-;5205:89;:::o;17086:110::-;17143:7;17170:9;:18;17180:7;17170:18;;;;;;;;;;;;;;;;17163:25;;17086:110;;;:::o;25796:119::-;25857:4;25881:26;25899:7;25881:13;:17;;:26;;;;:::i;:::-;25874:33;;25796:119;;;:::o;41500:318::-;41613:13;41743:20;;;;;;;;;;;:50;;;41794:15;41743:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41743:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41743:67:0;;;;;;39:16:-1;36:1;17:17;2:54;41743:67:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41743:67:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;41743:67:0;;;;;;41736:74;;41500:318;;;:::o;26032:107::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26104:27;26123:7;26104:18;:27::i;:::-;26032:107;:::o;34808:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34872:19;34883:7;34872:10;:19::i;:::-;34808:91;:::o;29177:105::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29248:26;29266:7;29248:17;:26::i;:::-;29177:105;:::o;36173:62::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36219:8;:6;:8::i;:::-;36173:62::o;37318:87::-;37357:13;37390:7;37383:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37318:87;:::o;24241:93::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24306:20;24318:7;24306:11;:20::i;:::-;24241:93;:::o;28287:152::-;28361:4;28385:9;:15;28395:4;28385:15;;;;;;;;;;;;;;;:22;;;;;;;;;;;;:46;;;;;28411:9;:13;28421:2;28411:13;;;;;;;;;;;;;;;:20;;;;;;;;;;;;28385:46;28378:53;;28287:152;;;;:::o;33978:251::-;34037:7;34046;34107:29;;:::i;:::-;34139:7;:17;34147:8;34139:17;;;;;;;;;;;;;;;34107:49;;;;;;;;;;;;;;;;;;;;;;;;;;;34177:11;:23;;;34202:11;:18;;;34169:52;;;;;33978:251;;;:::o;27019:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19961:261::-;20046:4;20063:129;20072:12;:10;:12::i;:::-;20086:7;20095:96;20134:15;20095:96;;;;;;;;;;;;;;;;;:11;:25;20107:12;:10;:12::i;:::-;20095:25;;;;;;;;;;;;;;;:34;20121:7;20095:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;20063:8;:129::i;:::-;20210:4;20203:11;;19961:261;;;;:::o;42830:199::-;42956:12;42915:10;42927:2;42931:5;41979:21;42003:20;;;;;;;;;;;:46;;;42050:4;42056:2;42060:5;42003:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42003:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42003:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42003:63:0;;;;;;;;;;;;;;;;41979:87;;42104:20;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42104:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42104:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42104:37:0;;;;;;;;;;;;;;;;42085:15;:56;;;42143:20;;;;;;;;;;;:50;;;42194:15;42143:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42143:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42143:67:0;;;;;;39:16:-1;36:1;17:17;2:54;42143:67:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42143:67:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;42143:67:0;;;;;;42077:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42077:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42996:25;43011:2;43015:5;42996:14;:25::i;:::-;42986:35;;42830:199;;;;;;;;:::o;24342:99::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24410:23;24425:7;24410:14;:23::i;:::-;24342:99;:::o;32500:1259::-;32597:4;32900:6;32890:7;:16;32886:60;;;32930:4;32923:11;;;;32886:60;33029:23;33055:37;33067:7;:17;33075:8;33067:17;;;;;;;;;;;;;;;:24;;;33055:7;:11;;:37;;;;:::i;:::-;33029:63;;33199:14;33226:15;33216:6;:25;;33199:42;;33340:20;33381:7;:17;33389:8;33381:17;;;;;;;;;;;;;;;:29;;;33363:15;:47;33340:70;;33529:15;:28;;;;33548:9;33529:28;33526:226;;;33580:4;33573:11;;;;;;;33526:226;33735:5;33728:12;;;;;32500:1259;;;;;;:::o;40090:476::-;40216:5;40338:1;40297:43;;40305:20;;;;;;;;;;;40297:43;;;;40289:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40494:20;;;;;;;;;;;:46;;;40541:4;40547:2;40551:6;40494:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40494:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40494:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40494:64:0;;;;;;;;;;;;;;;;40487:71;;40090:476;;;;;:::o;27667:123::-;27733:4;27756:9;:19;27766:8;27756:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;27749:33;;27667:123;;;:::o;39389:315::-;39511:4;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39572:23;39533:20;;:63;;;;;;;;;;;;;;;;;;39612:62;39640:20;;;;;;;;;;;39663:10;39612:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39692:4;39685:11;;39389:315;;;:::o;17630:134::-;17702:7;17729:11;:18;17741:5;17729:18;;;;;;;;;;;;;;;:27;17748:7;17729:27;;;;;;;;;;;;;;;;17722:34;;17630:134;;;;:::o;30416:482::-;30517:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30556:15;30542:11;:29;30534:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30653:1;30633:22;;:8;:22;;;;30625:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30705:29;;:::i;:::-;30737:31;;;;;;;;30748:6;30737:31;;;;30756:11;30737:31;;;30705:63;;30799:11;30779:7;:17;30787:8;30779:17;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;;30826:42;30838:8;30848:6;30856:11;30826:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30886:4;30879:11;;;30416:482;;;;;:::o;25044:235::-;25150:4;24018:21;24028:10;24018:9;:21::i;:::-;24010:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25166:43;25182:5;25189:10;25201:7;25166:15;:43::i;:::-;25240:5;25221:34;;25228:10;25221:34;;;25247:7;25221:34;;;;;;;;;;;;;;;;;;25269:4;25262:11;;25044:235;;;;:::o;25923:101::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25992:24;26008:7;25992:15;:24::i;:::-;25923:101;:::o;24122:111::-;24179:4;24203:22;24217:7;24203:9;:13;;:22;;;;:::i;:::-;24196:29;;24122:111;;;:::o;29290:146::-;29351:25;29368:7;29351:12;:16;;:25;;;;:::i;:::-;29417:10;29392:36;;29408:7;29392:36;;;;;;;;;;;;29290:146;:::o;11220:136::-;11278:7;11305:43;11309:1;11312;11305:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;11298:50;;11220:136;;;;:::o;6633:98::-;6678:15;6713:10;6706:17;;6633:98;:::o;22893:338::-;23004:1;22987:19;;:5;:19;;;;22979:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23085:1;23066:21;;:7;:21;;;;23058:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23169:6;23139:11;:18;23151:5;23139:18;;;;;;;;;;;;;;;:27;23158:7;23139:27;;;;;;;;;;;;;;;:36;;;;23207:7;23191:32;;23200:5;23191:32;;;23216:6;23191:32;;;;;;;;;;;;;;;;;;22893:338;;;:::o;4416:203::-;4488:4;4532:1;4513:21;;:7;:21;;;;4505:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4591:4;:11;;:20;4603:7;4591:20;;;;;;;;;;;;;;;;;;;;;;;;;4584:27;;4416:203;;;;:::o;5629:139::-;5688:23;5703:7;5688;:14;;:23;;;;:::i;:::-;5749:10;5727:33;;5740:7;5727:33;;;;;;;;;;;;5629:139;:::o;18535:304::-;18624:4;18641:36;18651:6;18659:9;18670:6;18641:9;:36::i;:::-;18688:121;18697:6;18705:12;:10;:12::i;:::-;18719:89;18757:6;18719:89;;;;;;;;;;;;;;;;;:11;:19;18731:6;18719:19;;;;;;;;;;;;;;;:33;18739:12;:10;:12::i;:::-;18719:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;18688:8;:121::i;:::-;18827:4;18820:11;;18535:304;;;;;:::o;10764:181::-;10822:7;10842:9;10858:1;10854;:5;10842:17;;10883:1;10878;:6;;10870:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10936:1;10929:8;;;10764:181;;;;:::o;35989:89::-;36039:5;36029:7;;:15;;;;;;;;;;;;;;;;;;36060:10;;;;;;;;;;35989:89::o;35154:142::-;35214:24;35230:7;35214:8;:15;;:24;;;;:::i;:::-;35277:10;35254:34;;35268:7;35254:34;;;;;;;;;;;;35154:142;:::o;5490:131::-;5546:20;5558:7;5546;:11;;:20;;;;:::i;:::-;5602:10;5582:31;;5593:7;5582:31;;;;;;;;;;;;5490:131;:::o;26304:157::-;26369:29;26390:7;26369:13;:20;;:29;;;;:::i;:::-;26442:10;26414:39;;26433:7;26414:39;;;;;;;;;;;;26304:157;:::o;35012:134::-;35069:21;35082:7;35069:8;:12;;:21;;;;:::i;:::-;35127:10;35106:32;;35118:7;35106:32;;;;;;;;;;;;35012:134;:::o;29444:154::-;29508:28;29528:7;29508:12;:19;;:28;;;;:::i;:::-;29579:10;29552:38;;29570:7;29552:38;;;;;;;;;;;;29444:154;:::o;35821:84::-;35869:4;35859:7;;:14;;;;;;;;;;;;;;;;;;35889:8;;;;;;;;;;35821:84::o;24449:137::-;24507:22;24521:7;24507:9;:13;;:22;;;;:::i;:::-;24567:10;24545:33;;24558:7;24545:33;;;;;;;;;;;;24449:137;:::o;11693:192::-;11779:7;11812:1;11807;:6;;11815:12;11799:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11799:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11839:9;11855:1;11851;:5;11839:17;;11876:1;11869:8;;;11693:192;;;;;:::o;17409:158::-;17478:4;17495:42;17505:12;:10;:12::i;:::-;17519:9;17530:6;17495:9;:42::i;:::-;17555:4;17548:11;;17409:158;;;;:::o;24594:145::-;24655:25;24672:7;24655:9;:16;;:25;;;;:::i;:::-;24720:10;24696:35;;24711:7;24696:35;;;;;;;;;;;;24594:145;:::o;20712:471::-;20828:1;20810:20;;:6;:20;;;;20802:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20912:1;20891:23;;:9;:23;;;;20883:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20987;21009:6;20987:71;;;;;;;;;;;;;;;;;:9;:17;20997:6;20987:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;20967:9;:17;20977:6;20967:17;;;;;;;;;;;;;;;:91;;;;21092:32;21117:6;21092:9;:20;21102:9;21092:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;21069:9;:20;21079:9;21069:20;;;;;;;;;;;;;;;:55;;;;21157:9;21140:35;;21149:6;21140:35;;;21168:6;21140:35;;;;;;;;;;;;;;;;;;20712:471;;;:::o;26147:149::-;26209:26;26227:7;26209:13;:17;;:26;;;;:::i;:::-;26277:10;26251:37;;26268:7;26251:37;;;;;;;;;;;;26147:149;:::o;3880:178::-;3958:18;3962:4;3968:7;3958:3;:18::i;:::-;3957:19;3949:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4046:4;4023;:11;;:20;4035:7;4023:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;3880:178;;:::o;4138:183::-;4218:18;4222:4;4228:7;4218:3;:18::i;:::-;4210:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4308:5;4285:4;:11;;:20;4297:7;4285:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;4138:183;;:::o;38139:5248::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://fd2b7c0b63c2b263df6c412efa85ea764ada4d00a7fd7bffebfbf707855dd9f6
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.