ETH Price: $3,490.78 (+3.70%)
Gas: 2 Gwei

Token

Yolo Chips (CHIPS)
 

Overview

Max Total Supply

1,473,130 CHIPS

Holders

281

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
rightclickdave.eth
Balance
1,000 CHIPS

Value
$0.00
0x1064aa646a7aedbd40816fc0c35e044d0244a764
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
YoloChips

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : YoloChips.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

import "./YoloInterfaces.sol";

/**
  ERC20 utility token.
 */

contract YoloChips is ERC20, ERC20Burnable, Ownable {
    using SafeMath for uint256;

    struct LandDeed {
        uint256 tokenId;
        uint256 yield;
    }

    event ChipsCashed(address indexed account, uint256 amount);
    
    bool public airdropped = false;
    uint256 public airdropOffset = 0;

    mapping (address => uint256) public accountRewards;
    mapping (address => uint256) public lastAccountUpdate;
    mapping (uint256 => uint256) public lastPropertyUpdate;

    mapping (address => bool) public marketplaces;

    uint256 public airdropAmount = 1000;
    uint256 public startTime = 1638316800; // Dec 01, 2021.
    uint256 public endTime = 1893456000; // Jan 01, 2030.

    IYoloDice public diceV1;
    IYoloBoardDeed public landDeeds;

    constructor(address _diceV1) ERC20("Yolo Chips", "CHIPS") {
        diceV1 = IYoloDice(_diceV1);
    }

    // Setters.

    function setAirdropAmount(uint256 _amount) external onlyOwner {
        airdropAmount = _amount;
    }

    function setStartTime(uint256 _startTime) external onlyOwner {
        startTime = _startTime;
    }

    function setEndTime(uint256 _endTime) external onlyOwner {
        endTime = _endTime;
    }

    function setDiceV1(address _diceV1) external onlyOwner {
        diceV1 = IYoloDice(_diceV1);
    }

    function setLandDeeds(address _deeds) external onlyOwner {
        landDeeds = IYoloBoardDeed(_deeds);
    }

    function setMarketplace(address _address, bool _allowed) external onlyOwner {
        marketplaces[_address] = _allowed;
    }

    // Core functionality.

    /// @notice This issues initial rewards to V1 dice holders.
    /// It will reward holders from token _start (inclusive) to token _end (exclusive)
    function performAirdrop(uint256 _start, uint256 _end) external onlyOwner {
        require(!airdropped, "Yolo Chips: Airdrop already done");
        require(_start == airdropOffset, "Yolo Chips: Incorrect airdrop start index");

        // Iterate through all V1 dice.
        uint max = Math.min(_end, diceV1.totalSupply());
        for (uint256 tokenId = _start; tokenId < max; tokenId++) {
            address diceOwner = diceV1.ownerOf(tokenId);
            if (diceOwner != address(0x0)) {
                accountRewards[diceOwner] = accountRewards[diceOwner].add(airdropAmount);
            }
        }

        airdropOffset = max;

        // If we hit the end, mark the airdrop completed.
        if (max == diceV1.totalSupply()) {
            airdropped = true;
        }
    }

    /// @notice Called when property deed tokens are transferred.
    function updateOwnership(address _from, address _to) external {
        require(msg.sender == address(landDeeds), "Yolo Chips: Not allowed");

        // Update old and new owners before the transfer takes place.
        _updateRewards(_from);
        _updateRewards(_to);
    }

    /// @notice Shows current (including pending) rewards for an account.
    function getEarnedRewards(address _address) external view returns (uint256) {
        if (block.timestamp < startTime) {
            return accountRewards[_address];
        }

        LandDeed[] memory properties = _getProperties(_address);

        uint256 earned = 0;
        uint256 time = Math.min(block.timestamp, endTime);

        for (uint256 idx = 0; idx < properties.length; idx++) {
            uint256 lastUpdate = Math.max(lastPropertyUpdate[properties[idx].tokenId], startTime);

            if (lastUpdate > 0) {
                uint256 yield = (properties[idx].yield).mul((time.sub(lastUpdate))).div(86400);
                earned = earned.add(yield);
            }
        }

        return accountRewards[_address].add(earned);
    }

    function spend(address account, uint256 amount) external {
        require(marketplaces[msg.sender], "Yolo Chips: Not allowed to spend $CHIPS");
        _burn(account, amount);
    }

    /// @notice Withdraws balance and resets rewards.
    function cashOut() external {
        // First, ensure we're up to date.
        _updateRewards(msg.sender);

        uint256 reward = accountRewards[msg.sender];
        if (reward > 0) {
            accountRewards[msg.sender] = 0;

            _mint(msg.sender, reward.mul(1 ether));
            emit ChipsCashed(msg.sender, reward);
        }
    }

    // Helpers.

    /// @notice Updates a user's reward balance based on owned properties.
    function _updateRewards(address _address) internal {
        if (block.timestamp < startTime) {
            return;
        } 

        LandDeed[] memory properties = _getProperties(_address);

        uint256 earned = 0;
        uint256 time = Math.min(block.timestamp, endTime);

        for (uint256 idx = 0; idx < properties.length; idx++) {
            uint256 lastUpdate = Math.max(lastPropertyUpdate[properties[idx].tokenId], startTime);

            if (lastUpdate > 0) {
                uint256 yield = (properties[idx].yield).mul((time.sub(lastUpdate))).div(86400);
                earned = earned.add(yield);
            }
            if (lastUpdate != endTime) {
                lastPropertyUpdate[properties[idx].tokenId] = time;
            }
        }

        accountRewards[_address] = accountRewards[_address].add(earned);
        lastAccountUpdate[_address] = time;
    }

    /// @notice Returns Land Deeds owned by the address.
    function _getProperties(address _address) internal view returns (LandDeed[] memory) {
        uint balance = landDeeds.balanceOf(_address);

        LandDeed[] memory properties = new LandDeed[](balance);
        for (uint256 idx = 0; idx < balance; idx++) {
            uint256 tokenId = landDeeds.tokenOfOwnerByIndex(_address, idx);
            uint256 yield = landDeeds.yieldRate(tokenId);
            properties[idx] = LandDeed(tokenId, yield);
        }

        return properties;
    }

}

