ETH Price: $2,385.30 (+7.83%)

Contract

0x2Cd48C7eB2fC9664F644F2BAE7AFe20DAEb29068
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...219580022025-03-02 8:30:4723 hrs ago1740904247IN
0x2Cd48C7e...DAEb29068
0 ETH0.00005741.24286058
Set Approval For...219580012025-03-02 8:30:3523 hrs ago1740904235IN
0x2Cd48C7e...DAEb29068
0 ETH0.000057961.25264757
Set Approval For...219579982025-03-02 8:29:5923 hrs ago1740904199IN
0x2Cd48C7e...DAEb29068
0 ETH0.000059271.28260891
Safe Transfer Fr...219234632025-02-25 12:52:475 days ago1740487967IN
0x2Cd48C7e...DAEb29068
0 ETH0.000084351.38741515
Set Approval For...216719232025-01-21 9:18:4740 days ago1737451127IN
0x2Cd48C7e...DAEb29068
0 ETH0.0008961519.40195805
Set Approval For...215185362024-12-30 23:20:1162 days ago1735600811IN
0x2Cd48C7e...DAEb29068
0 ETH0.00018277.5
Transfer From213596122024-12-08 18:37:4784 days ago1733683067IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005904912.93072208
Transfer From213596052024-12-08 18:36:2384 days ago1733682983IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005889812.89772263
Transfer From213596002024-12-08 18:35:2384 days ago1733682923IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005740812.5713945
Transfer From213595902024-12-08 18:33:2384 days ago1733682803IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006069413.29105316
Transfer From213595822024-12-08 18:31:4784 days ago1733682707IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006036713.21939769
Transfer From213595662024-12-08 18:28:3584 days ago1733682515IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005996813.13192934
Transfer From213595582024-12-08 18:26:5984 days ago1733682419IN
0x2Cd48C7e...DAEb29068
0 ETH0.000627213.73456706
Transfer From213595552024-12-08 18:26:1184 days ago1733682371IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006175613.52347779
Transfer From213595522024-12-08 18:25:3584 days ago1733682335IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006285513.76408134
Transfer From213595462024-12-08 18:24:2384 days ago1733682263IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005944513.01738046
Transfer From213595392024-12-08 18:22:5984 days ago1733682179IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005548912.15110351
Transfer From213595342024-12-08 18:21:5984 days ago1733682119IN
0x2Cd48C7e...DAEb29068
0 ETH0.000561912.30475253
Transfer From213595242024-12-08 18:19:5984 days ago1733681999IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005536212.12337119
Transfer From213595142024-12-08 18:17:5984 days ago1733681879IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006313713.82584887
Transfer From213595062024-12-08 18:16:2384 days ago1733681783IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006310513.81882532
Transfer From213594982024-12-08 18:14:4784 days ago1733681687IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006654214.57155512
Transfer From213594922024-12-08 18:13:3584 days ago1733681615IN
0x2Cd48C7e...DAEb29068
0 ETH0.0006536214.31318705
Transfer From213594802024-12-08 18:11:1184 days ago1733681471IN
0x2Cd48C7e...DAEb29068
0 ETH0.000730916.00556029
Set Approval For...212956682024-11-29 20:15:2393 days ago1732911323IN
0x2Cd48C7e...DAEb29068
0 ETH0.0005729112.38111662
View all transactions

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
161657082022-12-12 2:41:11812 days ago1670812871
0x2Cd48C7e...DAEb29068
97.73717771 ETH
161573012022-12-10 22:30:35813 days ago1670711435
0x2Cd48C7e...DAEb29068
166.42432357 ETH
161137132022-12-04 20:05:47819 days ago1670184347
0x2Cd48C7e...DAEb29068
143.89157011 ETH
161044592022-12-03 13:02:47820 days ago1670072567
0x2Cd48C7e...DAEb29068
22.01257861 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PowrUP

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-02
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/security/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File contracts/PowrUp.sol

pragma solidity 0.8.14;

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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

