ETH Price: $3,265.70 (+0.56%)
Gas: 3 Gwei

Token

Locked Keys (LOCKEDKEYS)
 

Overview

Max Total Supply

58,608,068.917448486 LOCKEDKEYS

Holders

234

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
8,000 LOCKEDKEYS

Value
$0.00
0xbad6c6d1e2e8997f934f030256fcc5ca56ba5d68
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:
KEYSLockBox

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 6: KeysLockBox.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";
import "./ReentrantGuard.sol";
import "./IKeysStaking.sol";

/**
 *
 * KEYS Token Locking Contract
 * Contract Developed By DeFi Mark (MoonMark)
 *
 */
contract KEYSLockBox is ReentrancyGuard, IERC20, IKeysStaking{

    using SafeMath for uint256;
    using Address for address;
    
    // KEYS Contract
    address constant KEYS = 0xe0a189C975e4928222978A74517442239a0b86ff;

    // precision factor
    uint256 constant precision = 10**36;
    
    // Total Dividends Per Farm
    uint256 public dividendsPerToken;
 
    // 88 day lock time
    uint256 public lockTime = 2534400;
    
    // 8 day harvest time
    uint256 public harvestTime = 230400;
    
    // Locker Structure
    struct StakedUser {
        uint256 tokensLocked;
        uint256 timeLocked;
        uint256 lastClaim;
        uint256 totalExcluded;
    }
    
    // Users -> StakedUser
    mapping ( address => StakedUser ) users;
    
    // total locked across all lockers
    uint256 totalLocked;
    
    // minimum stake amount
    uint256 public minToStake = 100 * 10**9;
    
    // reduced purchase fee
    uint256 public fee = 2;
    
    // fee for unstaking too early
    uint256 public earlyFee = 8;
    
    // multisignature wallet
    address public multisig = 0xfCacEAa7b4cf845f2cfcE6a3dA680dF1BB05015c;
    
    // Ownership
    address public owner;
    modifier onlyOwner(){require(owner == msg.sender, 'Only Owner'); _;}
    
    // Events
    event TransferOwnership(address newOwner);
    event UpdateFee(uint256 newFee);
    event UpdateLockTime(uint256 newTime);
    event UpdatedStakingMinimum(uint256 minimumKeys);
    event UpdatedFeeReceiver(address feeReceiver);
    event UpdatedEarlyFee(uint256 newFee);
    
    constructor() {
        owner = 0xfCacEAa7b4cf845f2cfcE6a3dA680dF1BB05015c;
    }
    
    function totalSupply() external view override returns (uint256) { return totalLocked; }
    function balanceOf(address account) public view override returns (uint256) { return users[account].tokensLocked; }
    function allowance(address holder, address spender) external view override returns (uint256) { return holder == spender ? balanceOf(holder) : 0; }
    function name() public pure override returns (string memory) {
        return "Locked Keys";
    }
    function symbol() public pure override returns (string memory) {
        return "LOCKEDKEYS";
    }
    function decimals() public pure override returns (uint8) {
        return 9;
    }
    function approve(address spender, uint256 amount) public view override returns (bool) {
        return users[msg.sender].tokensLocked >= amount && spender != msg.sender;
    }
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        // ensure claim requirements
        if (recipient == KEYS) {
            _unlock(msg.sender, msg.sender, amount);
        } else if (recipient == address(this)){
            _reinvestKeys(msg.sender);
        } else {
            _makeClaim(msg.sender);
        }
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (recipient == KEYS) {
            _unlock(msg.sender, msg.sender, amount);
        } else if (recipient == address(this)){
            _reinvestKeys(msg.sender);
        } else {
            _makeClaim(msg.sender);
        }
        return true && sender == recipient;
    }
    
    
    ///////////////////////////////////
    //////    OWNER FUNCTIONS   ///////
    ///////////////////////////////////
    
    function transferOwnership(address newOwner) external onlyOwner {
        owner = newOwner;
        emit TransferOwnership(newOwner);
    }
    
    function updateFee(uint256 newFee) external onlyOwner {
        fee = newFee;
        emit UpdateFee(newFee);
    }
    
    function updateFeeReceiver(address newReceiver) external onlyOwner {
        multisig = newReceiver;
        emit UpdatedFeeReceiver(newReceiver);
    }
    
    function setEarlyFee(uint256 newFee) external onlyOwner {
        earlyFee = newFee;
        emit UpdatedEarlyFee(newFee);
    }
    
    function setMinimumToStake(uint256 minimum) external onlyOwner {
        minToStake = minimum;
        emit UpdatedStakingMinimum(minimum);
    }
    
    function setLockTime(uint256 newTime) external onlyOwner {
        require(newTime <= 10**6, 'Lock Time Too Long');
        lockTime = newTime;
        emit UpdateLockTime(newTime);
    }
    
    function withdraw(bool eth, address token, uint256 amount, address recipient) external onlyOwner {
        if (eth) {
            require(address(this).balance >= amount, 'Insufficient Balance');
            (bool s,) = payable(recipient).call{value: amount}("");
            require(s, 'Failure on ETH Withdrawal');
        } else {
            IERC20(token).transfer(recipient, amount);
        }
    }
    
    
    ///////////////////////////////////
    //////   PUBLIC FUNCTIONS   ///////
    ///////////////////////////////////

    /** Adds KEYS To The Pending Rewards Of KEYS Stakers */
    function deposit(uint256 amount) external override {
        uint256 received = _transferIn(amount);
        dividendsPerToken += received.mul(precision).div(totalLocked);
    }

    function claimReward() external nonReentrant {
        _makeClaim(msg.sender);      
    }
    
    function claimRewardForUser(address user) external nonReentrant {
        _makeClaim(user);
    }
    
    function unlock(uint256 amount) external nonReentrant {
        _unlock(msg.sender, msg.sender, amount);
    }
    
    function unlockFor(uint256 amount, address keysRecipient) external nonReentrant {
        _unlock(msg.sender, keysRecipient, amount);
    }
    
    function unlockAll() external nonReentrant {
        _unlock(msg.sender, msg.sender, users[msg.sender].tokensLocked);
    }
    
    function stakeKeys(uint256 numKeys) external nonReentrant {
        uint256 received = _transferIn(numKeys);
        require(received >= minToStake, 'Minimum To Stake Not Reached');
        _lock(msg.sender, received);
    }

    function reinvestKeys() external nonReentrant {
        _reinvestKeys(msg.sender);
    }

    function _reinvestKeys(address user) internal {

        uint256 amount = pendingRewards(user);
        require(amount > 0, 'Zero Amount');

        // set locker data
        users[user].tokensLocked += amount;
        users[user].lastClaim = block.number;
        users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        
        // increment total locked
        totalLocked += amount;
        
        // Transfer StakedKeys
        emit Transfer(address(0), user, amount);
    }
    
    ///////////////////////////////////
    //////  INTERNAL FUNCTIONS  ///////
    ///////////////////////////////////
    
    function _makeClaim(address user) internal {
        // ensure claim requirements
        require(users[user].tokensLocked > 0, 'Zero Tokens Locked');
        require(users[user].lastClaim + harvestTime <= block.number, 'Claim Wait Time Not Reached');
        
        uint256 amount = pendingRewards(user);
        require(amount > 0,'Zero Rewards');
        _claimReward(user);
    }
    
    function _claimReward(address user) internal {
        
        uint256 amount = pendingRewards(user);
        if (amount == 0) return;
        
        // update claim stats 
        users[user].lastClaim = block.number;
        users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        // transfer tokens
        bool s = IERC20(KEYS).transfer(user, amount);
        require(s,'Failure On Token Transfer');
    }
    
    function _transferIn(uint256 amount) internal returns (uint256) {
        
        uint256 before = IERC20(KEYS).balanceOf(address(this));
        bool s = IERC20(KEYS).transferFrom(msg.sender, address(this), amount);
        
        uint256 difference = IERC20(KEYS).balanceOf(address(this)).sub(before);
        require(s && difference <= amount, 'Error On Transfer In');
        return difference;
    }
    
    function _buyKeys() internal returns (uint256) {
        
        uint256 feeAmount = msg.value.mul(fee).div(100);
        uint256 purchaseAmount = msg.value.sub(feeAmount);
        
        (bool success,) = payable(multisig).call{value: feeAmount}("");
        require(success, 'Failure on Dev Payment');
        
        uint256 before = IERC20(KEYS).balanceOf(address(this));
        (bool s,) = payable(KEYS).call{value: purchaseAmount}("");
        require(s, 'Failure on KEYS Purchase');
        return IERC20(KEYS).balanceOf(address(this)).sub(before);
    }
    
    function _lock(address user, uint256 received) private {
        
        if (users[user].tokensLocked > 0) { // recurring locker
            _claimReward(user);
        } else { // new user
            users[user].lastClaim = block.number;
        }
        
        // add locker data
        users[user].tokensLocked += received;
        users[user].timeLocked = block.number;
        users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        
        // increment total locked
        totalLocked += received;
        
        emit Transfer(address(0), user, received);
    }

    function _unlock(address user, address recipient, uint256 nTokens) private {
        
        // Ensure Lock Requirements
        require(users[user].tokensLocked > 0, 'Zero Tokens Locked');
        require(users[user].tokensLocked >= nTokens && nTokens > 0, 'Insufficient Tokens');
        
        // expiration
        uint256 lockExpiration = users[user].timeLocked + lockTime;
        
        // claim reward 
        _claimReward(user);
        
        // Update Staked Balances
        if (users[user].tokensLocked == nTokens) {
            delete users[user]; // Free Storage
        } else {
            users[user].tokensLocked = users[user].tokensLocked.sub(nTokens, 'Insufficient Lock Amount');
            users[user].totalExcluded = currentDividends(users[user].tokensLocked);
        }
        
        // Update Total Locked
        totalLocked = totalLocked.sub(nTokens, 'Negative Locked');

        // Calculate Tokens To Send Recipient
        uint256 tokensToSend = lockExpiration > block.number ? _calculateAndReflect(nTokens) : nTokens;

        // Transfer KEYS Tokens To User
        bool s = IERC20(KEYS).transfer(recipient, tokensToSend);
        require(s, 'Failure on LP Token Transfer');

        // tell Blockchain
        emit Transfer(user, address(0), nTokens);
    }
    
    function _calculateAndReflect(uint256 nTokens) internal returns (uint256) {
        
        // apply early leave tax
        uint256 tax = nTokens.mul(earlyFee).div(100);
        
        // Reflect Tax To KEYS Stakers
        dividendsPerToken += tax.mul(precision).div(totalLocked);
        
        // Return Send Amount
        return nTokens.sub(tax);
    }
    
    ///////////////////////////////////
    //////    READ FUNCTIONS    ///////
    ///////////////////////////////////
    
    
    function getTimeUntilUnlock(address user) external view returns (uint256) {
        uint256 endTime = users[user].timeLocked + lockTime;
        return endTime > block.number ? endTime.sub(block.number) : 0;
    }
    
    function getTimeUntilNextClaim(address user) external view returns (uint256) {
        uint256 endTime = users[user].lastClaim + harvestTime;
        return endTime > block.number ? endTime.sub(block.number) : 0;
    }
    
    function currentDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerToken).div(precision);
    }
    
    function pendingRewards(address user) public view returns (uint256) {
        uint256 amount = users[user].tokensLocked;
        if(amount == 0){ return 0; }

        uint256 shareholderTotalDividends = currentDividends(amount);
        uint256 shareholderTotalExcluded = users[user].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }
    
    function totalPendingRewards() external view returns (uint256) {
        return IERC20(KEYS).balanceOf(address(this)).sub(totalLocked);
    }
    
    function calculateKEYSBalance(address user) external view returns (uint256) {
        return IERC20(KEYS).balanceOf(user);
    }
    
    function calculateKEYSContractBalance() external view returns (uint256) {
        return IERC20(KEYS).balanceOf(address(this));
    }

    receive() external payable {
        uint256 received = _buyKeys();
        require(received >= minToStake, 'Minimum To Stake Not Reached');
        _lock(msg.sender, received);
    }

}

