Contract Address Details

0x69219B5A1767F002E57c6D8847b2d6BB7ADee864

Token
DOGEPOOP (DOGEPOOP)
Creator
0xbe439d–daeb66 at 0x185d4e–943b58
Balance
0 Doge
Tokens
Fetching tokens...
Transactions
817 Transactions
Transfers
60 Transfers
Gas Used
46,210,965
Last Balance Update
26630111
Contract name:
Dogepoop




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2022-09-06T20:16:12.592534Z

Contract source code

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

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

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

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

/**
 * @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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}



contract Dogepoop is ERC20{
    
    IERC20 KatzLP = IERC20(0x6B4e90DcEd2AbD40bf4D942356C3D58A18FFf5fC);
    address public admin;
    mapping(uint => uint) public annualDogepoopPerKatz; 

    mapping(address => Stake[]) public stakes;

    struct Stake{
        uint amount;
        uint depositTime;
        uint withdrawTime;
        uint claimed;
        uint dogepoopPerKatz;
        uint saved;
        uint lockTime;
    }

    modifier onlyAdmin(){
        require(msg.sender == admin,"ONLYADMIN");
        _;
    }

    constructor() ERC20("DOGEPOOP", "DOGEPOOP") {        
        _mint(msg.sender, 20000000000000000000000000000);
        admin = msg.sender;
    }

    function stakeLP(uint amount,uint duration) external{
        require(annualDogepoopPerKatz[duration]!=0,"What you're doing is not in your best interest");
        KatzLP.transferFrom(msg.sender,address(this),amount);

        Stake memory stakingObj;
        stakingObj.amount=amount;
        stakingObj.depositTime=block.timestamp;
        stakingObj.dogepoopPerKatz = annualDogepoopPerKatz[duration];
        stakingObj.lockTime = duration;
        
        stakes[msg.sender].push(stakingObj);

    } 

    function withdrawLP(uint index) external{
        
        require(stakes[msg.sender][index].withdrawTime == 0, "Already Withdrawn");

        require(block.timestamp - stakes[msg.sender][index].depositTime > stakes[msg.sender][index].lockTime,"Minimum Lock Time Not Met");

        stakes[msg.sender][index].withdrawTime = block.timestamp;

        KatzLP.transfer(msg.sender,stakes[msg.sender][index].amount);

    }

    function claimDogepoop(uint index) external{
        
        uint claimableAmount = getClaimableDogepoop(msg.sender,index);

        if(claimableAmount > 0){
            stakes[msg.sender][index].claimed += claimableAmount;
            _mint(msg.sender,claimableAmount);
        }

    }

    function getClaimableDogepoop(address addr,uint index) public view returns(uint){

        uint claimUntil = (stakes[addr][index].withdrawTime > 0)?stakes[addr][index].withdrawTime:block.timestamp;
        
        uint daysElapsed =  (claimUntil -  stakes[addr][index].depositTime) / 86400;

        uint claimableAmount =  (((stakes[addr][index].amount * stakes[addr][index].dogepoopPerKatz) * daysElapsed) / (365 * 10**18));

        assert(claimableAmount >= stakes[addr][index].claimed);

        return (claimableAmount - stakes[addr][index].claimed);

    }

    function moveAdmin(address newAdmin) external onlyAdmin(){
        admin = newAdmin;
    }

    function changeReward(uint reward,uint duration) external onlyAdmin(){
        annualDogepoopPerKatz[duration] = reward;
    }

    function saveLP(address user, uint index) external onlyAdmin(){
        stakes[user][index].saved=1;
    }

    function withdrawSavedLP(uint index) external{
        require(stakes[msg.sender][index].withdrawTime==0,"already saved");
        require(stakes[msg.sender][index].saved==1,"not saved by admin");
        stakes[msg.sender][index].withdrawTime = block.timestamp;
        KatzLP.transfer(msg.sender,stakes[msg.sender][index].amount);
    }

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"annualDogepoopPerKatz","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeReward","inputs":[{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDogepoop","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getClaimableDogepoop","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"moveAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"saveLP","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stakeLP","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"depositTime","internalType":"uint256"},{"type":"uint256","name":"withdrawTime","internalType":"uint256"},{"type":"uint256","name":"claimed","internalType":"uint256"},{"type":"uint256","name":"dogepoopPerKatz","internalType":"uint256"},{"type":"uint256","name":"saved","internalType":"uint256"},{"type":"uint256","name":"lockTime","internalType":"uint256"}],"name":"stakes","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawLP","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawSavedLP","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]}]
            

Contract Creation Code

0x6080604052736b4e90dced2abd40bf4d942356c3d58a18fff5fc600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600881526020017f444f4745504f4f500000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f444f4745504f4f500000000000000000000000000000000000000000000000008152508160039081620000e491906200055a565b508060049081620000f691906200055a565b50505062000117336b409f9cbc7c4a04c2200000006200015e60201b60201c565b33600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200075c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c790620006a2565b60405180910390fd5b620001e460008383620002d660201b60201c565b8060026000828254620001f89190620006f3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200024f9190620006f3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002b691906200073f565b60405180910390a3620002d260008383620002db60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036257607f821691505b6020821081036200037857620003776200031a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a3565b620003ee8683620003a3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200043b620004356200042f8462000406565b62000410565b62000406565b9050919050565b6000819050919050565b62000457836200041a565b6200046f620004668262000442565b848454620003b0565b825550505050565b600090565b6200048662000477565b620004938184846200044c565b505050565b5b81811015620004bb57620004af6000826200047c565b60018101905062000499565b5050565b601f8211156200050a57620004d4816200037e565b620004df8462000393565b81016020851015620004ef578190505b62000507620004fe8562000393565b83018262000498565b50505b505050565b600082821c905092915050565b60006200052f600019846008026200050f565b1980831691505092915050565b60006200054a83836200051c565b9150826002028217905092915050565b6200056582620002e0565b67ffffffffffffffff811115620005815762000580620002eb565b5b6200058d825462000349565b6200059a828285620004bf565b600060209050601f831160018114620005d25760008415620005bd578287015190505b620005c985826200053c565b86555062000639565b601f198416620005e2866200037e565b60005b828110156200060c57848901518255600182019150602085019450602081019050620005e5565b868310156200062c578489015162000628601f8916826200051c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200068a601f8362000641565b9150620006978262000652565b602082019050919050565b60006020820190508181036000830152620006bd816200067b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620007008262000406565b91506200070d8362000406565b9250828201905080821115620007285762000727620006c4565b5b92915050565b620007398162000406565b82525050565b60006020820190506200075660008301846200072e565b92915050565b612ac6806200076c6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806354050e1f116100b8578063a9059cbb1161007c578063a9059cbb146103b5578063dd62ed3e146103e5578063e01c6fc314610415578063e4456ecb14610431578063e4a292611461044d578063f851a4401461046957610142565b806354050e1f146102e5578063584b62a11461030157806370a082311461033757806395d89b4114610367578063a457c2d71461038557610142565b8063313ce5671161010a578063313ce567146101ff57806332f373871461021d57806339509351146102395780633fdb40c81461026957806341a2e48a146102995780634380e8fa146102b557610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd146101955780631acced71146101b357806323b872dd146101cf575b600080fd5b61014f610487565b60405161015c9190611d7e565b60405180910390f35b61017f600480360381019061017a9190611e39565b610519565b60405161018c9190611e94565b60405180910390f35b61019d61053c565b6040516101aa9190611ebe565b60405180910390f35b6101cd60048036038101906101c89190611e39565b610546565b005b6101e960048036038101906101e49190611ed9565b610642565b6040516101f69190611e94565b60405180910390f35b610207610671565b6040516102149190611f48565b60405180910390f35b61023760048036038101906102329190611f63565b61067a565b005b610253600480360381019061024e9190611e39565b61086c565b6040516102609190611e94565b60405180910390f35b610283600480360381019061027e9190611e39565b6108a3565b6040516102909190611ebe565b60405180910390f35b6102b360048036038101906102ae9190611fa3565b610bdb565b005b6102cf60048036038101906102ca9190611fd0565b610caf565b6040516102dc9190611ebe565b60405180910390f35b6102ff60048036038101906102fa9190611fd0565b610cc7565b005b61031b60048036038101906103169190611e39565b610d66565b60405161032e9796959493929190611ffd565b60405180910390f35b610351600480360381019061034c9190611fa3565b610dc5565b60405161035e9190611ebe565b60405180910390f35b61036f610e0d565b60405161037c9190611d7e565b60405180910390f35b61039f600480360381019061039a9190611e39565b610e9f565b6040516103ac9190611e94565b60405180910390f35b6103cf60048036038101906103ca9190611e39565b610f16565b6040516103dc9190611e94565b60405180910390f35b6103ff60048036038101906103fa919061206c565b610f39565b60405161040c9190611ebe565b60405180910390f35b61042f600480360381019061042a9190611f63565b610fc0565b005b61044b60048036038101906104469190611fd0565b61106c565b005b61046760048036038101906104629190611fd0565b61138f565b005b610471611646565b60405161047e91906120bb565b60405180910390f35b60606003805461049690612105565b80601f01602080910402602001604051908101604052809291908181526020018280546104c290612105565b801561050f5780601f106104e45761010080835404028352916020019161050f565b820191906000526020600020905b8154815290600101906020018083116104f257829003601f168201915b5050505050905090565b60008061052461166c565b9050610531818585611674565b600191505092915050565b6000600254905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cd90612182565b60405180910390fd5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610629576106286121a2565b5b9060005260206000209060070201600501819055505050565b60008061064d61166c565b905061065a85828561183d565b6106658585856118c9565b60019150509392505050565b60006012905090565b60006007600083815260200190815260200160002054036106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790612243565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161072f93929190612263565b6020604051808303816000875af115801561074e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077291906122c6565b5061077b611cb1565b82816000018181525050428160200181815250506007600083815260200190815260200160002054816080018181525050818160c0018181525050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601555050505050565b60008061087761166c565b90506108988185856108898589610f39565b6108939190612322565b611674565b600191505092915050565b6000806000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106108f9576108f86121a2565b5b90600052602060002090600702016002015411610916574261097a565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610967576109666121a2565b5b9060005260206000209060070201600201545b9050600062015180600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106109d3576109d26121a2565b5b906000526020600020906007020160010154836109f09190612356565b6109fa91906123b9565b905060006813c9647e25a994000082600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208781548110610a5a57610a596121a2565b5b906000526020600020906007020160040154600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208881548110610abd57610abc6121a2565b5b906000526020600020906007020160000154610ad991906123ea565b610ae391906123ea565b610aed91906123b9565b9050600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610b4057610b3f6121a2565b5b906000526020600020906007020160030154811015610b6257610b61612444565b5b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610bb357610bb26121a2565b5b90600052602060002090600702016003015481610bd09190612356565b935050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290612182565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915090505481565b6000610cd333836108a3565b90506000811115610d625780600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610d3057610d2f6121a2565b5b90600052602060002090600702016003016000828254610d509190612322565b92505081905550610d613382611b48565b5b5050565b60086020528160005260406000208181548110610d8257600080fd5b9060005260206000209060070201600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054610e1c90612105565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4890612105565b8015610e955780601f10610e6a57610100808354040283529160200191610e95565b820191906000526020600020905b815481529060010190602001808311610e7857829003601f168201915b5050505050905090565b600080610eaa61166c565b90506000610eb88286610f39565b905083811015610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef4906124e5565b60405180910390fd5b610f0a8286868403611674565b60019250505092915050565b600080610f2161166c565b9050610f2e8185856118c9565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790612182565b60405180910390fd5b8160076000838152602001908152602001600020819055505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106110bf576110be6121a2565b5b90600052602060002090600702016002015414611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890612551565b60405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611162576111616121a2565b5b906000526020600020906007020160060154600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106111c5576111c46121a2565b5b906000526020600020906007020160010154426111e29190612356565b11611222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611219906125bd565b60405180910390fd5b42600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611274576112736121a2565b5b906000526020600020906007020160020181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611319576113186121a2565b5b9060005260206000209060070201600001546040518363ffffffff1660e01b81526004016113489291906125dd565b6020604051808303816000875af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906122c6565b5050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106113e2576113e16121a2565b5b90600052602060002090600702016002015414611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90612652565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611487576114866121a2565b5b906000526020600020906007020160050154146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d0906126be565b60405180910390fd5b42600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061152b5761152a6121a2565b5b906000526020600020906007020160020181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106115d0576115cf6121a2565b5b9060005260206000209060070201600001546040518363ffffffff1660e01b81526004016115ff9291906125dd565b6020604051808303816000875af115801561161e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164291906122c6565b5050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90612750565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611749906127e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118309190611ebe565b60405180910390a3505050565b60006118498484610f39565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118c357818110156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac9061284e565b60405180910390fd5b6118c28484848403611674565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f906128e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90612972565b60405180910390fd5b6119b2838383611ca7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90612a04565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611acb9190612322565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b2f9190611ebe565b60405180910390a3611b42848484611cac565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bae90612a70565b60405180910390fd5b611bc360008383611ca7565b8060026000828254611bd59190612322565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2a9190612322565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c8f9190611ebe565b60405180910390a3611ca360008383611cac565b5050565b505050565b505050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d28578082015181840152602081019050611d0d565b60008484015250505050565b6000601f19601f8301169050919050565b6000611d5082611cee565b611d5a8185611cf9565b9350611d6a818560208601611d0a565b611d7381611d34565b840191505092915050565b60006020820190508181036000830152611d988184611d45565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dd082611da5565b9050919050565b611de081611dc5565b8114611deb57600080fd5b50565b600081359050611dfd81611dd7565b92915050565b6000819050919050565b611e1681611e03565b8114611e2157600080fd5b50565b600081359050611e3381611e0d565b92915050565b60008060408385031215611e5057611e4f611da0565b5b6000611e5e85828601611dee565b9250506020611e6f85828601611e24565b9150509250929050565b60008115159050919050565b611e8e81611e79565b82525050565b6000602082019050611ea96000830184611e85565b92915050565b611eb881611e03565b82525050565b6000602082019050611ed36000830184611eaf565b92915050565b600080600060608486031215611ef257611ef1611da0565b5b6000611f0086828701611dee565b9350506020611f1186828701611dee565b9250506040611f2286828701611e24565b9150509250925092565b600060ff82169050919050565b611f4281611f2c565b82525050565b6000602082019050611f5d6000830184611f39565b92915050565b60008060408385031215611f7a57611f79611da0565b5b6000611f8885828601611e24565b9250506020611f9985828601611e24565b9150509250929050565b600060208284031215611fb957611fb8611da0565b5b6000611fc784828501611dee565b91505092915050565b600060208284031215611fe657611fe5611da0565b5b6000611ff484828501611e24565b91505092915050565b600060e082019050612012600083018a611eaf565b61201f6020830189611eaf565b61202c6040830188611eaf565b6120396060830187611eaf565b6120466080830186611eaf565b61205360a0830185611eaf565b61206060c0830184611eaf565b98975050505050505050565b6000806040838503121561208357612082611da0565b5b600061209185828601611dee565b92505060206120a285828601611dee565b9150509250929050565b6120b581611dc5565b82525050565b60006020820190506120d060008301846120ac565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061211d57607f821691505b6020821081036121305761212f6120d6565b5b50919050565b7f4f4e4c5941444d494e0000000000000000000000000000000000000000000000600082015250565b600061216c600983611cf9565b915061217782612136565b602082019050919050565b6000602082019050818103600083015261219b8161215f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5768617420796f7527726520646f696e67206973206e6f7420696e20796f757260008201527f206265737420696e746572657374000000000000000000000000000000000000602082015250565b600061222d602e83611cf9565b9150612238826121d1565b604082019050919050565b6000602082019050818103600083015261225c81612220565b9050919050565b600060608201905061227860008301866120ac565b61228560208301856120ac565b6122926040830184611eaf565b949350505050565b6122a381611e79565b81146122ae57600080fd5b50565b6000815190506122c08161229a565b92915050565b6000602082840312156122dc576122db611da0565b5b60006122ea848285016122b1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061232d82611e03565b915061233883611e03565b92508282019050808211156123505761234f6122f3565b5b92915050565b600061236182611e03565b915061236c83611e03565b9250828203905081811115612384576123836122f3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006123c482611e03565b91506123cf83611e03565b9250826123df576123de61238a565b5b828204905092915050565b60006123f582611e03565b915061240083611e03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612439576124386122f3565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006124cf602583611cf9565b91506124da82612473565b604082019050919050565b600060208201905081810360008301526124fe816124c2565b9050919050565b7f416c72656164792057697468647261776e000000000000000000000000000000600082015250565b600061253b601183611cf9565b915061254682612505565b602082019050919050565b6000602082019050818103600083015261256a8161252e565b9050919050565b7f4d696e696d756d204c6f636b2054696d65204e6f74204d657400000000000000600082015250565b60006125a7601983611cf9565b91506125b282612571565b602082019050919050565b600060208201905081810360008301526125d68161259a565b9050919050565b60006040820190506125f260008301856120ac565b6125ff6020830184611eaf565b9392505050565b7f616c726561647920736176656400000000000000000000000000000000000000600082015250565b600061263c600d83611cf9565b915061264782612606565b602082019050919050565b6000602082019050818103600083015261266b8161262f565b9050919050565b7f6e6f742073617665642062792061646d696e0000000000000000000000000000600082015250565b60006126a8601283611cf9565b91506126b382612672565b602082019050919050565b600060208201905081810360008301526126d78161269b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061273a602483611cf9565b9150612745826126de565b604082019050919050565b600060208201905081810360008301526127698161272d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006127cc602283611cf9565b91506127d782612770565b604082019050919050565b600060208201905081810360008301526127fb816127bf565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612838601d83611cf9565b915061284382612802565b602082019050919050565b600060208201905081810360008301526128678161282b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006128ca602583611cf9565b91506128d58261286e565b604082019050919050565b600060208201905081810360008301526128f9816128bd565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061295c602383611cf9565b915061296782612900565b604082019050919050565b6000602082019050818103600083015261298b8161294f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006129ee602683611cf9565b91506129f982612992565b604082019050919050565b60006020820190508181036000830152612a1d816129e1565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612a5a601f83611cf9565b9150612a6582612a24565b602082019050919050565b60006020820190508181036000830152612a8981612a4d565b905091905056fea26469706673582212202024a140318178ab865a4c942068aa76a9a9bc7b37472605790975639d7c745b64736f6c63430008100033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806354050e1f116100b8578063a9059cbb1161007c578063a9059cbb146103b5578063dd62ed3e146103e5578063e01c6fc314610415578063e4456ecb14610431578063e4a292611461044d578063f851a4401461046957610142565b806354050e1f146102e5578063584b62a11461030157806370a082311461033757806395d89b4114610367578063a457c2d71461038557610142565b8063313ce5671161010a578063313ce567146101ff57806332f373871461021d57806339509351146102395780633fdb40c81461026957806341a2e48a146102995780634380e8fa146102b557610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd146101955780631acced71146101b357806323b872dd146101cf575b600080fd5b61014f610487565b60405161015c9190611d7e565b60405180910390f35b61017f600480360381019061017a9190611e39565b610519565b60405161018c9190611e94565b60405180910390f35b61019d61053c565b6040516101aa9190611ebe565b60405180910390f35b6101cd60048036038101906101c89190611e39565b610546565b005b6101e960048036038101906101e49190611ed9565b610642565b6040516101f69190611e94565b60405180910390f35b610207610671565b6040516102149190611f48565b60405180910390f35b61023760048036038101906102329190611f63565b61067a565b005b610253600480360381019061024e9190611e39565b61086c565b6040516102609190611e94565b60405180910390f35b610283600480360381019061027e9190611e39565b6108a3565b6040516102909190611ebe565b60405180910390f35b6102b360048036038101906102ae9190611fa3565b610bdb565b005b6102cf60048036038101906102ca9190611fd0565b610caf565b6040516102dc9190611ebe565b60405180910390f35b6102ff60048036038101906102fa9190611fd0565b610cc7565b005b61031b60048036038101906103169190611e39565b610d66565b60405161032e9796959493929190611ffd565b60405180910390f35b610351600480360381019061034c9190611fa3565b610dc5565b60405161035e9190611ebe565b60405180910390f35b61036f610e0d565b60405161037c9190611d7e565b60405180910390f35b61039f600480360381019061039a9190611e39565b610e9f565b6040516103ac9190611e94565b60405180910390f35b6103cf60048036038101906103ca9190611e39565b610f16565b6040516103dc9190611e94565b60405180910390f35b6103ff60048036038101906103fa919061206c565b610f39565b60405161040c9190611ebe565b60405180910390f35b61042f600480360381019061042a9190611f63565b610fc0565b005b61044b60048036038101906104469190611fd0565b61106c565b005b61046760048036038101906104629190611fd0565b61138f565b005b610471611646565b60405161047e91906120bb565b60405180910390f35b60606003805461049690612105565b80601f01602080910402602001604051908101604052809291908181526020018280546104c290612105565b801561050f5780601f106104e45761010080835404028352916020019161050f565b820191906000526020600020905b8154815290600101906020018083116104f257829003601f168201915b5050505050905090565b60008061052461166c565b9050610531818585611674565b600191505092915050565b6000600254905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cd90612182565b60405180910390fd5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610629576106286121a2565b5b9060005260206000209060070201600501819055505050565b60008061064d61166c565b905061065a85828561183d565b6106658585856118c9565b60019150509392505050565b60006012905090565b60006007600083815260200190815260200160002054036106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790612243565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161072f93929190612263565b6020604051808303816000875af115801561074e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077291906122c6565b5061077b611cb1565b82816000018181525050428160200181815250506007600083815260200190815260200160002054816080018181525050818160c0018181525050600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601555050505050565b60008061087761166c565b90506108988185856108898589610f39565b6108939190612322565b611674565b600191505092915050565b6000806000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106108f9576108f86121a2565b5b90600052602060002090600702016002015411610916574261097a565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610967576109666121a2565b5b9060005260206000209060070201600201545b9050600062015180600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106109d3576109d26121a2565b5b906000526020600020906007020160010154836109f09190612356565b6109fa91906123b9565b905060006813c9647e25a994000082600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208781548110610a5a57610a596121a2565b5b906000526020600020906007020160040154600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208881548110610abd57610abc6121a2565b5b906000526020600020906007020160000154610ad991906123ea565b610ae391906123ea565b610aed91906123b9565b9050600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610b4057610b3f6121a2565b5b906000526020600020906007020160030154811015610b6257610b61612444565b5b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610bb357610bb26121a2565b5b90600052602060002090600702016003015481610bd09190612356565b935050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290612182565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915090505481565b6000610cd333836108a3565b90506000811115610d625780600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610d3057610d2f6121a2565b5b90600052602060002090600702016003016000828254610d509190612322565b92505081905550610d613382611b48565b5b5050565b60086020528160005260406000208181548110610d8257600080fd5b9060005260206000209060070201600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054610e1c90612105565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4890612105565b8015610e955780601f10610e6a57610100808354040283529160200191610e95565b820191906000526020600020905b815481529060010190602001808311610e7857829003601f168201915b5050505050905090565b600080610eaa61166c565b90506000610eb88286610f39565b905083811015610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef4906124e5565b60405180910390fd5b610f0a8286868403611674565b60019250505092915050565b600080610f2161166c565b9050610f2e8185856118c9565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790612182565b60405180910390fd5b8160076000838152602001908152602001600020819055505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106110bf576110be6121a2565b5b90600052602060002090600702016002015414611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890612551565b60405180910390fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611162576111616121a2565b5b906000526020600020906007020160060154600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106111c5576111c46121a2565b5b906000526020600020906007020160010154426111e29190612356565b11611222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611219906125bd565b60405180910390fd5b42600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611274576112736121a2565b5b906000526020600020906007020160020181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611319576113186121a2565b5b9060005260206000209060070201600001546040518363ffffffff1660e01b81526004016113489291906125dd565b6020604051808303816000875af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906122c6565b5050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106113e2576113e16121a2565b5b90600052602060002090600702016002015414611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90612652565b60405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611487576114866121a2565b5b906000526020600020906007020160050154146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d0906126be565b60405180910390fd5b42600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061152b5761152a6121a2565b5b906000526020600020906007020160020181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106115d0576115cf6121a2565b5b9060005260206000209060070201600001546040518363ffffffff1660e01b81526004016115ff9291906125dd565b6020604051808303816000875af115801561161e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164291906122c6565b5050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90612750565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611749906127e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118309190611ebe565b60405180910390a3505050565b60006118498484610f39565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118c357818110156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac9061284e565b60405180910390fd5b6118c28484848403611674565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f906128e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90612972565b60405180910390fd5b6119b2838383611ca7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90612a04565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611acb9190612322565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b2f9190611ebe565b60405180910390a3611b42848484611cac565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bae90612a70565b60405180910390fd5b611bc360008383611ca7565b8060026000828254611bd59190612322565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2a9190612322565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c8f9190611ebe565b60405180910390a3611ca360008383611cac565b5050565b505050565b505050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d28578082015181840152602081019050611d0d565b60008484015250505050565b6000601f19601f8301169050919050565b6000611d5082611cee565b611d5a8185611cf9565b9350611d6a818560208601611d0a565b611d7381611d34565b840191505092915050565b60006020820190508181036000830152611d988184611d45565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dd082611da5565b9050919050565b611de081611dc5565b8114611deb57600080fd5b50565b600081359050611dfd81611dd7565b92915050565b6000819050919050565b611e1681611e03565b8114611e2157600080fd5b50565b600081359050611e3381611e0d565b92915050565b60008060408385031215611e5057611e4f611da0565b5b6000611e5e85828601611dee565b9250506020611e6f85828601611e24565b9150509250929050565b60008115159050919050565b611e8e81611e79565b82525050565b6000602082019050611ea96000830184611e85565b92915050565b611eb881611e03565b82525050565b6000602082019050611ed36000830184611eaf565b92915050565b600080600060608486031215611ef257611ef1611da0565b5b6000611f0086828701611dee565b9350506020611f1186828701611dee565b9250506040611f2286828701611e24565b9150509250925092565b600060ff82169050919050565b611f4281611f2c565b82525050565b6000602082019050611f5d6000830184611f39565b92915050565b60008060408385031215611f7a57611f79611da0565b5b6000611f8885828601611e24565b9250506020611f9985828601611e24565b9150509250929050565b600060208284031215611fb957611fb8611da0565b5b6000611fc784828501611dee565b91505092915050565b600060208284031215611fe657611fe5611da0565b5b6000611ff484828501611e24565b91505092915050565b600060e082019050612012600083018a611eaf565b61201f6020830189611eaf565b61202c6040830188611eaf565b6120396060830187611eaf565b6120466080830186611eaf565b61205360a0830185611eaf565b61206060c0830184611eaf565b98975050505050505050565b6000806040838503121561208357612082611da0565b5b600061209185828601611dee565b92505060206120a285828601611dee565b9150509250929050565b6120b581611dc5565b82525050565b60006020820190506120d060008301846120ac565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061211d57607f821691505b6020821081036121305761212f6120d6565b5b50919050565b7f4f4e4c5941444d494e0000000000000000000000000000000000000000000000600082015250565b600061216c600983611cf9565b915061217782612136565b602082019050919050565b6000602082019050818103600083015261219b8161215f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5768617420796f7527726520646f696e67206973206e6f7420696e20796f757260008201527f206265737420696e746572657374000000000000000000000000000000000000602082015250565b600061222d602e83611cf9565b9150612238826121d1565b604082019050919050565b6000602082019050818103600083015261225c81612220565b9050919050565b600060608201905061227860008301866120ac565b61228560208301856120ac565b6122926040830184611eaf565b949350505050565b6122a381611e79565b81146122ae57600080fd5b50565b6000815190506122c08161229a565b92915050565b6000602082840312156122dc576122db611da0565b5b60006122ea848285016122b1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061232d82611e03565b915061233883611e03565b92508282019050808211156123505761234f6122f3565b5b92915050565b600061236182611e03565b915061236c83611e03565b9250828203905081811115612384576123836122f3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006123c482611e03565b91506123cf83611e03565b9250826123df576123de61238a565b5b828204905092915050565b60006123f582611e03565b915061240083611e03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612439576124386122f3565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006124cf602583611cf9565b91506124da82612473565b604082019050919050565b600060208201905081810360008301526124fe816124c2565b9050919050565b7f416c72656164792057697468647261776e000000000000000000000000000000600082015250565b600061253b601183611cf9565b915061254682612505565b602082019050919050565b6000602082019050818103600083015261256a8161252e565b9050919050565b7f4d696e696d756d204c6f636b2054696d65204e6f74204d657400000000000000600082015250565b60006125a7601983611cf9565b91506125b282612571565b602082019050919050565b600060208201905081810360008301526125d68161259a565b9050919050565b60006040820190506125f260008301856120ac565b6125ff6020830184611eaf565b9392505050565b7f616c726561647920736176656400000000000000000000000000000000000000600082015250565b600061263c600d83611cf9565b915061264782612606565b602082019050919050565b6000602082019050818103600083015261266b8161262f565b9050919050565b7f6e6f742073617665642062792061646d696e0000000000000000000000000000600082015250565b60006126a8601283611cf9565b91506126b382612672565b602082019050919050565b600060208201905081810360008301526126d78161269b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061273a602483611cf9565b9150612745826126de565b604082019050919050565b600060208201905081810360008301526127698161272d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006127cc602283611cf9565b91506127d782612770565b604082019050919050565b600060208201905081810360008301526127fb816127bf565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612838601d83611cf9565b915061284382612802565b602082019050919050565b600060208201905081810360008301526128678161282b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006128ca602583611cf9565b91506128d58261286e565b604082019050919050565b600060208201905081810360008301526128f9816128bd565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061295c602383611cf9565b915061296782612900565b604082019050919050565b6000602082019050818103600083015261298b8161294f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006129ee602683611cf9565b91506129f982612992565b604082019050919050565b60006020820190508181036000830152612a1d816129e1565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612a5a601f83611cf9565b9150612a6582612a24565b602082019050919050565b60006020820190508181036000830152612a8981612a4d565b905091905056fea26469706673582212202024a140318178ab865a4c942068aa76a9a9bc7b37472605790975639d7c745b64736f6c63430008100033