ETH Price: $3,461.46 (-1.57%)
Gas: 3 Gwei

Token

preserve.finance (PFI)
 

Overview

Max Total Supply

10,000,000 PFI

Holders

89

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
43.419525512 PFI

Value
$0.00
0x4297e08ee25a9eed190d4840c490bbf2332f22b0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Preserve

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-23
*/

// File: openzeppelin-solidity\contracts\GSN\Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.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.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// File: openzeppelin-solidity\contracts\token\ERC20\IERC20.sol

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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-solidity\contracts\math\SafeMath.sol

pragma solidity ^0.6.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.
     */
    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.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: openzeppelin-solidity\contracts\utils\Address.sol

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: openzeppelin-solidity\contracts\access\Ownable.sol

pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


pragma solidity ^0.6.12;

contract Preserve is Context, IERC20, Ownable {
    
    using SafeMath for uint256;
    using Address for address;

    mapping (address=>uint256) private _purchases;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 10 * 10**6 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = 'preserve.finance';
    string private _symbol = 'PFI';
    uint8 private _decimals = 9;
    
    
    //uint256[] public _sellFeePeriods = [24H, 1H, 30m, 15m, 0];
    uint256[] public _sellFeePeriods = [86400, 3600, 1800, 900, 0];
    uint256[] public _sellFeePcts = [200, 300, 500, 1500, 2900];
    
    uint256 public _buyFeePct = 50;
    uint256 public _setFeesTimestamp;
    
    address public _ecosystem;

    constructor (address ecosystem) public {
        
        _ecosystem = ecosystem;
        _setFeesTimestamp = now;
        
        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
        
        excludeAccount(_msgSender());
        excludeAccount(_ecosystem);
    }
    
    function setFees(uint256[] memory sellFeePeriods, uint256[] memory sellFeePcts, uint256 buyFeePct) external onlyOwner() {
        require(sellFeePeriods.length > 0 && sellFeePeriods.length == sellFeePcts.length, "Invalid sell fees");
        require(now >= (_setFeesTimestamp + 12 hours), "Sell fee changes timelocked for 12 hours");

        _sellFeePeriods = sellFeePeriods;
        _sellFeePcts = sellFeePcts;
        _buyFeePct = buyFeePct;
        
        _setFeesTimestamp = now;
    }
    
        // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) public pure returns (address) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        address _pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
            ))));
            
        return _pair;
    }
    

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromPreserve(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function preserve(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount, 100);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function preserveFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount, 100);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount, 100);
            return rTransferAmount;
        }
    }

    function tokenFromPreserve(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total preserves");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromPreserve(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) public onlyOwner() {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount >= 100, "Transfer amount must be greater than or equal to 100 PFI");
        
        uint256 _seconds = now - _purchases[sender];
        
        uint256 tFeePercent;
        
        for (uint256 i = 0; i < _sellFeePeriods.length; i++) {
            if(_seconds >= _sellFeePeriods[i]) {
                tFeePercent = _sellFeePcts[i];
                break;
            }
        }
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            
            _transferFromExcluded(sender, recipient, amount, _buyFeePct);
            _purchases[recipient] = now;
            
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount, tFeePercent);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount, tFeePercent);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, 0);
        } else {
            _transferStandard(sender, recipient, amount, tFeePercent);
        }
        
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);       
        _preserveFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _preserveFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _preserveFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _preserveFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _preserveFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount, uint256 tFeePercent) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount, tFeePercent);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount, uint256 tFeePercent) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(tFeePercent).div(10000);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"ecosystem","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"_buyFeePct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ecosystem","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_sellFeePcts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_sellFeePeriods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_setFeesTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"preserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"preserveFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"sellFeePeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"sellFeePcts","type":"uint256[]"},{"internalType":"uint256","name":"buyFeePct","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromPreserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc10000600019816200001757fe5b06600019036007556040518060400160405280601081526020017f70726573657276652e66696e616e636500000000000000000000000000000000815250600990805190602001906200006c92919062000cf3565b506040518060400160405280600381526020017f5046490000000000000000000000000000000000000000000000000000000000815250600a9080519060200190620000ba92919062000cf3565b506009600b60006101000a81548160ff021916908360ff1602179055506040518060a001604052806201518062ffffff168152602001610e1062ffffff16815260200161070862ffffff16815260200161038462ffffff168152602001600062ffffff16815250600c9060056200013392919062000d7a565b506040518060a0016040528060c861ffff16815260200161012c61ffff1681526020016101f461ffff1681526020016105dc61ffff168152602001610b5461ffff16815250600d9060056200018a92919062000dd3565b506032600e553480156200019d57600080fd5b5060405162004cd538038062004cd583398181016040526020811015620001c357600080fd5b81019080805190602001909291905050506000620001e6620003f760201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600f8190555060075460026000620002e3620003f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000331620003f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef662386f26fc100006040518082815260200191505060405180910390a3620003bd620003b1620003f760201b60201c565b620003ff60201b60201c565b620003f0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620003ff60201b60201c565b5062000e4a565b600033905090565b6200040f620003f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620004d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562000591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156200066e576200062a600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200072c60201b60201c565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006007548211156200078b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018062004cad6028913960400191505060405180910390fd5b60006200079d620007c160201b60201c565b9050620007b98184620007fb60201b620023d91790919060201c565b915050919050565b6000806000620007d66200084d60201b60201c565b91509150620007f48183620007fb60201b620023d91790919060201c565b9250505090565b60006200084583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000b1260201b60201c565b905092915050565b600080600060075490506000662386f26fc10000905060005b60068054905081101562000ac2578260026000600684815481106200088757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806200097057508160036000600684815481106200090857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156200098e57600754662386f26fc100009450945050505062000b0e565b62000a1f6002600060068481548110620009a457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548462000bdd60201b620024231790919060201c565b925062000ab2600360006006848154811062000a3757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548362000bdd60201b620024231790919060201c565b9150808060010191505062000866565b5062000ae6662386f26fc10000600754620007fb60201b620023d91790919060201c565b82101562000b0557600754662386f26fc1000093509350505062000b0e565b81819350935050505b9091565b6000808311829062000bc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000b8657808201518184015260208101905062000b69565b50505050905090810190601f16801562000bb45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162000bcf57fe5b049050809150509392505050565b600062000c2783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062000c2f60201b60201c565b905092915050565b600083831115829062000ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000ca457808201518184015260208101905062000c87565b50505050905090810190601f16801562000cd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000d3657805160ff191683800117855562000d67565b8280016001018555821562000d67579182015b8281111562000d6657825182559160200191906001019062000d49565b5b50905062000d76919062000e2b565b5090565b82805482825590600052602060002090810192821562000dc0579160200282015b8281111562000dbf578251829062ffffff1690559160200191906001019062000d9b565b5b50905062000dcf919062000e2b565b5090565b82805482825590600052602060002090810192821562000e18579160200282015b8281111562000e17578251829061ffff1690559160200191906001019062000df4565b5b50905062000e27919062000e2b565b5090565b5b8082111562000e4657600081600090555060010162000e2c565b5090565b613e538062000e5a6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063544caa5611610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610a9c578063f2cc0c1814610b14578063f2fde38b14610b58578063f84354f114610b9c576101cf565b8063a9059cbb1461098c578063a9c8af10146109f0578063ad863faa14610a0e578063cba0e99614610a42576101cf565b8063715018a6116100de578063715018a6146108675780638da5cb5b1461087157806395d89b41146108a5578063a457c2d714610928576101cf565b8063544caa56146106b65780636d91c0e21461076157806370a082311461080f576101cf565b806325cc524011610171578063313ce5671161014b578063313ce567146105d1578063393a6230146105f25780633950935114610634578063455edcce14610698576101cf565b806325cc52401461051f57806327e048b5146105615780632ed78a731461058f576101cf565b806313114a9d116101ad57806313114a9d1461041157806318160ddd1461042f57806323b872dd1461044d57806324901218146104d1576101cf565b8063060e52b7146101d457806306fdde031461032a578063095ea7b3146103ad575b600080fd5b610328600480360360608110156101ea57600080fd5b810190808035906020019064010000000081111561020757600080fd5b82018360208201111561021957600080fd5b8035906020019184602083028401116401000000008311171561023b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561029b57600080fd5b8201836020820111156102ad57600080fd5b803590602001918460208302840111640100000000831117156102cf57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610be0565b005b610332610dcc565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610372578082015181840152602081019050610357565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360408110156103c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e6e565b60405180821515815260200191505060405180910390f35b610419610e8c565b6040518082815260200191505060405180910390f35b610437610e96565b6040518082815260200191505060405180910390f35b6104b96004803603606081101561046357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ea5565b60405180821515815260200191505060405180910390f35b610509600480360360408110156104e757600080fd5b8101908080359060200190929190803515159060200190929190505050610f7e565b6040518082815260200191505060405180910390f35b61054b6004803603602081101561053557600080fd5b810190808035906020019092919050505061103c565b6040518082815260200191505060405180910390f35b61058d6004803603602081101561057757600080fd5b81019080803590602001909291905050506110c0565b005b6105bb600480360360208110156105a557600080fd5b8101908080359060200190929190505050611252565b6040518082815260200191505060405180910390f35b6105d9611273565b604051808260ff16815260200191505060405180910390f35b61061e6004803603602081101561060857600080fd5b810190808035906020019092919050505061128a565b6040518082815260200191505060405180910390f35b6106806004803603604081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112ab565b60405180821515815260200191505060405180910390f35b6106a061135e565b6040518082815260200191505060405180910390f35b610718600480360360408110156106cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611364565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6107e36004803603606081101561077757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114db565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108516004803603602081101561082557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115fa565b6040518082815260200191505060405180910390f35b61086f6116e5565b005b61087961186b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108ad611894565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ed5780820151818401526020810190506108d2565b50505050905090810190601f16801561091a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109746004803603604081101561093e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611936565b60405180821515815260200191505060405180910390f35b6109d8600480360360408110156109a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a03565b60405180821515815260200191505060405180910390f35b6109f8611a21565b6040518082815260200191505060405180910390f35b610a16611a27565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a8460048036036020811015610a5857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a4d565b60405180821515815260200191505060405180910390f35b610afe60048036036040811015610ab257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa3565b6040518082815260200191505060405180910390f35b610b5660048036036020811015610b2a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2a565b005b610b9a60048036036020811015610b6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e44565b005b610bde60048036036020811015610bb257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061204f565b005b610be861246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008351118015610cba575081518351145b610d2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c69642073656c6c206665657300000000000000000000000000000081525060200191505060405180910390fd5b61a8c0600f5401421015610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613d5c6028913960400191505060405180910390fd5b82600c9080519060200190610da1929190613bb8565b5081600d9080519060200190610db8929190613bb8565b5080600e8190555042600f81905550505050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e645780601f10610e3957610100808354040283529160200191610e64565b820191906000526020600020905b815481529060010190602001808311610e4757829003601f168201915b5050505050905090565b6000610e82610e7b61246d565b8484612475565b6001905092915050565b6000600854905090565b6000662386f26fc10000905090565b6000610eb284848461266c565b610f7384610ebe61246d565b610f6e85604051806060016040528060288152602001613cfc60289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f2461246d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bba9092919063ffffffff16565b612475565b600190509392505050565b6000662386f26fc10000831115610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b8161101e57600061100f846064612c7a565b50505050905080915050611036565b600061102b846064612c7a565b505050915050809150505b92915050565b6000600754821115611099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613cb36028913960400191505060405180910390fd5b60006110a3612cd4565b90506110b881846123d990919063ffffffff16565b915050919050565b60006110ca61246d565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613dcd602c913960400191505060405180910390fd5b600061117c836064612c7a565b5050505090506111d481600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061122c8160075461242390919063ffffffff16565b60078190555061124783600854612cff90919063ffffffff16565b600881905550505050565b600d818154811061125f57fe5b906000526020600020016000915090505481565b6000600b60009054906101000a900460ff16905090565b600c818154811061129757fe5b906000526020600020016000915090505481565b60006113546112b861246d565b8461134f85600460006112c961246d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b612475565b6001905092915050565b600e5481565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156113ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613c8e6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611426578284611429565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a205a45524f5f41444452455353000081525060200191505060405180910390fd5b9250929050565b60008060006114ea8585611364565b915091506000868383604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012060405160200180807fff000000000000000000000000000000000000000000000000000000000000008152506001018373ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001807f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f815250602001925050506040516020818303038152906040528051906020012060001c90508093505050509392505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561169557600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506116e0565b6116dd600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103c565b90505b919050565b6116ed61246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b5050505050905090565b60006119f961194361246d565b846119f485604051806060016040528060258152602001613df9602591396004600061196d61246d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bba9092919063ffffffff16565b612475565b6001905092915050565b6000611a17611a1061246d565b848461266c565b6001905092915050565b600f5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b3261246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d8657611d42600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103c565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e4c61246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613c466026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61205761246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4163636f756e74206973206e6f74206578636c7564656400000000000000000081525060200191505060405180910390fd5b60005b6006805490508110156123d5578173ffffffffffffffffffffffffffffffffffffffff166006828154811061220a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123c85760066001600680549050038154811061226657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006828154811061229e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600680548061238e57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556123d5565b80806001019150506121d9565b5050565b600061241b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d87565b905092915050565b600061246583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612bba565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613da96024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613c6c6022913960400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613d846025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612778576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613c236023913960400191505060405180910390fd5b60648110156127d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613d246038913960400191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442039050600080600090505b600c8054905081101561287757600c818154811061283a57fe5b9060005260206000200154831061286a57600d818154811061285857fe5b90600052602060002001549150612877565b8080600101915050612820565b50600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561291b5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156129775761292e858585600e54612e4d565b42600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bb3565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a1a5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612a3057612a2b858585846130a2565b612bb2565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ad45750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612aea57612ae5858585846132f7565b612bb1565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612b8c5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ba357612b9e85858560006134b7565b612bb0565b612baf858585846132f7565b5b5b5b5b5050505050565b6000838311158290612c67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c2c578082015181840152602081019050612c11565b50505050905090810190601f168015612c595780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000806000806000612c8f89896137a1565b915091506000612c9d612cd4565b90506000806000612caf8d86866137f5565b92509250925082828288889a509a509a509a509a505050505050509295509295909350565b6000806000612ce1613853565b91509150612cf881836123d990919063ffffffff16565b9250505090565b600080828401905083811015612d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008083118290612e33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612df8578082015181840152602081019050612ddd565b50505050905090810190601f168015612e255780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e3f57fe5b049050809150509392505050565b6000806000806000612e5f8787612c7a565b94509450945094509450612ebb87600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f5085600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fe584600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130328382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060008060006130b48787612c7a565b9450945094509450945061311085600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131a582600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061323a84600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132878382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060008060006133098787612c7a565b9450945094509450945061336585600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133fa84600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134478382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060008060006134c98787612c7a565b9450945094509450945061352587600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135ba85600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061364f82600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136e484600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137318382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060006137cd6127106137bf8688613b3290919063ffffffff16565b6123d990919063ffffffff16565b905060006137e4828761242390919063ffffffff16565b905080829350935050509250929050565b60008060008061380e8588613b3290919063ffffffff16565b905060006138258688613b3290919063ffffffff16565b9050600061383c828461242390919063ffffffff16565b905082818395509550955050505093509350939050565b600080600060075490506000662386f26fc10000905060005b600680549050811015613ab15782600260006006848154811061388b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613972575081600360006006848154811061390a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561398e57600754662386f26fc1000094509450505050613af4565b613a1760026000600684815481106139a257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461242390919063ffffffff16565b9250613aa26003600060068481548110613a2d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361242390919063ffffffff16565b9150808060010191505061386c565b50613ace662386f26fc100006007546123d990919063ffffffff16565b821015613aeb57600754662386f26fc10000935093505050613af4565b81819350935050505b9091565b613b0d8260075461242390919063ffffffff16565b600781905550613b2881600854612cff90919063ffffffff16565b6008819055505050565b600080831415613b455760009050613bb2565b6000828402905082848281613b5657fe5b0414613bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cdb6021913960400191505060405180910390fd5b809150505b92915050565b828054828255906000526020600020908101928215613bf4579160200282015b82811115613bf3578251825591602001919060010190613bd8565b5b509050613c019190613c05565b5090565b5b80821115613c1e576000816000905550600101613c06565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553416d6f756e74206d757374206265206c657373207468616e20746f74616c20707265736572766573536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e206f7220657175616c20746f203130302050464953656c6c20666565206368616e6765732074696d656c6f636b656420666f7220313220686f75727345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122071b7da56f9d624df909af201e754580bd4caf1e8b22245f83261b1b5505cf4ad64736f6c634300060c0033416d6f756e74206d757374206265206c657373207468616e20746f74616c20707265736572766573000000000000000000000000fd0e04daed1853e7ad3fdec5dff0f18ea5294b65

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063544caa5611610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610a9c578063f2cc0c1814610b14578063f2fde38b14610b58578063f84354f114610b9c576101cf565b8063a9059cbb1461098c578063a9c8af10146109f0578063ad863faa14610a0e578063cba0e99614610a42576101cf565b8063715018a6116100de578063715018a6146108675780638da5cb5b1461087157806395d89b41146108a5578063a457c2d714610928576101cf565b8063544caa56146106b65780636d91c0e21461076157806370a082311461080f576101cf565b806325cc524011610171578063313ce5671161014b578063313ce567146105d1578063393a6230146105f25780633950935114610634578063455edcce14610698576101cf565b806325cc52401461051f57806327e048b5146105615780632ed78a731461058f576101cf565b806313114a9d116101ad57806313114a9d1461041157806318160ddd1461042f57806323b872dd1461044d57806324901218146104d1576101cf565b8063060e52b7146101d457806306fdde031461032a578063095ea7b3146103ad575b600080fd5b610328600480360360608110156101ea57600080fd5b810190808035906020019064010000000081111561020757600080fd5b82018360208201111561021957600080fd5b8035906020019184602083028401116401000000008311171561023b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561029b57600080fd5b8201836020820111156102ad57600080fd5b803590602001918460208302840111640100000000831117156102cf57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610be0565b005b610332610dcc565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610372578082015181840152602081019050610357565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360408110156103c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e6e565b60405180821515815260200191505060405180910390f35b610419610e8c565b6040518082815260200191505060405180910390f35b610437610e96565b6040518082815260200191505060405180910390f35b6104b96004803603606081101561046357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ea5565b60405180821515815260200191505060405180910390f35b610509600480360360408110156104e757600080fd5b8101908080359060200190929190803515159060200190929190505050610f7e565b6040518082815260200191505060405180910390f35b61054b6004803603602081101561053557600080fd5b810190808035906020019092919050505061103c565b6040518082815260200191505060405180910390f35b61058d6004803603602081101561057757600080fd5b81019080803590602001909291905050506110c0565b005b6105bb600480360360208110156105a557600080fd5b8101908080359060200190929190505050611252565b6040518082815260200191505060405180910390f35b6105d9611273565b604051808260ff16815260200191505060405180910390f35b61061e6004803603602081101561060857600080fd5b810190808035906020019092919050505061128a565b6040518082815260200191505060405180910390f35b6106806004803603604081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112ab565b60405180821515815260200191505060405180910390f35b6106a061135e565b6040518082815260200191505060405180910390f35b610718600480360360408110156106cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611364565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6107e36004803603606081101561077757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114db565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108516004803603602081101561082557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115fa565b6040518082815260200191505060405180910390f35b61086f6116e5565b005b61087961186b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108ad611894565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ed5780820151818401526020810190506108d2565b50505050905090810190601f16801561091a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109746004803603604081101561093e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611936565b60405180821515815260200191505060405180910390f35b6109d8600480360360408110156109a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a03565b60405180821515815260200191505060405180910390f35b6109f8611a21565b6040518082815260200191505060405180910390f35b610a16611a27565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a8460048036036020811015610a5857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a4d565b60405180821515815260200191505060405180910390f35b610afe60048036036040811015610ab257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa3565b6040518082815260200191505060405180910390f35b610b5660048036036020811015610b2a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2a565b005b610b9a60048036036020811015610b6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e44565b005b610bde60048036036020811015610bb257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061204f565b005b610be861246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008351118015610cba575081518351145b610d2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c69642073656c6c206665657300000000000000000000000000000081525060200191505060405180910390fd5b61a8c0600f5401421015610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613d5c6028913960400191505060405180910390fd5b82600c9080519060200190610da1929190613bb8565b5081600d9080519060200190610db8929190613bb8565b5080600e8190555042600f81905550505050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e645780601f10610e3957610100808354040283529160200191610e64565b820191906000526020600020905b815481529060010190602001808311610e4757829003601f168201915b5050505050905090565b6000610e82610e7b61246d565b8484612475565b6001905092915050565b6000600854905090565b6000662386f26fc10000905090565b6000610eb284848461266c565b610f7384610ebe61246d565b610f6e85604051806060016040528060288152602001613cfc60289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f2461246d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bba9092919063ffffffff16565b612475565b600190509392505050565b6000662386f26fc10000831115610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b8161101e57600061100f846064612c7a565b50505050905080915050611036565b600061102b846064612c7a565b505050915050809150505b92915050565b6000600754821115611099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613cb36028913960400191505060405180910390fd5b60006110a3612cd4565b90506110b881846123d990919063ffffffff16565b915050919050565b60006110ca61246d565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613dcd602c913960400191505060405180910390fd5b600061117c836064612c7a565b5050505090506111d481600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061122c8160075461242390919063ffffffff16565b60078190555061124783600854612cff90919063ffffffff16565b600881905550505050565b600d818154811061125f57fe5b906000526020600020016000915090505481565b6000600b60009054906101000a900460ff16905090565b600c818154811061129757fe5b906000526020600020016000915090505481565b60006113546112b861246d565b8461134f85600460006112c961246d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b612475565b6001905092915050565b600e5481565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156113ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613c8e6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611426578284611429565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a205a45524f5f41444452455353000081525060200191505060405180910390fd5b9250929050565b60008060006114ea8585611364565b915091506000868383604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012060405160200180807fff000000000000000000000000000000000000000000000000000000000000008152506001018373ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001807f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f815250602001925050506040516020818303038152906040528051906020012060001c90508093505050509392505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561169557600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506116e0565b6116dd600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103c565b90505b919050565b6116ed61246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b5050505050905090565b60006119f961194361246d565b846119f485604051806060016040528060258152602001613df9602591396004600061196d61246d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bba9092919063ffffffff16565b612475565b6001905092915050565b6000611a17611a1061246d565b848461266c565b6001905092915050565b600f5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b3261246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d8657611d42600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103c565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e4c61246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613c466026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61205761246d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4163636f756e74206973206e6f74206578636c7564656400000000000000000081525060200191505060405180910390fd5b60005b6006805490508110156123d5578173ffffffffffffffffffffffffffffffffffffffff166006828154811061220a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123c85760066001600680549050038154811061226657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166006828154811061229e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600680548061238e57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556123d5565b80806001019150506121d9565b5050565b600061241b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d87565b905092915050565b600061246583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612bba565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613da96024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613c6c6022913960400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613d846025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612778576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613c236023913960400191505060405180910390fd5b60648110156127d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613d246038913960400191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442039050600080600090505b600c8054905081101561287757600c818154811061283a57fe5b9060005260206000200154831061286a57600d818154811061285857fe5b90600052602060002001549150612877565b8080600101915050612820565b50600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561291b5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156129775761292e858585600e54612e4d565b42600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bb3565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a1a5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612a3057612a2b858585846130a2565b612bb2565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ad45750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612aea57612ae5858585846132f7565b612bb1565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612b8c5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ba357612b9e85858560006134b7565b612bb0565b612baf858585846132f7565b5b5b5b5b5050505050565b6000838311158290612c67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c2c578082015181840152602081019050612c11565b50505050905090810190601f168015612c595780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000806000806000612c8f89896137a1565b915091506000612c9d612cd4565b90506000806000612caf8d86866137f5565b92509250925082828288889a509a509a509a509a505050505050509295509295909350565b6000806000612ce1613853565b91509150612cf881836123d990919063ffffffff16565b9250505090565b600080828401905083811015612d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008083118290612e33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612df8578082015181840152602081019050612ddd565b50505050905090810190601f168015612e255780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e3f57fe5b049050809150509392505050565b6000806000806000612e5f8787612c7a565b94509450945094509450612ebb87600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f5085600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fe584600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130328382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060008060006130b48787612c7a565b9450945094509450945061311085600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131a582600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061323a84600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132878382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060008060006133098787612c7a565b9450945094509450945061336585600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133fa84600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134478382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060008060006134c98787612c7a565b9450945094509450945061352587600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135ba85600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242390919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061364f82600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136e484600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cff90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137318382613af8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b60008060006137cd6127106137bf8688613b3290919063ffffffff16565b6123d990919063ffffffff16565b905060006137e4828761242390919063ffffffff16565b905080829350935050509250929050565b60008060008061380e8588613b3290919063ffffffff16565b905060006138258688613b3290919063ffffffff16565b9050600061383c828461242390919063ffffffff16565b905082818395509550955050505093509350939050565b600080600060075490506000662386f26fc10000905060005b600680549050811015613ab15782600260006006848154811061388b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613972575081600360006006848154811061390a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561398e57600754662386f26fc1000094509450505050613af4565b613a1760026000600684815481106139a257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461242390919063ffffffff16565b9250613aa26003600060068481548110613a2d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361242390919063ffffffff16565b9150808060010191505061386c565b50613ace662386f26fc100006007546123d990919063ffffffff16565b821015613aeb57600754662386f26fc10000935093505050613af4565b81819350935050505b9091565b613b0d8260075461242390919063ffffffff16565b600781905550613b2881600854612cff90919063ffffffff16565b6008819055505050565b600080831415613b455760009050613bb2565b6000828402905082848281613b5657fe5b0414613bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cdb6021913960400191505060405180910390fd5b809150505b92915050565b828054828255906000526020600020908101928215613bf4579160200282015b82811115613bf3578251825591602001919060010190613bd8565b5b509050613c019190613c05565b5090565b5b80821115613c1e576000816000905550600101613c06565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553416d6f756e74206d757374206265206c657373207468616e20746f74616c20707265736572766573536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e206f7220657175616c20746f203130302050464953656c6c20666565206368616e6765732074696d656c6f636b656420666f7220313220686f75727345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122071b7da56f9d624df909af201e754580bd4caf1e8b22245f83261b1b5505cf4ad64736f6c634300060c0033

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