File 1 of 6: Address.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;


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 2 of 6: IERC20.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

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

    /**
     * @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 3 of 6: IKeysStaking.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

/**
 * Exempt Surge Interface
 */
interface IKeysStaking {
    function deposit(uint256 amount) external;
}

File 5 of 6: ReentrantGuard.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor () {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

File 6 of 6: SafeMath.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

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;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"UpdateFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"UpdateLockTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"UpdatedEarlyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeReceiver","type":"address"}],"name":"UpdatedFeeReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minimumKeys","type":"uint256"}],"name":"UpdatedStakingMinimum","type":"event"},{"inputs":[{"internalType":"address","name":"holder","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":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateKEYSBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateKEYSContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimRewardForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendsPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTimeUntilNextClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTimeUntilUnlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minToStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinvestKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setEarlyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"setLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimum","type":"uint256"}],"name":"setMinimumToStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numKeys","type":"uint256"}],"name":"stakeKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPendingRewards","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"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"keysRecipient","type":"address"}],"name":"unlockFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReceiver","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"eth","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526226ac006002556203840060035564174876e80060065560026007556008805573fcaceaa7b4cf845f2cfce6a3da680df1bb05015c600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561008557600080fd5b50600160008190555073fcaceaa7b4cf845f2cfce6a3da680df1bb05015c600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613f70806100f26000396000f3fe6080604052600436106102295760003560e01c80638df0c65c11610123578063cd24b0a3116100ab578063e231dc271161006f578063e231dc271461085c578063e4049b0314610899578063ec1371f2146108c2578063f2fde38b146108ed578063f4808210146109165761028c565b8063cd24b0a31461078b578063d76bc1ab146107a2578063da2a37f2146107cb578063dd62ed3e146107f4578063ddca3f43146108315761028c565b8063ae04d45d116100f2578063ae04d45d146106e2578063b6b55f251461070b578063b88a802f14610734578063bbef7bbf1461074b578063c69bebe4146107625761028c565b80638df0c65c146106285780639012c4a81461065157806395d89b411461067a578063a9059cbb146106a55761028c565b806331d7a262116101b15780636198e339116101755780636198e339146105315780636d07b7e51461055a57806370a082311461059757806370bc1c24146105d45780638da5cb5b146105fd5761028c565b806331d7a26214610436578063401738111461047357806343deb2921461049e5780634783c35b146104c95780634fe24748146104f45761028c565b80630dd27dee116101f85780630dd27dee1461034f57806315bbd78f1461037857806318160ddd146103a357806323b872dd146103ce578063313ce5671461040b5761028c565b8063030cd3161461029157806306fdde03146102bc578063095ea7b3146102e75780630d668087146103245761028c565b3661028c576000610238610941565b905060065481101561027f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102769061392a565b60405180910390fd5b6102893382610c6d565b50005b600080fd5b34801561029d57600080fd5b506102a6610ec2565b6040516102b391906139aa565b60405180910390f35b3480156102c857600080fd5b506102d1610f66565b6040516102de9190613768565b60405180910390f35b3480156102f357600080fd5b5061030e6004803603810190610309919061327c565b610fa3565b60405161031b919061374d565b60405180910390f35b34801561033057600080fd5b5061033961102b565b60405161034691906139aa565b60405180910390f35b34801561035b57600080fd5b50610376600480360381019061037191906131c8565b611031565b005b34801561038457600080fd5b5061038d611093565b60405161039a91906139aa565b60405180910390f35b3480156103af57600080fd5b506103b8611099565b6040516103c591906139aa565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061322d565b6110a3565b604051610402919061374d565b60405180910390f35b34801561041757600080fd5b5061042061118c565b60405161042d91906139c5565b60405180910390f35b34801561044257600080fd5b5061045d600480360381019061045891906131c8565b611195565b60405161046a91906139aa565b60405180910390f35b34801561047f57600080fd5b50610488611275565b60405161049591906139aa565b60405180910390f35b3480156104aa57600080fd5b506104b361127b565b6040516104c091906139aa565b60405180910390f35b3480156104d557600080fd5b506104de611281565b6040516104eb91906136d2565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906131c8565b6112a7565b60405161052891906139aa565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613344565b61134d565b005b34801561056657600080fd5b50610581600480360381019061057c91906131c8565b6113b1565b60405161058e91906139aa565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b991906131c8565b611430565b6040516105cb91906139aa565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613344565b61147c565b005b34801561060957600080fd5b5061061261154d565b60405161061f91906136d2565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906132e1565b611573565b005b34801561065d57600080fd5b5061067860048036038101906106739190613344565b611793565b005b34801561068657600080fd5b5061068f611864565b60405161069c9190613768565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c7919061327c565b6118a1565b6040516106d9919061374d565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613344565b611952565b005b34801561071757600080fd5b50610732600480360381019061072d9190613344565b611a69565b005b34801561074057600080fd5b50610749611ac8565b005b34801561075757600080fd5b50610760611b29565b005b34801561076e57600080fd5b50610789600480360381019061078491906131c8565b611b8a565b005b34801561079757600080fd5b506107a0611c95565b005b3480156107ae57600080fd5b506107c960048036038101906107c49190613344565b611d3a565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613396565b611df0565b005b34801561080057600080fd5b5061081b600480360381019061081691906131f1565b611e55565b60405161082891906139aa565b60405180910390f35b34801561083d57600080fd5b50610846611ea3565b60405161085391906139aa565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e91906131c8565b611ea9565b60405161089091906139aa565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb9190613344565b611f28565b005b3480156108ce57600080fd5b506108d7611ff9565b6040516108e491906139aa565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f91906131c8565b6120b1565b005b34801561092257600080fd5b5061092b6121bc565b60405161093891906139aa565b60405180910390f35b60008061096c606461095e600754346121c290919063ffffffff16565b61223d90919063ffffffff16565b90506000610983823461228790919063ffffffff16565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516109cd906136bd565b60006040518083038185875af1925050503d8060008114610a0a576040519150601f19603f3d011682016040523d82523d6000602084013e610a0f565b606091505b5050905080610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a906137aa565b60405180910390fd5b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa291906136d2565b60206040518083038186803b158015610aba57600080fd5b505afa158015610ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af2919061336d565b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1684604051610b2e906136bd565b60006040518083038185875af1925050503d8060008114610b6b576040519150601f19603f3d011682016040523d82523d6000602084013e610b70565b606091505b5050905080610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab9061384a565b60405180910390fd5b610c638273e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c0591906136d2565b60206040518083038186803b158015610c1d57600080fd5b505afa158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c55919061336d565b61228790919063ffffffff16565b9550505050505090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610cc657610cc1826122d1565b610d0e565b43600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610d609190613a07565b9250508190555043600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610df9600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055508060056000828254610e519190613a07565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610eb691906139aa565b60405180910390a35050565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f1191906136d2565b60206040518083038186803b158015610f2957600080fd5b505afa158015610f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f61919061336d565b905090565b60606040518060400160405280600b81526020017f4c6f636b6564204b657973000000000000000000000000000000000000000000815250905090565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015801561102357503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b60025481565b60026000541415611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e9061394a565b60405180910390fd5b6002600081905550611088816124ef565b600160008190555050565b60085481565b6000600554905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110fd576110f8333384612663565b61114a565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561113f5761113a33612bab565b611149565b611148336124ef565b5b5b6001801561118357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90509392505050565b60006009905090565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008114156111f0576000915050611270565b60006111fb826124b0565b90506000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015490508082116112575760009350505050611270565b61126a818361228790919063ffffffff16565b93505050505b919050565b60015481565b60065481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016112f691906136d2565b60206040518083038186803b15801561130e57600080fd5b505afa158015611322573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611346919061336d565b9050919050565b60026000541415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a9061394a565b60405180910390fd5b60026000819055506113a6333383612663565b600160008190555050565b600080600354600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546114049190613a07565b9050438111611414576000611428565b611427438261228790919063ffffffff16565b5b915050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461150c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115039061396a565b60405180910390fd5b806006819055507f6d8526a472074bf72afd527fb790d17be310e7ff54098a1d8bd565ff5bfa11c18160405161154291906139aa565b60405180910390a150565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061396a565b60405180910390fd5b83156116fe578147101561164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906138aa565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051611672906136bd565b60006040518083038185875af1925050503d80600081146116af576040519150601f19603f3d011682016040523d82523d6000602084013e6116b4565b606091505b50509050806116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906138ea565b60405180910390fd5b5061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401611739929190613724565b602060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b91906132b8565b505b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a9061396a565b60405180910390fd5b806007819055507f38e229a7f3f9c329892d08eb37c4e91ccac6d12c798d394990ca4f56028ec2668160405161185991906139aa565b60405180910390a150565b60606040518060400160405280600a81526020017f4c4f434b45444b45595300000000000000000000000000000000000000000000815250905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118fb576118f6333384612663565b611948565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561193d5761193833612bab565b611947565b611946336124ef565b5b5b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d99061396a565b60405180910390fd5b620f4240811115611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f9061386a565b60405180910390fd5b806002819055507f76f15e9a1f6aff29e3af90c686f28fc78998700d6fc4d719359b3db4057663eb81604051611a5e91906139aa565b60405180910390a150565b6000611a7482612daf565b9050611aac600554611a9e6ec097ce7bc90715b34b9f1000000000846121c290919063ffffffff16565b61223d90919063ffffffff16565b60016000828254611abd9190613a07565b925050819055505050565b60026000541415611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b059061394a565b60405180910390fd5b6002600081905550611b1f336124ef565b6001600081905550565b60026000541415611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b669061394a565b60405180910390fd5b6002600081905550611b8033612bab565b6001600081905550565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c119061396a565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb4280c2c6d34a766a6e479b994060c3b1390228520ecfccc63ce21cd32ebbc6481604051611c8a91906136d2565b60405180910390a150565b60026000541415611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061394a565b60405180910390fd5b6002600081905550611d303333600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612663565b6001600081905550565b60026000541415611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d779061394a565b60405180910390fd5b60026000819055506000611d9382612daf565b9050600654811015611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd19061392a565b60405180910390fd5b611de43382610c6d565b50600160008190555050565b60026000541415611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d9061394a565b60405180910390fd5b6002600081905550611e49338284612663565b60016000819055505050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e91576000611e9b565b611e9a83611430565b5b905092915050565b60075481565b600080600254600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154611efc9190613a07565b9050438111611f0c576000611f20565b611f1f438261228790919063ffffffff16565b5b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf9061396a565b60405180910390fd5b806008819055507f08ac8802e9e8a639797eea08f528069fa79711b44449d7fb8e3d40487fab06b381604051611fee91906139aa565b60405180910390a150565b60006120ac60055473e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161204e91906136d2565b60206040518083038186803b15801561206657600080fd5b505afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e919061336d565b61228790919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121389061396a565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a4816040516121b191906136d2565b60405180910390a150565b60035481565b6000808314156121d55760009050612237565b600082846121e39190613a8e565b90508284826121f29190613a5d565b14612232576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122299061382a565b60405180910390fd5b809150505b92915050565b600061227f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613002565b905092915050565b60006122c983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613065565b905092915050565b60006122dc82611195565b905060008114156122ed57506124ad565b43600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061237f600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612416929190613724565b602060405180830381600087803b15801561243057600080fd5b505af1158015612444573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246891906132b8565b9050806124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a19061398a565b60405180910390fd5b50505b50565b60006124e86ec097ce7bc90715b34b9f10000000006124da600154856121c290919063ffffffff16565b61223d90919063ffffffff16565b9050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411612574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256b9061388a565b60405180910390fd5b43600354600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546125c59190613a07565b1115612606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fd9061390a565b60405180910390fd5b600061261182611195565b905060008111612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d906137ea565b60405180910390fd5b61265f826122d1565b5050565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154116126e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126df9061388a565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015801561273a5750600081115b612779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612770906137ca565b60405180910390fd5b6000600254600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546127cb9190613a07565b90506127d6846122d1565b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561288757600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550506129eb565b612913826040518060400160405280601881526020017f496e73756666696369656e74204c6f636b20416d6f756e740000000000000000815250600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546130659092919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506129a4600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b612a37826040518060400160405280600f81526020017f4e65676174697665204c6f636b656400000000000000000000000000000000008152506005546130659092919063ffffffff16565b6005819055506000438211612a4c5782612a56565b612a55836130c9565b5b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86846040518363ffffffff1660e01b8152600401612aa9929190613724565b602060405180830381600087803b158015612ac357600080fd5b505af1158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afb91906132b8565b905080612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b349061378a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612b9b91906139aa565b60405180910390a3505050505050565b6000612bb682611195565b905060008111612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf2906138ca565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612c4d9190613a07565b9250508190555043600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612ce6600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055508060056000828254612d3e9190613a07565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612da391906139aa565b60405180910390a35050565b60008073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612dff91906136d2565b60206040518083038186803b158015612e1757600080fd5b505afa158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f919061336d565b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401612ea4939291906136ed565b602060405180830381600087803b158015612ebe57600080fd5b505af1158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef691906132b8565b90506000612fa98373e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f4b91906136d2565b60206040518083038186803b158015612f6357600080fd5b505afa158015612f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9b919061336d565b61228790919063ffffffff16565b9050818015612fb85750848111155b612ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fee9061380a565b60405180910390fd5b809350505050919050565b60008083118290613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130409190613768565b60405180910390fd5b50600083856130589190613a5d565b9050809150509392505050565b60008383111582906130ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a49190613768565b60405180910390fd5b50600083856130bc9190613ae8565b9050809150509392505050565b6000806130f460646130e6600854866121c290919063ffffffff16565b61223d90919063ffffffff16565b905061312c60055461311e6ec097ce7bc90715b34b9f1000000000846121c290919063ffffffff16565b61223d90919063ffffffff16565b6001600082825461313d9190613a07565b92505081905550613157818461228790919063ffffffff16565b915050919050565b60008135905061316e81613ef5565b92915050565b60008135905061318381613f0c565b92915050565b60008151905061319881613f0c565b92915050565b6000813590506131ad81613f23565b92915050565b6000815190506131c281613f23565b92915050565b6000602082840312156131da57600080fd5b60006131e88482850161315f565b91505092915050565b6000806040838503121561320457600080fd5b60006132128582860161315f565b92505060206132238582860161315f565b9150509250929050565b60008060006060848603121561324257600080fd5b60006132508682870161315f565b93505060206132618682870161315f565b92505060406132728682870161319e565b9150509250925092565b6000806040838503121561328f57600080fd5b600061329d8582860161315f565b92505060206132ae8582860161319e565b9150509250929050565b6000602082840312156132ca57600080fd5b60006132d884828501613189565b91505092915050565b600080600080608085870312156132f757600080fd5b600061330587828801613174565b94505060206133168782880161315f565b93505060406133278782880161319e565b92505060606133388782880161315f565b91505092959194509250565b60006020828403121561335657600080fd5b60006133648482850161319e565b91505092915050565b60006020828403121561337f57600080fd5b600061338d848285016131b3565b91505092915050565b600080604083850312156133a957600080fd5b60006133b78582860161319e565b92505060206133c88582860161315f565b9150509250929050565b6133db81613b1c565b82525050565b6133ea81613b2e565b82525050565b60006133fb826139e0565b61340581856139f6565b9350613415818560208601613b71565b61341e81613c02565b840191505092915050565b6000613436601c836139f6565b915061344182613c13565b602082019050919050565b60006134596016836139f6565b915061346482613c3c565b602082019050919050565b600061347c6013836139f6565b915061348782613c65565b602082019050919050565b600061349f600c836139f6565b91506134aa82613c8e565b602082019050919050565b60006134c26014836139f6565b91506134cd82613cb7565b602082019050919050565b60006134e56021836139f6565b91506134f082613ce0565b604082019050919050565b60006135086018836139f6565b915061351382613d2f565b602082019050919050565b600061352b6012836139f6565b915061353682613d58565b602082019050919050565b600061354e6012836139f6565b915061355982613d81565b602082019050919050565b60006135716014836139f6565b915061357c82613daa565b602082019050919050565b6000613594600b836139f6565b915061359f82613dd3565b602082019050919050565b60006135b76019836139f6565b91506135c282613dfc565b602082019050919050565b60006135da6000836139eb565b91506135e582613e25565b600082019050919050565b60006135fd601b836139f6565b915061360882613e28565b602082019050919050565b6000613620601c836139f6565b915061362b82613e51565b602082019050919050565b6000613643601f836139f6565b915061364e82613e7a565b602082019050919050565b6000613666600a836139f6565b915061367182613ea3565b602082019050919050565b60006136896019836139f6565b915061369482613ecc565b602082019050919050565b6136a881613b5a565b82525050565b6136b781613b64565b82525050565b60006136c8826135cd565b9150819050919050565b60006020820190506136e760008301846133d2565b92915050565b600060608201905061370260008301866133d2565b61370f60208301856133d2565b61371c604083018461369f565b949350505050565b600060408201905061373960008301856133d2565b613746602083018461369f565b9392505050565b600060208201905061376260008301846133e1565b92915050565b6000602082019050818103600083015261378281846133f0565b905092915050565b600060208201905081810360008301526137a381613429565b9050919050565b600060208201905081810360008301526137c38161344c565b9050919050565b600060208201905081810360008301526137e38161346f565b9050919050565b6000602082019050818103600083015261380381613492565b9050919050565b60006020820190508181036000830152613823816134b5565b9050919050565b60006020820190508181036000830152613843816134d8565b9050919050565b60006020820190508181036000830152613863816134fb565b9050919050565b600060208201905081810360008301526138838161351e565b9050919050565b600060208201905081810360008301526138a381613541565b9050919050565b600060208201905081810360008301526138c381613564565b9050919050565b600060208201905081810360008301526138e381613587565b9050919050565b60006020820190508181036000830152613903816135aa565b9050919050565b60006020820190508181036000830152613923816135f0565b9050919050565b6000602082019050818103600083015261394381613613565b9050919050565b6000602082019050818103600083015261396381613636565b9050919050565b6000602082019050818103600083015261398381613659565b9050919050565b600060208201905081810360008301526139a38161367c565b9050919050565b60006020820190506139bf600083018461369f565b92915050565b60006020820190506139da60008301846136ae565b92915050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613a1282613b5a565b9150613a1d83613b5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5257613a51613ba4565b5b828201905092915050565b6000613a6882613b5a565b9150613a7383613b5a565b925082613a8357613a82613bd3565b5b828204905092915050565b6000613a9982613b5a565b9150613aa483613b5a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613add57613adc613ba4565b5b828202905092915050565b6000613af382613b5a565b9150613afe83613b5a565b925082821015613b1157613b10613ba4565b5b828203905092915050565b6000613b2782613b3a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613b8f578082015181840152602081019050613b74565b83811115613b9e576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f4661696c757265206f6e204c5020546f6b656e205472616e7366657200000000600082015250565b7f4661696c757265206f6e20446576205061796d656e7400000000000000000000600082015250565b7f496e73756666696369656e7420546f6b656e7300000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f4572726f72204f6e205472616e7366657220496e000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c757265206f6e204b4559532050757263686173650000000000000000600082015250565b7f4c6f636b2054696d6520546f6f204c6f6e670000000000000000000000000000600082015250565b7f5a65726f20546f6b656e73204c6f636b65640000000000000000000000000000600082015250565b7f496e73756666696369656e742042616c616e6365000000000000000000000000600082015250565b7f5a65726f20416d6f756e74000000000000000000000000000000000000000000600082015250565b7f4661696c757265206f6e20455448205769746864726177616c00000000000000600082015250565b50565b7f436c61696d20576169742054696d65204e6f7420526561636865640000000000600082015250565b7f4d696e696d756d20546f205374616b65204e6f74205265616368656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4f6e6c79204f776e657200000000000000000000000000000000000000000000600082015250565b7f4661696c757265204f6e20546f6b656e205472616e7366657200000000000000600082015250565b613efe81613b1c565b8114613f0957600080fd5b50565b613f1581613b2e565b8114613f2057600080fd5b50565b613f2c81613b5a565b8114613f3757600080fd5b5056fea2646970667358221220ceeb287112015a04dbdc006a9663175da08b5578d2cfe10f836f9d281e5e2b8d64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80638df0c65c11610123578063cd24b0a3116100ab578063e231dc271161006f578063e231dc271461085c578063e4049b0314610899578063ec1371f2146108c2578063f2fde38b146108ed578063f4808210146109165761028c565b8063cd24b0a31461078b578063d76bc1ab146107a2578063da2a37f2146107cb578063dd62ed3e146107f4578063ddca3f43146108315761028c565b8063ae04d45d116100f2578063ae04d45d146106e2578063b6b55f251461070b578063b88a802f14610734578063bbef7bbf1461074b578063c69bebe4146107625761028c565b80638df0c65c146106285780639012c4a81461065157806395d89b411461067a578063a9059cbb146106a55761028c565b806331d7a262116101b15780636198e339116101755780636198e339146105315780636d07b7e51461055a57806370a082311461059757806370bc1c24146105d45780638da5cb5b146105fd5761028c565b806331d7a26214610436578063401738111461047357806343deb2921461049e5780634783c35b146104c95780634fe24748146104f45761028c565b80630dd27dee116101f85780630dd27dee1461034f57806315bbd78f1461037857806318160ddd146103a357806323b872dd146103ce578063313ce5671461040b5761028c565b8063030cd3161461029157806306fdde03146102bc578063095ea7b3146102e75780630d668087146103245761028c565b3661028c576000610238610941565b905060065481101561027f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102769061392a565b60405180910390fd5b6102893382610c6d565b50005b600080fd5b34801561029d57600080fd5b506102a6610ec2565b6040516102b391906139aa565b60405180910390f35b3480156102c857600080fd5b506102d1610f66565b6040516102de9190613768565b60405180910390f35b3480156102f357600080fd5b5061030e6004803603810190610309919061327c565b610fa3565b60405161031b919061374d565b60405180910390f35b34801561033057600080fd5b5061033961102b565b60405161034691906139aa565b60405180910390f35b34801561035b57600080fd5b50610376600480360381019061037191906131c8565b611031565b005b34801561038457600080fd5b5061038d611093565b60405161039a91906139aa565b60405180910390f35b3480156103af57600080fd5b506103b8611099565b6040516103c591906139aa565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061322d565b6110a3565b604051610402919061374d565b60405180910390f35b34801561041757600080fd5b5061042061118c565b60405161042d91906139c5565b60405180910390f35b34801561044257600080fd5b5061045d600480360381019061045891906131c8565b611195565b60405161046a91906139aa565b60405180910390f35b34801561047f57600080fd5b50610488611275565b60405161049591906139aa565b60405180910390f35b3480156104aa57600080fd5b506104b361127b565b6040516104c091906139aa565b60405180910390f35b3480156104d557600080fd5b506104de611281565b6040516104eb91906136d2565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906131c8565b6112a7565b60405161052891906139aa565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613344565b61134d565b005b34801561056657600080fd5b50610581600480360381019061057c91906131c8565b6113b1565b60405161058e91906139aa565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b991906131c8565b611430565b6040516105cb91906139aa565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613344565b61147c565b005b34801561060957600080fd5b5061061261154d565b60405161061f91906136d2565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906132e1565b611573565b005b34801561065d57600080fd5b5061067860048036038101906106739190613344565b611793565b005b34801561068657600080fd5b5061068f611864565b60405161069c9190613768565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c7919061327c565b6118a1565b6040516106d9919061374d565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613344565b611952565b005b34801561071757600080fd5b50610732600480360381019061072d9190613344565b611a69565b005b34801561074057600080fd5b50610749611ac8565b005b34801561075757600080fd5b50610760611b29565b005b34801561076e57600080fd5b50610789600480360381019061078491906131c8565b611b8a565b005b34801561079757600080fd5b506107a0611c95565b005b3480156107ae57600080fd5b506107c960048036038101906107c49190613344565b611d3a565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613396565b611df0565b005b34801561080057600080fd5b5061081b600480360381019061081691906131f1565b611e55565b60405161082891906139aa565b60405180910390f35b34801561083d57600080fd5b50610846611ea3565b60405161085391906139aa565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e91906131c8565b611ea9565b60405161089091906139aa565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb9190613344565b611f28565b005b3480156108ce57600080fd5b506108d7611ff9565b6040516108e491906139aa565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f91906131c8565b6120b1565b005b34801561092257600080fd5b5061092b6121bc565b60405161093891906139aa565b60405180910390f35b60008061096c606461095e600754346121c290919063ffffffff16565b61223d90919063ffffffff16565b90506000610983823461228790919063ffffffff16565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516109cd906136bd565b60006040518083038185875af1925050503d8060008114610a0a576040519150601f19603f3d011682016040523d82523d6000602084013e610a0f565b606091505b5050905080610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a906137aa565b60405180910390fd5b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa291906136d2565b60206040518083038186803b158015610aba57600080fd5b505afa158015610ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af2919061336d565b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1684604051610b2e906136bd565b60006040518083038185875af1925050503d8060008114610b6b576040519150601f19603f3d011682016040523d82523d6000602084013e610b70565b606091505b5050905080610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab9061384a565b60405180910390fd5b610c638273e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c0591906136d2565b60206040518083038186803b158015610c1d57600080fd5b505afa158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c55919061336d565b61228790919063ffffffff16565b9550505050505090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610cc657610cc1826122d1565b610d0e565b43600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610d609190613a07565b9250508190555043600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610df9600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055508060056000828254610e519190613a07565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610eb691906139aa565b60405180910390a35050565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f1191906136d2565b60206040518083038186803b158015610f2957600080fd5b505afa158015610f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f61919061336d565b905090565b60606040518060400160405280600b81526020017f4c6f636b6564204b657973000000000000000000000000000000000000000000815250905090565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015801561102357503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b60025481565b60026000541415611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e9061394a565b60405180910390fd5b6002600081905550611088816124ef565b600160008190555050565b60085481565b6000600554905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110fd576110f8333384612663565b61114a565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561113f5761113a33612bab565b611149565b611148336124ef565b5b5b6001801561118357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90509392505050565b60006009905090565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008114156111f0576000915050611270565b60006111fb826124b0565b90506000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015490508082116112575760009350505050611270565b61126a818361228790919063ffffffff16565b93505050505b919050565b60015481565b60065481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016112f691906136d2565b60206040518083038186803b15801561130e57600080fd5b505afa158015611322573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611346919061336d565b9050919050565b60026000541415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a9061394a565b60405180910390fd5b60026000819055506113a6333383612663565b600160008190555050565b600080600354600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546114049190613a07565b9050438111611414576000611428565b611427438261228790919063ffffffff16565b5b915050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461150c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115039061396a565b60405180910390fd5b806006819055507f6d8526a472074bf72afd527fb790d17be310e7ff54098a1d8bd565ff5bfa11c18160405161154291906139aa565b60405180910390a150565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061396a565b60405180910390fd5b83156116fe578147101561164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906138aa565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051611672906136bd565b60006040518083038185875af1925050503d80600081146116af576040519150601f19603f3d011682016040523d82523d6000602084013e6116b4565b606091505b50509050806116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906138ea565b60405180910390fd5b5061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401611739929190613724565b602060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b91906132b8565b505b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a9061396a565b60405180910390fd5b806007819055507f38e229a7f3f9c329892d08eb37c4e91ccac6d12c798d394990ca4f56028ec2668160405161185991906139aa565b60405180910390a150565b60606040518060400160405280600a81526020017f4c4f434b45444b45595300000000000000000000000000000000000000000000815250905090565b600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118fb576118f6333384612663565b611948565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561193d5761193833612bab565b611947565b611946336124ef565b5b5b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d99061396a565b60405180910390fd5b620f4240811115611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f9061386a565b60405180910390fd5b806002819055507f76f15e9a1f6aff29e3af90c686f28fc78998700d6fc4d719359b3db4057663eb81604051611a5e91906139aa565b60405180910390a150565b6000611a7482612daf565b9050611aac600554611a9e6ec097ce7bc90715b34b9f1000000000846121c290919063ffffffff16565b61223d90919063ffffffff16565b60016000828254611abd9190613a07565b925050819055505050565b60026000541415611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b059061394a565b60405180910390fd5b6002600081905550611b1f336124ef565b6001600081905550565b60026000541415611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b669061394a565b60405180910390fd5b6002600081905550611b8033612bab565b6001600081905550565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c119061396a565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb4280c2c6d34a766a6e479b994060c3b1390228520ecfccc63ce21cd32ebbc6481604051611c8a91906136d2565b60405180910390a150565b60026000541415611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061394a565b60405180910390fd5b6002600081905550611d303333600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612663565b6001600081905550565b60026000541415611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d779061394a565b60405180910390fd5b60026000819055506000611d9382612daf565b9050600654811015611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd19061392a565b60405180910390fd5b611de43382610c6d565b50600160008190555050565b60026000541415611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d9061394a565b60405180910390fd5b6002600081905550611e49338284612663565b60016000819055505050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e91576000611e9b565b611e9a83611430565b5b905092915050565b60075481565b600080600254600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154611efc9190613a07565b9050438111611f0c576000611f20565b611f1f438261228790919063ffffffff16565b5b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf9061396a565b60405180910390fd5b806008819055507f08ac8802e9e8a639797eea08f528069fa79711b44449d7fb8e3d40487fab06b381604051611fee91906139aa565b60405180910390a150565b60006120ac60055473e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161204e91906136d2565b60206040518083038186803b15801561206657600080fd5b505afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e919061336d565b61228790919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121389061396a565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a4816040516121b191906136d2565b60405180910390a150565b60035481565b6000808314156121d55760009050612237565b600082846121e39190613a8e565b90508284826121f29190613a5d565b14612232576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122299061382a565b60405180910390fd5b809150505b92915050565b600061227f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613002565b905092915050565b60006122c983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613065565b905092915050565b60006122dc82611195565b905060008114156122ed57506124ad565b43600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061237f600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612416929190613724565b602060405180830381600087803b15801561243057600080fd5b505af1158015612444573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246891906132b8565b9050806124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a19061398a565b60405180910390fd5b50505b50565b60006124e86ec097ce7bc90715b34b9f10000000006124da600154856121c290919063ffffffff16565b61223d90919063ffffffff16565b9050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411612574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256b9061388a565b60405180910390fd5b43600354600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546125c59190613a07565b1115612606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fd9061390a565b60405180910390fd5b600061261182611195565b905060008111612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d906137ea565b60405180910390fd5b61265f826122d1565b5050565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154116126e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126df9061388a565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015801561273a5750600081115b612779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612770906137ca565b60405180910390fd5b6000600254600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546127cb9190613a07565b90506127d6846122d1565b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561288757600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550506129eb565b612913826040518060400160405280601881526020017f496e73756666696369656e74204c6f636b20416d6f756e740000000000000000815250600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546130659092919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506129a4600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b612a37826040518060400160405280600f81526020017f4e65676174697665204c6f636b656400000000000000000000000000000000008152506005546130659092919063ffffffff16565b6005819055506000438211612a4c5782612a56565b612a55836130c9565b5b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86846040518363ffffffff1660e01b8152600401612aa9929190613724565b602060405180830381600087803b158015612ac357600080fd5b505af1158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afb91906132b8565b905080612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b349061378a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612b9b91906139aa565b60405180910390a3505050505050565b6000612bb682611195565b905060008111612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf2906138ca565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612c4d9190613a07565b9250508190555043600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612ce6600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546124b0565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055508060056000828254612d3e9190613a07565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612da391906139aa565b60405180910390a35050565b60008073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612dff91906136d2565b60206040518083038186803b158015612e1757600080fd5b505afa158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f919061336d565b9050600073e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401612ea4939291906136ed565b602060405180830381600087803b158015612ebe57600080fd5b505af1158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef691906132b8565b90506000612fa98373e0a189c975e4928222978a74517442239a0b86ff73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f4b91906136d2565b60206040518083038186803b158015612f6357600080fd5b505afa158015612f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9b919061336d565b61228790919063ffffffff16565b9050818015612fb85750848111155b612ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fee9061380a565b60405180910390fd5b809350505050919050565b60008083118290613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130409190613768565b60405180910390fd5b50600083856130589190613a5d565b9050809150509392505050565b60008383111582906130ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a49190613768565b60405180910390fd5b50600083856130bc9190613ae8565b9050809150509392505050565b6000806130f460646130e6600854866121c290919063ffffffff16565b61223d90919063ffffffff16565b905061312c60055461311e6ec097ce7bc90715b34b9f1000000000846121c290919063ffffffff16565b61223d90919063ffffffff16565b6001600082825461313d9190613a07565b92505081905550613157818461228790919063ffffffff16565b915050919050565b60008135905061316e81613ef5565b92915050565b60008135905061318381613f0c565b92915050565b60008151905061319881613f0c565b92915050565b6000813590506131ad81613f23565b92915050565b6000815190506131c281613f23565b92915050565b6000602082840312156131da57600080fd5b60006131e88482850161315f565b91505092915050565b6000806040838503121561320457600080fd5b60006132128582860161315f565b92505060206132238582860161315f565b9150509250929050565b60008060006060848603121561324257600080fd5b60006132508682870161315f565b93505060206132618682870161315f565b92505060406132728682870161319e565b9150509250925092565b6000806040838503121561328f57600080fd5b600061329d8582860161315f565b92505060206132ae8582860161319e565b9150509250929050565b6000602082840312156132ca57600080fd5b60006132d884828501613189565b91505092915050565b600080600080608085870312156132f757600080fd5b600061330587828801613174565b94505060206133168782880161315f565b93505060406133278782880161319e565b92505060606133388782880161315f565b91505092959194509250565b60006020828403121561335657600080fd5b60006133648482850161319e565b91505092915050565b60006020828403121561337f57600080fd5b600061338d848285016131b3565b91505092915050565b600080604083850312156133a957600080fd5b60006133b78582860161319e565b92505060206133c88582860161315f565b9150509250929050565b6133db81613b1c565b82525050565b6133ea81613b2e565b82525050565b60006133fb826139e0565b61340581856139f6565b9350613415818560208601613b71565b61341e81613c02565b840191505092915050565b6000613436601c836139f6565b915061344182613c13565b602082019050919050565b60006134596016836139f6565b915061346482613c3c565b602082019050919050565b600061347c6013836139f6565b915061348782613c65565b602082019050919050565b600061349f600c836139f6565b91506134aa82613c8e565b602082019050919050565b60006134c26014836139f6565b91506134cd82613cb7565b602082019050919050565b60006134e56021836139f6565b91506134f082613ce0565b604082019050919050565b60006135086018836139f6565b915061351382613d2f565b602082019050919050565b600061352b6012836139f6565b915061353682613d58565b602082019050919050565b600061354e6012836139f6565b915061355982613d81565b602082019050919050565b60006135716014836139f6565b915061357c82613daa565b602082019050919050565b6000613594600b836139f6565b915061359f82613dd3565b602082019050919050565b60006135b76019836139f6565b91506135c282613dfc565b602082019050919050565b60006135da6000836139eb565b91506135e582613e25565b600082019050919050565b60006135fd601b836139f6565b915061360882613e28565b602082019050919050565b6000613620601c836139f6565b915061362b82613e51565b602082019050919050565b6000613643601f836139f6565b915061364e82613e7a565b602082019050919050565b6000613666600a836139f6565b915061367182613ea3565b602082019050919050565b60006136896019836139f6565b915061369482613ecc565b602082019050919050565b6136a881613b5a565b82525050565b6136b781613b64565b82525050565b60006136c8826135cd565b9150819050919050565b60006020820190506136e760008301846133d2565b92915050565b600060608201905061370260008301866133d2565b61370f60208301856133d2565b61371c604083018461369f565b949350505050565b600060408201905061373960008301856133d2565b613746602083018461369f565b9392505050565b600060208201905061376260008301846133e1565b92915050565b6000602082019050818103600083015261378281846133f0565b905092915050565b600060208201905081810360008301526137a381613429565b9050919050565b600060208201905081810360008301526137c38161344c565b9050919050565b600060208201905081810360008301526137e38161346f565b9050919050565b6000602082019050818103600083015261380381613492565b9050919050565b60006020820190508181036000830152613823816134b5565b9050919050565b60006020820190508181036000830152613843816134d8565b9050919050565b60006020820190508181036000830152613863816134fb565b9050919050565b600060208201905081810360008301526138838161351e565b9050919050565b600060208201905081810360008301526138a381613541565b9050919050565b600060208201905081810360008301526138c381613564565b9050919050565b600060208201905081810360008301526138e381613587565b9050919050565b60006020820190508181036000830152613903816135aa565b9050919050565b60006020820190508181036000830152613923816135f0565b9050919050565b6000602082019050818103600083015261394381613613565b9050919050565b6000602082019050818103600083015261396381613636565b9050919050565b6000602082019050818103600083015261398381613659565b9050919050565b600060208201905081810360008301526139a38161367c565b9050919050565b60006020820190506139bf600083018461369f565b92915050565b60006020820190506139da60008301846136ae565b92915050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613a1282613b5a565b9150613a1d83613b5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5257613a51613ba4565b5b828201905092915050565b6000613a6882613b5a565b9150613a7383613b5a565b925082613a8357613a82613bd3565b5b828204905092915050565b6000613a9982613b5a565b9150613aa483613b5a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613add57613adc613ba4565b5b828202905092915050565b6000613af382613b5a565b9150613afe83613b5a565b925082821015613b1157613b10613ba4565b5b828203905092915050565b6000613b2782613b3a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613b8f578082015181840152602081019050613b74565b83811115613b9e576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f4661696c757265206f6e204c5020546f6b656e205472616e7366657200000000600082015250565b7f4661696c757265206f6e20446576205061796d656e7400000000000000000000600082015250565b7f496e73756666696369656e7420546f6b656e7300000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f4572726f72204f6e205472616e7366657220496e000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c757265206f6e204b4559532050757263686173650000000000000000600082015250565b7f4c6f636b2054696d6520546f6f204c6f6e670000000000000000000000000000600082015250565b7f5a65726f20546f6b656e73204c6f636b65640000000000000000000000000000600082015250565b7f496e73756666696369656e742042616c616e6365000000000000000000000000600082015250565b7f5a65726f20416d6f756e74000000000000000000000000000000000000000000600082015250565b7f4661696c757265206f6e20455448205769746864726177616c00000000000000600082015250565b50565b7f436c61696d20576169742054696d65204e6f7420526561636865640000000000600082015250565b7f4d696e696d756d20546f205374616b65204e6f74205265616368656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4f6e6c79204f776e657200000000000000000000000000000000000000000000600082015250565b7f4661696c757265204f6e20546f6b656e205472616e7366657200000000000000600082015250565b613efe81613b1c565b8114613f0957600080fd5b50565b613f1581613b2e565b8114613f2057600080fd5b50565b613f2c81613b5a565b8114613f3757600080fd5b5056fea2646970667358221220ceeb287112015a04dbdc006a9663175da08b5578d2cfe10f836f9d281e5e2b8d64736f6c63430008040033

