MATIC Price: $0.709501 (-0.59%)
Gas: 46 GWei
 

Overview

Max Total Supply

0

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
AimedisStakingPoolPlatinum

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2023-02-21
*/

//SPDX-License-Identifier: MIT


pragma solidity 0.8.16;

//import "@nomiclabs/buidler/console.sol";

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

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

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

/**
 * @title SafeBEP20
 * @dev Wrappers around BEP20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeBEP20 for IBEP20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeBEP20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(
        IBEP20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IBEP20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IBEP20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            'SafeBEP20: approve from non-zero to non-zero allowance'
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IBEP20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            'SafeBEP20: decreased allowance below zero'
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IBEP20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, 'SafeBEP20: low-level call failed');
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed');
        }
    }
}

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

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

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

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

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

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

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

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

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

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

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

contract AimedisStakingPoolPlatinum is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeBEP20 for IBEP20;

    // Info of each user.
    struct UserInfo {
        uint256 amount;     // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
    }

    // Info of each pool.
    struct PoolInfo {
        IBEP20 lpToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool. Tokens to distribute per block.
        uint256 lastRewardTimestamp;  // Last block number that Tokens distribution occurs.
        uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below.
    }

    IBEP20 public immutable stakingToken;
    IBEP20 public immutable rewardToken;
    mapping (address => uint256) public holderUnlockTime;

    uint256 public totalStaked;
    uint256 public apr;
    uint256 public lockDuration;
    uint256 public exitPenaltyPerc;
    
    bool public canCompoundOrStakeMore;

    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping (address => UserInfo) public userInfo;
    // Total allocation poitns. Must be the sum of all allocation points in all pools.
    uint256 private totalAllocPoint = 0;

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event Compound(address indexed user);
    event EmergencyWithdraw(address indexed user, uint256 amount);

    constructor(address _tokenAddress, uint256 _apr, uint256 _lockDurationInDays, uint256 _exitPenaltyPerc, bool _canCompoundOrStakeMore) {
        stakingToken = IBEP20(_tokenAddress);
        rewardToken = IBEP20(_tokenAddress);
        canCompoundOrStakeMore = _canCompoundOrStakeMore;

        apr = _apr;
        lockDuration = _lockDurationInDays * 1 days;
        exitPenaltyPerc = _exitPenaltyPerc;

        // staking pool
        poolInfo.push(PoolInfo({
            lpToken: stakingToken,
            allocPoint: 1000,
            lastRewardTimestamp: 99999999999,
            accTokensPerShare: 0
        }));

        totalAllocPoint = 1000;

    }

    function stopReward() external onlyOwner {
        updatePool(0);
        apr = 0;
    }

    function startReward() external onlyOwner {
        require(poolInfo[0].lastRewardTimestamp == 99999999999, "Can only start rewards once");
        poolInfo[0].lastRewardTimestamp = block.timestamp;
    }

    // View function to see pending Reward on frontend.
    function pendingReward(address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[_user];
        if(pool.lastRewardTimestamp == 99999999999){
            return 0;
        }
        uint256 accTokensPerShare = pool.accTokensPerShare;
        uint256 lpSupply = totalStaked;
        if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
            uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint);
            accTokensPerShare = accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt);
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) internal {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.timestamp <= pool.lastRewardTimestamp) {
            return;
        }
        uint256 lpSupply = totalStaked;
        if (lpSupply == 0) {
            pool.lastRewardTimestamp = block.timestamp;
            return;
        }
        uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint);
        pool.accTokensPerShare = pool.accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply));
        pool.lastRewardTimestamp = block.timestamp;
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public onlyOwner {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    } 

        // Stake primary tokens for holders
    function depositForHolders(address[] calldata accounts, uint256[] calldata amounts, uint256[] calldata expiryDates) external onlyOwner {
        require(accounts.length == amounts.length && amounts.length == expiryDates.length, "length mismatch");
        updatePool(0);
        for(uint256 i = 0; i < accounts.length; i++){
            holderUnlockTime[accounts[i]] = expiryDates[i];
            PoolInfo storage pool = poolInfo[0];
            UserInfo storage user = userInfo[accounts[i]];

            if (user.amount > 0) {
                uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
                if(pending > 0) {
                    require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens.  Contact an admin.");
                    rewardToken.safeTransfer(address(accounts[i]), pending);
                }
            }

            if(amounts[i] > 0) {
                user.amount = user.amount.add(amounts[i]);
                totalStaked += amounts[i];
            }
            
            user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);

            emit Deposit(accounts[i], amounts[i]);
        }

        require(stakingToken.balanceOf(address(this)) >= totalStaked, "Must send tokens to contract");
    }

    // Stake primary tokens
    function deposit(uint256 _amount) external nonReentrant {
        if(holderUnlockTime[msg.sender] == 0){
            holderUnlockTime[msg.sender] = block.timestamp + lockDuration;
        }
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[msg.sender];

        if(!canCompoundOrStakeMore && _amount > 0){
            require(user.amount == 0, "Cannot stake more");
        }

        updatePool(0);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens.  Contact an admin.");
                rewardToken.safeTransfer(address(msg.sender), pending);
            }
        }
        uint256 amountTransferred = 0;
        if(_amount > 0) {
            uint256 initialBalance = pool.lpToken.balanceOf(address(this));
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance;
            user.amount = user.amount.add(amountTransferred);
            totalStaked += amountTransferred;
        }
        user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);

        emit Deposit(msg.sender, _amount);
    }

    function compound() external nonReentrant {
        require(canCompoundOrStakeMore, "Cannot compound");
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[msg.sender];

        updatePool(0);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens.  Contact an admin.");
                user.amount += pending;
                totalStaked += pending;
            }
        }

        user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);
        emit Compound(msg.sender);
    }

    // Withdraw primary tokens from STAKING.

    function withdraw() external nonReentrant {

        require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early");
        
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[msg.sender];

        uint256 _amount = user.amount;
        updatePool(0);
        uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt);
        if(pending > 0){
            require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens.  Contact an admin.");
            rewardToken.safeTransfer(address(msg.sender), pending);
        }

        if(_amount > 0) {
            user.amount = 0;
            totalStaked -= _amount;
            pool.lpToken.safeTransfer(address(msg.sender), _amount);
        }

        user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12);
        
        if(user.amount > 0){
            holderUnlockTime[msg.sender] = block.timestamp + lockDuration;
        } else {
            holderUnlockTime[msg.sender] = 0;
        }

        emit Withdraw(msg.sender, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw() external nonReentrant {
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[msg.sender];
        uint256 _amount = user.amount;
        totalStaked -= _amount;
        // exit penalty for early unstakers, penalty held on contract as rewards.
        if(holderUnlockTime[msg.sender] >= block.timestamp){
            _amount -= _amount * exitPenaltyPerc / 100;
        }
        holderUnlockTime[msg.sender] = 0;
        pool.lpToken.safeTransfer(address(msg.sender), _amount);
        user.amount = 0;
        user.rewardDebt = 0;
        emit EmergencyWithdraw(msg.sender, _amount);
    }

    // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens.
    function emergencyRewardWithdraw(uint256 _amount) external onlyOwner {
        require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out');
        rewardToken.safeTransfer(address(msg.sender), _amount);
    }

    function calculateNewRewards() public view returns (uint256) {
        PoolInfo storage pool = poolInfo[0];
        if(pool.lastRewardTimestamp > block.timestamp){
            return 0;
        }
        return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apr / 100 / 365 days);
    }

    function rewardsRemaining() public view returns (uint256){
        return rewardToken.balanceOf(address(this)) - totalStaked;
    }

    function updateApr(uint256 newApr) external onlyOwner {
        require(newApr <= 100, "APR must be below 100%");
        updatePool(0);
        apr = newApr;
    }

    function updateLockDuration(uint256 daysForLock) external onlyOwner {
        require(daysForLock <= 365, "Lock must be 365 days or less.");
        lockDuration = daysForLock * 1 days;
    }

    function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner {
        require(newPenaltyPerc <= 25, "May not set higher than 25%");
        exitPenaltyPerc = newPenaltyPerc;
    }

    function updateCanCompoundOrStakeMore(bool compoundEnabled) external onlyOwner {
        canCompoundOrStakeMore = compoundEnabled;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_lockDurationInDays","type":"uint256"},{"internalType":"uint256","name":"_exitPenaltyPerc","type":"uint256"},{"internalType":"bool","name":"_canCompoundOrStakeMore","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canCompoundOrStakeMore","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"expiryDates","type":"uint256[]"}],"name":"depositForHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApr","type":"uint256"}],"name":"updateApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"compoundEnabled","type":"bool"}],"name":"updateCanCompoundOrStakeMore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"daysForLock","type":"uint256"}],"name":"updateLockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000600a553480156200001657600080fd5b50604051620042ee380380620042ee83398181016040528101906200003c91906200036b565b60006200004e6200028160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600180819055508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505080600760006101000a81548160ff0219169083151502179055508360048190555062015180836200018d919062000422565b600581905550816006819055506008604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e8815260200164174876e7ff81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e8600a81905550505050505062000483565b600033905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002bb826200028e565b9050919050565b620002cd81620002ae565b8114620002d957600080fd5b50565b600081519050620002ed81620002c2565b92915050565b6000819050919050565b6200030881620002f3565b81146200031457600080fd5b50565b6000815190506200032881620002fd565b92915050565b60008115159050919050565b62000345816200032e565b81146200035157600080fd5b50565b60008151905062000365816200033a565b92915050565b600080600080600060a086880312156200038a576200038962000289565b5b60006200039a88828901620002dc565b9550506020620003ad8882890162000317565b9450506040620003c08882890162000317565b9350506060620003d38882890162000317565b9250506080620003e68882890162000354565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042f82620002f3565b91506200043c83620002f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004785762000477620003f3565b5b828202905092915050565b60805160a051613e14620004da6000396000818161091b01528181610c4d01528181610d3801528181610f71015281816114fe01528181611b6c01526125f8015260008181610ad201526113a60152613e146000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637b280def11610104578063a913a5f7116100a2578063f2fde38b11610071578063f2fde38b14610476578063f40f0f5214610492578063f69e2046146104c2578063f7c618c1146104cc576101cf565b8063a913a5f714610404578063b6b55f2514610434578063d477edf414610450578063db2e21bc1461046c576101cf565b80638552bf90116100de5780638552bf90146103905780638da5cb5b146103ac5780638e0b0198146103ca578063999e2f75146103e6576101cf565b80637b280def1461034a57806380dc067214610368578063817b1cd214610372576101cf565b806357ded9c911610171578063715018a61161014b578063715018a6146102fa57806372f702f314610304578063746c8ae11461032257806378c196f31461032c576101cf565b806357ded9c9146102b4578063630b5ba1146102d257806368365d03146102dc576101cf565b80631959a002116101ad5780631959a00214610241578063212a0780146102725780633279beab1461028e5780633ccfd60b146102aa576101cf565b806304554443146101d45780630698260f146101f25780631526fe271461020e575b600080fd5b6101dc6104ea565b6040516101e99190612dd9565b60405180910390f35b61020c60048036038101906102079190612e36565b6104f0565b005b61022860048036038101906102239190612e8f565b6105a2565b6040516102389493929190612f3b565b60405180910390f35b61025b60048036038101906102569190612fbe565b610602565b604051610269929190612feb565b60405180910390f35b61028c600480360381019061028791906130cf565b610626565b005b6102a860048036038101906102a39190612e8f565b610bb3565b005b6102b2610d7f565b005b6102bc611170565b6040516102c99190612dd9565b60405180910390f35b6102da611176565b005b6102e461123e565b6040516102f19190613192565b60405180910390f35b610302611251565b005b61030c6113a4565b60405161031991906131ad565b60405180910390f35b61032a6113c8565b005b6103346114f7565b6040516103419190612dd9565b60405180910390f35b6103526115a5565b60405161035f9190612dd9565b60405180910390f35b6103706115ab565b005b61037a611654565b6040516103879190612dd9565b60405180910390f35b6103aa60048036038101906103a59190612e8f565b61165a565b005b6103b4611747565b6040516103c191906131d7565b60405180910390f35b6103e460048036038101906103df9190612e8f565b611770565b005b6103ee611853565b6040516103fb9190612dd9565b60405180910390f35b61041e60048036038101906104199190612fbe565b6118dd565b60405161042b9190612dd9565b60405180910390f35b61044e60048036038101906104499190612e8f565b6118f5565b005b61046a60048036038101906104659190612e8f565b611e2a565b005b610474611f1c565b005b610490600480360381019061048b9190612fbe565b612165565b005b6104ac60048036038101906104a79190612fbe565b612206565b6040516104b99190612dd9565b60405180910390f35b6104ca61237b565b005b6104d46125f6565b6040516104e191906131ad565b60405180910390f35b60055481565b6104f861261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c9061324f565b60405180910390fd5b80600760006101000a81548160ff02191690831515021790555050565b600881815481106105b257600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60096020528060005260406000206000915090508060000154908060010154905082565b61062e61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29061324f565b60405180910390fd5b83839050868690501480156106d557508181905084849050145b610714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070b906132bb565b60405180910390fd5b61071e6000612622565b60005b86869050811015610acc5782828281811061073f5761073e6132db565b5b905060200201356002600089898581811061075d5761075c6132db565b5b90506020020160208101906107729190612fbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060086000815481106107c7576107c66132db565b5b906000526020600020906004020190506000600960008a8a868181106107f0576107ef6132db565b5b90506020020160208101906108059190612fbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541115610962576000610898826001015461088a64e8d4a5100061087c8760030154876000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b90506000811115610960576108ab6114f7565b8111156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e49061337c565b60405180910390fd5b61095f8a8a86818110610903576109026132db565b5b90506020020160208101906109189190612fbe565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b505b6000878785818110610977576109766132db565b5b9050602002013511156109ef576109b487878581811061099a576109996132db565b5b90506020020135826000015461289a90919063ffffffff16565b81600001819055508686848181106109cf576109ce6132db565b5b90506020020135600360008282546109e791906133cb565b925050819055505b610a2164e8d4a51000610a138460030154846000015461270690919063ffffffff16565b61278090919063ffffffff16565b8160010181905550888884818110610a3c57610a3b6132db565b5b9050602002016020810190610a519190612fbe565b73ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c888886818110610a9b57610a9a6132db565b5b90506020020135604051610aaf9190612dd9565b60405180910390a250508080610ac4906133ff565b915050610721565b506003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b2991906131d7565b602060405180830381865afa158015610b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6a919061345c565b1015610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba2906134d5565b60405180910390fd5b505050505050565b610bbb61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f9061324f565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca491906131d7565b602060405180830381865afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce5919061345c565b610cef91906134f5565b811115610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890613575565b60405180910390fd5b610d7c33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b50565b600260015403610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb906135e1565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459061364d565b60405180910390fd5b60006008600081548110610e6557610e646132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050610ecb6000612622565b6000610f158360010154610f0764e8d4a51000610ef98860030154886000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b90506000811115610fb657610f286114f7565b811115610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f619061337c565b60405180910390fd5b610fb533827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b600082111561103257600083600001819055508160036000828254610fdb91906134f5565b9250508190555061103133838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b61106464e8d4a510006110568660030154866000015461270690919063ffffffff16565b61278090919063ffffffff16565b83600101819055506000836000015411156110cf576005544261108791906133cb565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611115565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648360405161115b9190612dd9565b60405180910390a25050505060018081905550565b60045481565b61117e61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061324f565b60405180910390fd5b6000600880549050905060005b8181101561123a5761122981612622565b80611233906133ff565b9050611218565b5050565b600760009054906101000a900460ff1681565b61125961261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dd9061324f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b6113d061261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114549061324f565b60405180910390fd5b64174876e7ff6008600081548110611478576114776132db565b5b906000526020600020906004020160020154146114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c1906136b9565b60405180910390fd5b4260086000815481106114e0576114df6132db565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161155591906131d7565b602060405180830381865afa158015611572573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611596919061345c565b6115a091906134f5565b905090565b60065481565b6115b361261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061324f565b60405180910390fd5b61164a6000612622565b6000600481905550565b60035481565b61166261261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e69061324f565b60405180910390fd5b6064811115611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90613725565b60405180910390fd5b61173d6000612622565b8060048190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61177861261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc9061324f565b60405180910390fd5b6019811115611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090613791565b60405180910390fd5b8060068190555050565b600080600860008154811061186b5761186a6132db565b5b9060005260206000209060040201905042816002015411156118915760009150506118da565b6301e1338060646004546003548460020154426118ae91906134f5565b6118b891906137b1565b6118c291906137b1565b6118cc919061383a565b6118d6919061383a565b9150505b90565b60026020528060005260406000206000915090505481565b60026001540361193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906135e1565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036119db576005544261199791906133cb565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060086000815481106119f2576119f16132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600760009054906101000a900460ff16158015611a625750600083115b15611aaf576000816000015414611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa5906138b7565b60405180910390fd5b5b611ab96000612622565b600081600001541115611bb3576000611b108260010154611b0264e8d4a51000611af48760030154876000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b90506000811115611bb157611b236114f7565b811115611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c9061337c565b60405180910390fd5b611bb033827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b505b600080841115611d955760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c1c91906131d7565b602060405180830381865afa158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d919061345c565b9050611cb03330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f8909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d0e91906131d7565b602060405180830381865afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f919061345c565b611d5991906134f5565b9150611d7282846000015461289a90919063ffffffff16565b83600001819055508160036000828254611d8c91906133cb565b92505081905550505b611dc764e8d4a51000611db98560030154856000015461270690919063ffffffff16565b61278090919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c85604051611e159190612dd9565b60405180910390a25050506001808190555050565b611e3261261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb69061324f565b60405180910390fd5b61016d811115611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efb90613923565b60405180910390fd5b6201518081611f1391906137b1565b60058190555050565b600260015403611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f58906135e1565b60405180910390fd5b600260018190555060006008600081548110611f8057611f7f6132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490508060036000828254611fee91906134f5565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106120635760646006548261204b91906137b1565b612055919061383a565b8161206091906134f5565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120f733828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516121519190612dd9565b60405180910390a250505060018081905550565b61216d61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f19061324f565b60405180910390fd5b61220381612981565b50565b600080600860008154811061221e5761221d6132db565b5b906000526020600020906004020190506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905064174876e7ff82600201540361228c57600092505050612376565b600082600301549050600060035490508360020154421180156122b0575060008114155b1561232b5760006122e9600a546122db87600101546122cd611853565b61270690919063ffffffff16565b61278090919063ffffffff16565b90506123276123188361230a64e8d4a510008561270690919063ffffffff16565b61278090919063ffffffff16565b8461289a90919063ffffffff16565b9250505b61236f836001015461236164e8d4a5100061235386886000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b9450505050505b919050565b6002600154036123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b7906135e1565b60405180910390fd5b6002600181905550600760009054906101000a900460ff16612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e9061398f565b60405180910390fd5b6000600860008154811061242e5761242d6132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061248b6000612622565b60008160000154111561256e5760006124e282600101546124d464e8d4a510006124c68760030154876000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b9050600081111561256c576124f56114f7565b811115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e9061337c565b60405180910390fd5b8082600001600082825461254b91906133cb565b92505081905550806003600082825461256491906133cb565b925050819055505b505b6125a064e8d4a510006125928460030154846000015461270690919063ffffffff16565b61278090919063ffffffff16565b81600101819055503373ffffffffffffffffffffffffffffffffffffffff167fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa160405160405180910390a2505060018081905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b600060088281548110612638576126376132db565b5b90600052602060002090600402019050806002015442116126595750612703565b6000600354905060008103612678574282600201819055505050612703565b60006126ac600a5461269e8560010154612690611853565b61270690919063ffffffff16565b61278090919063ffffffff16565b90506126ee6126db836126cd64e8d4a510008561270690919063ffffffff16565b61278090919063ffffffff16565b846003015461289a90919063ffffffff16565b83600301819055504283600201819055505050505b50565b6000808303612718576000905061277a565b6000828461272691906137b1565b9050828482612735919061383a565b14612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90613a21565b60405180910390fd5b809150505b92915050565b60006127c283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612aad565b905092915050565b600061280c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b10565b905092915050565b6128958363a9059cbb60e01b8484604051602401612833929190613a41565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b74565b505050565b60008082846128a991906133cb565b9050838110156128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590613ab6565b60405180910390fd5b8091505092915050565b61297b846323b872dd60e01b85858560405160240161291993929190613ad6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b74565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e790613b7f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290612af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aeb9190613c1e565b60405180910390fd5b5060008385612b03919061383a565b9050809150509392505050565b6000838311158290612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9190613c1e565b60405180910390fd5b5060008385612b6791906134f5565b9050809150509392505050565b6000612bd6826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c3b9092919063ffffffff16565b9050600081511115612c365780806020019051810190612bf69190613c55565b612c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2c90613cf4565b60405180910390fd5b5b505050565b6060612c4a8484600085612c53565b90509392505050565b6060612c5e85612d75565b612c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9490613d60565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cc69190613dc7565b60006040518083038185875af1925050503d8060008114612d03576040519150601f19603f3d011682016040523d82523d6000602084013e612d08565b606091505b50915091508115612d1d578092505050612d6d565b600081511115612d305780518082602001fd5b836040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d649190613c1e565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015612db757506000801b8214155b92505050919050565b6000819050919050565b612dd381612dc0565b82525050565b6000602082019050612dee6000830184612dca565b92915050565b600080fd5b600080fd5b60008115159050919050565b612e1381612dfe565b8114612e1e57600080fd5b50565b600081359050612e3081612e0a565b92915050565b600060208284031215612e4c57612e4b612df4565b5b6000612e5a84828501612e21565b91505092915050565b612e6c81612dc0565b8114612e7757600080fd5b50565b600081359050612e8981612e63565b92915050565b600060208284031215612ea557612ea4612df4565b5b6000612eb384828501612e7a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612f01612efc612ef784612ebc565b612edc565b612ebc565b9050919050565b6000612f1382612ee6565b9050919050565b6000612f2582612f08565b9050919050565b612f3581612f1a565b82525050565b6000608082019050612f506000830187612f2c565b612f5d6020830186612dca565b612f6a6040830185612dca565b612f776060830184612dca565b95945050505050565b6000612f8b82612ebc565b9050919050565b612f9b81612f80565b8114612fa657600080fd5b50565b600081359050612fb881612f92565b92915050565b600060208284031215612fd457612fd3612df4565b5b6000612fe284828501612fa9565b91505092915050565b60006040820190506130006000830185612dca565b61300d6020830184612dca565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261303957613038613014565b5b8235905067ffffffffffffffff81111561305657613055613019565b5b6020830191508360208202830111156130725761307161301e565b5b9250929050565b60008083601f84011261308f5761308e613014565b5b8235905067ffffffffffffffff8111156130ac576130ab613019565b5b6020830191508360208202830111156130c8576130c761301e565b5b9250929050565b600080600080600080606087890312156130ec576130eb612df4565b5b600087013567ffffffffffffffff81111561310a57613109612df9565b5b61311689828a01613023565b9650965050602087013567ffffffffffffffff81111561313957613138612df9565b5b61314589828a01613079565b9450945050604087013567ffffffffffffffff81111561316857613167612df9565b5b61317489828a01613079565b92509250509295509295509295565b61318c81612dfe565b82525050565b60006020820190506131a76000830184613183565b92915050565b60006020820190506131c26000830184612f2c565b92915050565b6131d181612f80565b82525050565b60006020820190506131ec60008301846131c8565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132396020836131f2565b915061324482613203565b602082019050919050565b600060208201905081810360008301526132688161322c565b9050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b60006132a5600f836131f2565b91506132b08261326f565b602082019050919050565b600060208201905081810360008301526132d481613298565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006133666040836131f2565b91506133718261330a565b604082019050919050565b6000602082019050818103600083015261339581613359565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133d682612dc0565b91506133e183612dc0565b92508282019050808211156133f9576133f861339c565b5b92915050565b600061340a82612dc0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361343c5761343b61339c565b5b600182019050919050565b60008151905061345681612e63565b92915050565b60006020828403121561347257613471612df4565b5b600061348084828501613447565b91505092915050565b7f4d7573742073656e6420746f6b656e7320746f20636f6e747261637400000000600082015250565b60006134bf601c836131f2565b91506134ca82613489565b602082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b600061350082612dc0565b915061350b83612dc0565b92508282039050818111156135235761352261339c565b5b92915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b600061355f601d836131f2565b915061356a82613529565b602082019050919050565b6000602082019050818103600083015261358e81613552565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006135cb601f836131f2565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b60006136376020836131f2565b915061364282613601565b602082019050919050565b600060208201905081810360008301526136668161362a565b9050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006136a3601b836131f2565b91506136ae8261366d565b602082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f415052206d7573742062652062656c6f77203130302500000000000000000000600082015250565b600061370f6016836131f2565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203235250000000000600082015250565b600061377b601b836131f2565b915061378682613745565b602082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b60006137bc82612dc0565b91506137c783612dc0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613800576137ff61339c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061384582612dc0565b915061385083612dc0565b9250826138605761385f61380b565b5b828204905092915050565b7f43616e6e6f74207374616b65206d6f7265000000000000000000000000000000600082015250565b60006138a16011836131f2565b91506138ac8261386b565b602082019050919050565b600060208201905081810360008301526138d081613894565b9050919050565b7f4c6f636b206d757374206265203336352064617973206f72206c6573732e0000600082015250565b600061390d601e836131f2565b9150613918826138d7565b602082019050919050565b6000602082019050818103600083015261393c81613900565b9050919050565b7f43616e6e6f7420636f6d706f756e640000000000000000000000000000000000600082015250565b6000613979600f836131f2565b915061398482613943565b602082019050919050565b600060208201905081810360008301526139a88161396c565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0b6021836131f2565b9150613a16826139af565b604082019050919050565b60006020820190508181036000830152613a3a816139fe565b9050919050565b6000604082019050613a5660008301856131c8565b613a636020830184612dca565b9392505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613aa0601b836131f2565b9150613aab82613a6a565b602082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b6000606082019050613aeb60008301866131c8565b613af860208301856131c8565b613b056040830184612dca565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b696026836131f2565b9150613b7482613b0d565b604082019050919050565b60006020820190508181036000830152613b9881613b5c565b9050919050565b600081519050919050565b60005b83811015613bc8578082015181840152602081019050613bad565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bf082613b9f565b613bfa81856131f2565b9350613c0a818560208601613baa565b613c1381613bd4565b840191505092915050565b60006020820190508181036000830152613c388184613be5565b905092915050565b600081519050613c4f81612e0a565b92915050565b600060208284031215613c6b57613c6a612df4565b5b6000613c7984828501613c40565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613cde602a836131f2565b9150613ce982613c82565b604082019050919050565b60006020820190508181036000830152613d0d81613cd1565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613d4a601d836131f2565b9150613d5582613d14565b602082019050919050565b60006020820190508181036000830152613d7981613d3d565b9050919050565b600081519050919050565b600081905092915050565b6000613da182613d80565b613dab8185613d8b565b9350613dbb818560208601613baa565b80840191505092915050565b6000613dd38284613d96565b91508190509291505056fea26469706673582212203c6c5020134092b3a06a8d6b6106a64fbdb57498c09570d172c2b18571ef70fa64736f6c6343000810003300000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637b280def11610104578063a913a5f7116100a2578063f2fde38b11610071578063f2fde38b14610476578063f40f0f5214610492578063f69e2046146104c2578063f7c618c1146104cc576101cf565b8063a913a5f714610404578063b6b55f2514610434578063d477edf414610450578063db2e21bc1461046c576101cf565b80638552bf90116100de5780638552bf90146103905780638da5cb5b146103ac5780638e0b0198146103ca578063999e2f75146103e6576101cf565b80637b280def1461034a57806380dc067214610368578063817b1cd214610372576101cf565b806357ded9c911610171578063715018a61161014b578063715018a6146102fa57806372f702f314610304578063746c8ae11461032257806378c196f31461032c576101cf565b806357ded9c9146102b4578063630b5ba1146102d257806368365d03146102dc576101cf565b80631959a002116101ad5780631959a00214610241578063212a0780146102725780633279beab1461028e5780633ccfd60b146102aa576101cf565b806304554443146101d45780630698260f146101f25780631526fe271461020e575b600080fd5b6101dc6104ea565b6040516101e99190612dd9565b60405180910390f35b61020c60048036038101906102079190612e36565b6104f0565b005b61022860048036038101906102239190612e8f565b6105a2565b6040516102389493929190612f3b565b60405180910390f35b61025b60048036038101906102569190612fbe565b610602565b604051610269929190612feb565b60405180910390f35b61028c600480360381019061028791906130cf565b610626565b005b6102a860048036038101906102a39190612e8f565b610bb3565b005b6102b2610d7f565b005b6102bc611170565b6040516102c99190612dd9565b60405180910390f35b6102da611176565b005b6102e461123e565b6040516102f19190613192565b60405180910390f35b610302611251565b005b61030c6113a4565b60405161031991906131ad565b60405180910390f35b61032a6113c8565b005b6103346114f7565b6040516103419190612dd9565b60405180910390f35b6103526115a5565b60405161035f9190612dd9565b60405180910390f35b6103706115ab565b005b61037a611654565b6040516103879190612dd9565b60405180910390f35b6103aa60048036038101906103a59190612e8f565b61165a565b005b6103b4611747565b6040516103c191906131d7565b60405180910390f35b6103e460048036038101906103df9190612e8f565b611770565b005b6103ee611853565b6040516103fb9190612dd9565b60405180910390f35b61041e60048036038101906104199190612fbe565b6118dd565b60405161042b9190612dd9565b60405180910390f35b61044e60048036038101906104499190612e8f565b6118f5565b005b61046a60048036038101906104659190612e8f565b611e2a565b005b610474611f1c565b005b610490600480360381019061048b9190612fbe565b612165565b005b6104ac60048036038101906104a79190612fbe565b612206565b6040516104b99190612dd9565b60405180910390f35b6104ca61237b565b005b6104d46125f6565b6040516104e191906131ad565b60405180910390f35b60055481565b6104f861261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c9061324f565b60405180910390fd5b80600760006101000a81548160ff02191690831515021790555050565b600881815481106105b257600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60096020528060005260406000206000915090508060000154908060010154905082565b61062e61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29061324f565b60405180910390fd5b83839050868690501480156106d557508181905084849050145b610714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070b906132bb565b60405180910390fd5b61071e6000612622565b60005b86869050811015610acc5782828281811061073f5761073e6132db565b5b905060200201356002600089898581811061075d5761075c6132db565b5b90506020020160208101906107729190612fbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060086000815481106107c7576107c66132db565b5b906000526020600020906004020190506000600960008a8a868181106107f0576107ef6132db565b5b90506020020160208101906108059190612fbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541115610962576000610898826001015461088a64e8d4a5100061087c8760030154876000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b90506000811115610960576108ab6114f7565b8111156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e49061337c565b60405180910390fd5b61095f8a8a86818110610903576109026132db565b5b90506020020160208101906109189190612fbe565b827f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b505b6000878785818110610977576109766132db565b5b9050602002013511156109ef576109b487878581811061099a576109996132db565b5b90506020020135826000015461289a90919063ffffffff16565b81600001819055508686848181106109cf576109ce6132db565b5b90506020020135600360008282546109e791906133cb565b925050819055505b610a2164e8d4a51000610a138460030154846000015461270690919063ffffffff16565b61278090919063ffffffff16565b8160010181905550888884818110610a3c57610a3b6132db565b5b9050602002016020810190610a519190612fbe565b73ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c888886818110610a9b57610a9a6132db565b5b90506020020135604051610aaf9190612dd9565b60405180910390a250508080610ac4906133ff565b915050610721565b506003547f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b2991906131d7565b602060405180830381865afa158015610b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6a919061345c565b1015610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba2906134d5565b60405180910390fd5b505050505050565b610bbb61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f9061324f565b60405180910390fd5b6003547f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca491906131d7565b602060405180830381865afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce5919061345c565b610cef91906134f5565b811115610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890613575565b60405180910390fd5b610d7c33827f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b50565b600260015403610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb906135e1565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459061364d565b60405180910390fd5b60006008600081548110610e6557610e646132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050610ecb6000612622565b6000610f158360010154610f0764e8d4a51000610ef98860030154886000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b90506000811115610fb657610f286114f7565b811115610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f619061337c565b60405180910390fd5b610fb533827f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b600082111561103257600083600001819055508160036000828254610fdb91906134f5565b9250508190555061103133838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b61106464e8d4a510006110568660030154866000015461270690919063ffffffff16565b61278090919063ffffffff16565b83600101819055506000836000015411156110cf576005544261108791906133cb565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611115565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648360405161115b9190612dd9565b60405180910390a25050505060018081905550565b60045481565b61117e61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061324f565b60405180910390fd5b6000600880549050905060005b8181101561123a5761122981612622565b80611233906133ff565b9050611218565b5050565b600760009054906101000a900460ff1681565b61125961261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dd9061324f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db81565b6113d061261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114549061324f565b60405180910390fd5b64174876e7ff6008600081548110611478576114776132db565b5b906000526020600020906004020160020154146114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c1906136b9565b60405180910390fd5b4260086000815481106114e0576114df6132db565b5b906000526020600020906004020160020181905550565b60006003547f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161155591906131d7565b602060405180830381865afa158015611572573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611596919061345c565b6115a091906134f5565b905090565b60065481565b6115b361261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061324f565b60405180910390fd5b61164a6000612622565b6000600481905550565b60035481565b61166261261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e69061324f565b60405180910390fd5b6064811115611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90613725565b60405180910390fd5b61173d6000612622565b8060048190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61177861261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc9061324f565b60405180910390fd5b6019811115611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090613791565b60405180910390fd5b8060068190555050565b600080600860008154811061186b5761186a6132db565b5b9060005260206000209060040201905042816002015411156118915760009150506118da565b6301e1338060646004546003548460020154426118ae91906134f5565b6118b891906137b1565b6118c291906137b1565b6118cc919061383a565b6118d6919061383a565b9150505b90565b60026020528060005260406000206000915090505481565b60026001540361193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906135e1565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036119db576005544261199791906133cb565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060086000815481106119f2576119f16132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600760009054906101000a900460ff16158015611a625750600083115b15611aaf576000816000015414611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa5906138b7565b60405180910390fd5b5b611ab96000612622565b600081600001541115611bb3576000611b108260010154611b0264e8d4a51000611af48760030154876000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b90506000811115611bb157611b236114f7565b811115611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c9061337c565b60405180910390fd5b611bb033827f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db73ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b5b505b600080841115611d955760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c1c91906131d7565b602060405180830381865afa158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d919061345c565b9050611cb03330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f8909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d0e91906131d7565b602060405180830381865afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f919061345c565b611d5991906134f5565b9150611d7282846000015461289a90919063ffffffff16565b83600001819055508160036000828254611d8c91906133cb565b92505081905550505b611dc764e8d4a51000611db98560030154856000015461270690919063ffffffff16565b61278090919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c85604051611e159190612dd9565b60405180910390a25050506001808190555050565b611e3261261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb69061324f565b60405180910390fd5b61016d811115611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efb90613923565b60405180910390fd5b6201518081611f1391906137b1565b60058190555050565b600260015403611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f58906135e1565b60405180910390fd5b600260018190555060006008600081548110611f8057611f7f6132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490508060036000828254611fee91906134f5565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106120635760646006548261204b91906137b1565b612055919061383a565b8161206091906134f5565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120f733828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128149092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516121519190612dd9565b60405180910390a250505060018081905550565b61216d61261a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f19061324f565b60405180910390fd5b61220381612981565b50565b600080600860008154811061221e5761221d6132db565b5b906000526020600020906004020190506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905064174876e7ff82600201540361228c57600092505050612376565b600082600301549050600060035490508360020154421180156122b0575060008114155b1561232b5760006122e9600a546122db87600101546122cd611853565b61270690919063ffffffff16565b61278090919063ffffffff16565b90506123276123188361230a64e8d4a510008561270690919063ffffffff16565b61278090919063ffffffff16565b8461289a90919063ffffffff16565b9250505b61236f836001015461236164e8d4a5100061235386886000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b9450505050505b919050565b6002600154036123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b7906135e1565b60405180910390fd5b6002600181905550600760009054906101000a900460ff16612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e9061398f565b60405180910390fd5b6000600860008154811061242e5761242d6132db565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061248b6000612622565b60008160000154111561256e5760006124e282600101546124d464e8d4a510006124c68760030154876000015461270690919063ffffffff16565b61278090919063ffffffff16565b6127ca90919063ffffffff16565b9050600081111561256c576124f56114f7565b811115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e9061337c565b60405180910390fd5b8082600001600082825461254b91906133cb565b92505081905550806003600082825461256491906133cb565b925050819055505b505b6125a064e8d4a510006125928460030154846000015461270690919063ffffffff16565b61278090919063ffffffff16565b81600101819055503373ffffffffffffffffffffffffffffffffffffffff167fda323bd96658b18a6ce813e824305dc61760462bad6aaf52c65aebb8c8c9faa160405160405180910390a2505060018081905550565b7f00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db81565b600033905090565b600060088281548110612638576126376132db565b5b90600052602060002090600402019050806002015442116126595750612703565b6000600354905060008103612678574282600201819055505050612703565b60006126ac600a5461269e8560010154612690611853565b61270690919063ffffffff16565b61278090919063ffffffff16565b90506126ee6126db836126cd64e8d4a510008561270690919063ffffffff16565b61278090919063ffffffff16565b846003015461289a90919063ffffffff16565b83600301819055504283600201819055505050505b50565b6000808303612718576000905061277a565b6000828461272691906137b1565b9050828482612735919061383a565b14612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90613a21565b60405180910390fd5b809150505b92915050565b60006127c283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612aad565b905092915050565b600061280c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b10565b905092915050565b6128958363a9059cbb60e01b8484604051602401612833929190613a41565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b74565b505050565b60008082846128a991906133cb565b9050838110156128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590613ab6565b60405180910390fd5b8091505092915050565b61297b846323b872dd60e01b85858560405160240161291993929190613ad6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b74565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e790613b7f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290612af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aeb9190613c1e565b60405180910390fd5b5060008385612b03919061383a565b9050809150509392505050565b6000838311158290612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9190613c1e565b60405180910390fd5b5060008385612b6791906134f5565b9050809150509392505050565b6000612bd6826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c3b9092919063ffffffff16565b9050600081511115612c365780806020019051810190612bf69190613c55565b612c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2c90613cf4565b60405180910390fd5b5b505050565b6060612c4a8484600085612c53565b90509392505050565b6060612c5e85612d75565b612c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9490613d60565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cc69190613dc7565b60006040518083038185875af1925050503d8060008114612d03576040519150601f19603f3d011682016040523d82523d6000602084013e612d08565b606091505b50915091508115612d1d578092505050612d6d565b600081511115612d305780518082602001fd5b836040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d649190613c1e565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015612db757506000801b8214155b92505050919050565b6000819050919050565b612dd381612dc0565b82525050565b6000602082019050612dee6000830184612dca565b92915050565b600080fd5b600080fd5b60008115159050919050565b612e1381612dfe565b8114612e1e57600080fd5b50565b600081359050612e3081612e0a565b92915050565b600060208284031215612e4c57612e4b612df4565b5b6000612e5a84828501612e21565b91505092915050565b612e6c81612dc0565b8114612e7757600080fd5b50565b600081359050612e8981612e63565b92915050565b600060208284031215612ea557612ea4612df4565b5b6000612eb384828501612e7a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612f01612efc612ef784612ebc565b612edc565b612ebc565b9050919050565b6000612f1382612ee6565b9050919050565b6000612f2582612f08565b9050919050565b612f3581612f1a565b82525050565b6000608082019050612f506000830187612f2c565b612f5d6020830186612dca565b612f6a6040830185612dca565b612f776060830184612dca565b95945050505050565b6000612f8b82612ebc565b9050919050565b612f9b81612f80565b8114612fa657600080fd5b50565b600081359050612fb881612f92565b92915050565b600060208284031215612fd457612fd3612df4565b5b6000612fe284828501612fa9565b91505092915050565b60006040820190506130006000830185612dca565b61300d6020830184612dca565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261303957613038613014565b5b8235905067ffffffffffffffff81111561305657613055613019565b5b6020830191508360208202830111156130725761307161301e565b5b9250929050565b60008083601f84011261308f5761308e613014565b5b8235905067ffffffffffffffff8111156130ac576130ab613019565b5b6020830191508360208202830111156130c8576130c761301e565b5b9250929050565b600080600080600080606087890312156130ec576130eb612df4565b5b600087013567ffffffffffffffff81111561310a57613109612df9565b5b61311689828a01613023565b9650965050602087013567ffffffffffffffff81111561313957613138612df9565b5b61314589828a01613079565b9450945050604087013567ffffffffffffffff81111561316857613167612df9565b5b61317489828a01613079565b92509250509295509295509295565b61318c81612dfe565b82525050565b60006020820190506131a76000830184613183565b92915050565b60006020820190506131c26000830184612f2c565b92915050565b6131d181612f80565b82525050565b60006020820190506131ec60008301846131c8565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132396020836131f2565b915061324482613203565b602082019050919050565b600060208201905081810360008301526132688161322c565b9050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b60006132a5600f836131f2565b91506132b08261326f565b602082019050919050565b600060208201905081810360008301526132d481613298565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006133666040836131f2565b91506133718261330a565b604082019050919050565b6000602082019050818103600083015261339581613359565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133d682612dc0565b91506133e183612dc0565b92508282019050808211156133f9576133f861339c565b5b92915050565b600061340a82612dc0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361343c5761343b61339c565b5b600182019050919050565b60008151905061345681612e63565b92915050565b60006020828403121561347257613471612df4565b5b600061348084828501613447565b91505092915050565b7f4d7573742073656e6420746f6b656e7320746f20636f6e747261637400000000600082015250565b60006134bf601c836131f2565b91506134ca82613489565b602082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b600061350082612dc0565b915061350b83612dc0565b92508282039050818111156135235761352261339c565b5b92915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b600061355f601d836131f2565b915061356a82613529565b602082019050919050565b6000602082019050818103600083015261358e81613552565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006135cb601f836131f2565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b60006136376020836131f2565b915061364282613601565b602082019050919050565b600060208201905081810360008301526136668161362a565b9050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006136a3601b836131f2565b91506136ae8261366d565b602082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f415052206d7573742062652062656c6f77203130302500000000000000000000600082015250565b600061370f6016836131f2565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203235250000000000600082015250565b600061377b601b836131f2565b915061378682613745565b602082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b60006137bc82612dc0565b91506137c783612dc0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613800576137ff61339c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061384582612dc0565b915061385083612dc0565b9250826138605761385f61380b565b5b828204905092915050565b7f43616e6e6f74207374616b65206d6f7265000000000000000000000000000000600082015250565b60006138a16011836131f2565b91506138ac8261386b565b602082019050919050565b600060208201905081810360008301526138d081613894565b9050919050565b7f4c6f636b206d757374206265203336352064617973206f72206c6573732e0000600082015250565b600061390d601e836131f2565b9150613918826138d7565b602082019050919050565b6000602082019050818103600083015261393c81613900565b9050919050565b7f43616e6e6f7420636f6d706f756e640000000000000000000000000000000000600082015250565b6000613979600f836131f2565b915061398482613943565b602082019050919050565b600060208201905081810360008301526139a88161396c565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0b6021836131f2565b9150613a16826139af565b604082019050919050565b60006020820190508181036000830152613a3a816139fe565b9050919050565b6000604082019050613a5660008301856131c8565b613a636020830184612dca565b9392505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000613aa0601b836131f2565b9150613aab82613a6a565b602082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b6000606082019050613aeb60008301866131c8565b613af860208301856131c8565b613b056040830184612dca565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b696026836131f2565b9150613b7482613b0d565b604082019050919050565b60006020820190508181036000830152613b9881613b5c565b9050919050565b600081519050919050565b60005b83811015613bc8578082015181840152602081019050613bad565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bf082613b9f565b613bfa81856131f2565b9350613c0a818560208601613baa565b613c1381613bd4565b840191505092915050565b60006020820190508181036000830152613c388184613be5565b905092915050565b600081519050613c4f81612e0a565b92915050565b600060208284031215613c6b57613c6a612df4565b5b6000613c7984828501613c40565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613cde602a836131f2565b9150613ce982613c82565b604082019050919050565b60006020820190508181036000830152613d0d81613cd1565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613d4a601d836131f2565b9150613d5582613d14565b602082019050919050565b60006020820190508181036000830152613d7981613d3d565b9050919050565b600081519050919050565b600081905092915050565b6000613da182613d80565b613dab8185613d8b565b9350613dbb818560208601613baa565b80840191505092915050565b6000613dd38284613d96565b91508190509291505056fea26469706673582212203c6c5020134092b3a06a8d6b6106a64fbdb57498c09570d172c2b18571ef70fa64736f6c63430008100033

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

00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x33B6d77c607ea499ab5DB7e2201C5A516a78a5db
Arg [1] : _apr (uint256): 15
Arg [2] : _lockDurationInDays (uint256): 360
Arg [3] : _exitPenaltyPerc (uint256): 25
Arg [4] : _canCompoundOrStakeMore (bool): True

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000033b6d77c607ea499ab5db7e2201c5a516a78a5db
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000168
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed Bytecode Sourcemap

24690:11496:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36045:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25813:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;25895:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;29094:1348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34745:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32706:1154;;;:::i;:::-;;25641:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28850:190;;;:::i;:::-;;25743:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2811:140;;;:::i;:::-;;25462:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27092:207;;;:::i;:::-;;35326:133;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25700:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26993:91;;;:::i;:::-;;25608:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35467:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2169:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35845:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35009:309;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25547:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30479:1410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35643:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33931:665;;;:::i;:::-;;3106:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27364:727;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31897:753;;;:::i;:::-;;25505:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25666:27;;;;:::o;36045:138::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36160:15:::1;36135:22;;:40;;;;;;;;;;;;;;;;;;36045:138:::0;:::o;25813:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25895:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29094:1348::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29267:7:::1;;:14;;29248:8;;:15;;:33;:73;;;;;29303:11;;:18;;29285:7;;:14;;:36;29248:73;29240:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;29352:13;29363:1;29352:10;:13::i;:::-;29380:9;29376:953;29399:8;;:15;;29395:1;:19;29376:953;;;29467:11;;29479:1;29467:14;;;;;;;:::i;:::-;;;;;;;;29435:16;:29;29452:8;;29461:1;29452:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;29435:29;;;;;;;;;;;;;;;:46;;;;29496:21;29520:8;29529:1;29520:11;;;;;;;;:::i;:::-;;;;;;;;;;;;29496:35;;29546:21;29570:8;:21;29579:8;;29588:1;29579:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;29570:21;;;;;;;;;;;;;;;29546:45;;29626:1;29612:4;:11;;;:15;29608:405;;;29648:15;29666:70;29720:4;:15;;;29666:49;29710:4;29666:39;29682:4;:22;;;29666:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;29648:88;;29768:1;29758:7;:11;29755:243;;;29813:18;:16;:18::i;:::-;29802:7;:29;;29794:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;29923:55;29956:8;;29965:1;29956:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;29970:7;29923:11;:24;;;;:55;;;;;:::i;:::-;29755:243;29629:384;29608:405;30045:1;30032:7;;30040:1;30032:10;;;;;;;:::i;:::-;;;;;;;;:14;30029:139;;;30081:27;30097:7;;30105:1;30097:10;;;;;;;:::i;:::-;;;;;;;;30081:4;:11;;;:15;;:27;;;;:::i;:::-;30067:4;:11;;:41;;;;30142:7;;30150:1;30142:10;;;;;;;:::i;:::-;;;;;;;;30127:11;;:25;;;;;;;:::i;:::-;;;;;;;;30029:139;30214:49;30258:4;30214:39;30230:4;:22;;;30214:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;30196:4;:15;;:67;;;;30293:8;;30302:1;30293:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;30285:32;;;30306:7;;30314:1;30306:10;;;;;;;:::i;:::-;;;;;;;;30285:32;;;;;;:::i;:::-;;;;;;;;29420:909;;29416:3;;;;;:::i;:::-;;;;29376:953;;;;30390:11;;30349:12;:22;;;30380:4;30349:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;30341:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;29094:1348:::0;;;;;;:::o;34745:256::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34883:11:::1;;34844;:21;;;34874:4;34844:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;34833:7;:61;;34825:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34939:54;34972:10;34985:7;34939:11;:24;;;;:54;;;;;:::i;:::-;34745:256:::0;:::o;32706:1154::-;23743:1;24341:7;;:19;24333:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23743:1;24474:7;:18;;;;32801:15:::1;32769:16;:28;32786:10;32769:28;;;;;;;;;;;;;;;;:47;;32761:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;32874:21;32898:8;32907:1;32898:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32874:35;;32920:21;32944:8;:20;32953:10;32944:20;;;;;;;;;;;;;;;32920:44;;32977:15;32995:4;:11;;;32977:29;;33017:13;33028:1;33017:10;:13::i;:::-;33041:15;33059:70;33113:4;:15;;;33059:49;33103:4;33059:39;33075:4;:22;;;33059:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;33041:88;;33153:1;33143:7;:11;33140:217;;;33189:18;:16;:18::i;:::-;33178:7;:29;;33170:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;33291:54;33324:10;33337:7;33291:11;:24;;;;:54;;;;;:::i;:::-;33140:217;33382:1;33372:7;:11;33369:165;;;33414:1;33400:4;:11;;:15;;;;33445:7;33430:11;;:22;;;;;;;:::i;:::-;;;;;;;;33467:55;33501:10;33514:7;33467:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;33369:165;33564:49;33608:4;33564:39;33580:4;:22;;;33564:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;33546:4;:15;;:67;;;;33651:1;33637:4;:11;;;:15;33634:172;;;33717:12;;33699:15;:30;;;;:::i;:::-;33668:16;:28;33685:10;33668:28;;;;;;;;;;;;;;;:61;;;;33634:172;;;33793:1;33762:16;:28;33779:10;33762:28;;;;;;;;;;;;;;;:32;;;;33634:172;33832:10;33823:29;;;33844:7;33823:29;;;;;;:::i;:::-;;;;;;;;32748:1112;;;;23699:1:::0;24653:7;:22;;;;32706:1154::o;25641:18::-;;;;:::o;28850:190::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28905:14:::1;28922:8;:15;;;;28905:32;;28953:11;28948:85;28976:6;28970:3;:12;28948:85;;;29006:15;29017:3;29006:10;:15::i;:::-;28984:5;;;;:::i;:::-;;;28948:85;;;;28894:146;28850:190::o:0;25743:34::-;;;;;;;;;;;;;:::o;2811:140::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2910:1:::1;2873:40;;2894:6;::::0;::::1;;;;;;;;2873:40;;;;;;;;;;;;2941:1;2924:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2811:140::o:0;25462:36::-;;;:::o;27092:207::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27188:11:::1;27153:8;27162:1;27153:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:46;27145:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;27276:15;27242:8;27251:1;27242:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;27092:207::o:0;35326:133::-;35375:7;35440:11;;35401;:21;;;35431:4;35401:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;35394:57;;35326:133;:::o;25700:30::-;;;;:::o;26993:91::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27045:13:::1;27056:1;27045:10;:13::i;:::-;27075:1;27069:3;:7;;;;26993:91::o:0;25608:26::-;;;;:::o;35467:168::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35550:3:::1;35540:6;:13;;35532:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;35591:13;35602:1;35591:10;:13::i;:::-;35621:6;35615:3;:12;;;;35467:168:::0;:::o;2169:79::-;2207:7;2234:6;;;;;;;;;;;2227:13;;2169:79;:::o;35845:192::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35952:2:::1;35934:14;:20;;35926:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36015:14;35997:15;:32;;;;35845:192:::0;:::o;35009:309::-;35061:7;35081:21;35105:8;35114:1;35105:11;;;;;;;;:::i;:::-;;;;;;;;;;;;35081:35;;35157:15;35130:4;:24;;;:42;35127:81;;;35195:1;35188:8;;;;;35127:81;35301:8;35295:3;35289;;35274:11;;35246:4;:24;;;35228:15;:42;;;;:::i;:::-;35227:58;;;;:::i;:::-;35226:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;35218:92;;;35009:309;;:::o;25547:52::-;;;;;;;;;;;;;;;;;:::o;30479:1410::-;23743:1;24341:7;;:19;24333:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23743:1;24474:7;:18;;;;30581:1:::1;30549:16;:28;30566:10;30549:28;;;;;;;;;;;;;;;;:33:::0;30546:125:::1;;30647:12;;30629:15;:30;;;;:::i;:::-;30598:16;:28;30615:10;30598:28;;;;;;;;;;;;;;;:61;;;;30546:125;30681:21;30705:8;30714:1;30705:11;;;;;;;;:::i;:::-;;;;;;;;;;;;30681:35;;30727:21;30751:8;:20;30760:10;30751:20;;;;;;;;;;;;;;;30727:44;;30788:22;;;;;;;;;;;30787:23;:38;;;;;30824:1;30814:7;:11;30787:38;30784:115;;;30864:1;30849:4;:11;;;:16;30841:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;30784:115;30911:13;30922:1;30911:10;:13::i;:::-;30953:1;30939:4;:11;;;:15;30935:380;;;30971:15;30989:70;31043:4;:15;;;30989:49;31033:4;30989:39;31005:4;:22;;;30989:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;30971:88;;31087:1;31077:7;:11;31074:230;;;31128:18;:16;:18::i;:::-;31117:7;:29;;31109:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;31234:54;31267:10;31280:7;31234:11;:24;;;;:54;;;;;:::i;:::-;31074:230;30956:359;30935:380;31325:25;31378:1:::0;31368:7:::1;:11;31365:393;;;31396:22;31421:4;:12;;;;;;;;;;;;:22;;;31452:4;31421:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31396:62;;31473:74;31511:10;31532:4;31539:7;31473:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;31622:14;31582:4;:12;;;;;;;;;;;;:22;;;31613:4;31582:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;31562:74;;31665:34;31681:17;31665:4;:11;;;:15;;:34;;;;:::i;:::-;31651:4;:11;;:48;;;;31729:17;31714:11;;:32;;;;;;;:::i;:::-;;;;;;;;31381:377;31365:393;31786:49;31830:4;31786:39;31802:4;:22;;;31786:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;31768:4;:15;;:67;;;;31861:10;31853:28;;;31873:7;31853:28;;;;;;:::i;:::-;;;;;;;;30535:1354;;;23699:1:::0;24653:7;:22;;;;30479:1410;:::o;35643:194::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35745:3:::1;35730:11;:18;;35722:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35823:6;35809:11;:20;;;;:::i;:::-;35794:12;:35;;;;35643:194:::0;:::o;33931:665::-;23743:1;24341:7;;:19;24333:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23743:1;24474:7;:18;;;;33993:21:::1;34017:8;34026:1;34017:11;;;;;;;;:::i;:::-;;;;;;;;;;;;33993:35;;34039:21;34063:8;:20;34072:10;34063:20;;;;;;;;;;;;;;;34039:44;;34094:15;34112:4;:11;;;34094:29;;34149:7;34134:11;;:22;;;;;;;:::i;:::-;;;;;;;;34285:15;34253:16;:28;34270:10;34253:28;;;;;;;;;;;;;;;;:47;34250:120;;34355:3;34337:15;;34327:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;34316:42;;;;;:::i;:::-;;;34250:120;34411:1;34380:16;:28;34397:10;34380:28;;;;;;;;;;;;;;;:32;;;;34423:55;34457:10;34470:7;34423:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;34503:1;34489:4;:11;;:15;;;;34533:1;34515:4;:15;;:19;;;;34568:10;34550:38;;;34580:7;34550:38;;;;;;:::i;:::-;;;;;;;;33982:614;;;23699:1:::0;24653:7;:22;;;;33931:665::o;3106:109::-;2391:12;:10;:12::i;:::-;2381:22;;:6;;;;;;;;;;:22;;;2373:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3179:28:::1;3198:8;3179:18;:28::i;:::-;3106:109:::0;:::o;27364:727::-;27425:7;27445:21;27469:8;27478:1;27469:11;;;;;;;;:::i;:::-;;;;;;;;;;;;27445:35;;27491:21;27515:8;:15;27524:5;27515:15;;;;;;;;;;;;;;;27491:39;;27572:11;27544:4;:24;;;:39;27541:78;;27606:1;27599:8;;;;;;27541:78;27629:25;27657:4;:22;;;27629:50;;27690:16;27709:11;;27690:30;;27753:4;:24;;;27735:15;:42;:59;;;;;27793:1;27781:8;:13;;27735:59;27731:270;;;27811:19;27833:63;27880:15;;27833:42;27859:4;:15;;;27833:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27811:85;;27931:58;27953:35;27979:8;27953:21;27969:4;27953:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;27931:17;:21;;:58;;;;:::i;:::-;27911:78;;27796:205;27731:270;28018:65;28067:4;:15;;;28018:44;28057:4;28018:34;28034:17;28018:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;28011:72;;;;;;27364:727;;;;:::o;31897:753::-;23743:1;24341:7;;:19;24333:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23743:1;24474:7;:18;;;;31958:22:::1;;;;;;;;;;;31950:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;32011:21;32035:8;32044:1;32035:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32011:35;;32057:21;32081:8;:20;32090:10;32081:20;;;;;;;;;;;;;;;32057:44;;32114:13;32125:1;32114:10;:13::i;:::-;32156:1;32142:4;:11;;;:15;32138:389;;;32174:15;32192:70;32246:4;:15;;;32192:49;32236:4;32192:39;32208:4;:22;;;32192:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;32174:88;;32290:1;32280:7;:11;32277:239;;;32331:18;:16;:18::i;:::-;32320:7;:29;;32312:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;32452:7;32437:4;:11;;;:22;;;;;;;:::i;:::-;;;;;;;;32493:7;32478:11;;:22;;;;;;;:::i;:::-;;;;;;;;32277:239;32159:368;32138:389;32557:49;32601:4;32557:39;32573:4;:22;;;32557:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;32539:4;:15;;:67;;;;32631:10;32622:20;;;;;;;;;;;;31939:711;;23699:1:::0;24653:7;:22;;;;31897:753::o;25505:35::-;;;:::o;823:107::-;868:15;911:10;896:26;;823:107;:::o;28167:600::-;28221:21;28245:8;28254:4;28245:14;;;;;;;;:::i;:::-;;;;;;;;;;;;28221:38;;28293:4;:24;;;28274:15;:43;28270:82;;28334:7;;;28270:82;28362:16;28381:11;;28362:30;;28419:1;28407:8;:13;28403:109;;28464:15;28437:4;:24;;:42;;;;28494:7;;;;28403:109;28522:19;28544:63;28591:15;;28544:42;28570:4;:15;;;28544:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;28522:85;;28643:63;28670:35;28696:8;28670:21;28686:4;28670:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;28643:4;:22;;;:26;;:63;;;;:::i;:::-;28618:4;:22;;:88;;;;28744:15;28717:4;:24;;:42;;;;28210:557;;;28167:600;;:::o;5785:471::-;5843:7;6093:1;6088;:6;6084:47;;6118:1;6111:8;;;;6084:47;6143:9;6159:1;6155;:5;;;;:::i;:::-;6143:17;;6188:1;6183;6179;:5;;;;:::i;:::-;:10;6171:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6247:1;6240:8;;;5785:471;;;;;:::o;6732:132::-;6790:7;6817:39;6821:1;6824;6817:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6810:46;;6732:132;;;;:::o;4861:136::-;4919:7;4946:43;4950:1;4953;4946:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4939:50;;4861:136;;;;:::o;13210:211::-;13327:86;13347:5;13377:23;;;13402:2;13406:5;13354:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13327:19;:86::i;:::-;13210:211;;;:::o;4397:181::-;4455:7;4475:9;4491:1;4487;:5;;;;:::i;:::-;4475:17;;4516:1;4511;:6;;4503:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4569:1;4562:8;;;4397:181;;;;:::o;13429:248::-;13573:96;13593:5;13623:27;;;13652:4;13658:2;13662:5;13600:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13573:19;:96::i;:::-;13429:248;;;;:::o;3321:229::-;3415:1;3395:22;;:8;:22;;;3387:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3505:8;3476:38;;3497:6;;;;;;;;;;3476:38;;;;;;;;;;;;3534:8;3525:6;;:17;;;;;;;;;;;;;;;;;;3321:229;:::o;7360:312::-;7480:7;7512:1;7508;:5;7515:12;7500:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7539:9;7555:1;7551;:5;;;;:::i;:::-;7539:17;;7663:1;7656:8;;;7360:312;;;;;:::o;5300:226::-;5420:7;5453:1;5448;:6;;5456:12;5440:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5480:9;5496:1;5492;:5;;;;:::i;:::-;5480:17;;5517:1;5510:8;;;5300:226;;;;;:::o;15745:774::-;16169:23;16195:69;16223:4;16195:69;;;;;;;;;;;;;;;;;16203:5;16195:27;;;;:69;;;;;:::i;:::-;16169:95;;16299:1;16279:10;:17;:21;16275:237;;;16434:10;16423:30;;;;;;;;;;;;:::i;:::-;16415:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16275:237;15815:704;15745:774;;:::o;20344:230::-;20481:12;20513:53;20536:6;20544:4;20550:1;20553:12;20513:22;:53::i;:::-;20506:60;;20344:230;;;;;:::o;21832:1020::-;22005:12;22038:18;22049:6;22038:10;:18::i;:::-;22030:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22164:12;22178:23;22205:6;:11;;22224:8;22234:4;22205:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22163:76;;;;22254:7;22250:595;;;22285:10;22278:17;;;;;;22250:595;22419:1;22399:10;:17;:21;22395:439;;;22662:10;22656:17;22723:15;22710:10;22706:2;22702:19;22695:44;22395:439;22805:12;22798:20;;;;;;;;;;;:::i;:::-;;;;;;;;21832:1020;;;;;;;:::o;17207:641::-;17267:4;17529:16;17556:19;17578:66;17556:88;;;;17760:7;17748:20;17736:32;;17809:11;17797:8;:23;;:42;;;;;17836:3;17824:15;;:8;:15;;17797:42;17789:51;;;;17207:641;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:90;803:7;846:5;839:13;832:21;821:32;;769:90;;;:::o;865:116::-;935:21;950:5;935:21;:::i;:::-;928:5;925:32;915:60;;971:1;968;961:12;915:60;865:116;:::o;987:133::-;1030:5;1068:6;1055:20;1046:29;;1084:30;1108:5;1084:30;:::i;:::-;987:133;;;;:::o;1126:323::-;1182:6;1231:2;1219:9;1210:7;1206:23;1202:32;1199:119;;;1237:79;;:::i;:::-;1199:119;1357:1;1382:50;1424:7;1415:6;1404:9;1400:22;1382:50;:::i;:::-;1372:60;;1328:114;1126:323;;;;:::o;1455:122::-;1528:24;1546:5;1528:24;:::i;:::-;1521:5;1518:35;1508:63;;1567:1;1564;1557:12;1508:63;1455:122;:::o;1583:139::-;1629:5;1667:6;1654:20;1645:29;;1683:33;1710:5;1683:33;:::i;:::-;1583:139;;;;:::o;1728:329::-;1787:6;1836:2;1824:9;1815:7;1811:23;1807:32;1804:119;;;1842:79;;:::i;:::-;1804:119;1962:1;1987:53;2032:7;2023:6;2012:9;2008:22;1987:53;:::i;:::-;1977:63;;1933:117;1728:329;;;;:::o;2063:126::-;2100:7;2140:42;2133:5;2129:54;2118:65;;2063:126;;;:::o;2195:60::-;2223:3;2244:5;2237:12;;2195:60;;;:::o;2261:142::-;2311:9;2344:53;2362:34;2371:24;2389:5;2371:24;:::i;:::-;2362:34;:::i;:::-;2344:53;:::i;:::-;2331:66;;2261:142;;;:::o;2409:126::-;2459:9;2492:37;2523:5;2492:37;:::i;:::-;2479:50;;2409:126;;;:::o;2541:140::-;2605:9;2638:37;2669:5;2638:37;:::i;:::-;2625:50;;2541:140;;;:::o;2687:159::-;2788:51;2833:5;2788:51;:::i;:::-;2783:3;2776:64;2687:159;;:::o;2852:581::-;3043:4;3081:3;3070:9;3066:19;3058:27;;3095:85;3177:1;3166:9;3162:17;3153:6;3095:85;:::i;:::-;3190:72;3258:2;3247:9;3243:18;3234:6;3190:72;:::i;:::-;3272;3340:2;3329:9;3325:18;3316:6;3272:72;:::i;:::-;3354;3422:2;3411:9;3407:18;3398:6;3354:72;:::i;:::-;2852:581;;;;;;;:::o;3439:96::-;3476:7;3505:24;3523:5;3505:24;:::i;:::-;3494:35;;3439:96;;;:::o;3541:122::-;3614:24;3632:5;3614:24;:::i;:::-;3607:5;3604:35;3594:63;;3653:1;3650;3643:12;3594:63;3541:122;:::o;3669:139::-;3715:5;3753:6;3740:20;3731:29;;3769:33;3796:5;3769:33;:::i;:::-;3669:139;;;;:::o;3814:329::-;3873:6;3922:2;3910:9;3901:7;3897:23;3893:32;3890:119;;;3928:79;;:::i;:::-;3890:119;4048:1;4073:53;4118:7;4109:6;4098:9;4094:22;4073:53;:::i;:::-;4063:63;;4019:117;3814:329;;;;:::o;4149:332::-;4270:4;4308:2;4297:9;4293:18;4285:26;;4321:71;4389:1;4378:9;4374:17;4365:6;4321:71;:::i;:::-;4402:72;4470:2;4459:9;4455:18;4446:6;4402:72;:::i;:::-;4149:332;;;;;:::o;4487:117::-;4596:1;4593;4586:12;4610:117;4719:1;4716;4709:12;4733:117;4842:1;4839;4832:12;4873:568;4946:8;4956:6;5006:3;4999:4;4991:6;4987:17;4983:27;4973:122;;5014:79;;:::i;:::-;4973:122;5127:6;5114:20;5104:30;;5157:18;5149:6;5146:30;5143:117;;;5179:79;;:::i;:::-;5143:117;5293:4;5285:6;5281:17;5269:29;;5347:3;5339:4;5331:6;5327:17;5317:8;5313:32;5310:41;5307:128;;;5354:79;;:::i;:::-;5307:128;4873:568;;;;;:::o;5464:::-;5537:8;5547:6;5597:3;5590:4;5582:6;5578:17;5574:27;5564:122;;5605:79;;:::i;:::-;5564:122;5718:6;5705:20;5695:30;;5748:18;5740:6;5737:30;5734:117;;;5770:79;;:::i;:::-;5734:117;5884:4;5876:6;5872:17;5860:29;;5938:3;5930:4;5922:6;5918:17;5908:8;5904:32;5901:41;5898:128;;;5945:79;;:::i;:::-;5898:128;5464:568;;;;;:::o;6038:1309::-;6196:6;6204;6212;6220;6228;6236;6285:2;6273:9;6264:7;6260:23;6256:32;6253:119;;;6291:79;;:::i;:::-;6253:119;6439:1;6428:9;6424:17;6411:31;6469:18;6461:6;6458:30;6455:117;;;6491:79;;:::i;:::-;6455:117;6604:80;6676:7;6667:6;6656:9;6652:22;6604:80;:::i;:::-;6586:98;;;;6382:312;6761:2;6750:9;6746:18;6733:32;6792:18;6784:6;6781:30;6778:117;;;6814:79;;:::i;:::-;6778:117;6927:80;6999:7;6990:6;6979:9;6975:22;6927:80;:::i;:::-;6909:98;;;;6704:313;7084:2;7073:9;7069:18;7056:32;7115:18;7107:6;7104:30;7101:117;;;7137:79;;:::i;:::-;7101:117;7250:80;7322:7;7313:6;7302:9;7298:22;7250:80;:::i;:::-;7232:98;;;;7027:313;6038:1309;;;;;;;;:::o;7353:109::-;7434:21;7449:5;7434:21;:::i;:::-;7429:3;7422:34;7353:109;;:::o;7468:210::-;7555:4;7593:2;7582:9;7578:18;7570:26;;7606:65;7668:1;7657:9;7653:17;7644:6;7606:65;:::i;:::-;7468:210;;;;:::o;7684:250::-;7791:4;7829:2;7818:9;7814:18;7806:26;;7842:85;7924:1;7913:9;7909:17;7900:6;7842:85;:::i;:::-;7684:250;;;;:::o;7940:118::-;8027:24;8045:5;8027:24;:::i;:::-;8022:3;8015:37;7940:118;;:::o;8064:222::-;8157:4;8195:2;8184:9;8180:18;8172:26;;8208:71;8276:1;8265:9;8261:17;8252:6;8208:71;:::i;:::-;8064:222;;;;:::o;8292:169::-;8376:11;8410:6;8405:3;8398:19;8450:4;8445:3;8441:14;8426:29;;8292:169;;;;:::o;8467:182::-;8607:34;8603:1;8595:6;8591:14;8584:58;8467:182;:::o;8655:366::-;8797:3;8818:67;8882:2;8877:3;8818:67;:::i;:::-;8811:74;;8894:93;8983:3;8894:93;:::i;:::-;9012:2;9007:3;9003:12;8996:19;;8655:366;;;:::o;9027:419::-;9193:4;9231:2;9220:9;9216:18;9208:26;;9280:9;9274:4;9270:20;9266:1;9255:9;9251:17;9244:47;9308:131;9434:4;9308:131;:::i;:::-;9300:139;;9027:419;;;:::o;9452:165::-;9592:17;9588:1;9580:6;9576:14;9569:41;9452:165;:::o;9623:366::-;9765:3;9786:67;9850:2;9845:3;9786:67;:::i;:::-;9779:74;;9862:93;9951:3;9862:93;:::i;:::-;9980:2;9975:3;9971:12;9964:19;;9623:366;;;:::o;9995:419::-;10161:4;10199:2;10188:9;10184:18;10176:26;;10248:9;10242:4;10238:20;10234:1;10223:9;10219:17;10212:47;10276:131;10402:4;10276:131;:::i;:::-;10268:139;;9995:419;;;:::o;10420:180::-;10468:77;10465:1;10458:88;10565:4;10562:1;10555:15;10589:4;10586:1;10579:15;10606:251;10746:34;10742:1;10734:6;10730:14;10723:58;10815:34;10810:2;10802:6;10798:15;10791:59;10606:251;:::o;10863:366::-;11005:3;11026:67;11090:2;11085:3;11026:67;:::i;:::-;11019:74;;11102:93;11191:3;11102:93;:::i;:::-;11220:2;11215:3;11211:12;11204:19;;10863:366;;;:::o;11235:419::-;11401:4;11439:2;11428:9;11424:18;11416:26;;11488:9;11482:4;11478:20;11474:1;11463:9;11459:17;11452:47;11516:131;11642:4;11516:131;:::i;:::-;11508:139;;11235:419;;;:::o;11660:180::-;11708:77;11705:1;11698:88;11805:4;11802:1;11795:15;11829:4;11826:1;11819:15;11846:191;11886:3;11905:20;11923:1;11905:20;:::i;:::-;11900:25;;11939:20;11957:1;11939:20;:::i;:::-;11934:25;;11982:1;11979;11975:9;11968:16;;12003:3;12000:1;11997:10;11994:36;;;12010:18;;:::i;:::-;11994:36;11846:191;;;;:::o;12043:233::-;12082:3;12105:24;12123:5;12105:24;:::i;:::-;12096:33;;12151:66;12144:5;12141:77;12138:103;;12221:18;;:::i;:::-;12138:103;12268:1;12261:5;12257:13;12250:20;;12043:233;;;:::o;12282:143::-;12339:5;12370:6;12364:13;12355:22;;12386:33;12413:5;12386:33;:::i;:::-;12282:143;;;;:::o;12431:351::-;12501:6;12550:2;12538:9;12529:7;12525:23;12521:32;12518:119;;;12556:79;;:::i;:::-;12518:119;12676:1;12701:64;12757:7;12748:6;12737:9;12733:22;12701:64;:::i;:::-;12691:74;;12647:128;12431:351;;;;:::o;12788:178::-;12928:30;12924:1;12916:6;12912:14;12905:54;12788:178;:::o;12972:366::-;13114:3;13135:67;13199:2;13194:3;13135:67;:::i;:::-;13128:74;;13211:93;13300:3;13211:93;:::i;:::-;13329:2;13324:3;13320:12;13313:19;;12972:366;;;:::o;13344:419::-;13510:4;13548:2;13537:9;13533:18;13525:26;;13597:9;13591:4;13587:20;13583:1;13572:9;13568:17;13561:47;13625:131;13751:4;13625:131;:::i;:::-;13617:139;;13344:419;;;:::o;13769:194::-;13809:4;13829:20;13847:1;13829:20;:::i;:::-;13824:25;;13863:20;13881:1;13863:20;:::i;:::-;13858:25;;13907:1;13904;13900:9;13892:17;;13931:1;13925:4;13922:11;13919:37;;;13936:18;;:::i;:::-;13919:37;13769:194;;;;:::o;13969:179::-;14109:31;14105:1;14097:6;14093:14;14086:55;13969:179;:::o;14154:366::-;14296:3;14317:67;14381:2;14376:3;14317:67;:::i;:::-;14310:74;;14393:93;14482:3;14393:93;:::i;:::-;14511:2;14506:3;14502:12;14495:19;;14154:366;;;:::o;14526:419::-;14692:4;14730:2;14719:9;14715:18;14707:26;;14779:9;14773:4;14769:20;14765:1;14754:9;14750:17;14743:47;14807:131;14933:4;14807:131;:::i;:::-;14799:139;;14526:419;;;:::o;14951:181::-;15091:33;15087:1;15079:6;15075:14;15068:57;14951:181;:::o;15138:366::-;15280:3;15301:67;15365:2;15360:3;15301:67;:::i;:::-;15294:74;;15377:93;15466:3;15377:93;:::i;:::-;15495:2;15490:3;15486:12;15479:19;;15138:366;;;:::o;15510:419::-;15676:4;15714:2;15703:9;15699:18;15691:26;;15763:9;15757:4;15753:20;15749:1;15738:9;15734:17;15727:47;15791:131;15917:4;15791:131;:::i;:::-;15783:139;;15510:419;;;:::o;15935:182::-;16075:34;16071:1;16063:6;16059:14;16052:58;15935:182;:::o;16123:366::-;16265:3;16286:67;16350:2;16345:3;16286:67;:::i;:::-;16279:74;;16362:93;16451:3;16362:93;:::i;:::-;16480:2;16475:3;16471:12;16464:19;;16123:366;;;:::o;16495:419::-;16661:4;16699:2;16688:9;16684:18;16676:26;;16748:9;16742:4;16738:20;16734:1;16723:9;16719:17;16712:47;16776:131;16902:4;16776:131;:::i;:::-;16768:139;;16495:419;;;:::o;16920:177::-;17060:29;17056:1;17048:6;17044:14;17037:53;16920:177;:::o;17103:366::-;17245:3;17266:67;17330:2;17325:3;17266:67;:::i;:::-;17259:74;;17342:93;17431:3;17342:93;:::i;:::-;17460:2;17455:3;17451:12;17444:19;;17103:366;;;:::o;17475:419::-;17641:4;17679:2;17668:9;17664:18;17656:26;;17728:9;17722:4;17718:20;17714:1;17703:9;17699:17;17692:47;17756:131;17882:4;17756:131;:::i;:::-;17748:139;;17475:419;;;:::o;17900:172::-;18040:24;18036:1;18028:6;18024:14;18017:48;17900:172;:::o;18078:366::-;18220:3;18241:67;18305:2;18300:3;18241:67;:::i;:::-;18234:74;;18317:93;18406:3;18317:93;:::i;:::-;18435:2;18430:3;18426:12;18419:19;;18078:366;;;:::o;18450:419::-;18616:4;18654:2;18643:9;18639:18;18631:26;;18703:9;18697:4;18693:20;18689:1;18678:9;18674:17;18667:47;18731:131;18857:4;18731:131;:::i;:::-;18723:139;;18450:419;;;:::o;18875:177::-;19015:29;19011:1;19003:6;18999:14;18992:53;18875:177;:::o;19058:366::-;19200:3;19221:67;19285:2;19280:3;19221:67;:::i;:::-;19214:74;;19297:93;19386:3;19297:93;:::i;:::-;19415:2;19410:3;19406:12;19399:19;;19058:366;;;:::o;19430:419::-;19596:4;19634:2;19623:9;19619:18;19611:26;;19683:9;19677:4;19673:20;19669:1;19658:9;19654:17;19647:47;19711:131;19837:4;19711:131;:::i;:::-;19703:139;;19430:419;;;:::o;19855:348::-;19895:7;19918:20;19936:1;19918:20;:::i;:::-;19913:25;;19952:20;19970:1;19952:20;:::i;:::-;19947:25;;20140:1;20072:66;20068:74;20065:1;20062:81;20057:1;20050:9;20043:17;20039:105;20036:131;;;20147:18;;:::i;:::-;20036:131;20195:1;20192;20188:9;20177:20;;19855:348;;;;:::o;20209:180::-;20257:77;20254:1;20247:88;20354:4;20351:1;20344:15;20378:4;20375:1;20368:15;20395:185;20435:1;20452:20;20470:1;20452:20;:::i;:::-;20447:25;;20486:20;20504:1;20486:20;:::i;:::-;20481:25;;20525:1;20515:35;;20530:18;;:::i;:::-;20515:35;20572:1;20569;20565:9;20560:14;;20395:185;;;;:::o;20586:167::-;20726:19;20722:1;20714:6;20710:14;20703:43;20586:167;:::o;20759:366::-;20901:3;20922:67;20986:2;20981:3;20922:67;:::i;:::-;20915:74;;20998:93;21087:3;20998:93;:::i;:::-;21116:2;21111:3;21107:12;21100:19;;20759:366;;;:::o;21131:419::-;21297:4;21335:2;21324:9;21320:18;21312:26;;21384:9;21378:4;21374:20;21370:1;21359:9;21355:17;21348:47;21412:131;21538:4;21412:131;:::i;:::-;21404:139;;21131:419;;;:::o;21556:180::-;21696:32;21692:1;21684:6;21680:14;21673:56;21556:180;:::o;21742:366::-;21884:3;21905:67;21969:2;21964:3;21905:67;:::i;:::-;21898:74;;21981:93;22070:3;21981:93;:::i;:::-;22099:2;22094:3;22090:12;22083:19;;21742:366;;;:::o;22114:419::-;22280:4;22318:2;22307:9;22303:18;22295:26;;22367:9;22361:4;22357:20;22353:1;22342:9;22338:17;22331:47;22395:131;22521:4;22395:131;:::i;:::-;22387:139;;22114:419;;;:::o;22539:165::-;22679:17;22675:1;22667:6;22663:14;22656:41;22539:165;:::o;22710:366::-;22852:3;22873:67;22937:2;22932:3;22873:67;:::i;:::-;22866:74;;22949:93;23038:3;22949:93;:::i;:::-;23067:2;23062:3;23058:12;23051:19;;22710:366;;;:::o;23082:419::-;23248:4;23286:2;23275:9;23271:18;23263:26;;23335:9;23329:4;23325:20;23321:1;23310:9;23306:17;23299:47;23363:131;23489:4;23363:131;:::i;:::-;23355:139;;23082:419;;;:::o;23507:220::-;23647:34;23643:1;23635:6;23631:14;23624:58;23716:3;23711:2;23703:6;23699:15;23692:28;23507:220;:::o;23733:366::-;23875:3;23896:67;23960:2;23955:3;23896:67;:::i;:::-;23889:74;;23972:93;24061:3;23972:93;:::i;:::-;24090:2;24085:3;24081:12;24074:19;;23733:366;;;:::o;24105:419::-;24271:4;24309:2;24298:9;24294:18;24286:26;;24358:9;24352:4;24348:20;24344:1;24333:9;24329:17;24322:47;24386:131;24512:4;24386:131;:::i;:::-;24378:139;;24105:419;;;:::o;24530:332::-;24651:4;24689:2;24678:9;24674:18;24666:26;;24702:71;24770:1;24759:9;24755:17;24746:6;24702:71;:::i;:::-;24783:72;24851:2;24840:9;24836:18;24827:6;24783:72;:::i;:::-;24530:332;;;;;:::o;24868:177::-;25008:29;25004:1;24996:6;24992:14;24985:53;24868:177;:::o;25051:366::-;25193:3;25214:67;25278:2;25273:3;25214:67;:::i;:::-;25207:74;;25290:93;25379:3;25290:93;:::i;:::-;25408:2;25403:3;25399:12;25392:19;;25051:366;;;:::o;25423:419::-;25589:4;25627:2;25616:9;25612:18;25604:26;;25676:9;25670:4;25666:20;25662:1;25651:9;25647:17;25640:47;25704:131;25830:4;25704:131;:::i;:::-;25696:139;;25423:419;;;:::o;25848:442::-;25997:4;26035:2;26024:9;26020:18;26012:26;;26048:71;26116:1;26105:9;26101:17;26092:6;26048:71;:::i;:::-;26129:72;26197:2;26186:9;26182:18;26173:6;26129:72;:::i;:::-;26211;26279:2;26268:9;26264:18;26255:6;26211:72;:::i;:::-;25848:442;;;;;;:::o;26296:225::-;26436:34;26432:1;26424:6;26420:14;26413:58;26505:8;26500:2;26492:6;26488:15;26481:33;26296:225;:::o;26527:366::-;26669:3;26690:67;26754:2;26749:3;26690:67;:::i;:::-;26683:74;;26766:93;26855:3;26766:93;:::i;:::-;26884:2;26879:3;26875:12;26868:19;;26527:366;;;:::o;26899:419::-;27065:4;27103:2;27092:9;27088:18;27080:26;;27152:9;27146:4;27142:20;27138:1;27127:9;27123:17;27116:47;27180:131;27306:4;27180:131;:::i;:::-;27172:139;;26899:419;;;:::o;27324:99::-;27376:6;27410:5;27404:12;27394:22;;27324:99;;;:::o;27429:246::-;27510:1;27520:113;27534:6;27531:1;27528:13;27520:113;;;27619:1;27614:3;27610:11;27604:18;27600:1;27595:3;27591:11;27584:39;27556:2;27553:1;27549:10;27544:15;;27520:113;;;27667:1;27658:6;27653:3;27649:16;27642:27;27491:184;27429:246;;;:::o;27681:102::-;27722:6;27773:2;27769:7;27764:2;27757:5;27753:14;27749:28;27739:38;;27681:102;;;:::o;27789:377::-;27877:3;27905:39;27938:5;27905:39;:::i;:::-;27960:71;28024:6;28019:3;27960:71;:::i;:::-;27953:78;;28040:65;28098:6;28093:3;28086:4;28079:5;28075:16;28040:65;:::i;:::-;28130:29;28152:6;28130:29;:::i;:::-;28125:3;28121:39;28114:46;;27881:285;27789:377;;;;:::o;28172:313::-;28285:4;28323:2;28312:9;28308:18;28300:26;;28372:9;28366:4;28362:20;28358:1;28347:9;28343:17;28336:47;28400:78;28473:4;28464:6;28400:78;:::i;:::-;28392:86;;28172:313;;;;:::o;28491:137::-;28545:5;28576:6;28570:13;28561:22;;28592:30;28616:5;28592:30;:::i;:::-;28491:137;;;;:::o;28634:345::-;28701:6;28750:2;28738:9;28729:7;28725:23;28721:32;28718:119;;;28756:79;;:::i;:::-;28718:119;28876:1;28901:61;28954:7;28945:6;28934:9;28930:22;28901:61;:::i;:::-;28891:71;;28847:125;28634:345;;;;:::o;28985:229::-;29125:34;29121:1;29113:6;29109:14;29102:58;29194:12;29189:2;29181:6;29177:15;29170:37;28985:229;:::o;29220:366::-;29362:3;29383:67;29447:2;29442:3;29383:67;:::i;:::-;29376:74;;29459:93;29548:3;29459:93;:::i;:::-;29577:2;29572:3;29568:12;29561:19;;29220:366;;;:::o;29592:419::-;29758:4;29796:2;29785:9;29781:18;29773:26;;29845:9;29839:4;29835:20;29831:1;29820:9;29816:17;29809:47;29873:131;29999:4;29873:131;:::i;:::-;29865:139;;29592:419;;;:::o;30017:179::-;30157:31;30153:1;30145:6;30141:14;30134:55;30017:179;:::o;30202:366::-;30344:3;30365:67;30429:2;30424:3;30365:67;:::i;:::-;30358:74;;30441:93;30530:3;30441:93;:::i;:::-;30559:2;30554:3;30550:12;30543:19;;30202:366;;;:::o;30574:419::-;30740:4;30778:2;30767:9;30763:18;30755:26;;30827:9;30821:4;30817:20;30813:1;30802:9;30798:17;30791:47;30855:131;30981:4;30855:131;:::i;:::-;30847:139;;30574:419;;;:::o;30999:98::-;31050:6;31084:5;31078:12;31068:22;;30999:98;;;:::o;31103:147::-;31204:11;31241:3;31226:18;;31103:147;;;;:::o;31256:386::-;31360:3;31388:38;31420:5;31388:38;:::i;:::-;31442:88;31523:6;31518:3;31442:88;:::i;:::-;31435:95;;31539:65;31597:6;31592:3;31585:4;31578:5;31574:16;31539:65;:::i;:::-;31629:6;31624:3;31620:16;31613:23;;31364:278;31256:386;;;;:::o;31648:271::-;31778:3;31800:93;31889:3;31880:6;31800:93;:::i;:::-;31793:100;;31910:3;31903:10;;31648:271;;;;:::o

Swarm Source

ipfs://3c6c5020134092b3a06a8d6b6106a64fbdb57498c09570d172c2b18571ef70fa
Loading...
Loading
[ 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.