ETH Price: $2,265.18 (+2.18%)
Gas: 1.92 Gwei

Token

Magic Balancer (MGB)
 

Overview

Max Total Supply

300,000 MGB

Holders

206 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.05 MGB

Value
$0.00
0x61c4ee78f6d9313665ab66583ee96d4006af98f8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Magic Balancer is a deflationary governance DEFI token which provides exceptional rewards to active users via Smart Contract protocols, while seamlessly incorporating transactional rewards with liquidity rebalancing features.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MagicBalancer

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 99999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**                  ____ 
                  .'* *.'
               __/_*_*(_
              / _______ \
             _\_)/___\(_/_ 
            / _((\- -/))_ \
            \ \())(-)(()/ /
             ' \(((()))/ '
            / ' \)).))/ ' \
           / _ \ - | - /_  \
          (   ( .;''';. .'  )
          _\"__ /    )\ __"/_
            \/  \   ' /  \/
             .'  '...' ' )
              / /  |  \ \
             / .   .   . \
            /   .     .   \
           /   /   |   \   \
         .'   /    b    '.  '.
     _.-'    /     Bb     '-. '-._ 
 _.-'       |      BBb       '-.  '-. 
(___________\____.dBBBb.________)____)

╔╦╗┌─┐┌─┐┬┌─┐  ╔╗ ┌─┐┬  ┌─┐┌┐┌┌─┐┌─┐┬─┐
║║║├─┤│ ┬││    ╠╩╗├─┤│  ├─┤││││  ├┤ ├┬┘
╩ ╩┴ ┴└─┘┴└─┘  ╚═╝┴ ┴┴─┘┴ ┴┘└┘└─┘└─┘┴└─
     
     https://magicbalancer.org/
*/
// 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;
    constructor (uint256 totalSupply) public {
        _mint(_msgSender(),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: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol

pragma solidity ^0.5.0;

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev See {ERC20-_burnFrom}.
     */
    function burnFrom(address account, uint256 amount) public {
        _burnFrom(account, amount);
    }
}

// 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: @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: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol

pragma solidity ^0.5.0;

/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
contract WhitelistAdminRole is Context {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor () internal {
        _addWhitelistAdmin(_msgSender());
    }

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(_msgSender());
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

// File: contracts/ERC20/ERC20TransferLiquidityLock.sol

pragma solidity ^0.5.17;

contract ERC20TransferLiquidityLock is ERC20 {
    using SafeMath for uint256;


    event Rebalance(uint256 tokenBurnt);
    event RewardLiquidityProviders(uint256 liquidityRewards);
    
    address public uniswapV2Router;
    address public uniswapV2Pair;
    address payable public treasury;
    address public PresaleAddress;
    address public bounce = 0x73282A63F0e3D7e9604575420F777361ecA3C86A;
    mapping(address => bool) feelessAddr;
    mapping(address => bool) unlocked;
    
    // the amount of tokens to lock for liquidity during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%
    uint256 public liquidityLockDivisor;
    uint256 public callerRewardDivisor;
    uint256 public rebalanceDivisor;
    uint256 public minRebalanceAmount;
    uint256 public lastRebalance;
    uint256 public rebalanceInterval;
    uint256 public lpUnlocked;
    bool public locked;
    Balancer balancer;
    
    constructor() public {
        lastRebalance = block.timestamp;
        liquidityLockDivisor = 100;
        callerRewardDivisor = 25;
        rebalanceDivisor = 50;
        rebalanceInterval = 1 hours;
        lpUnlocked = block.timestamp + 90 days;
        minRebalanceAmount = 30 ether;
        treasury = msg.sender;
        balancer = new Balancer(treasury);
        feelessAddr[address(this)] = true;
        feelessAddr[address(balancer)] = true;
        feelessAddr[bounce] = true;
        feelessAddr[PresaleAddress] = true;
        locked = true;
        unlocked[address(this)] = true;
        unlocked[address(uniswapV2Router)] = true; 
        unlocked[address(PresaleAddress)] = true;
        unlocked[msg.sender] = true;
        unlocked[bounce] = true;
        unlocked[address(balancer)] = true;
    }
    

    function _transfer(address from, address to, uint256 amount) internal {
        // calculate liquidity lock amount
        // dont transfer burn from this contract
        // or can never lock full lockable amount
        if(locked && unlocked[from] != true && unlocked[to] != true)
            revert("Tokens locked until end of presale");
            
        if (liquidityLockDivisor != 0 && feelessAddr[from] == false && feelessAddr[to] == false) {
            uint256 liquidityLockAmount = amount.div(liquidityLockDivisor);
            super._transfer(from, address(this), liquidityLockAmount);
            super._transfer(from, to, amount.sub(liquidityLockAmount));
        }
        else {
            super._transfer(from, to, amount);
        }
    }


    function () external payable {}

    function rebalanceLiquidity() public {
        require(balanceOf(msg.sender) >= minRebalanceAmount, "You are not part of the MagicBalancer.");
        require(block.timestamp > lastRebalance + rebalanceInterval, 'Try again after 1 hour');
        lastRebalance = block.timestamp;
        // lockable supply is the token balance of this contract
        uint256 _lockableSupply = balanceOf(address(this));
        _rewardLiquidityProviders(_lockableSupply);
        
        uint256 amountToRemove = ERC20(uniswapV2Pair).balanceOf(address(this)).div(rebalanceDivisor);
        // needed in case contract already owns eth
        
        remLiquidity(amountToRemove);
        uint _locked = balancer.rebalance(callerRewardDivisor);

        emit Rebalance(_locked);
    }

    function _rewardLiquidityProviders(uint256 liquidityRewards) private {
  
            super._transfer(address(this), uniswapV2Pair, liquidityRewards);
            IUniswapV2Pair(uniswapV2Pair).sync();
            emit RewardLiquidityProviders(liquidityRewards);
        
    }

    function remLiquidity(uint256 lpAmount) private returns(uint ETHAmount) {
        ERC20(uniswapV2Pair).approve(uniswapV2Router, lpAmount);
        (ETHAmount) = IUniswapV2Router02(uniswapV2Router)
            .removeLiquidityETHSupportingFeeOnTransferTokens(
                address(this),
                lpAmount,
                0,
                0,
                address(balancer),
                block.timestamp
            );
    }
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), uniswapV2Router, tokenAmount);

        IUniswapV2Router02(uniswapV2Router)
            .addLiquidityETH
            .value(ethAmount)(
                address(this),
                tokenAmount,
                0,
                0,
                address(this),
                block.timestamp
            );
    }
    
    // returns token amount
    function lockableSupply() external view returns (uint256) {
        return balanceOf(address(this));
    }

    // returns token amount
    function lockedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply();
        uint256 lpBalance = lockedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _lockedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _lockedSupply;
    }

    // returns token amount
    function burnedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply();
        uint256 lpBalance = burnedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _burnedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _burnedSupply;
    }

    // returns LP amount, not token amount
    function burnableLiquidity() public view returns (uint256) {
        return ERC20(uniswapV2Pair).balanceOf(address(this));
    }

    // returns LP amount, not token amount
    function burnedLiquidity() public view returns (uint256) {
        return ERC20(uniswapV2Pair).balanceOf(address(0));
    }

    // returns LP amount, not token amount
    function lockedLiquidity() public view returns (uint256) {
        return burnableLiquidity().add(burnedLiquidity());
    }
}

// File: contracts/ERC20/ERC20Governance.sol

pragma solidity ^0.5.17;

contract ERC20Governance is ERC20, ERC20Detailed {
    using SafeMath for uint256;

    function _transfer(address from, address to, uint256 amount) internal {
        _moveDelegates(_delegates[from], _delegates[to], amount);
        super._transfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal {
        _moveDelegates(address(0), _delegates[account], amount);
        super._mint(account, amount);
    }

    function _burn(address account, uint256 amount) internal {
        _moveDelegates(_delegates[account], address(0), amount);
        super._burn(account, amount);
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    /// @notice A record of each accounts delegate
    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator)
        external
        view
        returns (address)
    {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
    {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "ERC20Governance::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "ERC20Governance::delegateBySig: invalid nonce");
        require(now <= expiry, "ERC20Governance::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account)
        external
        view
        returns (uint256)
    {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "ERC20Governance::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying ERC20Governances (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    )
        internal
    {
        uint32 blockNumber = safe32(block.number, "ERC20Governance::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

pragma solidity ^0.5.17;

contract Balancer {
    using SafeMath for uint256;    
    MagicBalancer token;
    address public burnAddr = 0x000000000000000000000000000000000000dEaD;
    address payable public treasury;
    
    constructor(address payable treasury_) public {
        token = MagicBalancer(msg.sender);
        treasury = treasury_;
    }
    function () external payable {}
    function rebalance(uint callerRewardDivisor) external returns (uint256) { 
        require(msg.sender == address(token), "only token");
        swapEthForTokens(address(this).balance, callerRewardDivisor);
        uint256 lockableBalance = token.balanceOf(address(this));
        uint256 callerReward = lockableBalance.div(callerRewardDivisor);
        token.transfer(tx.origin, callerReward);
        token.transfer(burnAddr, lockableBalance.sub(callerReward));        
        return lockableBalance.sub(callerReward);
    }

    function swapEthForTokens(uint256 EthAmount, uint callerRewardDivisor) private {
        address[] memory uniswapPairPath = new address[](2);
        uniswapPairPath[0] = IUniswapV2Router02(token.uniswapV2Router()).WETH();
        uniswapPairPath[1] = address(token);
        uint256 treasuryAmount = EthAmount.div(callerRewardDivisor);
        treasury.transfer(treasuryAmount);
        
        token.approve(token.uniswapV2Router(), EthAmount);
        
        IUniswapV2Router02(token.uniswapV2Router())
            .swapExactETHForTokensSupportingFeeOnTransferTokens.value(EthAmount.sub(treasuryAmount))(
                0,
                uniswapPairPath,
                address(this),
                block.timestamp
            );
    }    
}
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
interface IUniswapV2Router02 {
    function WETH() external pure returns (address);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
    ) external payable;
    function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityETHSupportingFeeOnTransferTokens(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountETH); 
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Pair {
    function sync() external;
}

contract MagicBalancer is 
    ERC20(300e3 ether), 
    ERC20Detailed("Magic Balancer", "MGB", 18), 
    ERC20Burnable, 
    // governance must be before transfer liquidity lock
    // or delegates are not updated correctly
    ERC20Governance,
    ERC20TransferLiquidityLock,
    WhitelistAdminRole 
{

    function setUniswapV2Pair(address _uniswapV2Pair) public onlyWhitelistAdmin {
        require(uniswapV2Pair == address(0), "MGBToken::setUniswapV2Pair: already set");
        uniswapV2Pair = _uniswapV2Pair;
    }
    
    function setUniswapV2Router(address _uniswapV2Router) public onlyWhitelistAdmin {
        require(uniswapV2Router == address(0), "MGBToken::setUniswapV2Router: already set");
        uniswapV2Router = _uniswapV2Router;
    }
    
    function setLiquidityLockDivisor(uint256 _liquidityLockDivisor) public onlyWhitelistAdmin {
        if (_liquidityLockDivisor != 0) {
            require(_liquidityLockDivisor >= 10, "MGBToken::setLiquidityLockDivisor: too small");
        }
        liquidityLockDivisor = _liquidityLockDivisor;
    }

    function setRebalanceDivisor(uint256 _rebalanceDivisor) public onlyWhitelistAdmin {
        if (_rebalanceDivisor != 0) {
            require(_rebalanceDivisor >= 10, "MGBToken::setRebalanceDivisor: too small");
        }        
        rebalanceDivisor = _rebalanceDivisor;
    }
    
    function setRebalanceInterval(uint256 _interval) public onlyWhitelistAdmin {
        rebalanceInterval = _interval;
    }
    
    function setCallerRewardDivisior(uint256 _rewardDivisor) public onlyWhitelistAdmin {
        if (_rewardDivisor != 0) {
            require(_rewardDivisor >= 10, "MGBToken::setCallerRewardDivisor: too small");
        }        
        callerRewardDivisor = _rewardDivisor;
    }
    
    function setMinRebalanceAmount(uint256 amount_) public onlyWhitelistAdmin {
        minRebalanceAmount = amount_;
    }
    
    function setPresaleAddress(address _PresaleAddress) public onlyWhitelistAdmin {
        require(PresaleAddress == address(0), "MGBToken::PresaleAddress: already set");
        PresaleAddress = _PresaleAddress;
        unlocked[_PresaleAddress] = !unlocked[_PresaleAddress];
        feelessAddr[_PresaleAddress] = !feelessAddr[_PresaleAddress];
        uint256 presaleAmount = 235000 ether;
        _transfer(address(treasury), address(_PresaleAddress), presaleAmount);
    }
    
    function unlockLP() public onlyWhitelistAdmin {
        require(now > lpUnlocked, "Not unlocked yet");
        uint256 amount = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).transfer(msg.sender, amount);
    }
    
    function toggleFeeless(address _addr) public onlyWhitelistAdmin {
        feelessAddr[_addr] = !feelessAddr[_addr];
    }
    
    function toggleUnlockable(address _addr) public onlyWhitelistAdmin {
        unlocked[_addr] = !unlocked[_addr];
    } 
    
    function activateTrading() public onlyWhitelistAdmin {
        locked = false;
    }
    
    function createUniswapPair() public onlyWhitelistAdmin {
        uint256 amountTokenDesired = IERC20(address(this)).balanceOf(address(this));
        uint amountETH = address(this).balance;
        _approve(address(this),address(uniswapV2Router), amountTokenDesired);
        IUniswapV2Router01(uniswapV2Router).addLiquidityETH.value(amountETH)(
            address(this),
            amountTokenDesired,
            0,
            0,
            address(this),
            now);
    }
    
    function MGBBalanceInUniswap(address _user) public view returns (uint256) {
        uint256 uniswapPairMGBBalance = balanceOf(address(uniswapV2Pair));
        if (uniswapPairMGBBalance == 0) {
            return 0;
        }
        uint256 userLpBalance = ERC20(uniswapV2Pair).balanceOf(_user);
        if (userLpBalance == 0) {
            return 0;
        }
        uint256 userPercentOfLpOwned = userLpBalance.mul(1e12).div(ERC20(uniswapV2Pair).totalSupply());
        return uniswapPairMGBBalance.mul(userPercentOfLpOwned).div(1e12);
    }

    function MGBBalanceAll(address _user) public view returns (uint256) {
        return balanceOf(_user).add(MGBBalanceInUniswap(_user));
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRewards","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"MGBBalanceAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"MGBBalanceInUniswap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PresaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activateTrading","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bounce","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burnableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callerRewardDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"createUniswapPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidityLockDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lpUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minRebalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalanceLiquidity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardDivisor","type":"uint256"}],"name":"setCallerRewardDivisior","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_liquidityLockDivisor","type":"uint256"}],"name":"setLiquidityLockDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinRebalanceAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_PresaleAddress","type":"address"}],"name":"setPresaleAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rebalanceDivisor","type":"uint256"}],"name":"setRebalanceDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleUnlockable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlockLP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

600e80546001600160a01b0319167373282a63f0e3d7e9604575420f777361eca3c86a17815560809081526d26b0b3b4b1902130b630b731b2b960911b60a052610100604052600360c09081526226a3a160e91b60e0526012693f870857a3e0e38000006200008a6200007a6001600160e01b036200027616565b826001600160e01b036200027b16565b508251620000a0906003906020860190620009af565b508151620000b6906004906020850190620009af565b506005805460ff90921660ff199092169190911790555050426015819055606460115560196012556032601355610e106016556276a700016017556801a055690d9db80000601455600c80546001600160a01b0319163317908190556040516001600160a01b0391909116906200012d9062000a34565b6001600160a01b03909116815260405190819003602001906000f0801580156200015b573d6000803e3d6000fd5b5060188054610100600160a81b0319166101006001600160a01b039384168102919091178255306000818152600f60209081526040808320805460ff1990811660019081179092558754879004891685528285208054821683179055600e80548a1686528386208054831684179055600d80548b16875284872080548416851790558954831684178a5596865260109094528285208054821683179055600a5489168552828520805482168317905594548816845281842080548616821790553384528184208054861682179055915487168352808320805485168317905594549390930490941684529190922080549091169091179055620002706200026162000276565b6001600160e01b03620002c616565b62000a5f565b335b90565b6001600160a01b03808316600090815260066020526040812054620002ab9216836001600160e01b036200031816565b620002c282826200049c60201b620042f51760201c565b5050565b620002e18160196200059d60201b62003ddf1790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b816001600160a01b0316836001600160a01b0316141580156200033b5750600081115b1562000497576001600160a01b03831615620003ec576001600160a01b03831660009081526008602052604081205463ffffffff1690816200037f576000620003b1565b6001600160a01b038516600090815260076020908152604080832063ffffffff60001987011684529091529020600101545b90506000620003cf84836200062a60201b6200393b1790919060201c565b9050620003e8868484846001600160e01b036200067b16565b5050505b6001600160a01b0382161562000497576001600160a01b03821660009081526008602052604081205463ffffffff1690816200042a5760006200045c565b6001600160a01b038416600090815260076020908152604080832063ffffffff60001987011684529091529020600101545b905060006200047a8483620007ef60201b620032c21790919060201c565b905062000493858484846001600160e01b036200067b16565b5050505b505050565b6001600160a01b038216620004f8576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200051481600254620007ef60201b620032c21790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000547918390620032c2620007ef821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b620005b282826001600160e01b036200084a16565b1562000605576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006200067483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250620008b360201b60201c565b9392505050565b6000620006ab436040518060600160405280603f815260200162005ebb603f91396001600160e01b036200094e16565b905060008463ffffffff16118015620006f557506001600160a01b038516600090815260076020908152604080832063ffffffff6000198901811685529252909120548282169116145b1562000734576001600160a01b038516600090815260076020908152604080832063ffffffff60001989011684529091529020600101829055620007a5565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600784528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260089092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008282018381101562000674576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006001600160a01b038216620008935760405162461bcd60e51b815260040180806020018281038252602281526020018062005efa6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b60008184841115620009465760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200090a578181015183820152602001620008f0565b50505050905090810190601f168015620009385780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000816401000000008410620009a75760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156200090a578181015183820152602001620008f0565b509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620009f257805160ff191683800117855562000a22565b8280016001018555821562000a22579182015b8281111562000a2257825182559160200191906001019062000a05565b5062000a3092915062000a42565b5090565b610b2c806200538f83390190565b6200027891905b8082111562000a30576000815560010162000a49565b6149208062000a6f6000396000f3fe6080604052600436106103a15760003560e01c8063782d6fe1116101e7578063b91f3f971161010d578063dd62ed3e116100a0578063e7a324dc1161006f578063e7a324dc14610dfb578063e84354c514610e10578063f1127ed814610e25578063f953797314610e91576103a1565b8063dd62ed3e14610d74578063e161eb5614610dbc578063e5ec1d8c14610dd1578063e660c7aa14610de6576103a1565b8063ca5c7b91116100dc578063ca5c7b9114610d20578063cafab28914610d35578063cf30901214610d4a578063dc654a7314610d5f576103a1565b8063b91f3f9714610c2a578063bb5f747b14610c3f578063bdb9f28d14610c7f578063c3cda52014610cbf576103a1565b806395d89b4111610185578063a9059cbb11610154578063a9059cbb14610b65578063b439824414610bab578063b4b5ea5714610bc0578063b6833c5914610c00576103a1565b806395d89b4114610ab5578063a29a608914610aca578063a457c2d714610b0a578063a8a5550e14610b50576103a1565b80637ecebe00116101c15780637ecebe0014610a0b5780637f4aeb1a14610a4b578063858750ab14610a6057806393e98e7d14610a75576103a1565b8063782d6fe11461095557806379cc67901461099b5780637e0d943e146109e1576103a1565b806342966c68116102cc5780635c19a95c1161026a5780636fcfff45116102395780636fcfff451461083c57806370709a7c1461089557806370a08231146108d55780637362d9c814610915576103a1565b80635c19a95c1461077d57806361d027b3146107bd57806364ba8a50146107d257806367a9fca614610812576103a1565b80634c5a628c116102a65780634c5a628c146106e957806355d0a1d0146106fe578063587cde1e146107135780635b7dcaed14610753576103a1565b806342966c681461069557806349bd5a5e146106bf5780634a131672146106d4576103a1565b80631694505e1161034457806323b872dd1161031357806323b872dd146105bf5780632898cafa1461060f578063313ce56714610624578063395093511461064f576103a1565b80631694505e1461054257806316d1d9161461058057806318160ddd1461059557806320606b70146105aa576103a1565b8063095ea7b311610380578063095ea7b31461047e5780630bd05b69146104d8578063106b9ca1146104ed5780631419841d14610502576103a1565b80629a8130146103a357806302dd19d9146103cd57806306fdde03146103f4575b005b3480156103af57600080fd5b506103a1600480360360208110156103c657600080fd5b5035610ed1565b3480156103d957600080fd5b506103e2610f9b565b60408051918252519081900360200190f35b34801561040057600080fd5b50610409610fa1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044357818101518382015260200161042b565b50505050905090810190601f1680156104705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048a57600080fd5b506104c4600480360360408110156104a157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611055565b604080519115158252519081900360200190f35b3480156104e457600080fd5b506103a1611073565b3480156104f957600080fd5b506103e26110fd565b34801561050e57600080fd5b506103a16004803603602081101561052557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611103565b34801561054e57600080fd5b50610557611219565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561058c57600080fd5b506103e2611235565b3480156105a157600080fd5b506103e261123b565b3480156105b657600080fd5b506103e2611241565b3480156105cb57600080fd5b506104c4600480360360608110156105e257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561125c565b34801561061b57600080fd5b506103e2611303565b34801561063057600080fd5b506106396113a8565b6040805160ff9092168252519081900360200190f35b34801561065b57600080fd5b506104c46004803603604081101561067257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356113b1565b3480156106a157600080fd5b506103a1600480360360208110156106b857600080fd5b5035611412565b3480156106cb57600080fd5b50610557611426565b3480156106e057600080fd5b506103a1611442565b3480156106f557600080fd5b506103a1611618565b34801561070a57600080fd5b506103e261162a565b34801561071f57600080fd5b506105576004803603602081101561073657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611745565b34801561075f57600080fd5b506103a16004803603602081101561077657600080fd5b5035611773565b34801561078957600080fd5b506103a1600480360360208110156107a057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117d8565b3480156107c957600080fd5b506105576117e2565b3480156107de57600080fd5b506103e2600480360360208110156107f557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117fe565b34801561081e57600080fd5b506103a16004803603602081101561083557600080fd5b5035611821565b34801561084857600080fd5b5061087c6004803603602081101561085f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118e6565b6040805163ffffffff9092168252519081900360200190f35b3480156108a157600080fd5b506103a1600480360360208110156108b857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118fe565b3480156108e157600080fd5b506103e2600480360360208110156108f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119b2565b34801561092157600080fd5b506103a16004803603602081101561093857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119da565b34801561096157600080fd5b506103e26004803603604081101561097857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a43565b3480156109a757600080fd5b506103a1600480360360408110156109be57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d0d565b3480156109ed57600080fd5b506103a160048036036020811015610a0457600080fd5b5035611d1b565b348015610a1757600080fd5b506103e260048036036020811015610a2e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611de0565b348015610a5757600080fd5b506103a1611df2565b348015610a6c57600080fd5b506103e2612087565b348015610a8157600080fd5b506103e260048036036020811015610a9857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120f8565b348015610ac157600080fd5b506104096122b7565b348015610ad657600080fd5b506103a160048036036020811015610aed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612336565b348015610b1657600080fd5b506104c460048036036040811015610b2d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561244c565b348015610b5c57600080fd5b506103e26124c7565b348015610b7157600080fd5b506104c460048036036040811015610b8857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356124d7565b348015610bb757600080fd5b506103e26124eb565b348015610bcc57600080fd5b506103e260048036036020811015610be357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612500565b348015610c0c57600080fd5b506103a160048036036020811015610c2357600080fd5b503561259c565b348015610c3657600080fd5b506103a1612601565b348015610c4b57600080fd5b506104c460048036036020811015610c6257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661281a565b348015610c8b57600080fd5b506103a160048036036020811015610ca257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661282d565b348015610ccb57600080fd5b506103a1600480360360c0811015610ce257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060408101359060ff6060820135169060808101359060a001356129b3565b348015610d2c57600080fd5b506103e2612d0f565b348015610d4157600080fd5b506103e2612db2565b348015610d5657600080fd5b506104c4612db8565b348015610d6b57600080fd5b506103e2612dc1565b348015610d8057600080fd5b506103e260048036036040811015610d9757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612dc7565b348015610dc857600080fd5b506103e2612dff565b348015610ddd57600080fd5b50610557612e05565b348015610df257600080fd5b50610557612e21565b348015610e0757600080fd5b506103e2612e3d565b348015610e1c57600080fd5b506103e2612e58565b348015610e3157600080fd5b50610e7160048036036040811015610e4857600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff16612e5e565b6040805163ffffffff909316835260208301919091528051918290030190f35b348015610e9d57600080fd5b506103a160048036036020811015610eb457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e8b565b610ee1610edc612f3f565b61281a565b610f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015610f9657600a811015610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061471d602b913960400191505060405180910390fd5b601255565b60125481565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b5050505050905090565b6000611069611062612f3f565b8484612f43565b5060015b92915050565b61107e610edc612f3f565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60155481565b61110e610edc612f3f565b611163576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff16156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806144e16029913960400191505060405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b60025490565b60405180604361460b82396043019050604051809103902081565b600061126984848461308a565b6112f984611275612f3f565b6112f48560405180606001604052806028815260200161466f6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600160205260408120906112c0612f3f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054919063ffffffff61321116565b612f43565b5060019392505050565b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081526000600482018190529151919273ffffffffffffffffffffffffffffffffffffffff16916370a0823191602480820192602092909190829003018186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b5051905090565b60055460ff1690565b60006110696113be612f3f565b846112f485600160006113cf612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6132c216565b61142361141d612f3f565b82613336565b50565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b61144d610edc612f3f565b6114a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190529151600092916370a08231916024808301926020929190829003018186803b1580156114fc57600080fd5b505afa158015611510573d6000803e3d6000fd5b505050506040513d602081101561152657600080fd5b5051600a54909150479061155290309073ffffffffffffffffffffffffffffffffffffffff1684612f43565b600a54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b50505050506040513d606081101561161257600080fd5b50505050565b611628611623612f3f565b613373565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b5051905060006116cd611303565b905060006116f6836116ea8464e8d4a5100063ffffffff6133c816565b9063ffffffff61343b16565b600b5490915060009061171e9073ffffffffffffffffffffffffffffffffffffffff166119b2565b9050600061173b64e8d4a510006116ea848663ffffffff6133c816565b9550505050505090565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260066020526040902054165b919050565b61177e610edc612f3f565b6117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601655565b611423338261347d565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b600061106d61180c836120f8565b611815846119b2565b9063ffffffff6132c216565b61182c610edc612f3f565b611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b80156118e157600a8110156118e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061457f602c913960400191505060405180910390fd5b601155565b60086020526000908152604090205463ffffffff1681565b611909610edc612f3f565b61195e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6119e5610edc612f3f565b611a3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b6114238161353e565b6000438210611a9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147bf6032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff1680611ad857600091505061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310611b9d5773ffffffffffffffffffffffffffffffffffffffff841660009081526007602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff1683529290522060010154905061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832083805290915290205463ffffffff16831015611be557600091505061106d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff161115611cc957600282820363ffffffff16048103611c356142de565b5073ffffffffffffffffffffffffffffffffffffffff8716600090815260076020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415611ca45760200151945061106d9350505050565b805163ffffffff16871115611cbb57819350611cc2565b6001820392505b5050611c0b565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b611d178282613593565b5050565b611d26610edc612f3f565b611d7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015611ddb57600a811015611ddb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145306028913960400191505060405180910390fd5b601355565b60096020526000908152604090205481565b601454611dfe336119b2565b1015611e55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b601654601554014211611ec957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f54727920616761696e206166746572203120686f757200000000000000000000604482015290519081900360640190fd5b426015556000611ed8306119b2565b9050611ee3816135f4565b601354600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600093611f9893909273ffffffffffffffffffffffffffffffffffffffff909116916370a0823191602480820192602092909190829003018186803b158015611f6057600080fd5b505afa158015611f74573d6000803e3d6000fd5b505050506040513d6020811015611f8a57600080fd5b50519063ffffffff61343b16565b9050611fa3816136d2565b50601854601254604080517ff4993018000000000000000000000000000000000000000000000000000000008152600481019290925251600092610100900473ffffffffffffffffffffffffffffffffffffffff169163f499301891602480830192602092919082900301818787803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b505050506040513d602081101561204957600080fd5b50516040805182815290519192507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0919081900360200190a1505050565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561137757600080fd5b600b54600090819061211f9073ffffffffffffffffffffffffffffffffffffffff166119b2565b90508061213057600091505061176e565b600b54604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156121a757600080fd5b505afa1580156121bb573d6000803e3d6000fd5b505050506040513d60208110156121d157600080fd5b50519050806121e55760009250505061176e565b6000612293600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225257600080fd5b505afa158015612266573d6000803e3d6000fd5b505050506040513d602081101561227c57600080fd5b50516116ea8464e8d4a5100063ffffffff6133c816565b90506122ae64e8d4a510006116ea858463ffffffff6133c816565b95945050505050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b612341610edc612f3f565b612396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600b5473ffffffffffffffffffffffffffffffffffffffff1615612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806145586027913960400191505060405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611069612459612f3f565b846112f4856040518060600160405280602581526020016148c76025913960016000612483612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61321116565b60006124d2306119b2565b905090565b60006110696124e4612f3f565b848461308a565b60006124d26124f8611303565b611815612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604081205463ffffffff1680612538576000612595565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86011684529091529020600101545b9392505050565b6125a7610edc612f3f565b6125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601455565b61260c610edc612f3f565b612661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b60175442116126d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d602081101561276c57600080fd5b5051600b54604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff9091169163a9059cbb916044808201926020929091908290030181600087803b1580156127eb57600080fd5b505af11580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b505050565b600061106d60198363ffffffff61385216565b612838610edc612f3f565b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600d5473ffffffffffffffffffffffffffffffffffffffff16156128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148426025913960400191505060405180910390fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092556000908152601060209081526040808320805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0092831617909255600f909352922080549283161592909116919091179055600c546931c3602284a35ce0000091611d179116838361308a565b6000604051808061460b60439139604301905060405180910390206129d6610fa1565b805190602001206129e56138ed565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019450505050506040516020818303038152906040528051906020012090506000604051808061488d603a91396040805191829003603a01822060208084019190915273ffffffffffffffffffffffffffffffffffffffff8c1683830152606083018b905260808084018b90528251808503909101815260a0840183528051908201207f190100000000000000000000000000000000000000000000000000000000000060c085015260c2840187905260e2808501829052835180860390910181526101028501808552815191840191909120600091829052610122860180865281905260ff8c1661014287015261016286018b905261018286018a9052935191965092945091926001926101a280830193927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301929081900390910190855afa158015612b83573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061448e6031913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090208054600181019091558914612c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614815602d913960400191505060405180910390fd5b87421115612cf8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806147486031913960400191505060405180910390fd5b612d02818b61347d565b505050505b505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7a57600080fd5b505afa158015612d8e573d6000803e3d6000fd5b505050506040513d6020811015612da457600080fd5b5051905060006116cd6124eb565b60175481565b60185460ff1681565b60115481565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60135481565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60405180603a61488d8239603a019050604051809103902081565b60145481565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b612e96610edc612f3f565b612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806147f16024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661301b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144bf6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60185460ff1680156130c7575073ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604090205460ff161515600114155b80156130fe575073ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604090205460ff161515600114155b15613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061446c6022913960400191505060405180910390fd5b6011541580159061318b575073ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604090205460ff16155b80156131bd575073ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604090205460ff16155b156132065760006131d96011548361343b90919063ffffffff16565b90506131e68430836138f1565b61320084846131fb858563ffffffff61393b16565b6138f1565b50612815565b6128158383836138f1565b600081848411156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561327f578181015183820152602001613267565b50505050905090810190601f1680156132ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561259557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660205260408120546133699216908361397d565b611d178282613b6a565b61338460198263ffffffff613cb416565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6000826133d75750600061106d565b828202828482816133e457fe5b0414612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061464e6021913960400191505060405180910390fd5b600061259583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d60565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260066020526040812054909116906134b1846119b2565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526006602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461161282848361397d565b61354f60198263ffffffff613ddf16565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b61359d8282613336565b611d17826135a9612f3f565b6112f4846040518060600160405280602481526020016146f96024913973ffffffffffffffffffffffffffffffffffffffff88166000908152600160205260408120906112c0612f3f565b600b5461361990309073ffffffffffffffffffffffffffffffffffffffff16836138f1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b600b54600a54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561375457600080fd5b505af1158015613768573d6000803e3d6000fd5b505050506040513d602081101561377e57600080fd5b5050600a54601854604080517faf2979eb000000000000000000000000000000000000000000000000000000008152306004820152602481018690526000604482018190526064820181905273ffffffffffffffffffffffffffffffffffffffff610100909404841660848301524260a48301529151929093169263af2979eb9260c48083019360209383900390910190829087803b15801561382057600080fd5b505af1158015613834573d6000803e3d6000fd5b505050506040513d602081101561384a57600080fd5b505192915050565b600073ffffffffffffffffffffffffffffffffffffffff82166138c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806146976022913960400191505060405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b4690565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660205260408082205485841683529120546139309291821691168361397d565b612815838383613ea5565b600061259583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613211565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156139b95750600081115b156128155773ffffffffffffffffffffffffffffffffffffffff831615613a965773ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081205463ffffffff169081613a13576000613a70565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613a84828563ffffffff61393b16565b9050613a9286848484614076565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156128155773ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205463ffffffff169081613aeb576000613b48565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613b5c828563ffffffff6132c216565b9050612d0785848484614076565b73ffffffffffffffffffffffffffffffffffffffff8216613bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147796021913960400191505060405180910390fd5b613c268160405180606001604052806022815260200161444a6022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902055600254613c5f908263ffffffff61393b16565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b613cbe8282613852565b613d13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806145ab6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60008183613dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b506000838581613dd557fe5b0495945050505050565b613de98282613852565b15613e5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8316613f11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061479a6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613f7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806144276023913960400191505060405180910390fd5b613fcd8160405180606001604052806026815260200161450a6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220939093559084168152205461400f908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061409a436040518060600160405280603f81526020016145cc603f9139614266565b905060008463ffffffff1611801561410e575073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b156141765773ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901168452909152902060010182905561420f565b60408051808201825263ffffffff8084168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000818152600784528681208b861682528452868120955186549086167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000918216178755925160019687015590815260089092529390208054928801909116919092161790555b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff8816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b509192915050565b604080518082019091526000808252602082015290565b73ffffffffffffffffffffffffffffffffffffffff821661437757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461438a908263ffffffff6132c216565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546143c3908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365546f6b656e73206c6f636b656420756e74696c20656e64206f662070726573616c654552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f20616464726573734d4742546f6b656e3a3a736574556e69737761705632526f757465723a20616c72656164792073657445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d4742546f6b656e3a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c4d4742546f6b656e3a3a736574556e69737761705632506169723a20616c7265616479207365744d4742546f6b656e3a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c654552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654d4742546f6b656e3a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c4552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e63654d4742546f6b656e3a3a50726573616c65416464726573733a20616c726561647920736574596f7520617265206e6f742070617274206f6620746865204d6167696342616c616e6365722e44656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e74323536206578706972792945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7f447ea7fa44adcb96a924f5f5f0fc97c5212181445f67f1a6ed49a96a50f0a64736f6c634300051100326080604052600180546001600160a01b03191661dead17905534801561002457600080fd5b50604051610b2c380380610b2c8339818101604052602081101561004757600080fd5b5051600080546001600160a01b03199081163317909155600280546001600160a01b0390931692909116919091179055610aa6806100866000396000f3fe6080604052600436106100345760003560e01c806361d027b314610036578063d246d41114610074578063f499301814610089575b005b34801561004257600080fd5b5061004b6100c5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561008057600080fd5b5061004b6100e1565b34801561009557600080fd5b506100b3600480360360208110156100ac57600080fd5b50356100fd565b60408051918252519081900360200190f35b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461018457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c7920746f6b656e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b61018e47836103cf565b60008054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561020057600080fd5b505afa158015610214573d6000803e3d6000fd5b505050506040513d602081101561022a57600080fd5b505190506000610240828563ffffffff6108b616565b60008054604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815232600482015260248101859052905193945073ffffffffffffffffffffffffffffffffffffffff9091169263a9059cbb92604480840193602093929083900390910190829087803b1580156102bf57600080fd5b505af11580156102d3573d6000803e3d6000fd5b505050506040513d60208110156102e957600080fd5b505060005460015473ffffffffffffffffffffffffffffffffffffffff9182169163a9059cbb9116610321858563ffffffff6108ff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561038a57600080fd5b505af115801561039e573d6000803e3d6000fd5b505050506040513d60208110156103b457600080fd5b506103c79050828263ffffffff6108ff16565b949350505050565b60408051600280825260608083018452926020830190803883395050600054604080517f1694505e000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff90911692631694505e92506004808301926020929190829003018186803b15801561045957600080fd5b505afa15801561046d573d6000803e3d6000fd5b505050506040513d602081101561048357600080fd5b5051604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163ad5c464891600480820192602092909190829003018186803b1580156104ed57600080fd5b505afa158015610501573d6000803e3d6000fd5b505050506040513d602081101561051757600080fd5b50518151829060009061052657fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260005482519116908290600190811061055e57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526000610595848463ffffffff6108b616565b60025460405191925073ffffffffffffffffffffffffffffffffffffffff169082156108fc029083906000818181858888f193505050501580156105dd573d6000803e3d6000fd5b50600054604080517f1694505e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163095ea7b3918391631694505e91600480820192602092909190829003018186803b15801561065157600080fd5b505afa158015610665573d6000803e3d6000fd5b505050506040513d602081101561067b57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9092166004830152602482018890525160448083019260209291908290030181600087803b1580156106f057600080fd5b505af1158015610704573d6000803e3d6000fd5b505050506040513d602081101561071a57600080fd5b5050600054604080517f1694505e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691631694505e91600480820192602092909190829003018186803b15801561078757600080fd5b505afa15801561079b573d6000803e3d6000fd5b505050506040513d60208110156107b157600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1663b6f9de956107de868463ffffffff6108ff16565b60008530426040518663ffffffff1660e01b815260040180858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610870578181015183820152602001610858565b50505050905001955050505050506000604051808303818588803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b505050505050505050565b60006108f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610941565b9392505050565b60006108f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506109fd565b600081836109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109ac578181015183820152602001610994565b50505050905090810190601f1680156109d95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816109f357fe5b0495945050505050565b60008184841115610a69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156109ac578181015183820152602001610994565b50505090039056fea265627a7a723158200aeb11da21a81715086ddcfae7ce8d1948dfd031ebf68fbcaceb6ef13fbbe3aa64736f6c634300051100324552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x6080604052600436106103a15760003560e01c8063782d6fe1116101e7578063b91f3f971161010d578063dd62ed3e116100a0578063e7a324dc1161006f578063e7a324dc14610dfb578063e84354c514610e10578063f1127ed814610e25578063f953797314610e91576103a1565b8063dd62ed3e14610d74578063e161eb5614610dbc578063e5ec1d8c14610dd1578063e660c7aa14610de6576103a1565b8063ca5c7b91116100dc578063ca5c7b9114610d20578063cafab28914610d35578063cf30901214610d4a578063dc654a7314610d5f576103a1565b8063b91f3f9714610c2a578063bb5f747b14610c3f578063bdb9f28d14610c7f578063c3cda52014610cbf576103a1565b806395d89b4111610185578063a9059cbb11610154578063a9059cbb14610b65578063b439824414610bab578063b4b5ea5714610bc0578063b6833c5914610c00576103a1565b806395d89b4114610ab5578063a29a608914610aca578063a457c2d714610b0a578063a8a5550e14610b50576103a1565b80637ecebe00116101c15780637ecebe0014610a0b5780637f4aeb1a14610a4b578063858750ab14610a6057806393e98e7d14610a75576103a1565b8063782d6fe11461095557806379cc67901461099b5780637e0d943e146109e1576103a1565b806342966c68116102cc5780635c19a95c1161026a5780636fcfff45116102395780636fcfff451461083c57806370709a7c1461089557806370a08231146108d55780637362d9c814610915576103a1565b80635c19a95c1461077d57806361d027b3146107bd57806364ba8a50146107d257806367a9fca614610812576103a1565b80634c5a628c116102a65780634c5a628c146106e957806355d0a1d0146106fe578063587cde1e146107135780635b7dcaed14610753576103a1565b806342966c681461069557806349bd5a5e146106bf5780634a131672146106d4576103a1565b80631694505e1161034457806323b872dd1161031357806323b872dd146105bf5780632898cafa1461060f578063313ce56714610624578063395093511461064f576103a1565b80631694505e1461054257806316d1d9161461058057806318160ddd1461059557806320606b70146105aa576103a1565b8063095ea7b311610380578063095ea7b31461047e5780630bd05b69146104d8578063106b9ca1146104ed5780631419841d14610502576103a1565b80629a8130146103a357806302dd19d9146103cd57806306fdde03146103f4575b005b3480156103af57600080fd5b506103a1600480360360208110156103c657600080fd5b5035610ed1565b3480156103d957600080fd5b506103e2610f9b565b60408051918252519081900360200190f35b34801561040057600080fd5b50610409610fa1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044357818101518382015260200161042b565b50505050905090810190601f1680156104705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048a57600080fd5b506104c4600480360360408110156104a157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611055565b604080519115158252519081900360200190f35b3480156104e457600080fd5b506103a1611073565b3480156104f957600080fd5b506103e26110fd565b34801561050e57600080fd5b506103a16004803603602081101561052557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611103565b34801561054e57600080fd5b50610557611219565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561058c57600080fd5b506103e2611235565b3480156105a157600080fd5b506103e261123b565b3480156105b657600080fd5b506103e2611241565b3480156105cb57600080fd5b506104c4600480360360608110156105e257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561125c565b34801561061b57600080fd5b506103e2611303565b34801561063057600080fd5b506106396113a8565b6040805160ff9092168252519081900360200190f35b34801561065b57600080fd5b506104c46004803603604081101561067257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356113b1565b3480156106a157600080fd5b506103a1600480360360208110156106b857600080fd5b5035611412565b3480156106cb57600080fd5b50610557611426565b3480156106e057600080fd5b506103a1611442565b3480156106f557600080fd5b506103a1611618565b34801561070a57600080fd5b506103e261162a565b34801561071f57600080fd5b506105576004803603602081101561073657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611745565b34801561075f57600080fd5b506103a16004803603602081101561077657600080fd5b5035611773565b34801561078957600080fd5b506103a1600480360360208110156107a057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117d8565b3480156107c957600080fd5b506105576117e2565b3480156107de57600080fd5b506103e2600480360360208110156107f557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117fe565b34801561081e57600080fd5b506103a16004803603602081101561083557600080fd5b5035611821565b34801561084857600080fd5b5061087c6004803603602081101561085f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118e6565b6040805163ffffffff9092168252519081900360200190f35b3480156108a157600080fd5b506103a1600480360360208110156108b857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118fe565b3480156108e157600080fd5b506103e2600480360360208110156108f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119b2565b34801561092157600080fd5b506103a16004803603602081101561093857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119da565b34801561096157600080fd5b506103e26004803603604081101561097857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a43565b3480156109a757600080fd5b506103a1600480360360408110156109be57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d0d565b3480156109ed57600080fd5b506103a160048036036020811015610a0457600080fd5b5035611d1b565b348015610a1757600080fd5b506103e260048036036020811015610a2e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611de0565b348015610a5757600080fd5b506103a1611df2565b348015610a6c57600080fd5b506103e2612087565b348015610a8157600080fd5b506103e260048036036020811015610a9857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120f8565b348015610ac157600080fd5b506104096122b7565b348015610ad657600080fd5b506103a160048036036020811015610aed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612336565b348015610b1657600080fd5b506104c460048036036040811015610b2d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561244c565b348015610b5c57600080fd5b506103e26124c7565b348015610b7157600080fd5b506104c460048036036040811015610b8857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356124d7565b348015610bb757600080fd5b506103e26124eb565b348015610bcc57600080fd5b506103e260048036036020811015610be357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612500565b348015610c0c57600080fd5b506103a160048036036020811015610c2357600080fd5b503561259c565b348015610c3657600080fd5b506103a1612601565b348015610c4b57600080fd5b506104c460048036036020811015610c6257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661281a565b348015610c8b57600080fd5b506103a160048036036020811015610ca257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661282d565b348015610ccb57600080fd5b506103a1600480360360c0811015610ce257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060408101359060ff6060820135169060808101359060a001356129b3565b348015610d2c57600080fd5b506103e2612d0f565b348015610d4157600080fd5b506103e2612db2565b348015610d5657600080fd5b506104c4612db8565b348015610d6b57600080fd5b506103e2612dc1565b348015610d8057600080fd5b506103e260048036036040811015610d9757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612dc7565b348015610dc857600080fd5b506103e2612dff565b348015610ddd57600080fd5b50610557612e05565b348015610df257600080fd5b50610557612e21565b348015610e0757600080fd5b506103e2612e3d565b348015610e1c57600080fd5b506103e2612e58565b348015610e3157600080fd5b50610e7160048036036040811015610e4857600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff16612e5e565b6040805163ffffffff909316835260208301919091528051918290030190f35b348015610e9d57600080fd5b506103a160048036036020811015610eb457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e8b565b610ee1610edc612f3f565b61281a565b610f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015610f9657600a811015610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061471d602b913960400191505060405180910390fd5b601255565b60125481565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b5050505050905090565b6000611069611062612f3f565b8484612f43565b5060015b92915050565b61107e610edc612f3f565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60155481565b61110e610edc612f3f565b611163576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff16156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806144e16029913960400191505060405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b60025490565b60405180604361460b82396043019050604051809103902081565b600061126984848461308a565b6112f984611275612f3f565b6112f48560405180606001604052806028815260200161466f6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600160205260408120906112c0612f3f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054919063ffffffff61321116565b612f43565b5060019392505050565b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081526000600482018190529151919273ffffffffffffffffffffffffffffffffffffffff16916370a0823191602480820192602092909190829003018186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b5051905090565b60055460ff1690565b60006110696113be612f3f565b846112f485600160006113cf612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6132c216565b61142361141d612f3f565b82613336565b50565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b61144d610edc612f3f565b6114a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190529151600092916370a08231916024808301926020929190829003018186803b1580156114fc57600080fd5b505afa158015611510573d6000803e3d6000fd5b505050506040513d602081101561152657600080fd5b5051600a54909150479061155290309073ffffffffffffffffffffffffffffffffffffffff1684612f43565b600a54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b50505050506040513d606081101561161257600080fd5b50505050565b611628611623612f3f565b613373565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b5051905060006116cd611303565b905060006116f6836116ea8464e8d4a5100063ffffffff6133c816565b9063ffffffff61343b16565b600b5490915060009061171e9073ffffffffffffffffffffffffffffffffffffffff166119b2565b9050600061173b64e8d4a510006116ea848663ffffffff6133c816565b9550505050505090565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260066020526040902054165b919050565b61177e610edc612f3f565b6117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601655565b611423338261347d565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b600061106d61180c836120f8565b611815846119b2565b9063ffffffff6132c216565b61182c610edc612f3f565b611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b80156118e157600a8110156118e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061457f602c913960400191505060405180910390fd5b601155565b60086020526000908152604090205463ffffffff1681565b611909610edc612f3f565b61195e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6119e5610edc612f3f565b611a3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b6114238161353e565b6000438210611a9d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147bf6032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff1680611ad857600091505061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310611b9d5773ffffffffffffffffffffffffffffffffffffffff841660009081526007602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff1683529290522060010154905061106d565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832083805290915290205463ffffffff16831015611be557600091505061106d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff161115611cc957600282820363ffffffff16048103611c356142de565b5073ffffffffffffffffffffffffffffffffffffffff8716600090815260076020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415611ca45760200151945061106d9350505050565b805163ffffffff16871115611cbb57819350611cc2565b6001820392505b5050611c0b565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b611d178282613593565b5050565b611d26610edc612f3f565b611d7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b8015611ddb57600a811015611ddb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145306028913960400191505060405180910390fd5b601355565b60096020526000908152604090205481565b601454611dfe336119b2565b1015611e55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b601654601554014211611ec957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f54727920616761696e206166746572203120686f757200000000000000000000604482015290519081900360640190fd5b426015556000611ed8306119b2565b9050611ee3816135f4565b601354600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600093611f9893909273ffffffffffffffffffffffffffffffffffffffff909116916370a0823191602480820192602092909190829003018186803b158015611f6057600080fd5b505afa158015611f74573d6000803e3d6000fd5b505050506040513d6020811015611f8a57600080fd5b50519063ffffffff61343b16565b9050611fa3816136d2565b50601854601254604080517ff4993018000000000000000000000000000000000000000000000000000000008152600481019290925251600092610100900473ffffffffffffffffffffffffffffffffffffffff169163f499301891602480830192602092919082900301818787803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b505050506040513d602081101561204957600080fd5b50516040805182815290519192507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0919081900360200190a1505050565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561137757600080fd5b600b54600090819061211f9073ffffffffffffffffffffffffffffffffffffffff166119b2565b90508061213057600091505061176e565b600b54604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156121a757600080fd5b505afa1580156121bb573d6000803e3d6000fd5b505050506040513d60208110156121d157600080fd5b50519050806121e55760009250505061176e565b6000612293600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225257600080fd5b505afa158015612266573d6000803e3d6000fd5b505050506040513d602081101561227c57600080fd5b50516116ea8464e8d4a5100063ffffffff6133c816565b90506122ae64e8d4a510006116ea858463ffffffff6133c816565b95945050505050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104b5780601f106110205761010080835404028352916020019161104b565b612341610edc612f3f565b612396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600b5473ffffffffffffffffffffffffffffffffffffffff1615612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806145586027913960400191505060405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611069612459612f3f565b846112f4856040518060600160405280602581526020016148c76025913960016000612483612f3f565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61321116565b60006124d2306119b2565b905090565b60006110696124e4612f3f565b848461308a565b60006124d26124f8611303565b611815612087565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604081205463ffffffff1680612538576000612595565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86011684529091529020600101545b9392505050565b6125a7610edc612f3f565b6125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b601455565b61260c610edc612f3f565b612661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b60175442116126d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d602081101561276c57600080fd5b5051600b54604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101849052905192935073ffffffffffffffffffffffffffffffffffffffff9091169163a9059cbb916044808201926020929091908290030181600087803b1580156127eb57600080fd5b505af11580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b505050565b600061106d60198363ffffffff61385216565b612838610edc612f3f565b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b600d5473ffffffffffffffffffffffffffffffffffffffff16156128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148426025913960400191505060405180910390fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092556000908152601060209081526040808320805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0092831617909255600f909352922080549283161592909116919091179055600c546931c3602284a35ce0000091611d179116838361308a565b6000604051808061460b60439139604301905060405180910390206129d6610fa1565b805190602001206129e56138ed565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019450505050506040516020818303038152906040528051906020012090506000604051808061488d603a91396040805191829003603a01822060208084019190915273ffffffffffffffffffffffffffffffffffffffff8c1683830152606083018b905260808084018b90528251808503909101815260a0840183528051908201207f190100000000000000000000000000000000000000000000000000000000000060c085015260c2840187905260e2808501829052835180860390910181526101028501808552815191840191909120600091829052610122860180865281905260ff8c1661014287015261016286018b905261018286018a9052935191965092945091926001926101a280830193927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301929081900390910190855afa158015612b83573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061448e6031913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090208054600181019091558914612c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614815602d913960400191505060405180910390fd5b87421115612cf8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806147486031913960400191505060405180910390fd5b612d02818b61347d565b505050505b505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7a57600080fd5b505afa158015612d8e573d6000803e3d6000fd5b505050506040513d6020811015612da457600080fd5b5051905060006116cd6124eb565b60175481565b60185460ff1681565b60115481565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60135481565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60405180603a61488d8239603a019050604051809103902081565b60145481565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b612e96610edc612f3f565b612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806146b96040913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806147f16024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661301b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144bf6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60185460ff1680156130c7575073ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604090205460ff161515600114155b80156130fe575073ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604090205460ff161515600114155b15613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061446c6022913960400191505060405180910390fd5b6011541580159061318b575073ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604090205460ff16155b80156131bd575073ffffffffffffffffffffffffffffffffffffffff82166000908152600f602052604090205460ff16155b156132065760006131d96011548361343b90919063ffffffff16565b90506131e68430836138f1565b61320084846131fb858563ffffffff61393b16565b6138f1565b50612815565b6128158383836138f1565b600081848411156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561327f578181015183820152602001613267565b50505050905090810190601f1680156132ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561259557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660205260408120546133699216908361397d565b611d178282613b6a565b61338460198263ffffffff613cb416565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6000826133d75750600061106d565b828202828482816133e457fe5b0414612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061464e6021913960400191505060405180910390fd5b600061259583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d60565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260066020526040812054909116906134b1846119b2565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526006602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461161282848361397d565b61354f60198263ffffffff613ddf16565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b61359d8282613336565b611d17826135a9612f3f565b6112f4846040518060600160405280602481526020016146f96024913973ffffffffffffffffffffffffffffffffffffffff88166000908152600160205260408120906112c0612f3f565b600b5461361990309073ffffffffffffffffffffffffffffffffffffffff16836138f1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b600b54600a54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561375457600080fd5b505af1158015613768573d6000803e3d6000fd5b505050506040513d602081101561377e57600080fd5b5050600a54601854604080517faf2979eb000000000000000000000000000000000000000000000000000000008152306004820152602481018690526000604482018190526064820181905273ffffffffffffffffffffffffffffffffffffffff610100909404841660848301524260a48301529151929093169263af2979eb9260c48083019360209383900390910190829087803b15801561382057600080fd5b505af1158015613834573d6000803e3d6000fd5b505050506040513d602081101561384a57600080fd5b505192915050565b600073ffffffffffffffffffffffffffffffffffffffff82166138c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806146976022913960400191505060405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b4690565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660205260408082205485841683529120546139309291821691168361397d565b612815838383613ea5565b600061259583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613211565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156139b95750600081115b156128155773ffffffffffffffffffffffffffffffffffffffff831615613a965773ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081205463ffffffff169081613a13576000613a70565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613a84828563ffffffff61393b16565b9050613a9286848484614076565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156128155773ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205463ffffffff169081613aeb576000613b48565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87011684529091529020600101545b90506000613b5c828563ffffffff6132c216565b9050612d0785848484614076565b73ffffffffffffffffffffffffffffffffffffffff8216613bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147796021913960400191505060405180910390fd5b613c268160405180606001604052806022815260200161444a6022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902055600254613c5f908263ffffffff61393b16565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b613cbe8282613852565b613d13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806145ab6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60008183613dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b506000838581613dd557fe5b0495945050505050565b613de98282613852565b15613e5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff8316613f11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061479a6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613f7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806144276023913960400191505060405180910390fd5b613fcd8160405180606001604052806026815260200161450a6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919063ffffffff61321116565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220939093559084168152205461400f908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061409a436040518060600160405280603f81526020016145cc603f9139614266565b905060008463ffffffff1611801561410e575073ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b156141765773ffffffffffffffffffffffffffffffffffffffff8516600090815260076020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901168452909152902060010182905561420f565b60408051808201825263ffffffff8084168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000818152600784528681208b861682528452868120955186549086167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000918216178755925160019687015590815260089092529390208054928801909116919092161790555b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff8816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561327f578181015183820152602001613267565b509192915050565b604080518082019091526000808252602082015290565b73ffffffffffffffffffffffffffffffffffffffff821661437757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461438a908263ffffffff6132c216565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546143c3908263ffffffff6132c216565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365546f6b656e73206c6f636b656420756e74696c20656e64206f662070726573616c654552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f20616464726573734d4742546f6b656e3a3a736574556e69737761705632526f757465723a20616c72656164792073657445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d4742546f6b656e3a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c4d4742546f6b656e3a3a736574556e69737761705632506169723a20616c7265616479207365744d4742546f6b656e3a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c654552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654d4742546f6b656e3a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c4552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e63654d4742546f6b656e3a3a50726573616c65416464726573733a20616c726561647920736574596f7520617265206e6f742070617274206f6620746865204d6167696342616c616e6365722e44656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e74323536206578706972792945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7f447ea7fa44adcb96a924f5f5f0fc97c5212181445f67f1a6ed49a96a50f0a64736f6c63430005110032

Deployed Bytecode Sourcemap

43562:4294:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45094:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45094:284:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45094:284:0;;:::i;24588:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24588:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;21495:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21495:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;21495:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13250:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13250:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13250:152:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46541:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46541:86:0;;;:::i;24707:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24707:28:0;;;:::i;44108:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44108:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44108:227:0;;;;:::i;24130:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24130:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24742:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24742:32:0;;;:::i;12271:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12271:91:0;;;:::i;31900:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31900:122:0;;;:::i;13874:304::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13874:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13874:304:0;;;;;;;;;;;;;;;;;;:::i;29861:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29861:125:0;;;:::i;22347:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22347:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14587:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14587:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14587:210:0;;;;;;;;;:::i;19457:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19457:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19457:83:0;;:::i;24167:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24167:28:0;;;:::i;46639:496::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46639:496:0;;;:::i;23425:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23425:95:0;;;:::i;29184:443::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29184:443:0;;;:::i;32883:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32883:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32883:149:0;;;;:::i;44959:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44959:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44959:123:0;;:::i;33176:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33176:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33176:104:0;;;;:::i;24202:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24202:31:0;;;:::i;47711:142::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47711:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47711:142:0;;;;:::i;44347:306::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44347:306:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44347:306:0;;:::i;31778:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31778:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31778:49:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46273:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46273:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46273:123:0;;;;:::i;12425:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12425:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12425:110:0;;;;:::i;23301:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23301:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23301:116:0;;;;:::i;35812:1264::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35812:1264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35812:1264:0;;;;;;;;;:::i;19602:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19602:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19602:103:0;;;;;;;;;:::i;44661:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44661:286:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44661:286:0;;:::i;32314:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32314:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32314:39:0;;;;:::i;26543:785::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26543:785:0;;;:::i;29679:130::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29679:130:0;;;:::i;47147:556::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47147:556:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47147:556:0;;;;:::i;21697:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21697:87:0;;;:::i;43881:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43881:215:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43881:215:0;;;;:::i;15300:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15300:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15300:261:0;;;;;;;;;:::i;28559:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28559:108:0;;;:::i;12748:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12748:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12748:158:0;;;;;;;;;:::i;30038:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30038:125:0;;;:::i;35126:255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35126:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35126:255:0;;;;:::i;45390:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45390:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45390:121:0;;:::i;46016:245::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46016:245:0;;;:::i;23168:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23168:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23168:125:0;;;;:::i;45523:481::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45523:481:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45523:481:0;;;;:::i;33714:1211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33714:1211:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;33714:1211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28704:443::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28704:443:0;;;:::i;24781:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24781:25:0;;;:::i;24813:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24813:18:0;;;:::i;24546:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24546:35:0;;;:::i;12969:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12969:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12969:134:0;;;;;;;;;;;:::i;24629:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24629:31:0;;;:::i;24276:66::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24276:66:0;;;:::i;24240:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24240:29:0;;;:::i;32116:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32116:117:0;;;:::i;24667:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24667:33:0;;;:::i;31639:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31639:70:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31639:70:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;46408:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46408:120:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46408:120:0;;;;:::i;45094:284::-;23041:30;23058:12;:10;:12::i;:::-;23041:16;:30::i;:::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45192:19;;45188:128;;45254:2;45236:14;:20;;45228:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45334:19;:36;45094:284::o;24588:34::-;;;;:::o;21495:83::-;21565:5;21558:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21532:13;;21558:12;;21565:5;;21558:12;;21565:5;21558:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21495:83;:::o;13250:152::-;13316:4;13333:39;13342:12;:10;:12::i;:::-;13356:7;13365:6;13333:8;:39::i;:::-;-1:-1:-1;13390:4:0;13250:152;;;;;:::o;46541:86::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46605:6;:14;;;;;;46541:86::o;24707:28::-;;;;:::o;44108:227::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44207:15;;:29;:15;:29;44199:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44293:15;:34;;;;;;;;;;;;;;;44108:227::o;24130:30::-;;;;;;:::o;24742:32::-;;;;:::o;12271:91::-;12342:12;;12271:91;:::o;31900:122::-;31942:80;;;;;;;;;;;;;;;;;;31900:122;:::o;13874:304::-;13963:4;13980:36;13990:6;13998:9;14009:6;13980:9;:36::i;:::-;14027:121;14036:6;14044:12;:10;:12::i;:::-;14058:89;14096:6;14058:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;14078:12;:10;:12::i;:::-;14058:33;;;;;;;;;;;;;-1:-1:-1;14058:33:0;;;:89;;:37;:89;:::i;:::-;14027:8;:121::i;:::-;-1:-1:-1;14166:4:0;13874:304;;;;;:::o;29861:125::-;29942:13;;29936:42;;;;;;29909:7;29936:42;;;;;;;;29909:7;;29942:13;;;29936:30;;:42;;;;;;;;;;;;;;;29942:13;29936:42;;;5:2:-1;;;;30:1;27;20:12;5:2;29936:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29936:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29936:42:0;;-1:-1:-1;29861:125:0;:::o;22347:83::-;22413:9;;;;22347:83;:::o;14587:210::-;14667:4;14684:83;14693:12;:10;:12::i;:::-;14707:7;14716:50;14755:10;14716:11;:25;14728:12;:10;:12::i;:::-;14716:25;;;;;;;;;;;;;;;;;;-1:-1:-1;14716:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;19457:83::-;19505:27;19511:12;:10;:12::i;:::-;19525:6;19505:5;:27::i;:::-;19457:83;:::o;24167:28::-;;;;;;:::o;46639:496::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46734:46;;;;;;46749:4;46734:46;;;;;;;;46705:26;;46749:4;46734:31;;:46;;;;;;;;;;;;;;46749:4;46734:46;;;5:2:-1;;;;30:1;27;20:12;5:2;46734:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46734:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46734:46:0;46871:15;;46734:46;;-1:-1:-1;46808:21:0;;46840:68;;46857:4;;46871:15;;46734:46;46840:8;:68::i;:::-;46938:15;;46919:208;;;;;;47010:4;46919:208;;;;;;;;;;;;46938:15;46919:208;;;;;;;;;;;;;;47123:3;46919:208;;;;;;46938:15;;;;;46919:51;;46977:9;;46919:208;;;;;;;;;;;;;;46977:9;46938:15;46919:208;;;5:2:-1;;;;30:1;27;20:12;5:2;46919:208:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46919:208:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;46639:496:0:o;23425:95::-;23477:35;23499:12;:10;:12::i;:::-;23477:21;:35::i;:::-;23425:95::o;29184:443::-;29231:7;29251:21;29281:13;;;;;;;;;;;29275:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29275:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29275:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29275:34:0;;-1:-1:-1;29320:17:0;29340;:15;:17::i;:::-;29320:37;-1:-1:-1;29368:30:0;29401:38;29425:13;29401:19;29320:37;29415:4;29401:19;:13;:19;:::i;:::-;:23;:38;:23;:38;:::i;:::-;29487:13;;29368:71;;-1:-1:-1;29452:22:0;;29477:24;;29487:13;;29477:9;:24::i;:::-;29452:49;-1:-1:-1;29512:21:0;29536:52;29583:4;29536:42;29452:49;29555:22;29536:42;:18;:42;:::i;:52::-;29512:76;-1:-1:-1;;;;;;29184:443:0;:::o;32883:149::-;33003:21;;;;32971:7;33003:21;;;:10;:21;;;;;;;32883:149;;;;:::o;44959:123::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45045:17;:29;44959:123::o;33176:104::-;33240:32;33250:10;33262:9;33240;:32::i;24202:31::-;;;;;;:::o;47711:142::-;47770:7;47797:48;47818:26;47838:5;47818:19;:26::i;:::-;47797:16;47807:5;47797:9;:16::i;:::-;:20;:48;:20;:48;:::i;44347:306::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44452:26;;44448:143;;44528:2;44503:21;:27;;44495:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44601:20;:44;44347:306::o;31778:49::-;;;;;;;;;;;;;;;:::o;46273:123::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46370:18;;;;;;:11;:18;;;;;;;46348:40;;;46370:18;;;;46369:19;46348:40;;;46273:123::o;12425:110::-;12509:18;;12482:7;12509:18;;;;;;;;;;;;12425:110::o;23301:116::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23382:27;23401:7;23382:18;:27::i;35812:1264::-;35920:7;35967:12;35953:11;:26;35945:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36069:23;;;36047:19;36069:23;;;:14;:23;;;;;;;;36107:17;36103:58;;36148:1;36141:8;;;;;36103:58;36221:20;;;;;;;:11;:20;;;;;;;;:38;36242:16;;;36221:38;;;;;;;;;:48;;:63;-1:-1:-1;36217:147:0;;36308:20;;;;;;;:11;:20;;;;;;;;36329:16;;;;;36308:38;;;;;;;;36344:1;36308:44;;;-1:-1:-1;36301:51:0;;36217:147;36425:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;36421:88:0;;;36496:1;36489:8;;;;;36421:88;36521:12;36563:16;;;36590:428;36605:5;36597:13;;:5;:13;;;36590:428;;;36669:1;36652:13;;;36651:19;;;36643:27;;36712:20;;:::i;:::-;-1:-1:-1;36735:20:0;;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;36712:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36782:27;;36778:229;;;36837:8;;;;-1:-1:-1;36830:15:0;;-1:-1:-1;;;;36830:15:0;36778:229;36871:12;;:26;;;-1:-1:-1;36867:140:0;;;36926:6;36918:14;;36867:140;;;36990:1;36981:6;:10;36973:18;;36867:140;36590:428;;;;;-1:-1:-1;37035:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;35812:1264:0;;;;:::o;19602:103::-;19671:26;19681:7;19690:6;19671:9;:26::i;:::-;19602:103;;:::o;44661:286::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44758:22;;44754:131;;44826:2;44805:17;:23;;44797:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44903:16;:36;44661:286::o;32314:39::-;;;;;;;;;;;;;:::o;26543:785::-;26624:18;;26599:21;26609:10;26599:9;:21::i;:::-;:43;;26591:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26738:17;;26722:13;;:33;26704:15;:51;26696:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26809:15;26793:13;:31;26901:23;26927:24;26945:4;26927:9;:24::i;:::-;26901:50;;26962:42;26988:15;26962:25;:42::i;:::-;27100:16;;27056:13;;27050:45;;;;;;27089:4;27050:45;;;;;;27025:22;;27050:67;;27100:16;;27056:13;;;;;27050:30;;:45;;;;;;;;;;;;;;;27056:13;27050:45;;;5:2:-1;;;;30:1;27;20:12;5:2;27050:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27050:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27050:45:0;;:67;:49;:67;:::i;:::-;27025:92;;27191:28;27204:14;27191:12;:28::i;:::-;-1:-1:-1;27245:8:0;;27264:19;;27245:39;;;;;;;;;;;;;;-1:-1:-1;;27245:8:0;;;;;;:18;;:39;;;;;;;;;;;;;;-1:-1:-1;27245:8:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;27245:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27245:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27245:39:0;27302:18;;;;;;;;27245:39;;-1:-1:-1;27302:18:0;;;;;;27245:39;27302:18;;;26543:785;;;:::o;29679:130::-;29762:13;;29756:45;;;;;;29795:4;29756:45;;;;;;29729:7;;29762:13;;;29756:30;;:45;;;;;;;;;;;;;;29762:13;29756:45;;;5:2:-1;;;;30:1;27;20:12;47147:556:0;47282:13;;47212:7;;;;47264:33;;47282:13;;47264:9;:33::i;:::-;47232:65;-1:-1:-1;47312:26:0;47308:67;;47362:1;47355:8;;;;;47308:67;47415:13;;47409:37;;;;;;47415:13;47409:37;;;;;;;;;47385:21;;47415:13;;;;;47409:30;;:37;;;;;;;;;;;;;;;47415:13;47409:37;;;5:2:-1;;;;30:1;27;20:12;5:2;47409:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47409:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47409:37:0;;-1:-1:-1;47461:18:0;47457:59;;47503:1;47496:8;;;;;;47457:59;47526:28;47557:63;47591:13;;;;;;;;;;;47585:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47585:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47585:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47585:34:0;47557:23;:13;47575:4;47557:23;:17;:23;:::i;:63::-;47526:94;-1:-1:-1;47638:57:0;47690:4;47638:47;:21;47526:94;47638:47;:25;:47;:::i;:57::-;47631:64;47147:556;-1:-1:-1;;;;;47147:556:0:o;21697:87::-;21769:7;21762:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21736:13;;21762:14;;21769:7;;21762:14;;21769:7;21762:14;;;;;;;;;;;;;;;;;;;;;;;;43881:215;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43976:13;;:27;:13;:27;43968:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44058:13;:30;;;;;;;;;;;;;;;43881:215::o;15300:261::-;15385:4;15402:129;15411:12;:10;:12::i;:::-;15425:7;15434:96;15473:15;15434:96;;;;;;;;;;;;;;;;;:11;:25;15446:12;:10;:12::i;:::-;15434:25;;;;;;;;;;;;;;;;;;-1:-1:-1;15434:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;28559:108::-;28608:7;28635:24;28653:4;28635:9;:24::i;:::-;28628:31;;28559:108;:::o;12748:158::-;12817:4;12834:42;12844:12;:10;:12::i;:::-;12858:9;12869:6;12834:9;:42::i;30038:125::-;30086:7;30113:42;30137:17;:15;:17::i;:::-;30113:19;:17;:19::i;35126:255::-;35265:23;;;35218:7;35265:23;;;:14;:23;;;;;;;;35306:16;:67;;35372:1;35306:67;;;35325:20;;;;;;;:11;:20;;;;;;;;:38;35346:16;;;35325:38;;;;;;;;35361:1;35325:44;;35306:67;35299:74;35126:255;-1:-1:-1;;;35126:255:0:o;45390:121::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45475:18;:28;45390:121::o;46016:245::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46087:10;;46081:3;:16;46073:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46153:13;;46146:46;;;;;;46186:4;46146:46;;;;;;46129:14;;46153:13;;;46146:31;;:46;;;;;;;;;;;;;;46153:13;46146:46;;;5:2:-1;;;;30:1;27;20:12;5:2;46146:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46146:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46146:46:0;46210:13;;46203:50;;;;;;46234:10;46203:50;;;;;;;;;;;;46146:46;;-1:-1:-1;46210:13:0;;;;;46203:30;;:50;;;;;46146:46;;46203:50;;;;;;;;46210:13;;46203:50;;;5:2:-1;;;;30:1;27;20:12;5:2;46203:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46203:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;46016:245:0:o;23168:125::-;23232:4;23256:29;:16;23277:7;23256:29;:20;:29;:::i;45523:481::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45620:14;;:28;:14;:28;45612:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45701:14;:32;;;;;;;;;;;;;;-1:-1:-1;45773:25:0;;;:8;:25;;;;;;;;;;;;;;45772:26;45744:54;;;;;;;;45841:11;:28;;;;;;;;;;45840:29;45809:60;;;;;;;;;;45945:8;;45904:12;;45927:69;;45945:8;45701:32;45904:12;45927:9;:69::i;33714:1211::-;33907:23;31942:80;;;;;;;;;;;;;;;;;;;34036:6;:4;:6::i;:::-;34020:24;;;;;;34063:12;:10;:12::i;:::-;34102:4;33957:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33957:165:0;;;33933:200;;;;;;33907:226;;34146:18;32162:71;;;;;;;;;;;;;;;;;;;34191:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;34191:140:0;;;;;34167:175;;;;;;34396:123;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;34396:123:0;;;;;;34372:158;;;;;;;;;-1:-1:-1;34563:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34167:175;;-1:-1:-1;34372:158:0;;-1:-1:-1;;;34563:26:0;;;;;;;34191:140;-1:-1:-1;34563:26:0;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;34563:26:0;;;;;;-1:-1:-1;;34608:23:0;;;34600:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34713:17;;;;;;;:6;:17;;;;;:19;;;;;;;;34704:28;;34696:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34808:6;34801:3;:13;;34793:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34886:31;34896:9;34907;34886;:31::i;:::-;34879:38;;;;33714:1211;;;;;;;:::o;28704:443::-;28751:7;28771:21;28801:13;;;;;;;;;;;28795:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28795:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28795:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28795:34:0;;-1:-1:-1;28840:17:0;28860;:15;:17::i;24781:25::-;;;;:::o;24813:18::-;;;;;;:::o;24546:35::-;;;;:::o;12969:134::-;13068:18;;;;13041:7;13068:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12969:134::o;24629:31::-;;;;:::o;24276:66::-;;;;;;:::o;24240:29::-;;;;;;:::o;32116:117::-;32162:71;;;;;;;;;;;;;;;;;;32116:117;:::o;24667:33::-;;;;:::o;31639:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46408:120::-;23041:30;23058:12;:10;:12::i;23041:30::-;23033:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46505:15;;;;;;:8;:15;;;;;;;46486:34;;;46505:15;;;;46504:16;46486:34;;;46408:120::o;1883:98::-;1963:10;1883:98;:::o;18231:338::-;18325:19;;;18317:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18404:21;;;18396:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18477:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18529:32;;;;;;;;;;;;;;;;;18231:338;;;:::o;25720:774::-;25949:6;;;;:32;;;;-1:-1:-1;25959:14:0;;;;;;;:8;:14;;;;;;;;:22;;:14;:22;;25949:32;:56;;;;-1:-1:-1;25985:12:0;;;;;;;:8;:12;;;;;;;;:20;;:12;:20;;25949:56;25946:118;;;26020:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25946:118;26093:20;;:25;;;;:55;;-1:-1:-1;26122:17:0;;;;;;;:11;:17;;;;;;;;:26;26093:55;:83;;;;-1:-1:-1;26152:15:0;;;;;;;:11;:15;;;;;;;;:24;26093:83;26089:398;;;26193:27;26223:32;26234:20;;26223:6;:10;;:32;;;;:::i;:::-;26193:62;;26270:57;26286:4;26300;26307:19;26270:15;:57::i;:::-;26342:58;26358:4;26364:2;26368:31;:6;26379:19;26368:31;:10;:31;:::i;:::-;26342:15;:58::i;:::-;26089:398;;;;26442:33;26458:4;26464:2;26468:6;26442:15;:33::i;6943:192::-;7029:7;7065:12;7057:6;;;;7049:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7049:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7101:5:0;;;6943:192::o;6014:181::-;6072:7;6104:5;;;6128:6;;;;6120:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30712:170;30795:19;;;;;;;;:10;:19;;;;;;30780:55;;30795:19;;30828:6;30780:14;:55::i;:::-;30846:28;30858:7;30867:6;30846:11;:28::i;23682:154::-;23750:32;:16;23774:7;23750:32;:23;:32;:::i;:::-;23798:30;;;;;;;;;;;23682:154;:::o;7386:471::-;7444:7;7689:6;7685:47;;-1:-1:-1;7719:1:0;7712:8;;7685:47;7756:5;;;7760:1;7756;:5;:1;7780:5;;;;;:10;7772:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8325:132;8383:7;8410:39;8414:1;8417;8410:39;;;;;;;;;;;;;;;;;:3;:39::i;37084:449::-;37201:21;;;;37175:23;37201:21;;;:10;:21;;;;;;;;;;37260:20;37212:9;37260;:20::i;:::-;37347:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;37398:54;;37233:47;;-1:-1:-1;37347:33:0;37398:54;;;;;;37347:21;37398:54;37465:60;37480:15;37497:9;37508:16;37465:14;:60::i;23528:146::-;23593:29;:16;23614:7;23593:29;:20;:29;:::i;:::-;23638:28;;;;;;;;;;;23528:146;:::o;18755:232::-;18827:22;18833:7;18842:6;18827:5;:22::i;:::-;18860:119;18869:7;18878:12;:10;:12::i;:::-;18892:86;18931:6;18892:86;;;;;;;;;;;;;;;;;:20;;;;;;;:11;:20;;;;;;18913:12;:10;:12::i;27336:282::-;27455:13;;27424:63;;27448:4;;27455:13;;27470:16;27424:15;:63::i;:::-;27517:13;;;;;;;;;;;27502:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27502:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27558:42:0;;;;;;;;;;-1:-1:-1;27558:42:0;;;;;;;-1:-1:-1;27558:42:0;27336:282;:::o;27626:452::-;27715:13;;27738:15;;27709:55;;;;;;27715:13;27738:15;;;27709:55;;;;;;;;;;;;27682:14;;27715:13;;;;;27709:28;;:55;;;;;;;;;;;;;;;27682:14;27715:13;27709:55;;;5:2:-1;;;;30:1;27;20:12;5:2;27709:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27709:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;27808:15:0;;28012:8;;27789:281;;;;;;27913:4;27789:281;;;;;;;;;;-1:-1:-1;27789:281:0;;;;;;;;;;;;27808:15;;28012:8;;;;;27789:281;;;;28040:15;27789:281;;;;;;27808:15;;;;;27789:97;;:281;;;;;27709:55;;27789:281;;;;;;;;;27808:15;27789:281;;;5:2:-1;;;;30:1;27;20:12;5:2;27789:281:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27789:281:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27789:281:0;;27626:452;-1:-1:-1;;27626:452:0:o;20575:203::-;20647:4;20672:21;;;20664:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20750:20:0;;:11;:20;;;;;;;;;;;;;;;20575:203::o;39388:153::-;39498:9;39388:153;:::o;30337:189::-;30433:16;;;;;;;;:10;:16;;;;;;;30451:14;;;;;;;;30418:56;;30433:16;;;;30451:14;30467:6;30418:14;:56::i;:::-;30485:33;30501:4;30507:2;30511:6;30485:15;:33::i;6470:136::-;6528:7;6555:43;6559:1;6562;6555:43;;;;;;;;;;;;;;;;;:3;:43::i;37541:947::-;37647:6;37637:16;;:6;:16;;;;:30;;;;;37666:1;37657:6;:10;37637:30;37633:848;;;37688:20;;;;37684:385;;37796:22;;;37777:16;37796:22;;;:14;:22;;;;;;;;;37857:13;:60;;37916:1;37857:60;;;37873:19;;;;;;;:11;:19;;;;;;;;:34;37893:13;;;37873:34;;;;;;;;37905:1;37873:40;;37857:60;37837:80;-1:-1:-1;37936:17:0;37956:21;37837:80;37970:6;37956:21;:13;:21;:::i;:::-;37936:41;;37996:57;38013:6;38021:9;38032;38043;37996:16;:57::i;:::-;37684:385;;;;38089:20;;;;38085:385;;38197:22;;;38178:16;38197:22;;;:14;:22;;;;;;;;;38258:13;:60;;38317:1;38258:60;;;38274:19;;;;;;;:11;:19;;;;;;;;:34;38294:13;;;38274:34;;;;;;;;38306:1;38274:40;;38258:60;38238:80;-1:-1:-1;38337:17:0;38357:21;38238:80;38371:6;38357:21;:13;:21;:::i;:::-;38337:41;;38397:57;38414:6;38422:9;38433;38444;38397:16;:57::i;17443:348::-;17519:21;;;17511:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17612:68;17635:6;17612:68;;;;;;;;;;;;;;;;;:18;;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;17591:18;;;:9;:18;;;;;;;;;;:89;17706:12;;:24;;17723:6;17706:24;:16;:24;:::i;:::-;17691:12;:39;17746:37;;;;;;;;17772:1;;17746:37;;;;;;;;;;;;;17443:348;;:::o;20297:183::-;20377:18;20381:4;20387:7;20377:3;:18::i;:::-;20369:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20444:20;;20467:5;20444:20;;;;;;;;;;;:28;;;;;;20297:183::o;8987:345::-;9073:7;9175:12;9168:5;9160:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9160:28:0;;9199:9;9215:1;9211;:5;;;;;;;8987:345;-1:-1:-1;;;;;8987:345:0:o;20039:178::-;20117:18;20121:4;20127:7;20117:3;:18::i;:::-;20116:19;20108:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20182:20;;:11;:20;;;;;;;;;;;:27;;;;20205:4;20182:27;;;20039:178::o;16051:471::-;16149:20;;;16141:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16230:23;;;16222:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16326;16348:6;16326:71;;;;;;;;;;;;;;;;;:17;;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;16306:17;;;;:9;:17;;;;;;;;;;;:91;;;;16431:20;;;;;;;:32;;16456:6;16431:32;:24;:32;:::i;:::-;16408:20;;;;:9;:20;;;;;;;;;;;;:55;;;;16479:35;;;;;;;16408:20;;16479:35;;;;;;;;;;;;;16051:471;;;:::o;38496:715::-;38675:18;38696:87;38703:12;38696:87;;;;;;;;;;;;;;;;;:6;:87::i;:::-;38675:108;;38815:1;38800:12;:16;;;:85;;;;-1:-1:-1;38820:22:0;;;;;;;:11;:22;;;;;;;;:65;38843:16;;;38820:40;;;;;;;;;:50;:65;;;:50;;:65;38800:85;38796:339;;;38902:22;;;;;;;:11;:22;;;;;;;;:40;38925:16;;;38902:40;;;;;;;;38940:1;38902:46;:57;;;38796:339;;;39031:33;;;;;;;;;;;;;;;;;;;;;38992:22;;;-1:-1:-1;38992:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;39079:25;;;:14;:25;;;;;;:44;;39107:16;;;39079:44;;;;;;;;;;38796:339;39152:51;;;;;;;;;;;;;;;;;;;;;;;;;;38496:715;;;;;:::o;39219:161::-;39294:6;39332:12;39325:5;39321:9;;39313:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;39313:32:0;-1:-1:-1;39370:1:0;;39219:161;-1:-1:-1;;39219:161:0:o;43562:4294::-;;;;;;;;;;-1:-1:-1;43562:4294:0;;;;;;;;:::o;16803:308::-;16879:21;;;16871:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16964:12;;:24;;16981:6;16964:24;:16;:24;:::i;:::-;16949:12;:39;17020:18;;;:9;:18;;;;;;;;;;;:30;;17043:6;17020:30;:22;:30;:::i;:::-;16999:18;;;:9;:18;;;;;;;;;;;:51;;;;17066:37;;;;;;;16999:18;;:9;;17066:37;;;;;;;;;;16803:308;;:::o

Swarm Source

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