Deployed Bytecode Sourcemap

294:13009:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13149:16;13168:10;:8;:10::i;:::-;13149:29;;13209:10;;13197:8;:22;;13189:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13263:27;13269:10;13281:8;13263:5;:27::i;:::-;13111:187;294:13009;;;;;12968:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2380:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2683:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;705:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5683:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1342:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2015:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3269:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2593:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12192:467;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;638:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1190:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1412:68;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12826:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5794:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11805:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2108:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4412:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1511:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4775:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3972:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2486:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2866:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4572:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5391:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5579:92;;;;;;;;;;;;;:::i;:::-;;6444:90;;;;;;;;;;;;;:::i;:::-;;4102:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6071:125;;;;;;;;;;;;;:::i;:::-;;6208:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5918:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2228:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1271:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11577:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4269:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12671:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3818:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;778:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8495:578;8533:7;8563:17;8583:27;8606:3;8583:18;8597:3;;8583:9;:13;;:18;;;;:::i;:::-;:22;;:27;;;;:::i;:::-;8563:47;;8621:22;8646:24;8660:9;8646;:13;;:24;;;;:::i;:::-;8621:49;;8692:12;8717:8;;;;;;;;;;;8709:22;;8739:9;8709:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8691:62;;;8772:7;8764:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;8827:14;481:42;8844:22;;;8875:4;8844:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8827:54;;8893:6;481:42;8904:18;;8930:14;8904:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8892:57;;;8968:1;8960:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9016:49;9058:6;481:42;9016:22;;;9047:4;9016:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:49;;;;:::i;:::-;9009:56;;;;;;;8495:578;:::o;9085:618::-;9192:1;9165:5;:11;9171:4;9165:11;;;;;;;;;;;;;;;:24;;;:28;9161:180;;;9230:18;9243:4;9230:12;:18::i;:::-;9161:180;;;9317:12;9293:5;:11;9299:4;9293:11;;;;;;;;;;;;;;;:21;;:36;;;;9161:180;9417:8;9389:5;:11;9395:4;9389:11;;;;;;;;;;;;;;;:24;;;:36;;;;;;;:::i;:::-;;;;;;;;9461:12;9436:5;:11;9442:4;9436:11;;;;;;;;;;;;;;;:22;;:37;;;;9512:42;9529:5;:11;9535:4;9529:11;;;;;;;;;;;;;;;:24;;;9512:16;:42::i;:::-;9484:5;:11;9490:4;9484:11;;;;;;;;;;;;;;;:25;;:70;;;;9625:8;9610:11;;:23;;;;;;;:::i;:::-;;;;;;;;9680:4;9659:36;;9676:1;9659:36;;;9686:8;9659:36;;;;;;:::i;:::-;;;;;;;;9085:618;;:::o;12968:135::-;13031:7;481:42;13058:22;;;13089:4;13058:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13051:44;;12968:135;:::o;2380:100::-;2426:13;2452:20;;;;;;;;;;;;;;;;;;;2380:100;:::o;2683:177::-;2763:4;2821:6;2787:5;:17;2793:10;2787:17;;;;;;;;;;;;;;;:30;;;:40;;:65;;;;;2842:10;2831:21;;:7;:21;;;;2787:65;2780:72;;2683:177;;;;:::o;705:33::-;;;;:::o;5683:99::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;5758:16:3::1;5769:4;5758:10;:16::i;:::-;139:1:4::0;435:7;:22;;;;5683:99:3;:::o;1342:27::-;;;;:::o;2015:87::-;2070:7;2088:11;;2081:18;;2015:87;:::o;3269:402::-;3369:4;481:42;3390:17;;:9;:17;;;3386:233;;;3424:39;3432:10;3444;3456:6;3424:7;:39::i;:::-;3386:233;;;3506:4;3485:26;;:9;:26;;;3481:138;;;3527:25;3541:10;3527:13;:25::i;:::-;3481:138;;;3585:22;3596:10;3585;:22::i;:::-;3481:138;3386:233;3636:4;:27;;;;;3654:9;3644:19;;:6;:19;;;3636:27;3629:34;;3269:402;;;;;:::o;2593:84::-;2643:5;2668:1;2661:8;;2593:84;:::o;12192:467::-;12251:7;12271:14;12288:5;:11;12294:4;12288:11;;;;;;;;;;;;;;;:24;;;12271:41;;12336:1;12326:6;:11;12323:28;;;12347:1;12340:8;;;;;12323:28;12363:33;12399:24;12416:6;12399:16;:24::i;:::-;12363:60;;12434:32;12469:5;:11;12475:4;12469:11;;;;;;;;;;;;;;;:25;;;12434:60;;12539:24;12510:25;:53;12507:70;;12573:1;12566:8;;;;;;;12507:70;12596:55;12626:24;12596:25;:29;;:55;;;;:::i;:::-;12589:62;;;;;12192:467;;;;:::o;638:32::-;;;;:::o;1190:39::-;;;;:::o;1412:68::-;;;;;;;;;;;;;:::o;12826:130::-;12893:7;481:42;12920:22;;;12943:4;12920:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12913:35;;12826:130;;;:::o;5794:112::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;5859:39:3::1;5867:10;5879;5891:6;5859:7;:39::i;:::-;139:1:4::0;435:7;:22;;;;5794:112:3;:::o;11805:221::-;11873:7;11893:15;11935:11;;11911:5;:11;11917:4;11911:11;;;;;;;;;;;;;;;:21;;;:35;;;;:::i;:::-;11893:53;;11974:12;11964:7;:22;:54;;12017:1;11964:54;;;11989:25;12001:12;11989:7;:11;;:25;;;;:::i;:::-;11964:54;11957:61;;;11805:221;;;:::o;2108:114::-;2174:7;2192:5;:14;2198:7;2192:14;;;;;;;;;;;;;;;:27;;;2185:34;;2108:114;;;:::o;4412:148::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4499:7:::1;4486:10;:20;;;;4522:30;4544:7;4522:30;;;;;;:::i;:::-;;;;;;;;4412:148:::0;:::o;1511:20::-;;;;;;;;;;;;;:::o;4775:412::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4887:3:::1;4883:297;;;4940:6;4915:21;:31;;4907:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4987:6;5006:9;4998:23;;5029:6;4998:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4986:54;;;5063:1;5055:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;4883:297;;;;5134:5;5127:22;;;5150:9;5161:6;5127:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4883:297;4775:412:::0;;;;:::o;3972:118::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4043:6:::1;4037:3;:12;;;;4065:17;4075:6;4065:17;;;;;;:::i;:::-;;;;;;;;3972:118:::0;:::o;2486:101::-;2534:13;2560:19;;;;;;;;;;;;;;;;;;;2486:101;:::o;2866:397::-;2946:4;481:42;3005:17;;:9;:17;;;3001:233;;;3039:39;3047:10;3059;3071:6;3039:7;:39::i;:::-;3001:233;;;3121:4;3100:26;;:9;:26;;;3096:138;;;3142:25;3156:10;3142:13;:25::i;:::-;3096:138;;;3200:22;3211:10;3200;:22::i;:::-;3096:138;3001:233;3251:4;3244:11;;2866:397;;;;:::o;4572:191::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4659:5:::1;4648:7;:16;;4640:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;4709:7;4698:8;:18;;;;4732:23;4747:7;4732:23;;;;;;:::i;:::-;;;;;;;;4572:191:::0;:::o;5391:180::-;5453:16;5472:19;5484:6;5472:11;:19::i;:::-;5453:38;;5523:40;5551:11;;5523:23;586:6;5523:8;:12;;:23;;;;:::i;:::-;:27;;:40;;;;:::i;:::-;5502:17;;:61;;;;;;;:::i;:::-;;;;;;;;5391:180;;:::o;5579:92::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;5635:22:3::1;5646:10;5635;:22::i;:::-;139:1:4::0;435:7;:22;;;;5579:92:3:o;6444:90::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6501:25:3::1;6515:10;6501:13;:25::i;:::-;139:1:4::0;435:7;:22;;;;6444:90:3:o;4102:155::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:11:::1;4180:8;;:22;;;;;;;;;;;;;;;;;;4218:31;4237:11;4218:31;;;;;;:::i;:::-;;;;;;;;4102:155:::0;:::o;6071:125::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6125:63:3::1;6133:10;6145;6157:5;:17;6163:10;6157:17;;;;;;;;;;;;;;;:30;;;6125:7;:63::i;:::-;139:1:4::0;435:7;:22;;;;6071:125:3:o;6208:228::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6277:16:3::1;6296:20;6308:7;6296:11;:20::i;:::-;6277:39;;6347:10;;6335:8;:22;;6327:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6401:27;6407:10;6419:8;6401:5;:27::i;:::-;423:1:4;139::::0;435:7;:22;;;;6208:228:3;:::o;5918:141::-;183:1:4;328:7;;:19;;320:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;183:1;394:7;:18;;;;6009:42:3::1;6017:10;6029:13;6044:6;6009:7;:42::i;:::-;139:1:4::0;435:7;:22;;;;5918:141:3;;:::o;2228:146::-;2312:7;2340;2330:17;;:6;:17;;;:41;;2370:1;2330:41;;;2350:17;2360:6;2350:9;:17::i;:::-;2330:41;2323:48;;2228:146;;;;:::o;1271:22::-;;;;:::o;11577:216::-;11642:7;11662:15;11705:8;;11680:5;:11;11686:4;11680:11;;;;;;;;;;;;;;;:22;;;:33;;;;:::i;:::-;11662:51;;11741:12;11731:7;:22;:54;;11784:1;11731:54;;;11756:25;11768:12;11756:7;:11;;:25;;;;:::i;:::-;11731:54;11724:61;;;11577:216;;;:::o;4269:131::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4347:6:::1;4336:8;:17;;;;4369:23;4385:6;4369:23;;;;;;:::i;:::-;;;;;;;;4269:131:::0;:::o;12671:143::-;12725:7;12752:54;12794:11;;481:42;12752:22;;;12783:4;12752:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:54;;;;:::i;:::-;12745:61;;12671:143;:::o;3818:142::-;1576:10;1567:19;;:5;;;;;;;;;;;:19;;;1559:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;3901:8:::1;3893:5;;:16;;;;;;;;;;;;;;;;;;3925:27;3943:8;3925:27;;;;;;:::i;:::-;;;;;;;;3818:142:::0;:::o;778:35::-;;;;:::o;1675:471:5:-;1733:7;1983:1;1978;:6;1974:47;;;2008:1;2001:8;;;;1974:47;2033:9;2049:1;2045;:5;;;;:::i;:::-;2033:17;;2078:1;2073;2069;:5;;;;:::i;:::-;:10;2061:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:1;2130:8;;;1675:471;;;;;:::o;2622:132::-;2680:7;2707:39;2711:1;2714;2707:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2700:46;;2622:132;;;;:::o;785:136::-;843:7;870:43;874:1;877;870:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;863:50;;785:136;;;;:::o;7609:447:3:-;7675:14;7692:20;7707:4;7692:14;:20::i;:::-;7675:37;;7737:1;7727:6;:11;7723:24;;;7740:7;;;7723:24;7823:12;7799:5;:11;7805:4;7799:11;;;;;;;;;;;;;;;:21;;:36;;;;7874:42;7891:5;:11;7897:4;7891:11;;;;;;;;;;;;;;;:24;;;7874:16;:42::i;:::-;7846:5;:11;7852:4;7846:11;;;;;;;;;;;;;;;:25;;:70;;;;7955:6;481:42;7964:21;;;7986:4;7992:6;7964:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7955:44;;8018:1;8010:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7609:447;;;;:::o;12038:142::-;12102:7;12129:43;586:6;12129:28;12139:17;;12129:5;:9;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;12122:50;;12038:142;;;:::o;7204:393::-;7331:1;7304:5;:11;7310:4;7304:11;;;;;;;;;;;;;;;:24;;;:28;7296:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;7413:12;7398:11;;7374:5;:11;7380:4;7374:11;;;;;;;;;;;;;;;:21;;;:35;;;;:::i;:::-;:51;;7366:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;7478:14;7495:20;7510:4;7495:14;:20::i;:::-;7478:37;;7543:1;7534:6;:10;7526:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;7571:18;7584:4;7571:12;:18::i;:::-;7204:393;;:::o;9711:1334::-;9879:1;9852:5;:11;9858:4;9852:11;;;;;;;;;;;;;;;:24;;;:28;9844:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9950:7;9922:5;:11;9928:4;9922:11;;;;;;;;;;;;;;;:24;;;:35;;:50;;;;;9971:1;9961:7;:11;9922:50;9914:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;10040:22;10090:8;;10065:5;:11;10071:4;10065:11;;;;;;;;;;;;;;;:22;;;:33;;;;:::i;:::-;10040:58;;10145:18;10158:4;10145:12;:18::i;:::-;10251:7;10223:5;:11;10229:4;10223:11;;;;;;;;;;;;;;;:24;;;:35;10219:312;;;10282:5;:11;10288:4;10282:11;;;;;;;;;;;;;;;;10275:18;;;;;;;;;;;;;;;;;;;;;;;;;;10219:312;;;10369:65;10398:7;10369:65;;;;;;;;;;;;;;;;;:5;:11;10375:4;10369:11;;;;;;;;;;;;;;;:24;;;:28;;:65;;;;;:::i;:::-;10342:5;:11;10348:4;10342:11;;;;;;;;;;;;;;;:24;;:92;;;;10477:42;10494:5;:11;10500:4;10494:11;;;;;;;;;;;;;;;:24;;;10477:16;:42::i;:::-;10449:5;:11;10455:4;10449:11;;;;;;;;;;;;;;;:25;;:70;;;;10219:312;10597:43;10613:7;10597:43;;;;;;;;;;;;;;;;;:11;;:15;;:43;;;;;:::i;:::-;10583:11;:57;;;;10700:20;10740:12;10723:14;:29;:71;;10787:7;10723:71;;;10755:29;10776:7;10755:20;:29::i;:::-;10723:71;10700:94;;10848:6;481:42;10857:21;;;10879:9;10890:12;10857:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10848:55;;10922:1;10914:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;11025:1;11002:35;;11011:4;11002:35;;;11029:7;11002:35;;;;;;:::i;:::-;;;;;;;;9711:1334;;;;;;:::o;6542:521::-;6601:14;6618:20;6633:4;6618:14;:20::i;:::-;6601:37;;6666:1;6657:6;:10;6649:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;6752:6;6724:5;:11;6730:4;6724:11;;;;;;;;;;;;;;;:24;;;:34;;;;;;;:::i;:::-;;;;;;;;6793:12;6769:5;:11;6775:4;6769:11;;;;;;;;;;;;;;;:21;;:36;;;;6844:42;6861:5;:11;6867:4;6861:11;;;;;;;;;;;;;;;:24;;;6844:16;:42::i;:::-;6816:5;:11;6822:4;6816:11;;;;;;;;;;;;;;;:25;;:70;;;;6957:6;6942:11;;:21;;;;;;;:::i;:::-;;;;;;;;7042:4;7021:34;;7038:1;7021:34;;;7048:6;7021:34;;;;;;:::i;:::-;;;;;;;;6542:521;;:::o;8068:415::-;8123:7;8153:14;481:42;8170:22;;;8201:4;8170:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8153:54;;8218:6;481:42;8227:25;;;8253:10;8273:4;8280:6;8227:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8218:69;;8308:18;8329:49;8371:6;481:42;8329:22;;;8360:4;8329:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:49;;;;:::i;:::-;8308:70;;8397:1;:25;;;;;8416:6;8402:10;:20;;8397:25;8389:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;8465:10;8458:17;;;;;8068:415;;;:::o;3250:278:5:-;3336:7;3368:1;3364;:5;3371:12;3356:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3395:9;3411:1;3407;:5;;;;:::i;:::-;3395:17;;3519:1;3512:8;;;3250:278;;;;;:::o;1224:192::-;1310:7;1343:1;1338;:6;;1346:12;1330:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1370:9;1386:1;1382;:5;;;;:::i;:::-;1370:17;;1407:1;1400:8;;;1224:192;;;;;:::o;11057:373:3:-;11122:7;11186:11;11200:30;11226:3;11200:21;11212:8;;11200:7;:11;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;11186:44;;11312:35;11335:11;;11312:18;586:6;11312:3;:7;;:18;;;;:::i;:::-;:22;;:35;;;;:::i;:::-;11291:17;;:56;;;;;;;:::i;:::-;;;;;;;;11406:16;11418:3;11406:7;:11;;:16;;;;:::i;:::-;11399:23;;;11057:373;;;:::o;7:139:6:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;345:5;376:6;370:13;361:22;;392:30;416:5;392:30;:::i;:::-;351:77;;;;:::o;434:139::-;480:5;518:6;505:20;496:29;;534:33;561:5;534:33;:::i;:::-;486:87;;;;:::o;579:143::-;636:5;667:6;661:13;652:22;;683:33;710:5;683:33;:::i;:::-;642:80;;;;:::o;728:262::-;787:6;836:2;824:9;815:7;811:23;807:32;804:2;;;852:1;849;842:12;804:2;895:1;920:53;965:7;956:6;945:9;941:22;920:53;:::i;:::-;910:63;;866:117;794:196;;;;:::o;996:407::-;1064:6;1072;1121:2;1109:9;1100:7;1096:23;1092:32;1089:2;;;1137:1;1134;1127:12;1089:2;1180:1;1205:53;1250:7;1241:6;1230:9;1226:22;1205:53;:::i;:::-;1195:63;;1151:117;1307:2;1333:53;1378:7;1369:6;1358:9;1354:22;1333:53;:::i;:::-;1323:63;;1278:118;1079:324;;;;;:::o;1409:552::-;1486:6;1494;1502;1551:2;1539:9;1530:7;1526:23;1522:32;1519:2;;;1567:1;1564;1557:12;1519:2;1610:1;1635:53;1680:7;1671:6;1660:9;1656:22;1635:53;:::i;:::-;1625:63;;1581:117;1737:2;1763:53;1808:7;1799:6;1788:9;1784:22;1763:53;:::i;:::-;1753:63;;1708:118;1865:2;1891:53;1936:7;1927:6;1916:9;1912:22;1891:53;:::i;:::-;1881:63;;1836:118;1509:452;;;;;:::o;1967:407::-;2035:6;2043;2092:2;2080:9;2071:7;2067:23;2063:32;2060:2;;;2108:1;2105;2098:12;2060:2;2151:1;2176:53;2221:7;2212:6;2201:9;2197:22;2176:53;:::i;:::-;2166:63;;2122:117;2278:2;2304:53;2349:7;2340:6;2329:9;2325:22;2304:53;:::i;:::-;2294:63;;2249:118;2050:324;;;;;:::o;2380:278::-;2447:6;2496:2;2484:9;2475:7;2471:23;2467:32;2464:2;;;2512:1;2509;2502:12;2464:2;2555:1;2580:61;2633:7;2624:6;2613:9;2609:22;2580:61;:::i;:::-;2570:71;;2526:125;2454:204;;;;:::o;2664:692::-;2747:6;2755;2763;2771;2820:3;2808:9;2799:7;2795:23;2791:33;2788:2;;;2837:1;2834;2827:12;2788:2;2880:1;2905:50;2947:7;2938:6;2927:9;2923:22;2905:50;:::i;:::-;2895:60;;2851:114;3004:2;3030:53;3075:7;3066:6;3055:9;3051:22;3030:53;:::i;:::-;3020:63;;2975:118;3132:2;3158:53;3203:7;3194:6;3183:9;3179:22;3158:53;:::i;:::-;3148:63;;3103:118;3260:2;3286:53;3331:7;3322:6;3311:9;3307:22;3286:53;:::i;:::-;3276:63;;3231:118;2778:578;;;;;;;:::o;3362:262::-;3421:6;3470:2;3458:9;3449:7;3445:23;3441:32;3438:2;;;3486:1;3483;3476:12;3438:2;3529:1;3554:53;3599:7;3590:6;3579:9;3575:22;3554:53;:::i;:::-;3544:63;;3500:117;3428:196;;;;:::o;3630:284::-;3700:6;3749:2;3737:9;3728:7;3724:23;3720:32;3717:2;;;3765:1;3762;3755:12;3717:2;3808:1;3833:64;3889:7;3880:6;3869:9;3865:22;3833:64;:::i;:::-;3823:74;;3779:128;3707:207;;;;:::o;3920:407::-;3988:6;3996;4045:2;4033:9;4024:7;4020:23;4016:32;4013:2;;;4061:1;4058;4051:12;4013:2;4104:1;4129:53;4174:7;4165:6;4154:9;4150:22;4129:53;:::i;:::-;4119:63;;4075:117;4231:2;4257:53;4302:7;4293:6;4282:9;4278:22;4257:53;:::i;:::-;4247:63;;4202:118;4003:324;;;;;:::o;4333:118::-;4420:24;4438:5;4420:24;:::i;:::-;4415:3;4408:37;4398:53;;:::o;4457:109::-;4538:21;4553:5;4538:21;:::i;:::-;4533:3;4526:34;4516:50;;:::o;4572:364::-;4660:3;4688:39;4721:5;4688:39;:::i;:::-;4743:71;4807:6;4802:3;4743:71;:::i;:::-;4736:78;;4823:52;4868:6;4863:3;4856:4;4849:5;4845:16;4823:52;:::i;:::-;4900:29;4922:6;4900:29;:::i;:::-;4895:3;4891:39;4884:46;;4664:272;;;;;:::o;4942:366::-;5084:3;5105:67;5169:2;5164:3;5105:67;:::i;:::-;5098:74;;5181:93;5270:3;5181:93;:::i;:::-;5299:2;5294:3;5290:12;5283:19;;5088:220;;;:::o;5314:366::-;5456:3;5477:67;5541:2;5536:3;5477:67;:::i;:::-;5470:74;;5553:93;5642:3;5553:93;:::i;:::-;5671:2;5666:3;5662:12;5655:19;;5460:220;;;:::o;5686:366::-;5828:3;5849:67;5913:2;5908:3;5849:67;:::i;:::-;5842:74;;5925:93;6014:3;5925:93;:::i;:::-;6043:2;6038:3;6034:12;6027:19;;5832:220;;;:::o;6058:366::-;6200:3;6221:67;6285:2;6280:3;6221:67;:::i;:::-;6214:74;;6297:93;6386:3;6297:93;:::i;:::-;6415:2;6410:3;6406:12;6399:19;;6204:220;;;:::o;6430:366::-;6572:3;6593:67;6657:2;6652:3;6593:67;:::i;:::-;6586:74;;6669:93;6758:3;6669:93;:::i;:::-;6787:2;6782:3;6778:12;6771:19;;6576:220;;;:::o;6802:366::-;6944:3;6965:67;7029:2;7024:3;6965:67;:::i;:::-;6958:74;;7041:93;7130:3;7041:93;:::i;:::-;7159:2;7154:3;7150:12;7143:19;;6948:220;;;:::o;7174:366::-;7316:3;7337:67;7401:2;7396:3;7337:67;:::i;:::-;7330:74;;7413:93;7502:3;7413:93;:::i;:::-;7531:2;7526:3;7522:12;7515:19;;7320:220;;;:::o;7546:366::-;7688:3;7709:67;7773:2;7768:3;7709:67;:::i;:::-;7702:74;;7785:93;7874:3;7785:93;:::i;:::-;7903:2;7898:3;7894:12;7887:19;;7692:220;;;:::o;7918:366::-;8060:3;8081:67;8145:2;8140:3;8081:67;:::i;:::-;8074:74;;8157:93;8246:3;8157:93;:::i;:::-;8275:2;8270:3;8266:12;8259:19;;8064:220;;;:::o;8290:366::-;8432:3;8453:67;8517:2;8512:3;8453:67;:::i;:::-;8446:74;;8529:93;8618:3;8529:93;:::i;:::-;8647:2;8642:3;8638:12;8631:19;;8436:220;;;:::o;8662:366::-;8804:3;8825:67;8889:2;8884:3;8825:67;:::i;:::-;8818:74;;8901:93;8990:3;8901:93;:::i;:::-;9019:2;9014:3;9010:12;9003:19;;8808:220;;;:::o;9034:366::-;9176:3;9197:67;9261:2;9256:3;9197:67;:::i;:::-;9190:74;;9273:93;9362:3;9273:93;:::i;:::-;9391:2;9386:3;9382:12;9375:19;;9180:220;;;:::o;9406:398::-;9565:3;9586:83;9667:1;9662:3;9586:83;:::i;:::-;9579:90;;9678:93;9767:3;9678:93;:::i;:::-;9796:1;9791:3;9787:11;9780:18;;9569:235;;;:::o;9810:366::-;9952:3;9973:67;10037:2;10032:3;9973:67;:::i;:::-;9966:74;;10049:93;10138:3;10049:93;:::i;:::-;10167:2;10162:3;10158:12;10151:19;;9956:220;;;:::o;10182:366::-;10324:3;10345:67;10409:2;10404:3;10345:67;:::i;:::-;10338:74;;10421:93;10510:3;10421:93;:::i;:::-;10539:2;10534:3;10530:12;10523:19;;10328:220;;;:::o;10554:366::-;10696:3;10717:67;10781:2;10776:3;10717:67;:::i;:::-;10710:74;;10793:93;10882:3;10793:93;:::i;:::-;10911:2;10906:3;10902:12;10895:19;;10700:220;;;:::o;10926:366::-;11068:3;11089:67;11153:2;11148:3;11089:67;:::i;:::-;11082:74;;11165:93;11254:3;11165:93;:::i;:::-;11283:2;11278:3;11274:12;11267:19;;11072:220;;;:::o;11298:366::-;11440:3;11461:67;11525:2;11520:3;11461:67;:::i;:::-;11454:74;;11537:93;11626:3;11537:93;:::i;:::-;11655:2;11650:3;11646:12;11639:19;;11444:220;;;:::o;11670:118::-;11757:24;11775:5;11757:24;:::i;:::-;11752:3;11745:37;11735:53;;:::o;11794:112::-;11877:22;11893:5;11877:22;:::i;:::-;11872:3;11865:35;11855:51;;:::o;11912:379::-;12096:3;12118:147;12261:3;12118:147;:::i;:::-;12111:154;;12282:3;12275:10;;12100:191;;;:::o;12297:222::-;12390:4;12428:2;12417:9;12413:18;12405:26;;12441:71;12509:1;12498:9;12494:17;12485:6;12441:71;:::i;:::-;12395:124;;;;:::o;12525:442::-;12674:4;12712:2;12701:9;12697:18;12689:26;;12725:71;12793:1;12782:9;12778:17;12769:6;12725:71;:::i;:::-;12806:72;12874:2;12863:9;12859:18;12850:6;12806:72;:::i;:::-;12888;12956:2;12945:9;12941:18;12932:6;12888:72;:::i;:::-;12679:288;;;;;;:::o;12973:332::-;13094:4;13132:2;13121:9;13117:18;13109:26;;13145:71;13213:1;13202:9;13198:17;13189:6;13145:71;:::i;:::-;13226:72;13294:2;13283:9;13279:18;13270:6;13226:72;:::i;:::-;13099:206;;;;;:::o;13311:210::-;13398:4;13436:2;13425:9;13421:18;13413:26;;13449:65;13511:1;13500:9;13496:17;13487:6;13449:65;:::i;:::-;13403:118;;;;:::o;13527:313::-;13640:4;13678:2;13667:9;13663:18;13655:26;;13727:9;13721:4;13717:20;13713:1;13702:9;13698:17;13691:47;13755:78;13828:4;13819:6;13755:78;:::i;:::-;13747:86;;13645:195;;;;:::o;13846:419::-;14012:4;14050:2;14039:9;14035:18;14027:26;;14099:9;14093:4;14089:20;14085:1;14074:9;14070:17;14063:47;14127:131;14253:4;14127:131;:::i;:::-;14119:139;;14017:248;;;:::o;14271:419::-;14437:4;14475:2;14464:9;14460:18;14452:26;;14524:9;14518:4;14514:20;14510:1;14499:9;14495:17;14488:47;14552:131;14678:4;14552:131;:::i;:::-;14544:139;;14442:248;;;:::o;14696:419::-;14862:4;14900:2;14889:9;14885:18;14877:26;;14949:9;14943:4;14939:20;14935:1;14924:9;14920:17;14913:47;14977:131;15103:4;14977:131;:::i;:::-;14969:139;;14867:248;;;:::o;15121:419::-;15287:4;15325:2;15314:9;15310:18;15302:26;;15374:9;15368:4;15364:20;15360:1;15349:9;15345:17;15338:47;15402:131;15528:4;15402:131;:::i;:::-;15394:139;;15292:248;;;:::o;15546:419::-;15712:4;15750:2;15739:9;15735:18;15727:26;;15799:9;15793:4;15789:20;15785:1;15774:9;15770:17;15763:47;15827:131;15953:4;15827:131;:::i;:::-;15819:139;;15717:248;;;:::o;15971:419::-;16137:4;16175:2;16164:9;16160:18;16152:26;;16224:9;16218:4;16214:20;16210:1;16199:9;16195:17;16188:47;16252:131;16378:4;16252:131;:::i;:::-;16244:139;;16142:248;;;:::o;16396:419::-;16562:4;16600:2;16589:9;16585:18;16577:26;;16649:9;16643:4;16639:20;16635:1;16624:9;16620:17;16613:47;16677:131;16803:4;16677:131;:::i;:::-;16669:139;;16567:248;;;:::o;16821:419::-;16987:4;17025:2;17014:9;17010:18;17002:26;;17074:9;17068:4;17064:20;17060:1;17049:9;17045:17;17038:47;17102:131;17228:4;17102:131;:::i;:::-;17094:139;;16992:248;;;:::o;17246:419::-;17412:4;17450:2;17439:9;17435:18;17427:26;;17499:9;17493:4;17489:20;17485:1;17474:9;17470:17;17463:47;17527:131;17653:4;17527:131;:::i;:::-;17519:139;;17417:248;;;:::o;17671:419::-;17837:4;17875:2;17864:9;17860:18;17852:26;;17924:9;17918:4;17914:20;17910:1;17899:9;17895:17;17888:47;17952:131;18078:4;17952:131;:::i;:::-;17944:139;;17842:248;;;:::o;18096:419::-;18262:4;18300:2;18289:9;18285:18;18277:26;;18349:9;18343:4;18339:20;18335:1;18324:9;18320:17;18313:47;18377:131;18503:4;18377:131;:::i;:::-;18369:139;;18267:248;;;:::o;18521:419::-;18687:4;18725:2;18714:9;18710:18;18702:26;;18774:9;18768:4;18764:20;18760:1;18749:9;18745:17;18738:47;18802:131;18928:4;18802:131;:::i;:::-;18794:139;;18692:248;;;:::o;18946:419::-;19112:4;19150:2;19139:9;19135:18;19127:26;;19199:9;19193:4;19189:20;19185:1;19174:9;19170:17;19163:47;19227:131;19353:4;19227:131;:::i;:::-;19219:139;;19117:248;;;:::o;19371:419::-;19537:4;19575:2;19564:9;19560:18;19552:26;;19624:9;19618:4;19614:20;19610:1;19599:9;19595:17;19588:47;19652:131;19778:4;19652:131;:::i;:::-;19644:139;;19542:248;;;:::o;19796:419::-;19962:4;20000:2;19989:9;19985:18;19977:26;;20049:9;20043:4;20039:20;20035:1;20024:9;20020:17;20013:47;20077:131;20203:4;20077:131;:::i;:::-;20069:139;;19967:248;;;:::o;20221:419::-;20387:4;20425:2;20414:9;20410:18;20402:26;;20474:9;20468:4;20464:20;20460:1;20449:9;20445:17;20438:47;20502:131;20628:4;20502:131;:::i;:::-;20494:139;;20392:248;;;:::o;20646:419::-;20812:4;20850:2;20839:9;20835:18;20827:26;;20899:9;20893:4;20889:20;20885:1;20874:9;20870:17;20863:47;20927:131;21053:4;20927:131;:::i;:::-;20919:139;;20817:248;;;:::o;21071:222::-;21164:4;21202:2;21191:9;21187:18;21179:26;;21215:71;21283:1;21272:9;21268:17;21259:6;21215:71;:::i;:::-;21169:124;;;;:::o;21299:214::-;21388:4;21426:2;21415:9;21411:18;21403:26;;21439:67;21503:1;21492:9;21488:17;21479:6;21439:67;:::i;:::-;21393:120;;;;:::o;21519:99::-;21571:6;21605:5;21599:12;21589:22;;21578:40;;;:::o;21624:147::-;21725:11;21762:3;21747:18;;21737:34;;;;:::o;21777:169::-;21861:11;21895:6;21890:3;21883:19;21935:4;21930:3;21926:14;21911:29;;21873:73;;;;:::o;21952:305::-;21992:3;22011:20;22029:1;22011:20;:::i;:::-;22006:25;;22045:20;22063:1;22045:20;:::i;:::-;22040:25;;22199:1;22131:66;22127:74;22124:1;22121:81;22118:2;;;22205:18;;:::i;:::-;22118:2;22249:1;22246;22242:9;22235:16;;21996:261;;;;:::o;22263:185::-;22303:1;22320:20;22338:1;22320:20;:::i;:::-;22315:25;;22354:20;22372:1;22354:20;:::i;:::-;22349:25;;22393:1;22383:2;;22398:18;;:::i;:::-;22383:2;22440:1;22437;22433:9;22428:14;;22305:143;;;;:::o;22454:348::-;22494:7;22517:20;22535:1;22517:20;:::i;:::-;22512:25;;22551:20;22569:1;22551:20;:::i;:::-;22546:25;;22739:1;22671:66;22667:74;22664:1;22661:81;22656:1;22649:9;22642:17;22638:105;22635:2;;;22746:18;;:::i;:::-;22635:2;22794:1;22791;22787:9;22776:20;;22502:300;;;;:::o;22808:191::-;22848:4;22868:20;22886:1;22868:20;:::i;:::-;22863:25;;22902:20;22920:1;22902:20;:::i;:::-;22897:25;;22941:1;22938;22935:8;22932:2;;;22946:18;;:::i;:::-;22932:2;22991:1;22988;22984:9;22976:17;;22853:146;;;;:::o;23005:96::-;23042:7;23071:24;23089:5;23071:24;:::i;:::-;23060:35;;23050:51;;;:::o;23107:90::-;23141:7;23184:5;23177:13;23170:21;23159:32;;23149:48;;;:::o;23203:126::-;23240:7;23280:42;23273:5;23269:54;23258:65;;23248:81;;;:::o;23335:77::-;23372:7;23401:5;23390:16;;23380:32;;;:::o;23418:86::-;23453:7;23493:4;23486:5;23482:16;23471:27;;23461:43;;;:::o;23510:307::-;23578:1;23588:113;23602:6;23599:1;23596:13;23588:113;;;23687:1;23682:3;23678:11;23672:18;23668:1;23663:3;23659:11;23652:39;23624:2;23621:1;23617:10;23612:15;;23588:113;;;23719:6;23716:1;23713:13;23710:2;;;23799:1;23790:6;23785:3;23781:16;23774:27;23710:2;23559:258;;;;:::o;23823:180::-;23871:77;23868:1;23861:88;23968:4;23965:1;23958:15;23992:4;23989:1;23982:15;24009:180;24057:77;24054:1;24047:88;24154:4;24151:1;24144:15;24178:4;24175:1;24168:15;24195:102;24236:6;24287:2;24283:7;24278:2;24271:5;24267:14;24263:28;24253:38;;24243:54;;;:::o;24303:178::-;24443:30;24439:1;24431:6;24427:14;24420:54;24409:72;:::o;24487:172::-;24627:24;24623:1;24615:6;24611:14;24604:48;24593:66;:::o;24665:169::-;24805:21;24801:1;24793:6;24789:14;24782:45;24771:63;:::o;24840:162::-;24980:14;24976:1;24968:6;24964:14;24957:38;24946:56;:::o;25008:170::-;25148:22;25144:1;25136:6;25132:14;25125:46;25114:64;:::o;25184:220::-;25324:34;25320:1;25312:6;25308:14;25301:58;25393:3;25388:2;25380:6;25376:15;25369:28;25290:114;:::o;25410:174::-;25550:26;25546:1;25538:6;25534:14;25527:50;25516:68;:::o;25590:168::-;25730:20;25726:1;25718:6;25714:14;25707:44;25696:62;:::o;25764:168::-;25904:20;25900:1;25892:6;25888:14;25881:44;25870:62;:::o;25938:170::-;26078:22;26074:1;26066:6;26062:14;26055:46;26044:64;:::o;26114:161::-;26254:13;26250:1;26242:6;26238:14;26231:37;26220:55;:::o;26281:175::-;26421:27;26417:1;26409:6;26405:14;26398:51;26387:69;:::o;26462:114::-;26568:8;:::o;26582:177::-;26722:29;26718:1;26710:6;26706:14;26699:53;26688:71;:::o;26765:178::-;26905:30;26901:1;26893:6;26889:14;26882:54;26871:72;:::o;26949:181::-;27089:33;27085:1;27077:6;27073:14;27066:57;27055:75;:::o;27136:160::-;27276:12;27272:1;27264:6;27260:14;27253:36;27242:54;:::o;27302:175::-;27442:27;27438:1;27430:6;27426:14;27419:51;27408:69;:::o;27483:122::-;27556:24;27574:5;27556:24;:::i;:::-;27549:5;27546:35;27536:2;;27595:1;27592;27585:12;27536:2;27526:79;:::o;27611:116::-;27681:21;27696:5;27681:21;:::i;:::-;27674:5;27671:32;27661:2;;27717:1;27714;27707:12;27661:2;27651:76;:::o;27733:122::-;27806:24;27824:5;27806:24;:::i;:::-;27799:5;27796:35;27786:2;;27845:1;27842;27835:12;27786:2;27776:79;:::o

Swarm Source

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