File 2 of 12 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `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 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 {}
}

File 3 of 12 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../utils/Context.sol";

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

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

File 4 of 12 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 5 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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.
 */
abstract 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() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 12 : Math.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

File 7 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 8 of 12 : YoloInterfaces.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

interface IYoloDice {
    /// @notice IERC721, returns owner of token.
    function ownerOf(uint256 tokenId) external view returns (address);
    /// @notice IERC721, returns number of tokens owned.
    function balanceOf(address owner) external view returns (uint256);
    /// @notice IERC721, returns total number of tokens created.
    function totalSupply() external view returns (uint256);
    /// @notice IERC721Enumerable, returns token ID.
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
}

interface IYoloChips {
    /// @notice IERC20, returns number of tokens owned.
    function balanceOf(address account) external view returns (uint256);
    /// @notice Burns chips from whitelisted contracts.
    function spend(address account, uint256 amount) external;
    /// @notice Performs accounting before properties are transferred.
    function updateOwnership(address _from, address _to) external;
}

interface IYoloBoardDeed {
    /// @notice IERC721, returns number of tokens owned.
    function balanceOf(address owner) external view returns (uint256);
    /// @notice IERC721Enumerable, returns token ID.
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
    /// @notice Returns yield of the given token.
    function yieldRate(uint256 tokenId) external view returns (uint256);
}

File 9 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 10 of 12 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @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);
}

File 11 of 12 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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;
    }
}

File 12 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_diceV1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChipsCashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"diceV1","outputs":[{"internalType":"contract IYoloDice","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getEarnedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"landDeeds","outputs":[{"internalType":"contract IYoloBoardDeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastAccountUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastPropertyUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketplaces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"performAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setAirdropAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_diceV1","type":"address"}],"name":"setDiceV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_deeds","type":"address"}],"name":"setLandDeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_allowed","type":"bool"}],"name":"setMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"spend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"updateOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600560146101000a81548160ff02191690831515021790555060006006556103e8600b556361a6bb00600c556370dbd880600d553480156200004757600080fd5b5060405162003eac38038062003eac83398181016040528101906200006d91906200030a565b6040518060400160405280600a81526020017f596f6c6f204368697073000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43484950530000000000000000000000000000000000000000000000000000008152508160039080519060200190620000f192919062000243565b5080600490805190602001906200010a92919062000243565b5050506200012d620001216200017560201b60201c565b6200017d60201b60201c565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620003e9565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000251906200036a565b90600052602060002090601f016020900481019282620002755760008555620002c1565b82601f106200029057805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c0578251825591602001919060010190620002a3565b5b509050620002d09190620002d4565b5090565b5b80821115620002ef576000816000905550600101620002d5565b5090565b6000815190506200030481620003cf565b92915050565b6000602082840312156200031d57600080fd5b60006200032d84828501620002f3565b91505092915050565b600062000343826200034a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200038357607f821691505b602082108114156200039a5762000399620003a0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620003da8162000336565b8114620003e657600080fd5b50565b613ab380620003f96000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063a457c2d7116100b8578063dd62ed3e1161007c578063dd62ed3e1461068b578063f2fde38b146106bb578063facfd078146106d7578063fc2ea8a514610707578063ffd64f7f1461072557610232565b8063a457c2d7146105d7578063a5500c3014610607578063a9059cbb14610623578063af7d6ca314610653578063ccb98ffc1461066f57610232565b806379cc6790116100ff57806379cc6790146105475780638878d2ae146105635780638da5cb5b1461057f57806395d89b411461059d578063a2579505146105bb57610232565b8063715018a6146104f95780637419e77a1461050357806378e979251461051f578063793cd71e1461053d57610232565b80633e0a322d116101be5780635de54da5116101825780635de54da5146104415780636161a07d1461045f57806367da898e1461047b5780636a56b3591461049957806370a08231146104c957610232565b80633e0a322d1461038d57806342966c68146103a95780634612bd4f146103c55780635390f98e146103f5578063559a4db31461042557610232565b806323b872dd1161020557806323b872dd146102c15780632acca794146102f1578063313ce567146103215780633197cbb61461033f578063395093511461035d57610232565b806306fdde0314610237578063095ea7b31461025557806318160ddd1461028557806319cc02aa146102a3575b600080fd5b61023f610743565b60405161024c9190612fff565b60405180910390f35b61026f600480360381019061026a9190612bba565b6107d5565b60405161027c9190612fae565b60405180910390f35b61028d6107f3565b60405161029a9190613241565b60405180910390f35b6102ab6107fd565b6040516102b89190612fae565b60405180910390f35b6102db60048036038101906102d69190612b2f565b610810565b6040516102e89190612fae565b60405180910390f35b61030b60048036038101906103069190612aa1565b610908565b6040516103189190613241565b60405180910390f35b610329610920565b604051610336919061325c565b60405180910390f35b610347610929565b6040516103549190613241565b60405180910390f35b61037760048036038101906103729190612bba565b61092f565b6040516103849190612fae565b60405180910390f35b6103a760048036038101906103a29190612bf6565b6109db565b005b6103c360048036038101906103be9190612bf6565b610a61565b005b6103df60048036038101906103da9190612aa1565b610a75565b6040516103ec9190613241565b60405180910390f35b61040f600480360381019061040a9190612bf6565b610c6d565b60405161041c9190613241565b60405180910390f35b61043f600480360381019061043a9190612c48565b610c85565b005b6104496110af565b6040516104569190613241565b60405180910390f35b61047960048036038101906104749190612af3565b6110b5565b005b61048361115b565b6040516104909190612fe4565b60405180910390f35b6104b360048036038101906104ae9190612aa1565b611181565b6040516104c09190612fae565b60405180910390f35b6104e360048036038101906104de9190612aa1565b6111a1565b6040516104f09190613241565b60405180910390f35b6105016111e9565b005b61051d60048036038101906105189190612b7e565b611271565b005b610527611348565b6040516105349190613241565b60405180910390f35b61054561134e565b005b610561600480360381019061055c9190612bba565b61145f565b005b61057d60048036038101906105789190612aa1565b6114da565b005b61058761159a565b6040516105949190612f6a565b60405180910390f35b6105a56115c4565b6040516105b29190612fff565b60405180910390f35b6105d560048036038101906105d09190612aa1565b611656565b005b6105f160048036038101906105ec9190612bba565b611716565b6040516105fe9190612fae565b60405180910390f35b610621600480360381019061061c9190612bf6565b611801565b005b61063d60048036038101906106389190612bba565b611887565b60405161064a9190612fae565b60405180910390f35b61066d60048036038101906106689190612bba565b6118a5565b005b61068960048036038101906106849190612bf6565b61193f565b005b6106a560048036038101906106a09190612af3565b6119c5565b6040516106b29190613241565b60405180910390f35b6106d560048036038101906106d09190612aa1565b611a4c565b005b6106f160048036038101906106ec9190612aa1565b611b44565b6040516106fe9190613241565b60405180910390f35b61070f611b5c565b60405161071c9190613241565b60405180910390f35b61072d611b62565b60405161073a9190612fc9565b60405180910390f35b60606003805461075290613478565b80601f016020809104026020016040519081016040528092919081815260200182805461077e90613478565b80156107cb5780601f106107a0576101008083540402835291602001916107cb565b820191906000526020600020905b8154815290600101906020018083116107ae57829003601f168201915b5050505050905090565b60006107e96107e2611b88565b8484611b90565b6001905092915050565b6000600254905090565b600560149054906101000a900460ff1681565b600061081d848484611d5b565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610868611b88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90613121565b60405180910390fd5b6108fc856108f4611b88565b858403611b90565b60019150509392505050565b60086020528060005260406000206000915090505481565b60006012905090565b600d5481565b60006109d161093c611b88565b84846001600061094a611b88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109cc9190613293565b611b90565b6001905092915050565b6109e3611b88565b73ffffffffffffffffffffffffffffffffffffffff16610a0161159a565b73ffffffffffffffffffffffffffffffffffffffff1614610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613141565b60405180910390fd5b80600c8190555050565b610a72610a6c611b88565b82611fdc565b50565b6000600c54421015610ac857600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c68565b6000610ad3836121b3565b9050600080610ae442600d546124c6565b905060005b8351811015610c0f576000610b5760096000878581518110610b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160000151815260200190815260200160002054600c546124df565b90506000811115610bfb576000610be262015180610bd4610b8185886124f990919063ffffffff16565b898781518110610bba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516020015161250f90919063ffffffff16565b61252590919063ffffffff16565b9050610bf7818661253b90919063ffffffff16565b9450505b508080610c07906134aa565b915050610ae9565b50610c6282600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253b90919063ffffffff16565b93505050505b919050565b60096020528060005260406000206000915090505481565b610c8d611b88565b73ffffffffffffffffffffffffffffffffffffffff16610cab61159a565b73ffffffffffffffffffffffffffffffffffffffff1614610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613141565b60405180910390fd5b600560149054906101000a900460ff1615610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d48906130a1565b60405180910390fd5b6006548214610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c906131e1565b60405180910390fd5b6000610e4082600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0357600080fd5b505afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b9190612c1f565b6124c6565b905060008390505b81811015610fdf576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610ead9190613241565b60206040518083038186803b158015610ec557600080fd5b505afa158015610ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efd9190612aca565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fcb57610f87600b54600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253b90919063ffffffff16565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080610fd7906134aa565b915050610e48565b5080600681905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561104f57600080fd5b505afa158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190612c1f565b8114156110aa576001600560146101000a81548160ff0219169083151502179055505b505050565b60065481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c906130e1565b60405180910390fd5b61114e82612551565b61115781612551565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f1611b88565b73ffffffffffffffffffffffffffffffffffffffff1661120f61159a565b73ffffffffffffffffffffffffffffffffffffffff1614611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90613141565b60405180910390fd5b61126f60006127ee565b565b611279611b88565b73ffffffffffffffffffffffffffffffffffffffff1661129761159a565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613141565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c5481565b61135733612551565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561145c576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061140d33611408670de0b6b3a76400008461250f90919063ffffffff16565b6128b4565b3373ffffffffffffffffffffffffffffffffffffffff167f650a3e335a58a5ffe2ecc0f229faffb8af6149cc75b22210b6d2b9401f98c7b4826040516114539190613241565b60405180910390a25b50565b60006114728361146d611b88565b6119c5565b9050818110156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613161565b60405180910390fd5b6114cb836114c3611b88565b848403611b90565b6114d58383611fdc565b505050565b6114e2611b88565b73ffffffffffffffffffffffffffffffffffffffff1661150061159a565b73ffffffffffffffffffffffffffffffffffffffff1614611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90613141565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115d390613478565b80601f01602080910402602001604051908101604052809291908181526020018280546115ff90613478565b801561164c5780601f106116215761010080835404028352916020019161164c565b820191906000526020600020905b81548152906001019060200180831161162f57829003601f168201915b5050505050905090565b61165e611b88565b73ffffffffffffffffffffffffffffffffffffffff1661167c61159a565b73ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c990613141565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060016000611725611b88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990613201565b60405180910390fd5b6117f66117ed611b88565b85858403611b90565b600191505092915050565b611809611b88565b73ffffffffffffffffffffffffffffffffffffffff1661182761159a565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490613141565b60405180910390fd5b80600b8190555050565b600061189b611894611b88565b8484611d5b565b6001905092915050565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890613101565b60405180910390fd5b61193b8282611fdc565b5050565b611947611b88565b73ffffffffffffffffffffffffffffffffffffffff1661196561159a565b73ffffffffffffffffffffffffffffffffffffffff16146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290613141565b60405180910390fd5b80600d8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611a54611b88565b73ffffffffffffffffffffffffffffffffffffffff16611a7261159a565b73ffffffffffffffffffffffffffffffffffffffff1614611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90613141565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90613061565b60405180910390fd5b611b41816127ee565b50565b60076020528060005260406000206000915090505481565b600b5481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf7906131c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613081565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d4e9190613241565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc2906131a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3290613021565b60405180910390fd5b611e46838383612a14565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec3906130c1565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5f9190613293565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fc39190613241565b60405180910390a3611fd6848484612a19565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390613181565b60405180910390fd5b61205882600083612a14565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590613041565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546121359190613374565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161219a9190613241565b60405180910390a36121ae83600084612a19565b505050565b60606000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016122129190612f6a565b60206040518083038186803b15801561222a57600080fd5b505afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190612c1f565b905060008167ffffffffffffffff8111156122a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156122df57816020015b6122cc612a1e565b8152602001906001900390816122c45790505b50905060005b828110156124bb576000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5987846040518363ffffffff1660e01b815260040161234c929190612f85565b60206040518083038186803b15801561236457600080fd5b505afa158015612378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239c9190612c1f565b90506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361328074836040518263ffffffff1660e01b81526004016123fb9190613241565b60206040518083038186803b15801561241357600080fd5b505afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190612c1f565b905060405180604001604052808381526020018281525084848151811061249b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250505080806124b3906134aa565b9150506122e5565b508092505050919050565b60008183106124d557816124d7565b825b905092915050565b6000818310156124ef57816124f1565b825b905092915050565b600081836125079190613374565b905092915050565b6000818361251d919061331a565b905092915050565b6000818361253391906132e9565b905092915050565b600081836125499190613293565b905092915050565b600c54421015612560576127eb565b600061256b826121b3565b905060008061257c42600d546124c6565b905060005b835181101561270d5760006125ef600960008785815181106125cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160000151815260200190815260200160002054600c546124df565b9050600081111561269357600061267a6201518061266c61261985886124f990919063ffffffff16565b898781518110612652577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516020015161250f90919063ffffffff16565b61252590919063ffffffff16565b905061268f818661253b90919063ffffffff16565b9450505b600d5481146126f95782600960008785815181106126da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001908152602001600020819055505b508080612705906134aa565b915050612581565b5061276082600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253b90919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90613221565b60405180910390fd5b61293060008383612a14565b80600260008282546129429190613293565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129979190613293565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129fc9190613241565b60405180910390a3612a1060008383612a19565b5050565b505050565b505050565b604051806040016040528060008152602001600081525090565b600081359050612a4781613a38565b92915050565b600081519050612a5c81613a38565b92915050565b600081359050612a7181613a4f565b92915050565b600081359050612a8681613a66565b92915050565b600081519050612a9b81613a66565b92915050565b600060208284031215612ab357600080fd5b6000612ac184828501612a38565b91505092915050565b600060208284031215612adc57600080fd5b6000612aea84828501612a4d565b91505092915050565b60008060408385031215612b0657600080fd5b6000612b1485828601612a38565b9250506020612b2585828601612a38565b9150509250929050565b600080600060608486031215612b4457600080fd5b6000612b5286828701612a38565b9350506020612b6386828701612a38565b9250506040612b7486828701612a77565b9150509250925092565b60008060408385031215612b9157600080fd5b6000612b9f85828601612a38565b9250506020612bb085828601612a62565b9150509250929050565b60008060408385031215612bcd57600080fd5b6000612bdb85828601612a38565b9250506020612bec85828601612a77565b9150509250929050565b600060208284031215612c0857600080fd5b6000612c1684828501612a77565b91505092915050565b600060208284031215612c3157600080fd5b6000612c3f84828501612a8c565b91505092915050565b60008060408385031215612c5b57600080fd5b6000612c6985828601612a77565b9250506020612c7a85828601612a77565b9150509250929050565b612c8d816133a8565b82525050565b612c9c816133ba565b82525050565b612cab816133fd565b82525050565b612cba81613421565b82525050565b6000612ccb82613277565b612cd58185613282565b9350612ce5818560208601613445565b612cee81613580565b840191505092915050565b6000612d06602383613282565b9150612d1182613591565b604082019050919050565b6000612d29602283613282565b9150612d34826135e0565b604082019050919050565b6000612d4c602683613282565b9150612d578261362f565b604082019050919050565b6000612d6f602283613282565b9150612d7a8261367e565b604082019050919050565b6000612d92602083613282565b9150612d9d826136cd565b602082019050919050565b6000612db5602683613282565b9150612dc0826136f6565b604082019050919050565b6000612dd8601783613282565b9150612de382613745565b602082019050919050565b6000612dfb602783613282565b9150612e068261376e565b604082019050919050565b6000612e1e602883613282565b9150612e29826137bd565b604082019050919050565b6000612e41602083613282565b9150612e4c8261380c565b602082019050919050565b6000612e64602483613282565b9150612e6f82613835565b604082019050919050565b6000612e87602183613282565b9150612e9282613884565b604082019050919050565b6000612eaa602583613282565b9150612eb5826138d3565b604082019050919050565b6000612ecd602483613282565b9150612ed882613922565b604082019050919050565b6000612ef0602983613282565b9150612efb82613971565b604082019050919050565b6000612f13602583613282565b9150612f1e826139c0565b604082019050919050565b6000612f36601f83613282565b9150612f4182613a0f565b602082019050919050565b612f55816133e6565b82525050565b612f64816133f0565b82525050565b6000602082019050612f7f6000830184612c84565b92915050565b6000604082019050612f9a6000830185612c84565b612fa76020830184612f4c565b9392505050565b6000602082019050612fc36000830184612c93565b92915050565b6000602082019050612fde6000830184612ca2565b92915050565b6000602082019050612ff96000830184612cb1565b92915050565b600060208201905081810360008301526130198184612cc0565b905092915050565b6000602082019050818103600083015261303a81612cf9565b9050919050565b6000602082019050818103600083015261305a81612d1c565b9050919050565b6000602082019050818103600083015261307a81612d3f565b9050919050565b6000602082019050818103600083015261309a81612d62565b9050919050565b600060208201905081810360008301526130ba81612d85565b9050919050565b600060208201905081810360008301526130da81612da8565b9050919050565b600060208201905081810360008301526130fa81612dcb565b9050919050565b6000602082019050818103600083015261311a81612dee565b9050919050565b6000602082019050818103600083015261313a81612e11565b9050919050565b6000602082019050818103600083015261315a81612e34565b9050919050565b6000602082019050818103600083015261317a81612e57565b9050919050565b6000602082019050818103600083015261319a81612e7a565b9050919050565b600060208201905081810360008301526131ba81612e9d565b9050919050565b600060208201905081810360008301526131da81612ec0565b9050919050565b600060208201905081810360008301526131fa81612ee3565b9050919050565b6000602082019050818103600083015261321a81612f06565b9050919050565b6000602082019050818103600083015261323a81612f29565b9050919050565b60006020820190506132566000830184612f4c565b92915050565b60006020820190506132716000830184612f5b565b92915050565b600081519050919050565b600082825260208201905092915050565b600061329e826133e6565b91506132a9836133e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132de576132dd6134f3565b5b828201905092915050565b60006132f4826133e6565b91506132ff836133e6565b92508261330f5761330e613522565b5b828204905092915050565b6000613325826133e6565b9150613330836133e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613369576133686134f3565b5b828202905092915050565b600061337f826133e6565b915061338a836133e6565b92508282101561339d5761339c6134f3565b5b828203905092915050565b60006133b3826133c6565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006134088261340f565b9050919050565b600061341a826133c6565b9050919050565b600061342c82613433565b9050919050565b600061343e826133c6565b9050919050565b60005b83811015613463578082015181840152602081019050613448565b83811115613472576000848401525b50505050565b6000600282049050600182168061349057607f821691505b602082108114156134a4576134a3613551565b5b50919050565b60006134b5826133e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134e8576134e76134f3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f6c6f2043686970733a2041697264726f7020616c726561647920646f6e65600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f596f6c6f2043686970733a204e6f7420616c6c6f776564000000000000000000600082015250565b7f596f6c6f2043686970733a204e6f7420616c6c6f77656420746f207370656e6460008201527f2024434849505300000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f596f6c6f2043686970733a20496e636f72726563742061697264726f7020737460008201527f61727420696e6465780000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613a41816133a8565b8114613a4c57600080fd5b50565b613a58816133ba565b8114613a6357600080fd5b50565b613a6f816133e6565b8114613a7a57600080fd5b5056fea2646970667358221220e1433c9e227657f791a19732aa60ea25ba54636d9b816ff9e0bb458f92d2147d64736f6c6343000804003300000000000000000000000061e6494d934b594d0634f292e13846639b6f1927

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063a457c2d7116100b8578063dd62ed3e1161007c578063dd62ed3e1461068b578063f2fde38b146106bb578063facfd078146106d7578063fc2ea8a514610707578063ffd64f7f1461072557610232565b8063a457c2d7146105d7578063a5500c3014610607578063a9059cbb14610623578063af7d6ca314610653578063ccb98ffc1461066f57610232565b806379cc6790116100ff57806379cc6790146105475780638878d2ae146105635780638da5cb5b1461057f57806395d89b411461059d578063a2579505146105bb57610232565b8063715018a6146104f95780637419e77a1461050357806378e979251461051f578063793cd71e1461053d57610232565b80633e0a322d116101be5780635de54da5116101825780635de54da5146104415780636161a07d1461045f57806367da898e1461047b5780636a56b3591461049957806370a08231146104c957610232565b80633e0a322d1461038d57806342966c68146103a95780634612bd4f146103c55780635390f98e146103f5578063559a4db31461042557610232565b806323b872dd1161020557806323b872dd146102c15780632acca794146102f1578063313ce567146103215780633197cbb61461033f578063395093511461035d57610232565b806306fdde0314610237578063095ea7b31461025557806318160ddd1461028557806319cc02aa146102a3575b600080fd5b61023f610743565b60405161024c9190612fff565b60405180910390f35b61026f600480360381019061026a9190612bba565b6107d5565b60405161027c9190612fae565b60405180910390f35b61028d6107f3565b60405161029a9190613241565b60405180910390f35b6102ab6107fd565b6040516102b89190612fae565b60405180910390f35b6102db60048036038101906102d69190612b2f565b610810565b6040516102e89190612fae565b60405180910390f35b61030b60048036038101906103069190612aa1565b610908565b6040516103189190613241565b60405180910390f35b610329610920565b604051610336919061325c565b60405180910390f35b610347610929565b6040516103549190613241565b60405180910390f35b61037760048036038101906103729190612bba565b61092f565b6040516103849190612fae565b60405180910390f35b6103a760048036038101906103a29190612bf6565b6109db565b005b6103c360048036038101906103be9190612bf6565b610a61565b005b6103df60048036038101906103da9190612aa1565b610a75565b6040516103ec9190613241565b60405180910390f35b61040f600480360381019061040a9190612bf6565b610c6d565b60405161041c9190613241565b60405180910390f35b61043f600480360381019061043a9190612c48565b610c85565b005b6104496110af565b6040516104569190613241565b60405180910390f35b61047960048036038101906104749190612af3565b6110b5565b005b61048361115b565b6040516104909190612fe4565b60405180910390f35b6104b360048036038101906104ae9190612aa1565b611181565b6040516104c09190612fae565b60405180910390f35b6104e360048036038101906104de9190612aa1565b6111a1565b6040516104f09190613241565b60405180910390f35b6105016111e9565b005b61051d60048036038101906105189190612b7e565b611271565b005b610527611348565b6040516105349190613241565b60405180910390f35b61054561134e565b005b610561600480360381019061055c9190612bba565b61145f565b005b61057d60048036038101906105789190612aa1565b6114da565b005b61058761159a565b6040516105949190612f6a565b60405180910390f35b6105a56115c4565b6040516105b29190612fff565b60405180910390f35b6105d560048036038101906105d09190612aa1565b611656565b005b6105f160048036038101906105ec9190612bba565b611716565b6040516105fe9190612fae565b60405180910390f35b610621600480360381019061061c9190612bf6565b611801565b005b61063d60048036038101906106389190612bba565b611887565b60405161064a9190612fae565b60405180910390f35b61066d60048036038101906106689190612bba565b6118a5565b005b61068960048036038101906106849190612bf6565b61193f565b005b6106a560048036038101906106a09190612af3565b6119c5565b6040516106b29190613241565b60405180910390f35b6106d560048036038101906106d09190612aa1565b611a4c565b005b6106f160048036038101906106ec9190612aa1565b611b44565b6040516106fe9190613241565b60405180910390f35b61070f611b5c565b60405161071c9190613241565b60405180910390f35b61072d611b62565b60405161073a9190612fc9565b60405180910390f35b60606003805461075290613478565b80601f016020809104026020016040519081016040528092919081815260200182805461077e90613478565b80156107cb5780601f106107a0576101008083540402835291602001916107cb565b820191906000526020600020905b8154815290600101906020018083116107ae57829003601f168201915b5050505050905090565b60006107e96107e2611b88565b8484611b90565b6001905092915050565b6000600254905090565b600560149054906101000a900460ff1681565b600061081d848484611d5b565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610868611b88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90613121565b60405180910390fd5b6108fc856108f4611b88565b858403611b90565b60019150509392505050565b60086020528060005260406000206000915090505481565b60006012905090565b600d5481565b60006109d161093c611b88565b84846001600061094a611b88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109cc9190613293565b611b90565b6001905092915050565b6109e3611b88565b73ffffffffffffffffffffffffffffffffffffffff16610a0161159a565b73ffffffffffffffffffffffffffffffffffffffff1614610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613141565b60405180910390fd5b80600c8190555050565b610a72610a6c611b88565b82611fdc565b50565b6000600c54421015610ac857600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c68565b6000610ad3836121b3565b9050600080610ae442600d546124c6565b905060005b8351811015610c0f576000610b5760096000878581518110610b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160000151815260200190815260200160002054600c546124df565b90506000811115610bfb576000610be262015180610bd4610b8185886124f990919063ffffffff16565b898781518110610bba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516020015161250f90919063ffffffff16565b61252590919063ffffffff16565b9050610bf7818661253b90919063ffffffff16565b9450505b508080610c07906134aa565b915050610ae9565b50610c6282600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253b90919063ffffffff16565b93505050505b919050565b60096020528060005260406000206000915090505481565b610c8d611b88565b73ffffffffffffffffffffffffffffffffffffffff16610cab61159a565b73ffffffffffffffffffffffffffffffffffffffff1614610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613141565b60405180910390fd5b600560149054906101000a900460ff1615610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d48906130a1565b60405180910390fd5b6006548214610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c906131e1565b60405180910390fd5b6000610e4082600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0357600080fd5b505afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b9190612c1f565b6124c6565b905060008390505b81811015610fdf576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610ead9190613241565b60206040518083038186803b158015610ec557600080fd5b505afa158015610ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efd9190612aca565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fcb57610f87600b54600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253b90919063ffffffff16565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080610fd7906134aa565b915050610e48565b5080600681905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561104f57600080fd5b505afa158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190612c1f565b8114156110aa576001600560146101000a81548160ff0219169083151502179055505b505050565b60065481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c906130e1565b60405180910390fd5b61114e82612551565b61115781612551565b5050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f1611b88565b73ffffffffffffffffffffffffffffffffffffffff1661120f61159a565b73ffffffffffffffffffffffffffffffffffffffff1614611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90613141565b60405180910390fd5b61126f60006127ee565b565b611279611b88565b73ffffffffffffffffffffffffffffffffffffffff1661129761159a565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613141565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c5481565b61135733612551565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561145c576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061140d33611408670de0b6b3a76400008461250f90919063ffffffff16565b6128b4565b3373ffffffffffffffffffffffffffffffffffffffff167f650a3e335a58a5ffe2ecc0f229faffb8af6149cc75b22210b6d2b9401f98c7b4826040516114539190613241565b60405180910390a25b50565b60006114728361146d611b88565b6119c5565b9050818110156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613161565b60405180910390fd5b6114cb836114c3611b88565b848403611b90565b6114d58383611fdc565b505050565b6114e2611b88565b73ffffffffffffffffffffffffffffffffffffffff1661150061159a565b73ffffffffffffffffffffffffffffffffffffffff1614611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90613141565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546115d390613478565b80601f01602080910402602001604051908101604052809291908181526020018280546115ff90613478565b801561164c5780601f106116215761010080835404028352916020019161164c565b820191906000526020600020905b81548152906001019060200180831161162f57829003601f168201915b5050505050905090565b61165e611b88565b73ffffffffffffffffffffffffffffffffffffffff1661167c61159a565b73ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c990613141565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060016000611725611b88565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990613201565b60405180910390fd5b6117f66117ed611b88565b85858403611b90565b600191505092915050565b611809611b88565b73ffffffffffffffffffffffffffffffffffffffff1661182761159a565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490613141565b60405180910390fd5b80600b8190555050565b600061189b611894611b88565b8484611d5b565b6001905092915050565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890613101565b60405180910390fd5b61193b8282611fdc565b5050565b611947611b88565b73ffffffffffffffffffffffffffffffffffffffff1661196561159a565b73ffffffffffffffffffffffffffffffffffffffff16146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290613141565b60405180910390fd5b80600d8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611a54611b88565b73ffffffffffffffffffffffffffffffffffffffff16611a7261159a565b73ffffffffffffffffffffffffffffffffffffffff1614611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90613141565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90613061565b60405180910390fd5b611b41816127ee565b50565b60076020528060005260406000206000915090505481565b600b5481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf7906131c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613081565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d4e9190613241565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc2906131a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3290613021565b60405180910390fd5b611e46838383612a14565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec3906130c1565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5f9190613293565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fc39190613241565b60405180910390a3611fd6848484612a19565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390613181565b60405180910390fd5b61205882600083612a14565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590613041565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546121359190613374565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161219a9190613241565b60405180910390a36121ae83600084612a19565b505050565b60606000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016122129190612f6a565b60206040518083038186803b15801561222a57600080fd5b505afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190612c1f565b905060008167ffffffffffffffff8111156122a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156122df57816020015b6122cc612a1e565b8152602001906001900390816122c45790505b50905060005b828110156124bb576000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5987846040518363ffffffff1660e01b815260040161234c929190612f85565b60206040518083038186803b15801561236457600080fd5b505afa158015612378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239c9190612c1f565b90506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361328074836040518263ffffffff1660e01b81526004016123fb9190613241565b60206040518083038186803b15801561241357600080fd5b505afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190612c1f565b905060405180604001604052808381526020018281525084848151811061249b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250505080806124b3906134aa565b9150506122e5565b508092505050919050565b60008183106124d557816124d7565b825b905092915050565b6000818310156124ef57816124f1565b825b905092915050565b600081836125079190613374565b905092915050565b6000818361251d919061331a565b905092915050565b6000818361253391906132e9565b905092915050565b600081836125499190613293565b905092915050565b600c54421015612560576127eb565b600061256b826121b3565b905060008061257c42600d546124c6565b905060005b835181101561270d5760006125ef600960008785815181106125cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160000151815260200190815260200160002054600c546124df565b9050600081111561269357600061267a6201518061266c61261985886124f990919063ffffffff16565b898781518110612652577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516020015161250f90919063ffffffff16565b61252590919063ffffffff16565b905061268f818661253b90919063ffffffff16565b9450505b600d5481146126f95782600960008785815181106126da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001908152602001600020819055505b508080612705906134aa565b915050612581565b5061276082600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253b90919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90613221565b60405180910390fd5b61293060008383612a14565b80600260008282546129429190613293565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129979190613293565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129fc9190613241565b60405180910390a3612a1060008383612a19565b5050565b505050565b505050565b604051806040016040528060008152602001600081525090565b600081359050612a4781613a38565b92915050565b600081519050612a5c81613a38565b92915050565b600081359050612a7181613a4f565b92915050565b600081359050612a8681613a66565b92915050565b600081519050612a9b81613a66565b92915050565b600060208284031215612ab357600080fd5b6000612ac184828501612a38565b91505092915050565b600060208284031215612adc57600080fd5b6000612aea84828501612a4d565b91505092915050565b60008060408385031215612b0657600080fd5b6000612b1485828601612a38565b9250506020612b2585828601612a38565b9150509250929050565b600080600060608486031215612b4457600080fd5b6000612b5286828701612a38565b9350506020612b6386828701612a38565b9250506040612b7486828701612a77565b9150509250925092565b60008060408385031215612b9157600080fd5b6000612b9f85828601612a38565b9250506020612bb085828601612a62565b9150509250929050565b60008060408385031215612bcd57600080fd5b6000612bdb85828601612a38565b9250506020612bec85828601612a77565b9150509250929050565b600060208284031215612c0857600080fd5b6000612c1684828501612a77565b91505092915050565b600060208284031215612c3157600080fd5b6000612c3f84828501612a8c565b91505092915050565b60008060408385031215612c5b57600080fd5b6000612c6985828601612a77565b9250506020612c7a85828601612a77565b9150509250929050565b612c8d816133a8565b82525050565b612c9c816133ba565b82525050565b612cab816133fd565b82525050565b612cba81613421565b82525050565b6000612ccb82613277565b612cd58185613282565b9350612ce5818560208601613445565b612cee81613580565b840191505092915050565b6000612d06602383613282565b9150612d1182613591565b604082019050919050565b6000612d29602283613282565b9150612d34826135e0565b604082019050919050565b6000612d4c602683613282565b9150612d578261362f565b604082019050919050565b6000612d6f602283613282565b9150612d7a8261367e565b604082019050919050565b6000612d92602083613282565b9150612d9d826136cd565b602082019050919050565b6000612db5602683613282565b9150612dc0826136f6565b604082019050919050565b6000612dd8601783613282565b9150612de382613745565b602082019050919050565b6000612dfb602783613282565b9150612e068261376e565b604082019050919050565b6000612e1e602883613282565b9150612e29826137bd565b604082019050919050565b6000612e41602083613282565b9150612e4c8261380c565b602082019050919050565b6000612e64602483613282565b9150612e6f82613835565b604082019050919050565b6000612e87602183613282565b9150612e9282613884565b604082019050919050565b6000612eaa602583613282565b9150612eb5826138d3565b604082019050919050565b6000612ecd602483613282565b9150612ed882613922565b604082019050919050565b6000612ef0602983613282565b9150612efb82613971565b604082019050919050565b6000612f13602583613282565b9150612f1e826139c0565b604082019050919050565b6000612f36601f83613282565b9150612f4182613a0f565b602082019050919050565b612f55816133e6565b82525050565b612f64816133f0565b82525050565b6000602082019050612f7f6000830184612c84565b92915050565b6000604082019050612f9a6000830185612c84565b612fa76020830184612f4c565b9392505050565b6000602082019050612fc36000830184612c93565b92915050565b6000602082019050612fde6000830184612ca2565b92915050565b6000602082019050612ff96000830184612cb1565b92915050565b600060208201905081810360008301526130198184612cc0565b905092915050565b6000602082019050818103600083015261303a81612cf9565b9050919050565b6000602082019050818103600083015261305a81612d1c565b9050919050565b6000602082019050818103600083015261307a81612d3f565b9050919050565b6000602082019050818103600083015261309a81612d62565b9050919050565b600060208201905081810360008301526130ba81612d85565b9050919050565b600060208201905081810360008301526130da81612da8565b9050919050565b600060208201905081810360008301526130fa81612dcb565b9050919050565b6000602082019050818103600083015261311a81612dee565b9050919050565b6000602082019050818103600083015261313a81612e11565b9050919050565b6000602082019050818103600083015261315a81612e34565b9050919050565b6000602082019050818103600083015261317a81612e57565b9050919050565b6000602082019050818103600083015261319a81612e7a565b9050919050565b600060208201905081810360008301526131ba81612e9d565b9050919050565b600060208201905081810360008301526131da81612ec0565b9050919050565b600060208201905081810360008301526131fa81612ee3565b9050919050565b6000602082019050818103600083015261321a81612f06565b9050919050565b6000602082019050818103600083015261323a81612f29565b9050919050565b60006020820190506132566000830184612f4c565b92915050565b60006020820190506132716000830184612f5b565b92915050565b600081519050919050565b600082825260208201905092915050565b600061329e826133e6565b91506132a9836133e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132de576132dd6134f3565b5b828201905092915050565b60006132f4826133e6565b91506132ff836133e6565b92508261330f5761330e613522565b5b828204905092915050565b6000613325826133e6565b9150613330836133e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613369576133686134f3565b5b828202905092915050565b600061337f826133e6565b915061338a836133e6565b92508282101561339d5761339c6134f3565b5b828203905092915050565b60006133b3826133c6565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006134088261340f565b9050919050565b600061341a826133c6565b9050919050565b600061342c82613433565b9050919050565b600061343e826133c6565b9050919050565b60005b83811015613463578082015181840152602081019050613448565b83811115613472576000848401525b50505050565b6000600282049050600182168061349057607f821691505b602082108114156134a4576134a3613551565b5b50919050565b60006134b5826133e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134e8576134e76134f3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f6c6f2043686970733a2041697264726f7020616c726561647920646f6e65600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f596f6c6f2043686970733a204e6f7420616c6c6f776564000000000000000000600082015250565b7f596f6c6f2043686970733a204e6f7420616c6c6f77656420746f207370656e6460008201527f2024434849505300000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f596f6c6f2043686970733a20496e636f72726563742061697264726f7020737460008201527f61727420696e6465780000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613a41816133a8565b8114613a4c57600080fd5b50565b613a58816133ba565b8114613a6357600080fd5b50565b613a6f816133e6565b8114613a7a57600080fd5b5056fea2646970667358221220e1433c9e227657f791a19732aa60ea25ba54636d9b816ff9e0bb458f92d2147d64736f6c63430008040033

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

00000000000000000000000061e6494d934b594d0634f292e13846639b6f1927

-----Decoded View---------------
Arg [0] : _diceV1 (address): 0x61e6494d934B594d0634F292e13846639B6f1927

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000061e6494d934b594d0634f292e13846639b6f1927


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.