000000000000000000000000fd0e04daed1853e7ad3fdec5dff0f18ea5294b65

-----Decoded View---------------
Arg [0] : ecosystem (address): 0xFd0E04DAED1853E7AD3fdEC5DfF0f18ea5294b65

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


Deployed Bytecode Sourcemap

17787:13029:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19223:501;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20811:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21721:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22832:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21088:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21890:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23317:442;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23767:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22927:382;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18702:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20997:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18633:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22211:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18774:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20456:347;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19824:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21191:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17203:148;;;:::i;:::-;;16561:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20902:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22437:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21395:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18811:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18856:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22714:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21570:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24024:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17506:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24360:472;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19223:501;16783:12;:10;:12::i;:::-;16773:22;;:6;;;;;;;;;;:22;;;16765:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19386:1:::1;19362:14;:21;:25;:72;;;;;19416:11;:18;19391:14;:21;:43;19362:72;19354:102;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19503:8;19483:17;;:28;19475:3;:37;;19467:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19588:14;19570:15;:32;;;;;;;;;;;;:::i;:::-;;19628:11;19613:12;:26;;;;;;;;;;;;:::i;:::-;;19663:9;19650:10;:22;;;;19713:3;19693:17;:23;;;;19223:501:::0;;;:::o;20811:83::-;20848:13;20881:5;20874:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20811:83;:::o;21721:161::-;21796:4;21813:39;21822:12;:10;:12::i;:::-;21836:7;21845:6;21813:8;:39::i;:::-;21870:4;21863:11;;21721:161;;;;:::o;22832:87::-;22874:7;22901:10;;22894:17;;22832:87;:::o;21088:95::-;21141:7;18320:18;21161:14;;21088:95;:::o;21890:313::-;21988:4;22005:36;22015:6;22023:9;22034:6;22005:9;:36::i;:::-;22052:121;22061:6;22069:12;:10;:12::i;:::-;22083:89;22121:6;22083:89;;;;;;;;;;;;;;;;;:11;:19;22095:6;22083:19;;;;;;;;;;;;;;;:33;22103:12;:10;:12::i;:::-;22083:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;22052:8;:121::i;:::-;22191:4;22184:11;;21890:313;;;;;:::o;23317:442::-;23405:7;18320:18;23433:7;:18;;23425:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23503:17;23498:254;;23538:15;23561:24;23572:7;23581:3;23561:10;:24::i;:::-;23537:48;;;;;;23607:7;23600:14;;;;;23498:254;23649:23;23679:24;23690:7;23699:3;23679:10;:24::i;:::-;23647:56;;;;;;23725:15;23718:22;;;23317:442;;;;;:::o;23767:249::-;23831:7;23870;;23859;:18;;23851:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23933:19;23956:10;:8;:10::i;:::-;23933:33;;23984:24;23996:11;23984:7;:11;;:24;;;;:::i;:::-;23977:31;;;23767:249;;;:::o;22927:382::-;22980:14;22997:12;:10;:12::i;:::-;22980:29;;23029:11;:19;23041:6;23029:19;;;;;;;;;;;;;;;;;;;;;;;;;23028:20;23020:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23109:15;23132:24;23143:7;23152:3;23132:10;:24::i;:::-;23108:48;;;;;;23185:28;23205:7;23185;:15;23193:6;23185:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;23167:7;:15;23175:6;23167:15;;;;;;;;;;;;;;;:46;;;;23234:20;23246:7;23234;;:11;;:20;;;;:::i;:::-;23224:7;:30;;;;23278:23;23293:7;23278:10;;:14;;:23;;;;:::i;:::-;23265:10;:36;;;;22927:382;;;:::o;18702:59::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20997:83::-;21038:5;21063:9;;;;;;;;;;;21056:16;;20997:83;:::o;18633:62::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22211:218::-;22299:4;22316:83;22325:12;:10;:12::i;:::-;22339:7;22348:50;22387:10;22348:11;:25;22360:12;:10;:12::i;:::-;22348:25;;;;;;;;;;;;;;;:34;22374:7;22348:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;22316:8;:83::i;:::-;22417:4;22410:11;;22211:218;;;;:::o;18774:30::-;;;;:::o;20456:347::-;20529:14;20545;20590:6;20580:16;;:6;:16;;;;20572:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20677:6;20668:15;;:6;:15;;;:53;;20706:6;20714;20668:53;;;20687:6;20695;20668:53;20649:72;;;;;;;;20758:1;20740:20;;:6;:20;;;;20732:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20456:347;;;;;:::o;19824:517::-;19911:7;19932:14;19948;19966:26;19977:6;19985;19966:10;:26::i;:::-;19931:61;;;;20003:13;20103:7;20156:6;20164;20139:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20129:43;;;;;;20042:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20032:262;;;;;;20027:268;;20003:293;;20328:5;20321:12;;;;;19824:517;;;;;:::o;21191:196::-;21257:7;21281:11;:20;21293:7;21281:20;;;;;;;;;;;;;;;;;;;;;;;;;21277:49;;;21310:7;:16;21318:7;21310:16;;;;;;;;;;;;;;;;21303:23;;;;21277:49;21344:35;21362:7;:16;21370:7;21362:16;;;;;;;;;;;;;;;;21344:17;:35::i;:::-;21337:42;;21191:196;;;;:::o;17203:148::-;16783:12;:10;:12::i;:::-;16773:22;;:6;;;;;;;;;;:22;;;16765:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17310:1:::1;17273:40;;17294:6;::::0;::::1;;;;;;;;17273:40;;;;;;;;;;;;17341:1;17324:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;17203:148::o:0;16561:79::-;16599:7;16626:6;;;;;;;;;;;16619:13;;16561:79;:::o;20902:87::-;20941:13;20974:7;20967:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20902:87;:::o;22437:269::-;22530:4;22547:129;22556:12;:10;:12::i;:::-;22570:7;22579:96;22618:15;22579:96;;;;;;;;;;;;;;;;;:11;:25;22591:12;:10;:12::i;:::-;22579:25;;;;;;;;;;;;;;;:34;22605:7;22579:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;22547:8;:129::i;:::-;22694:4;22687:11;;22437:269;;;;:::o;21395:167::-;21473:4;21490:42;21500:12;:10;:12::i;:::-;21514:9;21525:6;21490:9;:42::i;:::-;21550:4;21543:11;;21395:167;;;;:::o;18811:32::-;;;;:::o;18856:25::-;;;;;;;;;;;;;:::o;22714:110::-;22772:4;22796:11;:20;22808:7;22796:20;;;;;;;;;;;;;;;;;;;;;;;;;22789:27;;22714:110;;;:::o;21570:143::-;21651:7;21678:11;:18;21690:5;21678:18;;;;;;;;;;;;;;;:27;21697:7;21678:27;;;;;;;;;;;;;;;;21671:34;;21570:143;;;;:::o;24024:328::-;16783:12;:10;:12::i;:::-;16773:22;;:6;;;;;;;;;;:22;;;16765:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24104:11:::1;:20;24116:7;24104:20;;;;;;;;;;;;;;;;;;;;;;;;;24103:21;24095:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24189:1;24170:7;:16;24178:7;24170:16;;;;;;;;;;;;;;;;:20;24167:106;;;24226:35;24244:7;:16;24252:7;24244:16;;;;;;;;;;;;;;;;24226:17;:35::i;:::-;24207:7;:16;24215:7;24207:16;;;;;;;;;;;;;;;:54;;;;24167:106;24306:4;24283:11;:20;24295:7;24283:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24321:9;24336:7;24321:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24024:328:::0;:::o;17506:244::-;16783:12;:10;:12::i;:::-;16773:22;;:6;;;;;;;;;;:22;;;16765:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17615:1:::1;17595:22;;:8;:22;;;;17587:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17705:8;17676:38;;17697:6;::::0;::::1;;;;;;;;17676:38;;;;;;;;;;;;17734:8;17725:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;17506:244:::0;:::o;24360:472::-;16783:12;:10;:12::i;:::-;16773:22;;:6;;;;;;;;;;:22;;;16765:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24439:11:::1;:20;24451:7;24439:20;;;;;;;;;;;;;;;;;;;;;;;;;24431:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24503:9;24498:327;24522:9;:16;;;;24518:1;:20;24498:327;;;24580:7;24564:23;;:9;24574:1;24564:12;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;24560:254;;;24623:9;24652:1;24633:9;:16;;;;:20;24623:31;;;;;;;;;;;;;;;;;;;;;;;;;24608:9;24618:1;24608:12;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;24692:1;24673:7;:16;24681:7;24673:16;;;;;;;;;;;;;;;:20;;;;24735:5;24712:11;:20;24724:7;24712:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;24759:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24793:5;;24560:254;24540:3;;;;;;;24498:327;;;;24360:472:::0;:::o;7056:132::-;7114:7;7141:39;7145:1;7148;7141:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7134:46;;7056:132;;;;:::o;5219:136::-;5277:7;5304:43;5308:1;5311;5304:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5297:50;;5219:136;;;;:::o;665:106::-;718:15;753:10;746:17;;665:106;:::o;24840:337::-;24950:1;24933:19;;:5;:19;;;;24925:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25031:1;25012:21;;:7;:21;;;;25004:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25115:6;25085:11;:18;25097:5;25085:18;;;;;;;;;;;;;;;:27;25104:7;25085:27;;;;;;;;;;;;;;;:36;;;;25153:7;25137:32;;25146:5;25137:32;;;25162:6;25137:32;;;;;;;;;;;;;;;;;;24840:337;;;:::o;25185:1419::-;25300:1;25282:20;;:6;:20;;;;25274:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25384:1;25363:23;;:9;:23;;;;25355:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25455:3;25445:6;:13;;25437:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25540:16;25565:10;:18;25576:6;25565:18;;;;;;;;;;;;;;;;25559:3;:24;25540:43;;25604:19;25649:9;25661:1;25649:13;;25644:202;25668:15;:22;;;;25664:1;:26;25644:202;;;25727:15;25743:1;25727:18;;;;;;;;;;;;;;;;25715:8;:30;25712:123;;25780:12;25793:1;25780:15;;;;;;;;;;;;;;;;25766:29;;25814:5;;25712:123;25692:3;;;;;;;25644:202;;;;25870:11;:19;25882:6;25870:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;25894:11;:22;25906:9;25894:22;;;;;;;;;;;;;;;;;;;;;;;;;25893:23;25870:46;25866:721;;;25947:60;25969:6;25977:9;25988:6;25996:10;;25947:21;:60::i;:::-;26046:3;26022:10;:21;26033:9;26022:21;;;;;;;;;;;;;;;:27;;;;25866:721;;;26086:11;:19;26098:6;26086:19;;;;;;;;;;;;;;;;;;;;;;;;;26085:20;:46;;;;;26109:11;:22;26121:9;26109:22;;;;;;;;;;;;;;;;;;;;;;;;;26085:46;26081:506;;;26148:59;26168:6;26176:9;26187:6;26195:11;26148:19;:59::i;:::-;26081:506;;;26230:11;:19;26242:6;26230:19;;;;;;;;;;;;;;;;;;;;;;;;;26229:20;:47;;;;;26254:11;:22;26266:9;26254:22;;;;;;;;;;;;;;;;;;;;;;;;;26253:23;26229:47;26225:362;;;26293:57;26311:6;26319:9;26330:6;26338:11;26293:17;:57::i;:::-;26225:362;;;26372:11;:19;26384:6;26372:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;26395:11;:22;26407:9;26395:22;;;;;;;;;;;;;;;;;;;;;;;;;26372:45;26368:219;;;26434:51;26456:6;26464:9;26475:6;26483:1;26434:21;:51::i;:::-;26368:219;;;26518:57;26536:6;26544:9;26555:6;26563:11;26518:17;:57::i;:::-;26368:219;26225:362;26081:506;25866:721;25185:1419;;;;;:::o;5658:192::-;5744:7;5777:1;5772;:6;;5780:12;5764:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5804:9;5820:1;5816;:5;5804:17;;5841:1;5834:8;;;5658:192;;;;;:::o;29015:445::-;29095:7;29104;29113;29122;29131;29152:23;29177:12;29193:33;29205:7;29214:11;29193;:33::i;:::-;29151:75;;;;29237:19;29260:10;:8;:10::i;:::-;29237:33;;29282:15;29299:23;29324:12;29340:39;29352:7;29361:4;29367:11;29340;:39::i;:::-;29281:98;;;;;;29398:7;29407:15;29424:4;29430:15;29447:4;29390:62;;;;;;;;;;;;;;;;29015:445;;;;;;;;:::o;30081:163::-;30122:7;30143:15;30160;30179:19;:17;:19::i;:::-;30142:56;;;;30216:20;30228:7;30216;:11;;:20;;;;:::i;:::-;30209:27;;;;30081:163;:::o;4755:181::-;4813:7;4833:9;4849:1;4845;:5;4833:17;;4874:1;4869;:6;;4861:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4927:1;4920:8;;;4755:181;;;;:::o;7684:278::-;7770:7;7802:1;7798;:5;7805:12;7790:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7829:9;7845:1;7841;:5;;;;;;7829:17;;7953:1;7946:8;;;7684:278;;;;;:::o;27679:544::-;27803:15;27820:23;27845:12;27859:23;27884:12;27900:32;27911:7;27920:11;27900:10;:32::i;:::-;27802:130;;;;;;;;;;27961:28;27981:7;27961;:15;27969:6;27961:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;27943:7;:15;27951:6;27943:15;;;;;;;;;;;;;;;:46;;;;28018:28;28038:7;28018;:15;28026:6;28018:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;28000:7;:15;28008:6;28000:15;;;;;;;;;;;;;;;:46;;;;28078:39;28101:15;28078:7;:18;28086:9;28078:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;28057:7;:18;28065:9;28057:18;;;;;;;;;;;;;;;:60;;;;28131:24;28144:4;28150;28131:12;:24::i;:::-;28188:9;28171:44;;28180:6;28171:44;;;28199:15;28171:44;;;;;;;;;;;;;;;;;;27679:544;;;;;;;;;:::o;27107:564::-;27229:15;27246:23;27271:12;27285:23;27310:12;27326:32;27337:7;27346:11;27326:10;:32::i;:::-;27228:130;;;;;;;;;;27387:28;27407:7;27387;:15;27395:6;27387:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;27369:7;:15;27377:6;27369:15;;;;;;;;;;;;;;;:46;;;;27447:39;27470:15;27447:7;:18;27455:9;27447:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;27426:7;:18;27434:9;27426:18;;;;;;;;;;;;;;;:60;;;;27518:39;27541:15;27518:7;:18;27526:9;27518:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;27497:7;:18;27505:9;27497:18;;;;;;;;;;;;;;;:60;;;;27579:24;27592:4;27598;27579:12;:24::i;:::-;27636:9;27619:44;;27628:6;27619:44;;;27647:15;27619:44;;;;;;;;;;;;;;;;;;27107:564;;;;;;;;;:::o;26612:487::-;26732:15;26749:23;26774:12;26788:23;26813:12;26829:32;26840:7;26849:11;26829:10;:32::i;:::-;26731:130;;;;;;;;;;26890:28;26910:7;26890;:15;26898:6;26890:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;26872:7;:15;26880:6;26872:15;;;;;;;;;;;;;;;:46;;;;26950:39;26973:15;26950:7;:18;26958:9;26950:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;26929:7;:18;26937:9;26929:18;;;;;;;;;;;;;;;:60;;;;27007:24;27020:4;27026;27007:12;:24::i;:::-;27064:9;27047:44;;27056:6;27047:44;;;27075:15;27047:44;;;;;;;;;;;;;;;;;;26612:487;;;;;;;;;:::o;28231:620::-;28355:15;28372:23;28397:12;28411:23;28436:12;28452:32;28463:7;28472:11;28452:10;:32::i;:::-;28354:130;;;;;;;;;;28513:28;28533:7;28513;:15;28521:6;28513:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;28495:7;:15;28503:6;28495:15;;;;;;;;;;;;;;;:46;;;;28570:28;28590:7;28570;:15;28578:6;28570:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;28552:7;:15;28560:6;28552:15;;;;;;;;;;;;;;;:46;;;;28630:39;28653:15;28630:7;:18;28638:9;28630:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;28609:7;:18;28617:9;28609:18;;;;;;;;;;;;;;;:60;;;;28701:39;28724:15;28701:7;:18;28709:9;28701:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;28680:7;:18;28688:9;28680:18;;;;;;;;;;;;;;;:60;;;;28759:24;28772:4;28778;28759:12;:24::i;:::-;28816:9;28799:44;;28808:6;28799:44;;;28827:15;28799:44;;;;;;;;;;;;;;;;;;28231:620;;;;;;;;;:::o;29468:263::-;29549:7;29558;29578:12;29593:35;29622:5;29593:24;29605:11;29593:7;:11;;:24;;;;:::i;:::-;:28;;:35;;;;:::i;:::-;29578:50;;29639:23;29665:17;29677:4;29665:7;:11;;:17;;;;:::i;:::-;29639:43;;29701:15;29718:4;29693:30;;;;;;29468:263;;;;;:::o;29739:334::-;29834:7;29843;29852;29872:15;29890:24;29902:11;29890:7;:11;;:24;;;;:::i;:::-;29872:42;;29925:12;29940:21;29949:11;29940:4;:8;;:21;;;;:::i;:::-;29925:36;;29972:23;29998:17;30010:4;29998:7;:11;;:17;;;;:::i;:::-;29972:43;;30034:7;30043:15;30060:4;30026:39;;;;;;;;;29739:334;;;;;;;:::o;30252:561::-;30302:7;30311;30331:15;30349:7;;30331:25;;30367:15;18320:18;30367:25;;30414:9;30409:289;30433:9;:16;;;;30429:1;:20;30409:289;;;30499:7;30475;:21;30483:9;30493:1;30483:12;;;;;;;;;;;;;;;;;;;;;;;;;30475:21;;;;;;;;;;;;;;;;:31;:66;;;;30534:7;30510;:21;30518:9;30528:1;30518:12;;;;;;;;;;;;;;;;;;;;;;;;;30510:21;;;;;;;;;;;;;;;;:31;30475:66;30471:97;;;30551:7;;18320:18;30543:25;;;;;;;;;30471:97;30593:34;30605:7;:21;30613:9;30623:1;30613:12;;;;;;;;;;;;;;;;;;;;;;;;;30605:21;;;;;;;;;;;;;;;;30593:7;:11;;:34;;;;:::i;:::-;30583:44;;30652:34;30664:7;:21;30672:9;30682:1;30672:12;;;;;;;;;;;;;;;;;;;;;;;;;30664:21;;;;;;;;;;;;;;;;30652:7;:11;;:34;;;;:::i;:::-;30642:44;;30451:3;;;;;;;30409:289;;;;30722:20;18320:18;30722:7;;:11;;:20;;;;:::i;:::-;30712:7;:30;30708:61;;;30752:7;;18320:18;30744:25;;;;;;;;30708:61;30788:7;30797;30780:25;;;;;;30252:561;;;:::o;28859:148::-;28938:17;28950:4;28938:7;;:11;;:17;;;;:::i;:::-;28928:7;:27;;;;28979:20;28994:4;28979:10;;:14;;:20;;;;:::i;:::-;28966:10;:33;;;;28859:148;;:::o;6109:471::-;6167:7;6417:1;6412;:6;6408:47;;;6442:1;6435:8;;;;6408:47;6467:9;6483:1;6479;:5;6467:17;;6512:1;6507;6503;:5;;;;;;:10;6495:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6571:1;6564:8;;;6109:471;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://71b7da56f9d624df909af201e754580bd4caf1e8b22245f83261b1b5505cf4ad
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.