library Address {

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

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

interface IERC20 {

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

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

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

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

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

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

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

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

contract Ownable {

    address public owner;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier onlyOwner() {
        // If the first argument of "require" evaluates to "false", execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use "require" to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }
    
    /**
     * @dev Set contract deployer as owner
     */
    constructor() {
        owner = msg.sender; // "msg.sender" is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
}

interface IAggregator {
  function latestAnswer() external view returns (int256);
  function latestTimestamp() external view returns (uint256);
  function latestRound() external view returns (uint256);
  function getAnswer(uint256 roundId) external view returns (int256);
  function getTimestamp(uint256 roundId) external view returns (uint256);
  function decimals() external view returns (uint8);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}

contract PowrUP is Context, ERC165, IERC721, IERC721Metadata, ReentrancyGuard, Ownable {

    using Address for address;

    // Token name
    string private constant _name = "POW'r UP Ethereum Virtual Miner";

    // Token symbol
    string private constant _symbol = "POWR";

    // total number of NFTs Minted
    uint256 private _totalSupply;
    uint256 public currentSupplyIndex;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // cost for minting NFT
    uint256 public costUSD = 1000;

    // Mint Fee Recipient
    address public mintRecipient;

    // base URI
    string private baseURI = "url";
    string private ending = ".json";

    // Contracts
    IAggregator public aggregatorContract;

    // Enable Trading
    bool public mintingEnabled = false;

    constructor() {
        aggregatorContract = IAggregator(address(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419));
    }

    ////////////////////////////////////////////////
    ///////////   RESTRICTED FUNCTIONS   ///////////
    ////////////////////////////////////////////////

    function enableMinting() external onlyOwner {
        mintingEnabled = true;
    }

    function disableMinting() external onlyOwner {
        mintingEnabled = false;
    }

    function setMintRecipient(address newRecipient) external onlyOwner {
        mintRecipient = newRecipient;
    }

    function withdraw() external onlyOwner {
        (bool s,) = payable(msg.sender).call{value: address(this).balance}("");
        require(s);
    }

    function withdrawToken(address token_) external onlyOwner {
        require(token_ != address(0), "Zero Address");
        IERC20(token_).transfer(msg.sender, IERC20(token_).balanceOf(address(this)));
    }

    function setCostUSD(uint256 newCost) external onlyOwner {
        costUSD = newCost;
    }

    function setBaseURI(string calldata newURI) external onlyOwner {
        baseURI = newURI;
    }

    function setURIExtention(string calldata newExtention) external onlyOwner {
        ending = newExtention;
    }

    function ownerMint(address to, uint256 qty) external onlyOwner {
        // mint NFTs
        for (uint i = 0; i < qty; i++) {
            _safeMint(to, currentSupplyIndex);
        }
    }


    ////////////////////////////////////////////////
    ///////////     PUBLIC FUNCTIONS     ///////////
    ////////////////////////////////////////////////

    /** 
     * Mints `numberOfMints` NFTs To Caller
     */
    function mint(uint256 numberOfMints) payable external nonReentrant {
        require(
            mintingEnabled,
            "Minting Not Enabled"
        );
        require(
            numberOfMints > 0, 
            "Invalid Input"
        );

        // determine cost
        int256 currentPrice = aggregatorContract.latestAnswer();
        uint256 convertedPrice = uint(currentPrice) / 1 * (10 ** aggregatorContract.decimals());
        uint cost = ((costUSD * numberOfMints) * 1e18) / convertedPrice;

        require(
            msg.value >= cost * 99 / 100,
            "Invalid Ethereum Amount"
        );

        // mint tokens
        for (uint i = 0; i < numberOfMints;) {
            _safeMint(msg.sender, currentSupplyIndex);
            unchecked { ++i; }
        }
    }

    function burn(uint256 tokenID) external {
        require(_isApprovedOrOwner(_msgSender(), tokenID), "caller not owner nor approved");
        _burn(tokenID);
    }

    receive() external payable {}

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address wpowner = ownerOf(tokenId);
        require(to != wpowner, "ERC721: approval to current owner");

        require(
            _msgSender() == wpowner || isApprovedForAll(wpowner, _msgSender()),
            "ERC721: not approved or owner"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address _operator, bool approved) public override {
        _setApprovalForAll(_msgSender(), _operator, approved);
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved");
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }


    ////////////////////////////////////////////////
    ///////////     READ FUNCTIONS       ///////////
    ////////////////////////////////////////////////

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function getCurrentCost() external view returns (uint256) {
        int256 currentPrice = aggregatorContract.latestAnswer();
        uint256 convertedPrice = uint(currentPrice) / 1e8;
        return (costUSD * 1e18) / convertedPrice;
    }

    function getIDsByOwner(address owner, uint startIndex) external view returns (uint256[] memory) {
        uint256[] memory ids = new uint256[](balanceOf(owner));
        if (balanceOf(owner) == 0) return ids;
        uint256 count = 0;
        for (uint i = startIndex; i < _totalSupply; i++) {
            if (_owners[i] == owner) {
                ids[count] = i;
                count++;
            }
        }
        return ids;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address wpowner) public view override returns (uint256) {
        require(wpowner != address(0), "query for the zero address");
        return _balances[wpowner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        address wpowner = _owners[tokenId];
        require(wpowner != address(0), "query for nonexistent token");
        return wpowner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public pure override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public pure override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "nonexistent token");

        string memory fHalf = string.concat(baseURI, uint2str(tokenId));
        return string.concat(fHalf, ending);
    }

    /**
        Converts A Uint Into a String
    */
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address wpowner, address _operator) public view override returns (bool) {
        return _operatorApprovals[wpowner][_operator];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: nonexistent token");
        address wpowner = ownerOf(tokenId);
        return (spender == wpowner || getApproved(tokenId) == spender || isApprovedForAll(wpowner, spender));
    }

    ////////////////////////////////////////////////
    ///////////    INTERNAL FUNCTIONS    ///////////
    ////////////////////////////////////////////////


    function _transferIn(address token, uint256 amount) internal {
        require(
            IERC20(token).allowance(msg.sender, address(this)) >= amount,
            "Insufficient Allowance"
        );
        uint bal = IERC20(token).balanceOf(mintRecipient);
        require(
            IERC20(token).transferFrom(msg.sender, mintRecipient, amount),
            "Transfer From Fail"
        );
        uint After = IERC20(token).balanceOf(mintRecipient);
        require(
            After > bal,
            "Zero Received"
        );
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId
    ) internal {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal {
        require(!_exists(tokenId), "ERC721: token already minted");

        _owners[tokenId] = to;
        unchecked {
            _balances[to] += 1;
            _totalSupply++;
            currentSupplyIndex++;
        }

        emit Transfer(address(0), to, tokenId);
    }


    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: non ERC721Receiver implementer");
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal {
        require(_exists(tokenId), "Token Does Not Exist");

        // owner of token
        address owner = ownerOf(tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        // decrement balance
        _balances[owner] -= 1;
        delete _owners[tokenId];

        // decrement total supply
        _totalSupply -= 1;

        // emit transfer
        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(ownerOf(tokenId) == from, "Incorrect owner");
        require(to != address(0), "zero address");
        require(balanceOf(from) > 0, "Zero Balance");

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        // Allocate balances
        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        // emit transfer
        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address wpowner,
        address _operator,
        bool approved
    ) internal {
        require(wpowner != _operator, "ERC721: approve to caller");
        _operatorApprovals[wpowner][_operator] = approved;
        emit ApprovalForAll(wpowner, _operator, approved);
    }

    function onReceivedRetval() public pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"aggregatorContract","outputs":[{"internalType":"contract IAggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"costUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"startIndex","type":"uint256"}],"name":"getIDsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"onReceivedRetval","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCostUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setMintRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtention","type":"string"}],"name":"setURIExtention","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6103e860085560c060405260036080819052621d5c9b60ea1b60a09081526200002c91600a9190620000e5565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005b91600b91620000e5565b50600c805460ff60a01b191690553480156200007657600080fd5b506001600081815581546001600160a01b031916339081179092556040517f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a3600c80546001600160a01b031916735f4ec3df9cbd43714fe2740f5e3616155c5b8419179055620001c7565b828054620000f3906200018b565b90600052602060002090601f01602090048101928262000117576000855562000162565b82601f106200013257805160ff191683800117855562000162565b8280016001018555821562000162579182015b828111156200016257825182559160200191906001019062000145565b506200017092915062000174565b5090565b5b8082111562000170576000815560010162000175565b600181811c90821680620001a057607f821691505b602082108103620001c157634e487b7160e01b600052602260045260246000fd5b50919050565b6124e780620001d76000396000f3fe6080604052600436106102135760003560e01c8063893d20e811610118578063b4b7eee0116100a0578063e797ec1b1161006f578063e797ec1b14610639578063e8a7bc571461064e578063e946b7ed1461066e578063e985e9c51461068e578063ff43221c146106d757600080fd5b8063b4b7eee0146105ac578063b88d4fde146105d9578063c87b56dd146105f9578063ce9174211461061957600080fd5b80639fd6db12116100e75780639fd6db1214610516578063a0712d6814610537578063a22cb4651461054a578063a6f9dae11461056a578063ae9843d61461058a57600080fd5b8063893d20e81461048b57806389476069146104a95780638da5cb5b146104c957806395d89b41146104e957600080fd5b806342842e0e1161019b57806355f804b31161016a57806355f804b3146104015780636352211e1461042157806370a08231146104415780637e5cd5c114610461578063831e60de1461047657600080fd5b806342842e0e1461038157806342966c68146103a15780634408a046146103c1578063484b973c146103e157600080fd5b806315b287fa116101e257806315b287fa146102fd57806318160ddd146103215780631e2639901461033657806323b872dd1461034c5780633ccfd60b1461036c57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc146102a3578063095ea7b3146102db57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004611d03565b6106f7565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5060408051808201909152601f81527f504f57277220555020457468657265756d205669727475616c204d696e65720060208201525b60405161024b9190611d7f565b3480156102af57600080fd5b506102c36102be366004611d92565b610749565b6040516001600160a01b03909116815260200161024b565b3480156102e757600080fd5b506102fb6102f6366004611dc7565b6107da565b005b34801561030957600080fd5b5061031360085481565b60405190815260200161024b565b34801561032d57600080fd5b50600254610313565b34801561034257600080fd5b5061031360035481565b34801561035857600080fd5b506102fb610367366004611df1565b6108c9565b34801561037857600080fd5b506102fb6108fb565b34801561038d57600080fd5b506102fb61039c366004611df1565b61097d565b3480156103ad57600080fd5b506102fb6103bc366004611d92565b610998565b3480156103cd57600080fd5b506102fb6103dc366004611e2d565b6109c6565b3480156103ed57600080fd5b506102fb6103fc366004611dc7565b6109fc565b34801561040d57600080fd5b506102fb61041c366004611e2d565b610a4f565b34801561042d57600080fd5b506102c361043c366004611d92565b610a85565b34801561044d57600080fd5b5061031361045c366004611e9f565b610aea565b34801561046d57600080fd5b506102fb610b5e565b34801561048257600080fd5b50610313610b97565b34801561049757600080fd5b506001546001600160a01b03166102c3565b3480156104b557600080fd5b506102fb6104c4366004611e9f565b610c4d565b3480156104d557600080fd5b506001546102c3906001600160a01b031681565b3480156104f557600080fd5b506040805180820190915260048152632827aba960e11b6020820152610296565b34801561052257600080fd5b50600c5461023f90600160a01b900460ff1681565b6102fb610545366004611d92565b610da1565b34801561055657600080fd5b506102fb610565366004611ec8565b611052565b34801561057657600080fd5b506102fb610585366004611e9f565b61105d565b34801561059657600080fd5b50604051630a85bd0160e11b815260200161024b565b3480156105b857600080fd5b506105cc6105c7366004611dc7565b6110e3565b60405161024b9190611eff565b3480156105e557600080fd5b506102fb6105f4366004611f59565b6111c2565b34801561060557600080fd5b50610296610614366004611d92565b6111fa565b34801561062557600080fd5b506102fb610634366004611d92565b6112af565b34801561064557600080fd5b506102fb6112de565b34801561065a57600080fd5b506009546102c3906001600160a01b031681565b34801561067a57600080fd5b506102fb610689366004611e9f565b61131d565b34801561069a57600080fd5b5061023f6106a9366004612035565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106e357600080fd5b50600c546102c3906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061072857506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b03166107be5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107e582610a85565b9050806001600160a01b0316836001600160a01b0316036108525760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b5565b336001600160a01b038216148061086e575061086e81336106a9565b6108ba5760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e657200000060448201526064016107b5565b6108c48383611369565b505050565b6108d4335b826113d7565b6108f05760405162461bcd60e51b81526004016107b590612068565b6108c48383836114b9565b6001546001600160a01b031633146109255760405162461bcd60e51b81526004016107b59061209f565b604051600090339047908381818185875af1925050503d8060008114610967576040519150601f19603f3d011682016040523d82523d6000602084013e61096c565b606091505b505090508061097a57600080fd5b50565b6108c4838383604051806020016040528060008152506111c2565b6109a1336108ce565b6109bd5760405162461bcd60e51b81526004016107b590612068565b61097a81611663565b6001546001600160a01b031633146109f05760405162461bcd60e51b81526004016107b59061209f565b6108c4600b8383611c54565b6001546001600160a01b03163314610a265760405162461bcd60e51b81526004016107b59061209f565b60005b818110156108c457610a3d83600354611774565b80610a47816120e2565b915050610a29565b6001546001600160a01b03163314610a795760405162461bcd60e51b81526004016107b59061209f565b6108c4600a8383611c54565b6000818152600460205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e000000000060448201526064016107b5565b60006001600160a01b038216610b425760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f206164647265737300000000000060448201526064016107b5565b506001600160a01b031660009081526005602052604090205490565b6001546001600160a01b03163314610b885760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b19169055565b600080600c60009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1191906120fb565b90506000610c236305f5e10083612114565b905080600854670de0b6b3a7640000610c3c9190612136565b610c469190612114565b9250505090565b6001546001600160a01b03163314610c775760405162461bcd60e51b81526004016107b59061209f565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107b5565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e91906120fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190612155565b5050565b600260005403610df35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b5565b6002600055600c54600160a01b900460ff16610e475760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c8139bdd08115b98589b1959606a1b60448201526064016107b5565b60008111610e875760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b60448201526064016107b5565b600c54604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd9160048083019260209291908290030181865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef591906120fb565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190612172565b610f7b90600a612279565b610f86600184612114565b610f909190612136565b905060008184600854610fa39190612136565b610fb590670de0b6b3a7640000612136565b610fbf9190612114565b90506064610fce826063612136565b610fd89190612114565b3410156110275760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420457468657265756d20416d6f756e7400000000000000000060448201526064016107b5565b60005b848110156110465761103e33600354611774565b60010161102a565b50506001600055505050565b610d9d338383611801565b6001546001600160a01b031633146110875760405162461bcd60e51b81526004016107b59061209f565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b606060006110f084610aea565b67ffffffffffffffff81111561110857611108611f43565b604051908082528060200260200182016040528015611131578160200160208202803683370190505b50905061113d84610aea565b60000361114b579050610743565b6000835b6002548110156111b8576000818152600460205260409020546001600160a01b038088169116036111a6578083838151811061118d5761118d612288565b6020908102919091010152816111a2816120e2565b9250505b806111b0816120e2565b91505061114f565b5090949350505050565b6111cc33836113d7565b6111e85760405162461bcd60e51b81526004016107b590612068565b6111f4848484846118cf565b50505050565b6000818152600460205260409020546060906001600160a01b03166112555760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016107b5565b6000600a61126284611902565b604051602001611273929190612371565b604051602081830303815290604052905080600b604051602001611298929190612396565b604051602081830303815290604052915050919050565b6001546001600160a01b031633146112d95760405162461bcd60e51b81526004016107b59061209f565b600855565b6001546001600160a01b031633146113085760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b1916600160a01b179055565b6001546001600160a01b031633146113475760405162461bcd60e51b81526004016107b59061209f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061139e82610a85565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b031661143b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064016107b5565b600061144683610a85565b9050806001600160a01b0316846001600160a01b031614806114815750836001600160a01b031661147684610749565b6001600160a01b0316145b806114b157506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114cc82610a85565b6001600160a01b0316146115145760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b60448201526064016107b5565b6001600160a01b0382166115595760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016107b5565b600061156484610aea565b116115a05760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016107b5565b6115ab600082611369565b6001600160a01b03831660009081526005602052604081208054600192906115d49084906123bd565b90915550506001600160a01b03821660009081526005602052604081208054600192906116029084906123d4565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600460205260409020546001600160a01b03166116be5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b60448201526064016107b5565b60006116c982610a85565b90506116d6600083611369565b6001600160a01b03811660009081526005602052604081208054600192906116ff9084906123bd565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906117339084906123bd565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61177e8282611a2e565b61179a6000838360405180602001604052806000815250611b13565b610d9d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107b5565b816001600160a01b0316836001600160a01b0316036118625760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b5565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118da8484846114b9565b6118e684848484611b13565b6111f45760405162461bcd60e51b81526004016107b5906123ec565b6060816000036119295750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611953578061193d816120e2565b915061194c9050600a83612114565b915061192d565b60008167ffffffffffffffff81111561196e5761196e611f43565b6040519080825280601f01601f191660200182016040528015611998576020820181803683370190505b509050815b8515611a25576119ae6001826123bd565b905060006119bd600a88612114565b6119c890600a612136565b6119d290886123bd565b6119dd906030612432565b905060008160f81b9050808484815181106119fa576119fa612288565b60200101906001600160f81b031916908160001a905350611a1c600a89612114565b9750505061199d565b50949350505050565b6000818152600460205260409020546001600160a01b031615611a935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b5565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526005909252808320805460019081019091556002805482019055600380549091019055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611b27846001600160a01b0316611c1b565b15611c1057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b5e903390899088908890600401612457565b6020604051808303816000875af1925050508015611b99575060408051601f3d908101601f19168201909252611b9691810190612494565b60015b611bf6573d808015611bc7576040519150601f19603f3d011682016040523d82523d6000602084013e611bcc565b606091505b508051600003611bee5760405162461bcd60e51b81526004016107b5906123ec565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114b1565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906114b1575050151592915050565b828054611c609061229e565b90600052602060002090601f016020900481019282611c825760008555611cc8565b82601f10611c9b5782800160ff19823516178555611cc8565b82800160010185558215611cc8579182015b82811115611cc8578235825591602001919060010190611cad565b50611cd4929150611cd8565b5090565b5b80821115611cd45760008155600101611cd9565b6001600160e01b03198116811461097a57600080fd5b600060208284031215611d1557600080fd5b8135611d2081611ced565b9392505050565b60005b83811015611d42578181015183820152602001611d2a565b838111156111f45750506000910152565b60008151808452611d6b816020860160208601611d27565b601f01601f19169290920160200192915050565b602081526000611d206020830184611d53565b600060208284031215611da457600080fd5b5035919050565b80356001600160a01b0381168114611dc257600080fd5b919050565b60008060408385031215611dda57600080fd5b611de383611dab565b946020939093013593505050565b600080600060608486031215611e0657600080fd5b611e0f84611dab565b9250611e1d60208501611dab565b9150604084013590509250925092565b60008060208385031215611e4057600080fd5b823567ffffffffffffffff80821115611e5857600080fd5b818501915085601f830112611e6c57600080fd5b813581811115611e7b57600080fd5b866020828501011115611e8d57600080fd5b60209290920196919550909350505050565b600060208284031215611eb157600080fd5b611d2082611dab565b801515811461097a57600080fd5b60008060408385031215611edb57600080fd5b611ee483611dab565b91506020830135611ef481611eba565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611f3757835183529284019291840191600101611f1b565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611f6f57600080fd5b611f7885611dab565b9350611f8660208601611dab565b925060408501359150606085013567ffffffffffffffff80821115611faa57600080fd5b818701915087601f830112611fbe57600080fd5b813581811115611fd057611fd0611f43565b604051601f8201601f19908116603f01168101908382118183101715611ff857611ff8611f43565b816040528281528a602084870101111561201157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561204857600080fd5b61205183611dab565b915061205f60208401611dab565b90509250929050565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016120f4576120f46120cc565b5060010190565b60006020828403121561210d57600080fd5b5051919050565b60008261213157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612150576121506120cc565b500290565b60006020828403121561216757600080fd5b8151611d2081611eba565b60006020828403121561218457600080fd5b815160ff81168114611d2057600080fd5b600181815b808511156121d05781600019048211156121b6576121b66120cc565b808516156121c357918102915b93841c939080029061219a565b509250929050565b6000826121e757506001610743565b816121f457506000610743565b816001811461220a576002811461221457612230565b6001915050610743565b60ff841115612225576122256120cc565b50506001821b610743565b5060208310610133831016604e8410600b8410161715612253575081810a610743565b61225d8383612195565b8060001904821115612271576122716120cc565b029392505050565b6000611d2060ff8416836121d8565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806122b257607f821691505b6020821081036122d257634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c90808316806122f257607f831692505b6020808410820361231357634e487b7160e01b600052602260045260246000fd5b818015612327576001811461233857612365565b60ff19861689528489019650612365565b60008881526020902060005b8681101561235d5781548b820152908501908301612344565b505084890196505b50505050505092915050565b600061237d82856122d8565b835161238d818360208801611d27565b01949350505050565b600083516123a8818460208801611d27565b6123b4818401856122d8565b95945050505050565b6000828210156123cf576123cf6120cc565b500390565b600082198211156123e7576123e76120cc565b500190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600060ff821660ff84168060ff0382111561244f5761244f6120cc565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061248a90830184611d53565b9695505050505050565b6000602082840312156124a657600080fd5b8151611d2081611ced56fea26469706673582212206577c032bb10d0952c63796fad8b88e142ef0367dc89e346be9cb70d9954dc5864736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102135760003560e01c8063893d20e811610118578063b4b7eee0116100a0578063e797ec1b1161006f578063e797ec1b14610639578063e8a7bc571461064e578063e946b7ed1461066e578063e985e9c51461068e578063ff43221c146106d757600080fd5b8063b4b7eee0146105ac578063b88d4fde146105d9578063c87b56dd146105f9578063ce9174211461061957600080fd5b80639fd6db12116100e75780639fd6db1214610516578063a0712d6814610537578063a22cb4651461054a578063a6f9dae11461056a578063ae9843d61461058a57600080fd5b8063893d20e81461048b57806389476069146104a95780638da5cb5b146104c957806395d89b41146104e957600080fd5b806342842e0e1161019b57806355f804b31161016a57806355f804b3146104015780636352211e1461042157806370a08231146104415780637e5cd5c114610461578063831e60de1461047657600080fd5b806342842e0e1461038157806342966c68146103a15780634408a046146103c1578063484b973c146103e157600080fd5b806315b287fa116101e257806315b287fa146102fd57806318160ddd146103215780631e2639901461033657806323b872dd1461034c5780633ccfd60b1461036c57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc146102a3578063095ea7b3146102db57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004611d03565b6106f7565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5060408051808201909152601f81527f504f57277220555020457468657265756d205669727475616c204d696e65720060208201525b60405161024b9190611d7f565b3480156102af57600080fd5b506102c36102be366004611d92565b610749565b6040516001600160a01b03909116815260200161024b565b3480156102e757600080fd5b506102fb6102f6366004611dc7565b6107da565b005b34801561030957600080fd5b5061031360085481565b60405190815260200161024b565b34801561032d57600080fd5b50600254610313565b34801561034257600080fd5b5061031360035481565b34801561035857600080fd5b506102fb610367366004611df1565b6108c9565b34801561037857600080fd5b506102fb6108fb565b34801561038d57600080fd5b506102fb61039c366004611df1565b61097d565b3480156103ad57600080fd5b506102fb6103bc366004611d92565b610998565b3480156103cd57600080fd5b506102fb6103dc366004611e2d565b6109c6565b3480156103ed57600080fd5b506102fb6103fc366004611dc7565b6109fc565b34801561040d57600080fd5b506102fb61041c366004611e2d565b610a4f565b34801561042d57600080fd5b506102c361043c366004611d92565b610a85565b34801561044d57600080fd5b5061031361045c366004611e9f565b610aea565b34801561046d57600080fd5b506102fb610b5e565b34801561048257600080fd5b50610313610b97565b34801561049757600080fd5b506001546001600160a01b03166102c3565b3480156104b557600080fd5b506102fb6104c4366004611e9f565b610c4d565b3480156104d557600080fd5b506001546102c3906001600160a01b031681565b3480156104f557600080fd5b506040805180820190915260048152632827aba960e11b6020820152610296565b34801561052257600080fd5b50600c5461023f90600160a01b900460ff1681565b6102fb610545366004611d92565b610da1565b34801561055657600080fd5b506102fb610565366004611ec8565b611052565b34801561057657600080fd5b506102fb610585366004611e9f565b61105d565b34801561059657600080fd5b50604051630a85bd0160e11b815260200161024b565b3480156105b857600080fd5b506105cc6105c7366004611dc7565b6110e3565b60405161024b9190611eff565b3480156105e557600080fd5b506102fb6105f4366004611f59565b6111c2565b34801561060557600080fd5b50610296610614366004611d92565b6111fa565b34801561062557600080fd5b506102fb610634366004611d92565b6112af565b34801561064557600080fd5b506102fb6112de565b34801561065a57600080fd5b506009546102c3906001600160a01b031681565b34801561067a57600080fd5b506102fb610689366004611e9f565b61131d565b34801561069a57600080fd5b5061023f6106a9366004612035565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106e357600080fd5b50600c546102c3906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061072857506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b03166107be5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107e582610a85565b9050806001600160a01b0316836001600160a01b0316036108525760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b5565b336001600160a01b038216148061086e575061086e81336106a9565b6108ba5760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e657200000060448201526064016107b5565b6108c48383611369565b505050565b6108d4335b826113d7565b6108f05760405162461bcd60e51b81526004016107b590612068565b6108c48383836114b9565b6001546001600160a01b031633146109255760405162461bcd60e51b81526004016107b59061209f565b604051600090339047908381818185875af1925050503d8060008114610967576040519150601f19603f3d011682016040523d82523d6000602084013e61096c565b606091505b505090508061097a57600080fd5b50565b6108c4838383604051806020016040528060008152506111c2565b6109a1336108ce565b6109bd5760405162461bcd60e51b81526004016107b590612068565b61097a81611663565b6001546001600160a01b031633146109f05760405162461bcd60e51b81526004016107b59061209f565b6108c4600b8383611c54565b6001546001600160a01b03163314610a265760405162461bcd60e51b81526004016107b59061209f565b60005b818110156108c457610a3d83600354611774565b80610a47816120e2565b915050610a29565b6001546001600160a01b03163314610a795760405162461bcd60e51b81526004016107b59061209f565b6108c4600a8383611c54565b6000818152600460205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e000000000060448201526064016107b5565b60006001600160a01b038216610b425760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f206164647265737300000000000060448201526064016107b5565b506001600160a01b031660009081526005602052604090205490565b6001546001600160a01b03163314610b885760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b19169055565b600080600c60009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1191906120fb565b90506000610c236305f5e10083612114565b905080600854670de0b6b3a7640000610c3c9190612136565b610c469190612114565b9250505090565b6001546001600160a01b03163314610c775760405162461bcd60e51b81526004016107b59061209f565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107b5565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e91906120fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190612155565b5050565b600260005403610df35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b5565b6002600055600c54600160a01b900460ff16610e475760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c8139bdd08115b98589b1959606a1b60448201526064016107b5565b60008111610e875760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b60448201526064016107b5565b600c54604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd9160048083019260209291908290030181865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef591906120fb565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190612172565b610f7b90600a612279565b610f86600184612114565b610f909190612136565b905060008184600854610fa39190612136565b610fb590670de0b6b3a7640000612136565b610fbf9190612114565b90506064610fce826063612136565b610fd89190612114565b3410156110275760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420457468657265756d20416d6f756e7400000000000000000060448201526064016107b5565b60005b848110156110465761103e33600354611774565b60010161102a565b50506001600055505050565b610d9d338383611801565b6001546001600160a01b031633146110875760405162461bcd60e51b81526004016107b59061209f565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b606060006110f084610aea565b67ffffffffffffffff81111561110857611108611f43565b604051908082528060200260200182016040528015611131578160200160208202803683370190505b50905061113d84610aea565b60000361114b579050610743565b6000835b6002548110156111b8576000818152600460205260409020546001600160a01b038088169116036111a6578083838151811061118d5761118d612288565b6020908102919091010152816111a2816120e2565b9250505b806111b0816120e2565b91505061114f565b5090949350505050565b6111cc33836113d7565b6111e85760405162461bcd60e51b81526004016107b590612068565b6111f4848484846118cf565b50505050565b6000818152600460205260409020546060906001600160a01b03166112555760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016107b5565b6000600a61126284611902565b604051602001611273929190612371565b604051602081830303815290604052905080600b604051602001611298929190612396565b604051602081830303815290604052915050919050565b6001546001600160a01b031633146112d95760405162461bcd60e51b81526004016107b59061209f565b600855565b6001546001600160a01b031633146113085760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b1916600160a01b179055565b6001546001600160a01b031633146113475760405162461bcd60e51b81526004016107b59061209f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061139e82610a85565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b031661143b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064016107b5565b600061144683610a85565b9050806001600160a01b0316846001600160a01b031614806114815750836001600160a01b031661147684610749565b6001600160a01b0316145b806114b157506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114cc82610a85565b6001600160a01b0316146115145760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b60448201526064016107b5565b6001600160a01b0382166115595760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016107b5565b600061156484610aea565b116115a05760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016107b5565b6115ab600082611369565b6001600160a01b03831660009081526005602052604081208054600192906115d49084906123bd565b90915550506001600160a01b03821660009081526005602052604081208054600192906116029084906123d4565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600460205260409020546001600160a01b03166116be5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b60448201526064016107b5565b60006116c982610a85565b90506116d6600083611369565b6001600160a01b03811660009081526005602052604081208054600192906116ff9084906123bd565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906117339084906123bd565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61177e8282611a2e565b61179a6000838360405180602001604052806000815250611b13565b610d9d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107b5565b816001600160a01b0316836001600160a01b0316036118625760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b5565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118da8484846114b9565b6118e684848484611b13565b6111f45760405162461bcd60e51b81526004016107b5906123ec565b6060816000036119295750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611953578061193d816120e2565b915061194c9050600a83612114565b915061192d565b60008167ffffffffffffffff81111561196e5761196e611f43565b6040519080825280601f01601f191660200182016040528015611998576020820181803683370190505b509050815b8515611a25576119ae6001826123bd565b905060006119bd600a88612114565b6119c890600a612136565b6119d290886123bd565b6119dd906030612432565b905060008160f81b9050808484815181106119fa576119fa612288565b60200101906001600160f81b031916908160001a905350611a1c600a89612114565b9750505061199d565b50949350505050565b6000818152600460205260409020546001600160a01b031615611a935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b5565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526005909252808320805460019081019091556002805482019055600380549091019055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611b27846001600160a01b0316611c1b565b15611c1057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b5e903390899088908890600401612457565b6020604051808303816000875af1925050508015611b99575060408051601f3d908101601f19168201909252611b9691810190612494565b60015b611bf6573d808015611bc7576040519150601f19603f3d011682016040523d82523d6000602084013e611bcc565b606091505b508051600003611bee5760405162461bcd60e51b81526004016107b5906123ec565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114b1565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906114b1575050151592915050565b828054611c609061229e565b90600052602060002090601f016020900481019282611c825760008555611cc8565b82601f10611c9b5782800160ff19823516178555611cc8565b82800160010185558215611cc8579182015b82811115611cc8578235825591602001919060010190611cad565b50611cd4929150611cd8565b5090565b5b80821115611cd45760008155600101611cd9565b6001600160e01b03198116811461097a57600080fd5b600060208284031215611d1557600080fd5b8135611d2081611ced565b9392505050565b60005b83811015611d42578181015183820152602001611d2a565b838111156111f45750506000910152565b60008151808452611d6b816020860160208601611d27565b601f01601f19169290920160200192915050565b602081526000611d206020830184611d53565b600060208284031215611da457600080fd5b5035919050565b80356001600160a01b0381168114611dc257600080fd5b919050565b60008060408385031215611dda57600080fd5b611de383611dab565b946020939093013593505050565b600080600060608486031215611e0657600080fd5b611e0f84611dab565b9250611e1d60208501611dab565b9150604084013590509250925092565b60008060208385031215611e4057600080fd5b823567ffffffffffffffff80821115611e5857600080fd5b818501915085601f830112611e6c57600080fd5b813581811115611e7b57600080fd5b866020828501011115611e8d57600080fd5b60209290920196919550909350505050565b600060208284031215611eb157600080fd5b611d2082611dab565b801515811461097a57600080fd5b60008060408385031215611edb57600080fd5b611ee483611dab565b91506020830135611ef481611eba565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611f3757835183529284019291840191600101611f1b565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611f6f57600080fd5b611f7885611dab565b9350611f8660208601611dab565b925060408501359150606085013567ffffffffffffffff80821115611faa57600080fd5b818701915087601f830112611fbe57600080fd5b813581811115611fd057611fd0611f43565b604051601f8201601f19908116603f01168101908382118183101715611ff857611ff8611f43565b816040528281528a602084870101111561201157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561204857600080fd5b61205183611dab565b915061205f60208401611dab565b90509250929050565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016120f4576120f46120cc565b5060010190565b60006020828403121561210d57600080fd5b5051919050565b60008261213157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612150576121506120cc565b500290565b60006020828403121561216757600080fd5b8151611d2081611eba565b60006020828403121561218457600080fd5b815160ff81168114611d2057600080fd5b600181815b808511156121d05781600019048211156121b6576121b66120cc565b808516156121c357918102915b93841c939080029061219a565b509250929050565b6000826121e757506001610743565b816121f457506000610743565b816001811461220a576002811461221457612230565b6001915050610743565b60ff841115612225576122256120cc565b50506001821b610743565b5060208310610133831016604e8410600b8410161715612253575081810a610743565b61225d8383612195565b8060001904821115612271576122716120cc565b029392505050565b6000611d2060ff8416836121d8565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806122b257607f821691505b6020821081036122d257634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c90808316806122f257607f831692505b6020808410820361231357634e487b7160e01b600052602260045260246000fd5b818015612327576001811461233857612365565b60ff19861689528489019650612365565b60008881526020902060005b8681101561235d5781548b820152908501908301612344565b505084890196505b50505050505092915050565b600061237d82856122d8565b835161238d818360208801611d27565b01949350505050565b600083516123a8818460208801611d27565b6123b4818401856122d8565b95945050505050565b6000828210156123cf576123cf6120cc565b500390565b600082198211156123e7576123e76120cc565b500190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600060ff821660ff84168060ff0382111561244f5761244f6120cc565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061248a90830184611d53565b9695505050505050565b6000602082840312156124a657600080fd5b8151611d2081611ced56fea26469706673582212206577c032bb10d0952c63796fad8b88e142ef0367dc89e346be9cb70d9954dc5864736f6c634300080e0033

Deployed Bytecode Sourcemap

17552:17053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24160:297;;;;;;;;;;-1:-1:-1;24160:297:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24160:297:0;;;;;;;;25063:92;;;;;;;;;;-1:-1:-1;25142:5:0;;;;;;;;;;;;;;;;;25063:92;;;;;;;:::i;26361:204::-;;;;;;;;;;-1:-1:-1;26361:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;26361:204:0;1528:203:1;21571:377:0;;;;;;;;;;-1:-1:-1;21571:377:0;;;;;:::i;:::-;;:::i;:::-;;18424:29;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;18424:29:0;2173:177:1;23285:93:0;;;;;;;;;;-1:-1:-1;23358:12:0;;23285:93;;17916:33;;;;;;;;;;;;;;;;22236:256;;;;;;;;;;-1:-1:-1;22236:256:0;;;;;:::i;:::-;;:::i;19348:149::-;;;;;;;;;;;;;:::i;22563:177::-;;;;;;;;;;-1:-1:-1;22563:177:0;;;;;:::i;:::-;;:::i;21305:167::-;;;;;;;;;;-1:-1:-1;21305:167:0;;;;;:::i;:::-;;:::i;19928:114::-;;;;;;;;;;-1:-1:-1;19928:114:0;;;;;:::i;:::-;;:::i;20050:194::-;;;;;;;;;;-1:-1:-1;20050:194:0;;;;;:::i;:::-;;:::i;19822:98::-;;;;;;;;;;-1:-1:-1;19822:98:0;;;;;:::i;:::-;;:::i;24773:223::-;;;;;;;;;;-1:-1:-1;24773:223:0;;;;;:::i;:::-;;:::i;24521:190::-;;;;;;;;;;-1:-1:-1;24521:190:0;;;;;:::i;:::-;;:::i;19132:86::-;;;;;;;;;;;;;:::i;23386:243::-;;;;;;;;;;;;;:::i;16867:83::-;;;;;;;;;;-1:-1:-1;16937:5:0;;-1:-1:-1;;;;;16937:5:0;16867:83;;19505:209;;;;;;;;;;-1:-1:-1;19505:209:0;;;;;:::i;:::-;;:::i;15571:20::-;;;;;;;;;;-1:-1:-1;15571:20:0;;;;-1:-1:-1;;;;;15571:20:0;;;25224:96;;;;;;;;;;-1:-1:-1;25305:7:0;;;;;;;;;;;;-1:-1:-1;;;25305:7:0;;;;25224:96;;18707:34;;;;;;;;;;-1:-1:-1;18707:34:0;;;;-1:-1:-1;;;18707:34:0;;;;;;20482:815;;;;;;:::i;:::-;;:::i;22020:149::-;;;;;;;;;;-1:-1:-1;22020:149:0;;;;;:::i;:::-;;:::i;16641:132::-;;;;;;;;;;-1:-1:-1;16641:132:0;;;;;:::i;:::-;;:::i;33126:124::-;;;;;;;;;;-1:-1:-1;33126:124:0;;-1:-1:-1;;;4063:52:1;;4051:2;4036:18;33126:124:0;3919:202:1;23637:451:0;;;;;;;;;;-1:-1:-1;23637:451:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22811:300::-;;;;;;;;;;-1:-1:-1;22811:300:0;;;;;:::i;:::-;;:::i;25391:267::-;;;;;;;;;;-1:-1:-1;25391:267:0;;;;;:::i;:::-;;:::i;19722:92::-;;;;;;;;;;-1:-1:-1;19722:92:0;;;;;:::i;:::-;;:::i;19040:84::-;;;;;;;;;;;;;:::i;18489:28::-;;;;;;;;;;-1:-1:-1;18489:28:0;;;;-1:-1:-1;;;;;18489:28:0;;;19226:114;;;;;;;;;;-1:-1:-1;19226:114:0;;;;;:::i;:::-;;:::i;26636:162::-;;;;;;;;;;-1:-1:-1;26636:162:0;;;;;:::i;:::-;-1:-1:-1;;;;;26752:27:0;;;26728:4;26752:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;;;26636:162;18638:37;;;;;;;;;;-1:-1:-1;18638:37:0;;;;-1:-1:-1;;;;;18638:37:0;;;24160:297;24254:4;-1:-1:-1;;;;;;24291:40:0;;-1:-1:-1;;;24291:40:0;;:105;;-1:-1:-1;;;;;;;24348:48:0;;-1:-1:-1;;;24348:48:0;24291:105;:158;;;-1:-1:-1;;;;;;;;;;4478:40:0;;;24413:36;24271:178;24160:297;-1:-1:-1;;24160:297:0:o;26361:204::-;26429:7;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;26449:64;;;;-1:-1:-1;;;26449:64:0;;6732:2:1;26449:64:0;;;6714:21:1;6771:2;6751:18;;;6744:30;6810:34;6790:18;;;6783:62;-1:-1:-1;;;6861:18:1;;;6854:33;6904:19;;26449:64:0;;;;;;;;;-1:-1:-1;26533:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26533:24:0;;26361:204::o;21571:377::-;21644:15;21662:16;21670:7;21662;:16::i;:::-;21644:34;;21703:7;-1:-1:-1;;;;;21697:13:0;:2;-1:-1:-1;;;;;21697:13:0;;21689:59;;;;-1:-1:-1;;;21689:59:0;;7136:2:1;21689:59:0;;;7118:21:1;7175:2;7155:18;;;7148:30;7214:34;7194:18;;;7187:62;-1:-1:-1;;;7265:18:1;;;7258:31;7306:19;;21689:59:0;6934:397:1;21689:59:0;12582:10;-1:-1:-1;;;;;21783:23:0;;;;:66;;-1:-1:-1;21810:39:0;21827:7;12582:10;26636:162;:::i;21810:39::-;21761:145;;;;-1:-1:-1;;;21761:145:0;;7538:2:1;21761:145:0;;;7520:21:1;7577:2;7557:18;;;7550:30;7616:31;7596:18;;;7589:59;7665:18;;21761:145:0;7336:353:1;21761:145:0;21919:21;21928:2;21932:7;21919:8;:21::i;:::-;21633:315;21571:377;;:::o;22236:256::-;22370:41;12582:10;22389:12;22403:7;22370:18;:41::i;:::-;22362:83;;;;-1:-1:-1;;;22362:83:0;;;;;;;:::i;:::-;22456:28;22466:4;22472:2;22476:7;22456:9;:28::i;19348:149::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19410:58:::1;::::0;19399:6:::1;::::0;19418:10:::1;::::0;19442:21:::1;::::0;19399:6;19410:58;19399:6;19410:58;19442:21;19418:10;19410:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19398:70;;;19487:1;19479:10;;;::::0;::::1;;19387:110;19348:149::o:0;22563:177::-;22693:39;22710:4;22716:2;22720:7;22693:39;;;;;;;;;;;;:16;:39::i;21305:167::-;21364:41;12582:10;21383:12;12502:98;21364:41;21356:83;;;;-1:-1:-1;;;21356:83:0;;;;;;;:::i;:::-;21450:14;21456:7;21450:5;:14::i;19928:114::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;20013:21:::1;:6;20022:12:::0;;20013:21:::1;:::i;20050:194::-:0;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;20151:6:::1;20146:91;20167:3;20163:1;:7;20146:91;;;20192:33;20202:2;20206:18;;20192:9;:33::i;:::-;20172:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20146:91;;19822:98:::0;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19896:16:::1;:7;19906:6:::0;;19896:16:::1;:::i;24773:223::-:0;24837:7;24875:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24875:16:0;;24902:61;;;;-1:-1:-1;;;24902:61:0;;9084:2:1;24902:61:0;;;9066:21:1;9123:2;9103:18;;;9096:30;9162:29;9142:18;;;9135:57;9209:18;;24902:61:0;8882:351:1;24521:190:0;24587:7;-1:-1:-1;;;;;24615:21:0;;24607:60;;;;-1:-1:-1;;;24607:60:0;;9440:2:1;24607:60:0;;;9422:21:1;9479:2;9459:18;;;9452:30;9518:28;9498:18;;;9491:56;9564:18;;24607:60:0;9238:350:1;24607:60:0;-1:-1:-1;;;;;;24685:18:0;;;;;:9;:18;;;;;;;24521:190::o;19132:86::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19188:14:::1;:22:::0;;-1:-1:-1;;;;19188:22:0::1;::::0;;19132:86::o;23386:243::-;23435:7;23455:19;23477:18;;;;;;;;;-1:-1:-1;;;;;23477:18:0;-1:-1:-1;;;;;23477:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23455:55;-1:-1:-1;23521:22:0;23546:24;23567:3;23455:55;23546:24;:::i;:::-;23521:49;;23607:14;23589:7;;23599:4;23589:14;;;;:::i;:::-;23588:33;;;;:::i;:::-;23581:40;;;;23386:243;:::o;19505:209::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19582:20:0;::::1;19574:45;;;::::0;-1:-1:-1;;;19574:45:0;;10378:2:1;19574:45:0::1;::::0;::::1;10360:21:1::0;10417:2;10397:18;;;10390:30;-1:-1:-1;;;10436:18:1;;;10429:42;10488:18;;19574:45:0::1;10176:336:1::0;19574:45:0::1;19666:39;::::0;-1:-1:-1;;;19666:39:0;;19699:4:::1;19666:39;::::0;::::1;1674:51:1::0;-1:-1:-1;;;;;19630:23:0;::::1;::::0;::::1;::::0;19654:10:::1;::::0;19630:23;;19666:24:::1;::::0;1647:18:1;;19666:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19630:76;::::0;-1:-1:-1;;;;;;19630:76:0::1;::::0;;;;;;-1:-1:-1;;;;;10898:32:1;;;19630:76:0::1;::::0;::::1;10880:51:1::0;10947:18;;;10940:34;10853:18;;19630:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19505:209:::0;:::o;20482:815::-;1913:1;2511:7;;:19;2503:63;;;;-1:-1:-1;;;2503:63:0;;11437:2:1;2503:63:0;;;11419:21:1;11476:2;11456:18;;;11449:30;11515:33;11495:18;;;11488:61;11566:18;;2503:63:0;11235:355:1;2503:63:0;1913:1;2644:7;:18;20582:14:::1;::::0;-1:-1:-1;;;20582:14:0;::::1;;;20560:83;;;::::0;-1:-1:-1;;;20560:83:0;;11797:2:1;20560:83:0::1;::::0;::::1;11779:21:1::0;11836:2;11816:18;;;11809:30;-1:-1:-1;;;11855:18:1;;;11848:49;11914:18;;20560:83:0::1;11595:343:1::0;20560:83:0::1;20692:1;20676:13;:17;20654:81;;;::::0;-1:-1:-1;;;20654:81:0;;12145:2:1;20654:81:0::1;::::0;::::1;12127:21:1::0;12184:2;12164:18;;;12157:30;-1:-1:-1;;;12203:18:1;;;12196:43;12256:18;;20654:81:0::1;11943:337:1::0;20654:81:0::1;20797:18;::::0;:33:::1;::::0;;-1:-1:-1;;;20797:33:0;;;;20775:19:::1;::::0;-1:-1:-1;;;;;20797:18:0::1;::::0;:31:::1;::::0;:33:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:18;:33:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20775:55;;20841:22;20898:18;;;;;;;;;-1:-1:-1::0;;;;;20898:18:0::1;-1:-1:-1::0;;;;;20898:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20892:35;::::0;:2:::1;:35;:::i;:::-;20866:22;20887:1;20871:12:::0;20866:22:::1;:::i;:::-;:62;;;;:::i;:::-;20841:87;;20939:9;20988:14;20963:13;20953:7;;:23;;;;:::i;:::-;20952:32;::::0;20980:4:::1;20952:32;:::i;:::-;20951:51;;;;:::i;:::-;20939:63:::0;-1:-1:-1;21062:3:0::1;21050:9;20939:63:::0;21057:2:::1;21050:9;:::i;:::-;:15;;;;:::i;:::-;21037:9;:28;;21015:101;;;::::0;-1:-1:-1;;;21015:101:0;;14148:2:1;21015:101:0::1;::::0;::::1;14130:21:1::0;14187:2;14167:18;;;14160:30;14226:25;14206:18;;;14199:53;14269:18;;21015:101:0::1;13946:347:1::0;21015:101:0::1;21158:6;21153:137;21174:13;21170:1;:17;21153:137;;;21205:41;21215:10;21227:18;;21205:9;:41::i;:::-;21273:3;;21153:137;;;-1:-1:-1::0;;1869:1:0;2823:7;:22;-1:-1:-1;;;20482:815:0:o;22020:149::-;22108:53;12582:10;22141:9;22152:8;22108:18;:53::i;16641:132::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;16722:5:::1;::::0;16713:25:::1;::::0;-1:-1:-1;;;;;16713:25:0;;::::1;::::0;16722:5:::1;::::0;16713:25:::1;::::0;16722:5:::1;::::0;16713:25:::1;16749:5;:16:::0;;-1:-1:-1;;;;;;16749:16:0::1;-1:-1:-1::0;;;;;16749:16:0;;;::::1;::::0;;;::::1;::::0;;16641:132::o;23637:451::-;23715:16;23744:20;23781:16;23791:5;23781:9;:16::i;:::-;23767:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23767:31:0;;23744:54;;23813:16;23823:5;23813:9;:16::i;:::-;23833:1;23813:21;23809:37;;23843:3;-1:-1:-1;23836:10:0;;23809:37;23857:13;23899:10;23885:175;23915:12;;23911:1;:16;23885:175;;;23953:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;23953:19:0;;;:10;;:19;23949:100;;24006:1;23993:3;23997:5;23993:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;24026:7;;;;:::i;:::-;;;;23949:100;23929:3;;;;:::i;:::-;;;;23885:175;;;-1:-1:-1;24077:3:0;;23637:451;-1:-1:-1;;;;23637:451:0:o;22811:300::-;22978:41;12582:10;23011:7;22978:18;:41::i;:::-;22970:83;;;;-1:-1:-1;;;22970:83:0;;;;;;;:::i;:::-;23064:39;23078:4;23084:2;23088:7;23097:5;23064:13;:39::i;:::-;22811:300;;;;:::o;25391:267::-;27099:4;27123:16;;;:7;:16;;;;;;25456:13;;-1:-1:-1;;;;;27123:16:0;25482:46;;;;-1:-1:-1;;;25482:46:0;;14632:2:1;25482:46:0;;;14614:21:1;14671:2;14651:18;;;14644:30;-1:-1:-1;;;14690:18:1;;;14683:47;14747:18;;25482:46:0;14430:341:1;25482:46:0;25541:19;25577:7;25586:17;25595:7;25586:8;:17::i;:::-;25563:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25541:63;;25636:5;25643:6;25622:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25615:35;;;25391:267;;;:::o;19722:92::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19789:7:::1;:17:::0;19722:92::o;19040:84::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19095:14:::1;:21:::0;;-1:-1:-1;;;;19095:21:0::1;-1:-1:-1::0;;;19095:21:0::1;::::0;;19040:84::o;19226:114::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19304:13:::1;:28:::0;;-1:-1:-1;;;;;;19304:28:0::1;-1:-1:-1::0;;;;;19304:28:0;;;::::1;::::0;;;::::1;::::0;;19226:114::o;32498:159::-;32565:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32565:29:0;-1:-1:-1;;;;;32565:29:0;;;;;;;;:24;;32619:16;32565:24;32619:7;:16::i;:::-;-1:-1:-1;;;;;32610:39:0;;;;;;;;;;;32498:159;;:::o;27328:320::-;27413:4;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;27430:54;;;;-1:-1:-1;;;27430:54:0;;17209:2:1;27430:54:0;;;17191:21:1;17248:2;17228:18;;;17221:30;17287:27;17267:18;;;17260:55;17332:18;;27430:54:0;17007:349:1;27430:54:0;27495:15;27513:16;27521:7;27513;:16::i;:::-;27495:34;;27559:7;-1:-1:-1;;;;;27548:18:0;:7;-1:-1:-1;;;;;27548:18:0;;:53;;;;27594:7;-1:-1:-1;;;;;27570:31:0;:20;27582:7;27570:11;:20::i;:::-;-1:-1:-1;;;;;27570:31:0;;27548:53;:91;;;-1:-1:-1;;;;;;26752:27:0;;;26728:4;26752:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;27605:34;27540:100;27328:320;-1:-1:-1;;;;27328:320:0:o;31808:572::-;31952:4;-1:-1:-1;;;;;31932:24:0;:16;31940:7;31932;:16::i;:::-;-1:-1:-1;;;;;31932:24:0;;31924:52;;;;-1:-1:-1;;;31924:52:0;;17563:2:1;31924:52:0;;;17545:21:1;17602:2;17582:18;;;17575:30;-1:-1:-1;;;17621:18:1;;;17614:45;17676:18;;31924:52:0;17361:339:1;31924:52:0;-1:-1:-1;;;;;31995:16:0;;31987:41;;;;-1:-1:-1;;;31987:41:0;;17907:2:1;31987:41:0;;;17889:21:1;17946:2;17926:18;;;17919:30;-1:-1:-1;;;17965:18:1;;;17958:42;18017:18;;31987:41:0;17705:336:1;31987:41:0;32065:1;32047:15;32057:4;32047:9;:15::i;:::-;:19;32039:44;;;;-1:-1:-1;;;32039:44:0;;18248:2:1;32039:44:0;;;18230:21:1;18287:2;18267:18;;;18260:30;-1:-1:-1;;;18306:18:1;;;18299:42;18358:18;;32039:44:0;18046:336:1;32039:44:0;32148:29;32165:1;32169:7;32148:8;:29::i;:::-;-1:-1:-1;;;;;32220:15:0;;;;;;:9;:15;;;;;:20;;32239:1;;32220:15;:20;;32239:1;;32220:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32251:13:0;;;;;;:9;:13;;;;;:18;;32268:1;;32251:13;:18;;32268:1;;32251:18;:::i;:::-;;;;-1:-1:-1;;32280:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32280:21:0;-1:-1:-1;;;;;32280:21:0;;;;;;;;;32345:27;;32280:16;;32345:27;;;;;;;31808:572;;;:::o;30977:494::-;27099:4;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;31029:49;;;;-1:-1:-1;;;31029:49:0;;18852:2:1;31029:49:0;;;18834:21:1;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:50;18970:18;;31029:49:0;18650:344:1;31029:49:0;31118:13;31134:16;31142:7;31134;:16::i;:::-;31118:32;;31191:29;31208:1;31212:7;31191:8;:29::i;:::-;-1:-1:-1;;;;;31263:16:0;;;;;;:9;:16;;;;;:21;;31283:1;;31263:16;:21;;31283:1;;31263:21;:::i;:::-;;;;-1:-1:-1;;31302:16:0;;;;:7;:16;;;;;31295:23;;-1:-1:-1;;;;;;31295:23:0;;;31366:12;:17;;31295:23;;31302:16;31366:17;;31295:23;;31366:17;:::i;:::-;;;;-1:-1:-1;;31427:36:0;;31455:7;;31451:1;;-1:-1:-1;;;;;31427:36:0;;;;;31451:1;;31427:36;31018:453;30977:494;:::o;28608:281::-;28701:18;28707:2;28711:7;28701:5;:18::i;:::-;28752:51;28783:1;28787:2;28791:7;28752:51;;;;;;;;;;;;:22;:51::i;:::-;28730:151;;;;-1:-1:-1;;;28730:151:0;;19201:2:1;28730:151:0;;;19183:21:1;19240:2;19220:18;;;19213:30;19279:34;19259:18;;;19252:62;-1:-1:-1;;;19330:18:1;;;19323:48;19388:19;;28730:151:0;18999:414:1;32799:319:0;32951:9;-1:-1:-1;;;;;32940:20:0;:7;-1:-1:-1;;;;;32940:20:0;;32932:58;;;;-1:-1:-1;;;32932:58:0;;19620:2:1;32932:58:0;;;19602:21:1;19659:2;19639:18;;;19632:30;19698:27;19678:18;;;19671:55;19743:18;;32932:58:0;19418:349:1;32932:58:0;-1:-1:-1;;;;;33001:27:0;;;;;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;:49;;-1:-1:-1;;33001:49:0;;;;;;;;;;33066:44;;540:41:1;;;33066:44:0;;513:18:1;33066:44:0;;;;;;;32799:319;;;:::o;30453:295::-;30602:28;30612:4;30618:2;30622:7;30602:9;:28::i;:::-;30649:48;30672:4;30678:2;30682:7;30691:5;30649:22;:48::i;:::-;30641:99;;;;-1:-1:-1;;;30641:99:0;;;;;;;:::i;25722:573::-;25772:27;25816:2;25822:1;25816:7;25812:50;;-1:-1:-1;;25840:10:0;;;;;;;;;;;;-1:-1:-1;;;25840:10:0;;;;;25722:573::o;25812:50::-;25881:2;25872:6;25913:69;25920:6;;25913:69;;25943:5;;;;:::i;:::-;;-1:-1:-1;25963:7:0;;-1:-1:-1;25968:2:0;25963:7;;:::i;:::-;;;25913:69;;;25992:17;26022:3;26012:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26012:14:0;-1:-1:-1;25992:34:0;-1:-1:-1;26046:3:0;26060:198;26067:7;;26060:198;;26095:3;26097:1;26095;:3;:::i;:::-;26091:7;-1:-1:-1;26113:10:0;26143:7;26148:2;26143;:7;:::i;:::-;:12;;26153:2;26143:12;:::i;:::-;26138:17;;:2;:17;:::i;:::-;26127:29;;:2;:29;:::i;:::-;26113:44;;26172:9;26191:4;26184:12;;26172:24;;26221:2;26211:4;26216:1;26211:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;26211:12:0;;;;;;;;-1:-1:-1;26238:8:0;26244:2;26238:8;;:::i;:::-;;;26076:182;;26060:198;;;-1:-1:-1;26282:4:0;25722:573;-1:-1:-1;;;;25722:573:0:o;29225:344::-;27099:4;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;:30;29289:58;;;;-1:-1:-1;;;29289:58:0;;20590:2:1;29289:58:0;;;20572:21:1;20629:2;20609:18;;;20602:30;20668;20648:18;;;20641:58;20716:18;;29289:58:0;20388:352:1;29289:58:0;29360:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;29360:21:0;-1:-1:-1;;;;;29360:21:0;;;;;;;;29417:13;;;:9;:13;;;;;;:18;;-1:-1:-1;29417:18:0;;;;;;29450:12;:14;;;;;;29479:18;:20;;;;;;;29528:33;29360:16;;;29528:33;;29360:16;;29528:33;29225:344;;:::o;33815:787::-;33970:4;33991:15;:2;-1:-1:-1;;;;;33991:13:0;;:15::i;:::-;33987:608;;;34027:72;;-1:-1:-1;;;34027:72:0;;-1:-1:-1;;;;;34027:36:0;;;;;:72;;12582:10;;34078:4;;34084:7;;34093:5;;34027:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34027:72:0;;;;;;;;-1:-1:-1;;34027:72:0;;;;;;;;;;;;:::i;:::-;;;34023:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34269:6;:13;34286:1;34269:18;34265:260;;34312:48;;-1:-1:-1;;;34312:48:0;;;;;;;:::i;34265:260::-;34475:6;34469:13;34460:6;34456:2;34452:15;34445:38;34023:517;-1:-1:-1;;;;;;34150:51:0;-1:-1:-1;;;34150:51:0;;-1:-1:-1;34143:58:0;;33987:608;-1:-1:-1;34579:4:0;33815:787;;;;;;:::o;11336:619::-;11396:4;11864:20;;11707:66;11904:23;;;;;;:42;;-1:-1:-1;;11931:15:0;;;11896:51;-1:-1:-1;;11336:619:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:592::-;2759:6;2767;2820:2;2808:9;2799:7;2795:23;2791:32;2788:52;;;2836:1;2833;2826:12;2788:52;2876:9;2863:23;2905:18;2946:2;2938:6;2935:14;2932:34;;;2962:1;2959;2952:12;2932:34;3000:6;2989:9;2985:22;2975:32;;3045:7;3038:4;3034:2;3030:13;3026:27;3016:55;;3067:1;3064;3057:12;3016:55;3107:2;3094:16;3133:2;3125:6;3122:14;3119:34;;;3149:1;3146;3139:12;3119:34;3194:7;3189:2;3180:6;3176:2;3172:15;3168:24;3165:37;3162:57;;;3215:1;3212;3205:12;3162:57;3246:2;3238:11;;;;;3268:6;;-1:-1:-1;2688:592:1;;-1:-1:-1;;;;2688:592:1:o;3285:186::-;3344:6;3397:2;3385:9;3376:7;3372:23;3368:32;3365:52;;;3413:1;3410;3403:12;3365:52;3436:29;3455:9;3436:29;:::i;3476:118::-;3562:5;3555:13;3548:21;3541:5;3538:32;3528:60;;3584:1;3581;3574:12;3599:315;3664:6;3672;3725:2;3713:9;3704:7;3700:23;3696:32;3693:52;;;3741:1;3738;3731:12;3693:52;3764:29;3783:9;3764:29;:::i;:::-;3754:39;;3843:2;3832:9;3828:18;3815:32;3856:28;3878:5;3856:28;:::i;:::-;3903:5;3893:15;;;3599:315;;;;;:::o;4126:632::-;4297:2;4349:21;;;4419:13;;4322:18;;;4441:22;;;4268:4;;4297:2;4520:15;;;;4494:2;4479:18;;;4268:4;4563:169;4577:6;4574:1;4571:13;4563:169;;;4638:13;;4626:26;;4707:15;;;;4672:12;;;;4599:1;4592:9;4563:169;;;-1:-1:-1;4749:3:1;;4126:632;-1:-1:-1;;;;;;4126:632:1:o;4763:127::-;4824:10;4819:3;4815:20;4812:1;4805:31;4855:4;4852:1;4845:15;4879:4;4876:1;4869:15;4895:1138;4990:6;4998;5006;5014;5067:3;5055:9;5046:7;5042:23;5038:33;5035:53;;;5084:1;5081;5074:12;5035:53;5107:29;5126:9;5107:29;:::i;:::-;5097:39;;5155:38;5189:2;5178:9;5174:18;5155:38;:::i;:::-;5145:48;;5240:2;5229:9;5225:18;5212:32;5202:42;;5295:2;5284:9;5280:18;5267:32;5318:18;5359:2;5351:6;5348:14;5345:34;;;5375:1;5372;5365:12;5345:34;5413:6;5402:9;5398:22;5388:32;;5458:7;5451:4;5447:2;5443:13;5439:27;5429:55;;5480:1;5477;5470:12;5429:55;5516:2;5503:16;5538:2;5534;5531:10;5528:36;;;5544:18;;:::i;:::-;5619:2;5613:9;5587:2;5673:13;;-1:-1:-1;;5669:22:1;;;5693:2;5665:31;5661:40;5649:53;;;5717:18;;;5737:22;;;5714:46;5711:72;;;5763:18;;:::i;:::-;5803:10;5799:2;5792:22;5838:2;5830:6;5823:18;5878:7;5873:2;5868;5864;5860:11;5856:20;5853:33;5850:53;;;5899:1;5896;5889:12;5850:53;5955:2;5950;5946;5942:11;5937:2;5929:6;5925:15;5912:46;6000:1;5995:2;5990;5982:6;5978:15;5974:24;5967:35;6021:6;6011:16;;;;;;;4895:1138;;;;;;;:::o;6038:260::-;6106:6;6114;6167:2;6155:9;6146:7;6142:23;6138:32;6135:52;;;6183:1;6180;6173:12;6135:52;6206:29;6225:9;6206:29;:::i;:::-;6196:39;;6254:38;6288:2;6277:9;6273:18;6254:38;:::i;:::-;6244:48;;6038:260;;;;;:::o;7694:353::-;7896:2;7878:21;;;7935:2;7915:18;;;7908:30;7974:31;7969:2;7954:18;;7947:59;8038:2;8023:18;;7694:353::o;8052:343::-;8254:2;8236:21;;;8293:2;8273:18;;;8266:30;-1:-1:-1;;;8327:2:1;8312:18;;8305:49;8386:2;8371:18;;8052:343::o;8610:127::-;8671:10;8666:3;8662:20;8659:1;8652:31;8702:4;8699:1;8692:15;8726:4;8723:1;8716:15;8742:135;8781:3;8802:17;;;8799:43;;8822:18;;:::i;:::-;-1:-1:-1;8869:1:1;8858:13;;8742:135::o;9593:183::-;9662:6;9715:2;9703:9;9694:7;9690:23;9686:32;9683:52;;;9731:1;9728;9721:12;9683:52;-1:-1:-1;9754:16:1;;9593:183;-1:-1:-1;9593:183:1:o;9781:217::-;9821:1;9847;9837:132;;9891:10;9886:3;9882:20;9879:1;9872:31;9926:4;9923:1;9916:15;9954:4;9951:1;9944:15;9837:132;-1:-1:-1;9983:9:1;;9781:217::o;10003:168::-;10043:7;10109:1;10105;10101:6;10097:14;10094:1;10091:21;10086:1;10079:9;10072:17;10068:45;10065:71;;;10116:18;;:::i;:::-;-1:-1:-1;10156:9:1;;10003:168::o;10985:245::-;11052:6;11105:2;11093:9;11084:7;11080:23;11076:32;11073:52;;;11121:1;11118;11111:12;11073:52;11153:9;11147:16;11172:28;11194:5;11172:28;:::i;12285:273::-;12353:6;12406:2;12394:9;12385:7;12381:23;12377:32;12374:52;;;12422:1;12419;12412:12;12374:52;12454:9;12448:16;12504:4;12497:5;12493:16;12486:5;12483:27;12473:55;;12524:1;12521;12514:12;12563:422;12652:1;12695:5;12652:1;12709:270;12730:7;12720:8;12717:21;12709:270;;;12789:4;12785:1;12781:6;12777:17;12771:4;12768:27;12765:53;;;12798:18;;:::i;:::-;12848:7;12838:8;12834:22;12831:55;;;12868:16;;;;12831:55;12947:22;;;;12907:15;;;;12709:270;;;12713:3;12563:422;;;;;:::o;12990:806::-;13039:5;13069:8;13059:80;;-1:-1:-1;13110:1:1;13124:5;;13059:80;13158:4;13148:76;;-1:-1:-1;13195:1:1;13209:5;;13148:76;13240:4;13258:1;13253:59;;;;13326:1;13321:130;;;;13233:218;;13253:59;13283:1;13274:10;;13297:5;;;13321:130;13358:3;13348:8;13345:17;13342:43;;;13365:18;;:::i;:::-;-1:-1:-1;;13421:1:1;13407:16;;13436:5;;13233:218;;13535:2;13525:8;13522:16;13516:3;13510:4;13507:13;13503:36;13497:2;13487:8;13484:16;13479:2;13473:4;13470:12;13466:35;13463:77;13460:159;;;-1:-1:-1;13572:19:1;;;13604:5;;13460:159;13651:34;13676:8;13670:4;13651:34;:::i;:::-;13721:6;13717:1;13713:6;13709:19;13700:7;13697:32;13694:58;;;13732:18;;:::i;:::-;13770:20;;12990:806;-1:-1:-1;;;12990:806:1:o;13801:140::-;13859:5;13888:47;13929:4;13919:8;13915:19;13909:4;13888:47;:::i;14298:127::-;14359:10;14354:3;14350:20;14347:1;14340:31;14390:4;14387:1;14380:15;14414:4;14411:1;14404:15;14776:380;14855:1;14851:12;;;;14898;;;14919:61;;14973:4;14965:6;14961:17;14951:27;;14919:61;15026:2;15018:6;15015:14;14995:18;14992:38;14989:161;;15072:10;15067:3;15063:20;15060:1;15053:31;15107:4;15104:1;15097:15;15135:4;15132:1;15125:15;14989:161;;14776:380;;;:::o;15287:973::-;15372:12;;15337:3;;15427:1;15447:18;;;;15500;;;;15527:61;;15581:4;15573:6;15569:17;15559:27;;15527:61;15607:2;15655;15647:6;15644:14;15624:18;15621:38;15618:161;;15701:10;15696:3;15692:20;15689:1;15682:31;15736:4;15733:1;15726:15;15764:4;15761:1;15754:15;15618:161;15795:18;15822:104;;;;15940:1;15935:319;;;;15788:466;;15822:104;-1:-1:-1;;15855:24:1;;15843:37;;15900:16;;;;-1:-1:-1;15822:104:1;;15935:319;15234:1;15227:14;;;15271:4;15258:18;;16029:1;16043:165;16057:6;16054:1;16051:13;16043:165;;;16135:14;;16122:11;;;16115:35;16178:16;;;;16072:10;;16043:165;;;16047:3;;16237:6;16232:3;16228:16;16221:23;;15788:466;;;;;;;15287:973;;;;:::o;16265:376::-;16441:3;16469:38;16503:3;16495:6;16469:38;:::i;:::-;16536:6;16530:13;16552:52;16597:6;16593:2;16586:4;16578:6;16574:17;16552:52;:::i;:::-;16620:15;;16265:376;-1:-1:-1;;;;16265:376:1:o;16646:356::-;16822:3;16860:6;16854:13;16876:53;16922:6;16917:3;16910:4;16902:6;16898:17;16876:53;:::i;:::-;16945:51;16988:6;16983:3;16979:16;16971:6;16945:51;:::i;:::-;16938:58;16646:356;-1:-1:-1;;;;;16646:356:1:o;18387:125::-;18427:4;18455:1;18452;18449:8;18446:34;;;18460:18;;:::i;:::-;-1:-1:-1;18497:9:1;;18387:125::o;18517:128::-;18557:3;18588:1;18584:6;18581:1;18578:13;18575:39;;;18594:18;;:::i;:::-;-1:-1:-1;18630:9:1;;18517:128::o;19772:402::-;19974:2;19956:21;;;20013:2;19993:18;;;19986:30;20052:34;20047:2;20032:18;;20025:62;-1:-1:-1;;;20118:2:1;20103:18;;20096:36;20164:3;20149:19;;19772:402::o;20179:204::-;20217:3;20253:4;20250:1;20246:12;20285:4;20282:1;20278:12;20320:3;20314:4;20310:14;20305:3;20302:23;20299:49;;;20328:18;;:::i;:::-;20364:13;;20179:204;-1:-1:-1;;;20179:204:1:o;20745:489::-;-1:-1:-1;;;;;21014:15:1;;;20996:34;;21066:15;;21061:2;21046:18;;21039:43;21113:2;21098:18;;21091:34;;;21161:3;21156:2;21141:18;;21134:31;;;20939:4;;21182:46;;21208:19;;21200:6;21182:46;:::i;:::-;21174:54;20745:489;-1:-1:-1;;;;;;20745:489:1:o;21239:249::-;21308:6;21361:2;21349:9;21340:7;21336:23;21332:32;21329:52;;;21377:1;21374;21367:12;21329:52;21409:9;21403:16;21428:30;21452:5;21428:30;:::i

Swarm Source

ipfs://6577c032bb10d0952c63796fad8b88e142ef0367dc89e346be9cb70d9954dc58

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.