ETH Price: $1,855.17 (-0.13%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...243689762026-02-02 11:48:3522 days ago1770032915IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000008780.36285214
Set Approval For...242241072026-01-13 6:48:3542 days ago1768286915IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000001460.03173273
Set Approval For...233675292025-09-15 9:17:11162 days ago1757927831IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000028371.17194582
Set Approval For...232011502025-08-23 3:38:23185 days ago1755920303IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000008030.33196959
Set Approval For...225734302025-05-27 10:09:23273 days ago1748340563IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000087661.90080623
Set Approval For...221055632025-03-22 22:59:47338 days ago1742684387IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000039790.861216
Set Approval For...218082712025-02-09 10:10:59380 days ago1739095859IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000031421.29814263
Set Approval For...215982562025-01-11 2:27:59409 days ago1736562479IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000127744.873859
Set Approval For...215982522025-01-11 2:27:11409 days ago1736562431IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000139535.32384778
Set Approval For...215982472025-01-11 2:26:11409 days ago1736562371IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000072442.99225307
Set Approval For...213462922024-12-06 21:58:11444 days ago1733522291IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0005786123.9
Set Approval For...211060742024-11-03 8:59:35478 days ago1730624375IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000117974.86805686
Set Approval For...207085642024-09-08 21:26:11533 days ago1725830771IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000022450.92669738
Set Approval For...207085642024-09-08 21:26:11533 days ago1725830771IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000022430.92669738
Set Approval For...206565092024-09-01 15:06:59541 days ago1725203219IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000060251.30650528
Set Approval For...203193022024-07-16 13:14:35588 days ago1721135675IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000197888.17368903
Set Approval For...190326912024-01-18 8:54:47768 days ago1705568087IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0013413929.03078372
Set Approval For...190120152024-01-15 11:34:23771 days ago1705318463IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0009655420.93463265
Set Approval For...190100142024-01-15 4:51:59771 days ago1705294319IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0007932717.19059552
Transfer From188799782023-12-27 22:33:35789 days ago1703716415IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0049275844.1429372
Set Approval For...188799762023-12-27 22:33:11789 days ago1703716391IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0035221776.2277015
Set Approval For...183702662023-10-17 13:03:11861 days ago1697547791IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0003068412.67420828
Set Approval For...181812312023-09-21 2:18:35887 days ago1695262715IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000342557.41360379
Set Approval For...180889102023-09-08 3:06:11900 days ago1694142371IN
0xE65f378d...a1Bbbe2EA
0 ETH0.000235699.73561113
Set Approval For...178919482023-08-11 13:29:35928 days ago1691760575IN
0xE65f378d...a1Bbbe2EA
0 ETH0.0010421222.59498523
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MintPass

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 8: MintPass.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./ERC721.sol";
import "./Ownership.sol";

contract MintPass is ERC721, Ownership {
    // represents how many times a mint pass is redeemed.
    mapping(uint256 => uint8) private redeemedTimes;
    // contracts that can update mint pass uses, like when minting art, art nft will updated `redeemedTimes`
    mapping(address => bool) public isWhitelisted;
    // nonce to prevent replay attack on admin signature
    mapping(uint256 => bool) public isSignerNonceUsed;

    bool public mintStoppted; // when enabled no futher mint pass can be minted.
    uint256 public maxSupply; // max supply of mint pass
    bool public isPaused = false; // pause the contractn when something goes "really" wrong

    uint8 constant UINT8_MAX = 255;

    struct Signature {
        bytes32 r;
        bytes32 s;
        uint8 v;
    }

    event MintPassUpdated(
        uint256 tokenId,
        uint8 redeemedTimes,
        address updatedBy
    );

    event Paused(bool _isPaused);

    modifier canAcceptMintPass(address user) {
        require(balanceOf(user) == 0, "Only 1 mint pass allowed per user");
        _;
    }

    modifier mintAllowed() {
        require(!mintStoppted, "Minting stopped");
        _;
    }

    modifier notPaused() {
        require(!isPaused, "Contract paused");
        _;
    }

    constructor(string memory _baseTokenUri)
        ERC721("Thunderbirds: IRC Mint Pass", "TBMP", _baseTokenUri)
    {
        maxSupply = 1000;
    }

    function mint(
        address user,
        Signature memory adminSignature,
        uint256 signerNonce
    ) public canAcceptMintPass(user) mintAllowed notPaused {
        require(totalSupply() < maxSupply, "Max token minted");
        require(
            !isSignerNonceUsed[signerNonce],
            "Duplicate nonce in signature"
        );
        bytes32 hash = keccak256(
            abi.encodePacked(
                bytes4(keccak256("mint")),
                address(this),
                signerNonce,
                getChainID(),
                user
            )
        );
        address signer = getSigner(hash, adminSignature);
        require(isDeputyOwner[signer], "Invalid signature/message");
        isSignerNonceUsed[signerNonce] = true;
        string memory url = "QmXyV2HUP7hv8Xjx3X6ZLUUMHkxsdRuQhZ9DwpzZqH16jD";
        super.mint(user, totalSupply() + 1, url);
    }

    function batchMintByAdmin(address[] memory users) public mintAllowed onlyDeputyOrOwner {
        require(totalSupply() + users.length < maxSupply, "Max token minted");
        string memory url = "QmXyV2HUP7hv8Xjx3X6ZLUUMHkxsdRuQhZ9DwpzZqH16jD";
        for(uint8 i=0; i<users.length; i++) {
            require(balanceOf(users[i]) == 0, "Only 1 mint pass allowed per user");
            super.mint(users[i], totalSupply() + 1, url);
        }
    }

    function updateRedeemedTimes(uint256 tokenId, uint8 _redeemedTimes)
        public
        notPaused
    {
        require(isWhitelisted[msg.sender], "Caller not whitelisted");
        redeemedTimes[tokenId] = _redeemedTimes;
        emit MintPassUpdated(tokenId, _redeemedTimes, msg.sender);
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override canAcceptMintPass(_to) notPaused {
        super._transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override canAcceptMintPass(_to) notPaused {
        super._safeTransferFrom(_from, _to, _tokenId, "0x");
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) public override canAcceptMintPass(_to) notPaused {
        super._safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function burn(uint256 _tokenId) public override notPaused {
        super.burn(_tokenId);
    }
    

    function updateTokenUri(uint256 _tokenId, string memory _url)
        public
        onlyDeputyOrOwner
    {
        super._updateTokenUri(_tokenId, _url);
    }

    function updateBaseTokenUri(string memory _baseTokenUri) public onlyOwner {
        super._updateBaseTokenUri(_baseTokenUri);
    }

    function whitelistContract(address contractAddress) public onlyOwner {
        isWhitelisted[contractAddress] = true;
    }

    function removeFromWhitelist(address contractAddress) public onlyOwner {
        isWhitelisted[contractAddress] = false;
    }

    function disableMinting(bool shoudlStop) public onlyOwner {
        mintStoppted = shoudlStop;
    }

    function pauseContract(bool _isPaused) public onlyOwner returns (bool) {
        isPaused = _isPaused;
        emit Paused(_isPaused);
        return true;
    }

    function getSigner(bytes32 message, Signature memory sig)
        public
        pure
        returns (address)
    {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, message));
        address signer = ecrecover(prefixedHash, sig.v, sig.r, sig.s);
        return signer;
    }

    function getRedeemedTimes(uint256 tokenId) public view returns(uint8) {
        if(!exists(tokenId)) return UINT8_MAX;
        return redeemedTimes[tokenId];
    }

    function getChainID() internal view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }
}

File 2 of 8: Addresses.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address to check
     * @return whether the target address is a contract
     */
    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);
    }
}

File 3 of 8: BaseERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./Addresses.sol";
import "./Strings.sol";
import "./ERC721Receiver.sol";
import "./IERC721.sol";

abstract contract ERC721BasicToken is IERC721 {
    using Address for address;
    using Strings for uint256;

    bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd;
    bytes4 private constant InterfaceId_ERC721Exists = 0x4f558e79;
    bytes4 private constant ERC721_RECEIVED = 0xf0b9e5ba;
    bytes4 private constant InterfaceId_ERC721Enumerable = 0x780e9d63;
    bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
    bytes4 private constant InterfaceId_ERC165 = 0x01ffc9a7;

    string internal name_;
    string internal symbol_;
    string public baseTokenURI;

    // Array with all token ids, used for enumeration
    uint256[] internal allTokens;

    // Mapping of interface id to whether or not it's supported
    mapping(bytes4 => bool) internal supportedInterfaces;

    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) internal ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) internal ownedTokensIndex;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) internal allTokensIndex;

    // Mapping from token ID to owner
    mapping(uint256 => address) internal tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) internal tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => uint256) internal ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) internal operatorApprovals;

    /**
     * @dev Guarantees msg.sender is owner of the given token
     * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
     */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender, "Only asset owner is allowed");
        _;
    }

    /**
     * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
     * @param _tokenId uint256 ID of the token to validate
     */
    modifier canTransfer(uint256 _tokenId) {
        require(isApprovedOrOwner(msg.sender, _tokenId), "Can not transfer");
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseTokenUri
    ) {
        name_ = _name;
        symbol_ = _symbol;
        baseTokenURI = _baseTokenUri;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(InterfaceId_ERC721Enumerable);
        _registerInterface(InterfaceId_ERC721Metadata);
        _registerInterface(InterfaceId_ERC721);
        _registerInterface(InterfaceId_ERC721Exists);
        _registerInterface(InterfaceId_ERC165);
    }

    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return name_;
    }

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return symbol_;
    }

    /**
     * @dev Returns an URI for a given token ID
     * Throws if the token ID does not exist. May return an empty string.
     * @param _tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        returns (string memory)
    {
        require(exists(_tokenId), "Asset does not exist");
        return string(abi.encodePacked(baseTokenURI, _tokenId.toString()));
    }

    /**
     * @dev Gets the balance of the specified address
     * @param _owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address _owner) public view returns (uint256) {
        require(_owner != address(0), "Zero address not allowed");
        return ownedTokensCount[_owner];
    }

    /**
     * @dev Gets the owner of the specified token ID
     * @param _tokenId uint256 ID of the token to query the owner of
     * @return owner address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 _tokenId) public view returns (address) {
        address owner = tokenOwner[_tokenId];
        require(owner != address(0), "Zero address not allowed");
        return owner;
    }

    /**
     * @dev Returns whether the specified token exists
     * @param _tokenId uint256 ID of the token to query the existence of
     * @return whether the token exists
     */
    function exists(uint256 _tokenId) public view returns (bool) {
        address owner = tokenOwner[_tokenId];
        return owner != address(0);
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param _to address to be approved for the given token ID
     * @param _tokenId uint256 ID of the token to be approved
     */
    function _approve(address _to, uint256 _tokenId) internal {
        address owner = ownerOf(_tokenId);
        require(_to != owner, "Can not approve to self");
        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "Not allowed to update approvals"
        );

        tokenApprovals[_tokenId] = _to;
        emit Approval(owner, _to, _tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * @param _tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 _tokenId) public view returns (address) {
        return tokenApprovals[_tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf
     * @param _to operator address to set the approval
     * @param _approved representing the status of the approval to be set
     */
    function _setApprovalForAll(address _to, bool _approved) internal {
        require(_to != msg.sender, "Can not approve to self");
        operatorApprovals[msg.sender][_to] = _approved;
        emit ApprovalForAll(msg.sender, _to, _approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner
     * @param _owner owner address which you want to query the approval of
     * @param _operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address _owner, address _operator)
        public
        view
        returns (bool)
    {
        return operatorApprovals[_owner][_operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) internal canTransfer(_tokenId) {
        require(_from != address(0), "Zero address not allowed");
        require(_to != address(0), "Zero address not allowed");

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) internal canTransfer(_tokenId) {
        // solium-disable-next-line arg-overflow
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) internal canTransfer(_tokenId) {
        _transferFrom(_from, _to, _tokenId);
        // solium-disable-next-line arg-overflow
        require(
            checkAndCallSafeTransfer(_from, _to, _tokenId, _data),
            "Safe Transfer failed"
        );
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID
     * @param _spender address of the spender to query
     * @param _tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     *  is an operator of the owner, or is the owner of the token
     */
    function isApprovedOrOwner(address _spender, uint256 _tokenId)
        internal
        view
        returns (bool)
    {
        address owner = ownerOf(_tokenId);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (_spender == owner ||
            getApproved(_tokenId) == _spender ||
            isApprovedForAll(owner, _spender));
    }

    /**
     * @dev Internal function to mint a new token
     * Reverts if the given token ID already exists
     * @param _to The address that will own the minted token
     * @param _tokenId uint256 ID of the token to be minted by the msg.sender
     */
    function _mint(address _to, uint256 _tokenId) internal {
        require(_to != address(0), "Zero address not allowed");
        addTokenTo(_to, _tokenId);
        allTokensIndex[_tokenId] = allTokens.length;
        allTokens.push(_tokenId);

        emit Transfer(address(0), _to, _tokenId);
    }

    /**
     * @dev Internal function to burn a specific token
     * Reverts if the token does not exist
     * @param _tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address _owner, uint256 _tokenId)
        internal
        canTransfer(_tokenId)
    {
        clearApproval(_owner, _tokenId);
        removeTokenFrom(_owner, _tokenId);

        // Reorg all tokens array
        uint256 tokenIndex = allTokensIndex[_tokenId];
        uint256 lastTokenIndex = allTokens.length - 1;
        uint256 lastToken = allTokens[lastTokenIndex];

        allTokens[tokenIndex] = lastToken;
        delete allTokens[lastTokenIndex];

        //allTokens[lastTokenIndex] = 0;
        // allTokens.length--; // @TODO

        allTokensIndex[_tokenId] = 0;
        allTokensIndex[lastToken] = tokenIndex;
        emit Transfer(_owner, address(0), _tokenId);
    }

    /**
     * @dev Internal function to clear current approval of a given token ID
     * Reverts if the given address is not indeed the owner of the token
     * @param _owner owner of the token
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function clearApproval(address _owner, uint256 _tokenId) internal {
        require(
            ownerOf(_tokenId) == _owner,
            "Asset does not belong to given owmer"
        );
        if (tokenApprovals[_tokenId] != address(0)) {
            tokenApprovals[_tokenId] = address(0);
            emit Approval(_owner, address(0), _tokenId);
        }
    }

    /**
     * @dev Internal function to add a token ID to the list of a given address
     * @param _to address representing the new owner of the given token ID
     * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        require(tokenOwner[_tokenId] == address(0), "Asset already exists");
        tokenOwner[_tokenId] = _to;
        ownedTokensCount[_to] = ownedTokensCount[_to] + 1;
        uint256 length = ownedTokens[_to].length;
        ownedTokens[_to].push(_tokenId);
        ownedTokensIndex[_tokenId] = length;
    }

    /**
     * @dev Internal function to remove a token ID from the list of a given address
     * @param _from address representing the previous owner of the given token ID
     * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        require(
            ownerOf(_tokenId) == _from,
            "Asset does not belong to given owmer"
        );
        ownedTokensCount[_from] = ownedTokensCount[_from] - 1;
        tokenOwner[_tokenId] = address(0);
        uint256 tokenIndex = ownedTokensIndex[_tokenId];
        uint256 lastTokenIndex = ownedTokens[_from].length - 1;
        uint256 lastToken = ownedTokens[_from][lastTokenIndex];

        ownedTokens[_from][tokenIndex] = lastToken;
        ownedTokens[_from][lastTokenIndex] = 0;
        // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
        // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
        // the lastToken to the first position, and then dropping the element placed in the last position of the list

        //ownedTokens[_from].length--; @TODO
        ownedTokensIndex[_tokenId] = 0;
        ownedTokensIndex[lastToken] = tokenIndex;
    }

    /**
     * @dev Internal function to invoke `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 whether the call correctly returned the expected magic value
     */
    function checkAndCallSafeTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) internal returns (bool) {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(
            _from,
            _tokenId,
            _data
        );
        return (retval == ERC721_RECEIVED);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner
     * @param _owner address owning the tokens list to be accessed
     * @param _index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        public
        view
        returns (uint256)
    {
        require(_index < balanceOf(_owner), "Invalid index");
        return ownedTokens[_owner][_index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens
     * @param _index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 _index) public view returns (uint256) {
        require(_index < totalSupply(), "Invalid index");
        return allTokens[_index];
    }

    function supportsInterface(bytes4 _interfaceId)
        external
        view
        returns (bool)
    {
        return supportedInterfaces[_interfaceId];
    }

    function _registerInterface(bytes4 _interfaceId) internal {
        require(_interfaceId != 0xffffffff);
        supportedInterfaces[_interfaceId] = true;
    }
}

File 4 of 8: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./BaseERC721.sol";

contract ERC721 is ERC721BasicToken {
    mapping(uint256 => string) internal _tokenUri;

    event TokenURIUpdated(uint256 tokenId, string _url);
    event BaseTokenURIUpdated(string _baseUrl);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseTokenUri
    ) ERC721BasicToken(_name, _symbol, _baseTokenUri) {
        emit BaseTokenURIUpdated(_baseTokenUri);
    }

    function approve(address _to, uint256 _tokenId) public {
        super._approve(_to, _tokenId);
    }

    function setApprovalForAll(address _to, bool _approved) public {
        super._setApprovalForAll(_to, _approved);
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public virtual {
        super._transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public virtual {
        super._safeTransferFrom(_from, _to, _tokenId, "0x");
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) public virtual {
        super._safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function _updateTokenUri(uint256 _tokenId, string memory _url) internal {
        _tokenUri[_tokenId] = _url;
        emit TokenURIUpdated(_tokenId, _url);
    }

    function _updateBaseTokenUri(string memory _baseTokenUri) internal {
        baseTokenURI = _baseTokenUri;
        emit BaseTokenURIUpdated(_baseTokenUri);
    }

    function mint(
        address _to,
        uint256 _tokenId,
        string memory _url
    ) internal {
        _updateTokenUri(_tokenId, _url);
        super._mint(_to, _tokenId);
    }

    function burn(uint256 _tokenId) public virtual {
        super._burn(ownerOf(_tokenId), _tokenId);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(exists(_tokenId), "Asset does not exist");
        return string(abi.encodePacked(baseTokenURI, _tokenUri[_tokenId]));
    }
}

File 5 of 8: ERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * @title ERC721 token receiver interface
 * @author Prashant Prabhakar Singh [prashantprabhakar123@gmail.com]
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
abstract contract ERC721Receiver {
    /**
     * @dev Magic value to be returned upon successful reception of an NFT
     *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
     *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
     */
    bytes4 internal constant ERC721_RECEIVED = 0xf0b9e5ba;

    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safetransfer`. This function MAY throw to revert and reject the
     * transfer. This function MUST use 50,000 gas or less. Return of other
     * than the magic value MUST result in the transaction being reverted.
     * Note: the contract address is always the message sender.
     * @param _from The sending address
     * @param _tokenId The NFT identifier which is being transfered
     * @param _data Additional data with no specified format
     * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
     */
    function onERC721Received(
        address _from,
        uint256 _tokenId,
        bytes memory _data
    ) public virtual returns (bytes4);
}

File 6 of 8: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @author Prashant Prabhakar Singh [prashantprabhakar123@gmail.com]
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
interface IERC721 {
    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 indexed _tokenId
    );
    event Approval(
        address indexed _owner,
        address indexed _approved,
        uint256 indexed _tokenId
    );
    event ApprovalForAll(
        address indexed _owner,
        address indexed _operator,
        bool _approved
    );

    function balanceOf(address _owner) external view returns (uint256 _balance);

    function ownerOf(uint256 _tokenId) external view returns (address _owner);

    function exists(uint256 _tokenId) external view returns (bool _exists);

    function approve(address _to, uint256 _tokenId) external;

    function getApproved(uint256 _tokenId)
        external
        view
        returns (address _operator);

    function setApprovalForAll(address _operator, bool _approved) external;

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        returns (bool);

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) external;

    function name() external view returns (string memory _name);

    function symbol() external view returns (string memory _symbol);

    function tokenURI(uint256 _tokenId) external view returns (string memory);

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        external
        view
        returns (uint256 _tokenId);

    function tokenByIndex(uint256 _index) external view returns (uint256);

    function supportsInterface(bytes4 _interfaceId)
        external
        view
        returns (bool);
}

File 7 of 8: Ownership.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

contract Ownership {
    address public owner;
    address[] public deputyOwners;

    mapping(address => bool) public isDeputyOwner;

    event OwnershipUpdated(address oldOwner, address newOwner);
    event DeputyOwnerUpdated(address _do, bool _isAdded);

    constructor() {
        owner = msg.sender;
        addDeputyOwner(msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    modifier onlyDeputyOrOwner() {
        require(
            msg.sender == owner || isDeputyOwner[msg.sender],
            "Caller is not owner or deputy"
        );
        _;
    }

    /**
     * @dev Transfer the ownership to some other address.
     * new owner can not be a zero address.
     * Only owner can call this function
     * @param _newOwner Address to which ownership is being transferred
     */
    function updateOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0x0), "Invalid address");
        owner = _newOwner;
        emit OwnershipUpdated(msg.sender, owner);
    }

    /**
     * @dev Add new deputy owner.
     * Only Owner can call this function
     * New Deputy should not be zero address
     * New Deputy should not be be already exisitng
     * emit DeputyOwnerUdpatd event
     * @param _newDO Address of new deputy owner
     */
    function addDeputyOwner(address _newDO) public onlyOwner {
        require(!isDeputyOwner[_newDO], "Deputy Owner already exists");
        deputyOwners.push(_newDO);
        isDeputyOwner[_newDO] = true;
        emit DeputyOwnerUpdated(_newDO, true);
    }

    /**
     * @dev Remove an existing deputy owner.
     * Only Owner can call this function
     * Given address should be a deputy owner
     * emit DeputyOwnerUdpatd event
     * @param _existingDO Address of existing deputy owner
     */
    function removeDeputyOwner(address _existingDO) public onlyOwner {
        require(isDeputyOwner[_existingDO], "Deputy Owner does not exits");
        uint256 existingId;
        for (uint256 i = 0; i < deputyOwners.length; i++) {
            if (deputyOwners[i] == _existingDO) existingId = i;
        }

        // swap this with last element
        deputyOwners[existingId] = deputyOwners[deputyOwners.length - 1];
        delete deputyOwners[deputyOwners.length - 1];
        isDeputyOwner[_existingDO] = false;
        emit DeputyOwnerUpdated(_existingDO, false);
    }

    /**
     * @dev Renounce the ownership.
     * This will leave the contract without any owner.
     * Only owner can call this function
     * @param _validationCode A code to prevent accidental calling of this function
     */
    function renounceOwnership(uint256 _validationCode) public onlyOwner {
        require(_validationCode == 123456789, "Invalid code");
        owner = address(0);
        emit OwnershipUpdated(msg.sender, owner);
    }
}

File 8 of 8: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"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":false,"internalType":"string","name":"_baseUrl","type":"string"}],"name":"BaseTokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_do","type":"address"},{"indexed":false,"internalType":"bool","name":"_isAdded","type":"bool"}],"name":"DeputyOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"redeemedTimes","type":"uint8"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"MintPassUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_url","type":"string"}],"name":"TokenURIUpdated","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":[{"internalType":"address","name":"_newDO","type":"address"}],"name":"addDeputyOwner","outputs":[],"stateMutability":"nonpayable","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":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"batchMintByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deputyOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"shoudlStop","type":"bool"}],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRedeemedTimes","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct MintPass.Signature","name":"sig","type":"tuple"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDeputyOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isSignerNonceUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct MintPass.Signature","name":"adminSignature","type":"tuple"},{"internalType":"uint256","name":"signerNonce","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStoppted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"pauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_existingDO","type":"address"}],"name":"removeDeputyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_validationCode","type":"uint256"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"_to","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","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":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"updateBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"_redeemedTimes","type":"uint8"}],"name":"updateRedeemedTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_url","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"whitelistContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526015805460ff191690553480156200001b57600080fd5b506040516200317f3803806200317f8339810160408190526200003e916200036e565b6040518060400160405280601b81526020017f5468756e64657262697264733a20495243204d696e742050617373000000000081525060405180604001604052806004815260200163054424d560e41b815250828282828260009081620000a69190620004b5565b506001620000b58382620004b5565b506002620000c48282620004b5565b50620000d763780e9d6360e01b6200018b565b620000e9635b5e139f60e01b6200018b565b620000fb6380ac58cd60e01b6200018b565b6200010d634f558e7960e01b6200018b565b6200011f6301ffc9a760e01b6200018b565b5050507fe6e4cd5c2dc7d2c20519b41832cd550fd3ea1186bf299d108179bf71fb8e00e58160405162000153919062000581565b60405180910390a15050600d80546001600160a01b031916339081179091556200017e9150620001c8565b506103e8601455620005b6565b6001600160e01b03198082169003620001a357600080fd5b6001600160e01b0319166000908152600460205260409020805460ff19166001179055565b600d546001600160a01b03163314620002285760405162461bcd60e51b815260206004820152601360248201527f43616c6c6572206973206e6f74206f776e65720000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff1615620002935760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c726561647920657869737473000000000060448201526064016200021f565b600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000818152600f6020908152604091829020805460ff19168517905581519283528201929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf85533910160405180910390a150565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003655781810151838201526020016200034b565b50506000910152565b6000602082840312156200038157600080fd5b81516001600160401b03808211156200039957600080fd5b818401915084601f830112620003ae57600080fd5b815181811115620003c357620003c362000332565b604051601f8201601f19908116603f01168101908382118183101715620003ee57620003ee62000332565b816040528281528760208487010111156200040857600080fd5b6200041b83602083016020880162000348565b979650505050505050565b600181811c908216806200043b57607f821691505b6020821081036200045c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004b057600081815260208120601f850160051c810160208610156200048b5750805b601f850160051c820191505b81811015620004ac5782815560010162000497565b5050505b505050565b81516001600160401b03811115620004d157620004d162000332565b620004e981620004e2845462000426565b8462000462565b602080601f831160018114620005215760008415620005085750858301515b600019600386901b1c1916600185901b178555620004ac565b600085815260208120601f198616915b82811015620005525788860151825594840194600190910190840162000531565b5085821015620005715787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020815260008251806020840152620005a281604085016020870162000348565b601f01601f19169190910160400192915050565b612bb980620005c66000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80638ab1d68111610146578063c87b56dd116100c3578063d734508311610087578063d734508314610581578063d76e87791461058e578063e272b892146105b1578063e985e9c5146105c4578063f9c67db4146105d7578063fef59ea5146105ea57600080fd5b8063c87b56dd14610537578063ca00043d1461054a578063d31af4841461055d578063d547cfb714610570578063d5abeb011461057857600080fd5b8063a22cb4651161010a578063a22cb465146104de578063a33cdc41146104f1578063b187bd2614610504578063b88d4fde14610511578063c400956a1461052457600080fd5b80638ab1d6811461048a5780638da5cb5b1461049d57806395d89b41146104b05780639a429a25146104b85780639c4d09a8146104cb57600080fd5b806342842e0e116101df5780636352211e116101a35780636352211e1461041857806370a082311461042b57806376c16f991461043e5780637d654c7f146104515780637da0349e14610464578063880cdc311461047757600080fd5b806342842e0e146103a157806342966c68146103b45780634f558e79146103c75780634f6ccce7146103f2578063558fc5e11461040557600080fd5b806318160ddd1161022657806318160ddd1461033357806323b872dd146103455780632f745c59146103585780633a0e6d431461036b5780633af32abf1461037e57600080fd5b806301ffc9a71461026357806306fdde03146102a5578063081812fc146102ba578063095ea7b3146102fb57806315761f0e14610310575b600080fd5b61029061027136600461221b565b6001600160e01b03191660009081526004602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102ad61060f565b60405161029c919061228f565b6102e36102c83660046122a2565b6000908152600960205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161029c565b61030e6103093660046122d2565b6106a1565b005b61029061031e3660046122fc565b600f6020526000908152604090205460ff1681565b6003545b60405190815260200161029c565b61030e610353366004612317565b6106af565b6103376103663660046122d2565b610713565b61030e6103793660046122fc565b61079a565b61029061038c3660046122fc565b60116020526000908152604090205460ff1681565b61030e6103af366004612317565b6107e8565b61030e6103c23660046122a2565b610858565b6102906103d53660046122a2565b6000908152600860205260409020546001600160a01b0316151590565b6103376104003660046122a2565b610887565b61030e610413366004612412565b6108f5565b6102e36104263660046122a2565b610928565b6103376104393660046122fc565b61095d565b61030e61044c3660046122fc565b6109a1565b61030e61045f3660046122a2565b610b9a565b61030e610472366004612447565b610c53565b61030e6104853660046122fc565b610e1d565b61030e6104983660046122fc565b610ee4565b600d546102e3906001600160a01b031681565b6102ad610f2f565b61030e6104c6366004612568565b610f3e565b61030e6104d93660046125a5565b6111a2565b61030e6104ec3660046125e1565b61127a565b61030e6104ff3660046122fc565b611284565b6015546102909060ff1681565b61030e61051f36600461260b565b6113b0565b6102e36105323660046122a2565b61140d565b6102ad6105453660046122a2565b611437565b6102e3610558366004612687565b6114d1565b61030e61056b3660046126ab565b6115ba565b6102ad611638565b61033760145481565b6013546102909060ff1681565b61029061059c3660046122a2565b60126020526000908152604090205460ff1681565b6102906105bf3660046126f2565b6116c6565b6102906105d236600461270d565b611740565b61030e6105e53660046126f2565b61176e565b6105fd6105f83660046122a2565b6117ab565b60405160ff909116815260200161029c565b60606000805461061e90612737565b80601f016020809104026020016040519081016040528092919081815260200182805461064a90612737565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b6106ab82826117e5565b5050565b816106b98161095d565b156106df5760405162461bcd60e51b81526004016106d690612771565b60405180910390fd5b60155460ff16156107025760405162461bcd60e51b81526004016106d6906127b2565b61070d848484611911565b50505050565b600061071e8361095d565b821061075c5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b6001600160a01b0383166000908152600560205260409020805483908110610786576107866127db565b906000526020600020015490505b92915050565b600d546001600160a01b031633146107c45760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b816107f28161095d565b1561080f5760405162461bcd60e51b81526004016106d690612771565b60155460ff16156108325760405162461bcd60e51b81526004016106d6906127b2565b61070d84848460405180604001604052806002815260200161060f60f31b8152506119e9565b60155460ff161561087b5760405162461bcd60e51b81526004016106d6906127b2565b61088481611a6a565b50565b600061089260035490565b82106108d05760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b600382815481106108e3576108e36127db565b90600052602060002001549050919050565b600d546001600160a01b0316331461091f5760405162461bcd60e51b81526004016106d6906127f1565b61088481611a7c565b6000818152600860205260408120546001600160a01b0316806107945760405162461bcd60e51b81526004016106d69061281e565b60006001600160a01b0382166109855760405162461bcd60e51b81526004016106d69061281e565b506001600160a01b03166000908152600a602052604090205490565b600d546001600160a01b031633146109cb5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16610a335760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f74206578697473000000000060448201526064016106d6565b6000805b600e54811015610a8e57826001600160a01b0316600e8281548110610a5e57610a5e6127db565b6000918252602090912001546001600160a01b031603610a7c578091505b80610a868161286b565b915050610a37565b50600e8054610a9f90600190612884565b81548110610aaf57610aaf6127db565b600091825260209091200154600e80546001600160a01b039092169183908110610adb57610adb6127db565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600e8054610b1490600190612884565b81548110610b2457610b246127db565b600091825260208083209190910180546001600160a01b03191690556001600160a01b038416808352600f82526040808420805460ff191690558051918252918101929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf8553391015b60405180910390a15050565b600d546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106d6906127f1565b8063075bcd1514610c065760405162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b60448201526064016106d6565b600d80546001600160a01b031916905560408051338152600060208201527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d91015b60405180910390a150565b60135460ff1615610c985760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b600d546001600160a01b0316331480610cc05750336000908152600f602052604090205460ff165b610d0c5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6014548151600354610d1e9190612897565b10610d5e5760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60006040518060600160405280602e8152602001612b56602e9139905060005b82518160ff161015610e1857610daf838260ff1681518110610da257610da26127db565b602002602001015161095d565b15610dcc5760405162461bcd60e51b81526004016106d690612771565b610e06838260ff1681518110610de457610de46127db565b6020026020010151610df560035490565b610e00906001612897565b84611ab8565b80610e10816128aa565b915050610d7e565b505050565b600d546001600160a01b03163314610e475760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b038116610e8f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016106d6565b600d80546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9101610c48565b600d546001600160a01b03163314610f0e5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60606001805461061e90612737565b82610f488161095d565b15610f655760405162461bcd60e51b81526004016106d690612771565b60135460ff1615610faa5760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b60155460ff1615610fcd5760405162461bcd60e51b81526004016106d6906127b2565b601454600354106110135760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60008281526012602052604090205460ff16156110725760405162461bcd60e51b815260206004820152601c60248201527f4475706c6963617465206e6f6e636520696e207369676e61747572650000000060448201526064016106d6565b6040805163daf0b3c560e01b6020808301919091526bffffffffffffffffffffffff1930606090811b821660248501526038840187905246605885015288901b1660788301528251808303606c018152608c909201909252805191012060006110db82866114d1565b6001600160a01b0381166000908152600f602052604090205490915060ff166111465760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e61747572652f6d6573736167650000000000000060448201526064016106d6565b6000848152601260209081526040808320805460ff19166001179055805160608101909152602e8082529091612b569083013990506111998761118860035490565b611193906001612897565b83611ab8565b50505050505050565b60155460ff16156111c55760405162461bcd60e51b81526004016106d6906127b2565b3360009081526011602052604090205460ff1661121d5760405162461bcd60e51b815260206004820152601660248201527510d85b1b195c881b9bdd081dda1a5d195b1a5cdd195960521b60448201526064016106d6565b600082815260106020908152604091829020805460ff191660ff851690811790915582518581529182015233918101919091527ff8fa114c2a702f597cbc7426fcd7e5b18937b14664cc15c313dbe300accc69ee90606001610b8e565b6106ab8282611acc565b600d546001600160a01b031633146112ae5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16156113175760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c726561647920657869737473000000000060448201526064016106d6565b600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000818152600f6020908152604091829020805460ff19168517905581519283528201929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339101610c48565b826113ba8161095d565b156113d75760405162461bcd60e51b81526004016106d690612771565b60155460ff16156113fa5760405162461bcd60e51b81526004016106d6906127b2565b611406858585856119e9565b5050505050565b600e818154811061141d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600860205260409020546060906001600160a01b03166114955760405162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016106d6565b6002600c60008481526020019081526020016000206040516020016114bb92919061293c565b6040516020818303038152906040529050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008185604051602001611521929190612951565b604051602081830303815290604052805190602001209050600060018286604001518760000151886020015160405160008152602001604052604051611583949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156115a5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600d546001600160a01b03163314806115e25750336000908152600f602052604090205460ff165b61162e5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6106ab8282611b8a565b6002805461164590612737565b80601f016020809104026020016040519081016040528092919081815260200182805461167190612737565b80156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b505050505081565b600d546000906001600160a01b031633146116f35760405162461bcd60e51b81526004016106d6906127f1565b6015805460ff19168315159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29060200160405180910390a15060015b919050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600d546001600160a01b031633146117985760405162461bcd60e51b81526004016106d6906127f1565b6013805460ff1916911515919091179055565b6000818152600860205260408120546001600160a01b03166117cf575060ff919050565b5060009081526010602052604090205460ff1690565b60006117f082610928565b9050806001600160a01b0316836001600160a01b03160361184d5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336001600160a01b038216148061186957506118698133611740565b6118b55760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c730060448201526064016106d6565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b8061191c3382611bd4565b6119385760405162461bcd60e51b81526004016106d690612973565b6001600160a01b03841661195e5760405162461bcd60e51b81526004016106d69061281e565b6001600160a01b0383166119845760405162461bcd60e51b81526004016106d69061281e565b61198e8483611c33565b6119988483611cde565b6119a28383611e6b565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b816119f43382611bd4565b611a105760405162461bcd60e51b81526004016106d690612973565b611a1b858585611911565b611a2785858585611f51565b6114065760405162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b60448201526064016106d6565b610884611a7682610928565b82612005565b6002611a8882826129eb565b507fe6e4cd5c2dc7d2c20519b41832cd550fd3ea1186bf299d108179bf71fb8e00e581604051610c48919061228f565b611ac28282611b8a565b610e18838361211e565b336001600160a01b03831603611b1e5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600c60205260409020611ba282826129eb565b507f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd8282604051610b8e929190612aab565b600080611be083610928565b9050806001600160a01b0316846001600160a01b03161480611c1b57506000838152600960205260409020546001600160a01b038581169116145b80611c2b5750611c2b8185611740565b949350505050565b816001600160a01b0316611c4682610928565b6001600160a01b031614611c6c5760405162461bcd60e51b81526004016106d690612ac4565b6000818152600960205260409020546001600160a01b0316156106ab5760008181526009602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b816001600160a01b0316611cf182610928565b6001600160a01b031614611d175760405162461bcd60e51b81526004016106d690612ac4565b6001600160a01b0382166000908152600a6020526040902054611d3c90600190612884565b6001600160a01b0383166000818152600a60209081526040808320949094558482526008815283822080546001600160a01b031916905560068152838220549282526005905291822054909190611d9590600190612884565b6001600160a01b03851660009081526005602052604081208054929350909183908110611dc457611dc46127db565b906000526020600020015490508060056000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110611e0857611e086127db565b60009182526020808320909101929092556001600160a01b0387168152600590915260408120805484908110611e4057611e406127db565b6000918252602080832090910192909255948552600690526040808520859055908452909220555050565b6000818152600860205260409020546001600160a01b031615611ec75760405162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b60448201526064016106d6565b600081815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600a909152902054611f09906001612897565b6001600160a01b039092166000908152600a60209081526040808320949094556005815283822080546001810182559083528183208101849055928252600690529190912055565b6000611f65846001600160a01b03166121cc565b611f7157506001611c2b565b60405163785cf2dd60e11b81526000906001600160a01b0386169063f0b9e5ba90611fa490899088908890600401612b08565b6020604051808303816000875af1158015611fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe79190612b38565b6001600160e01b03191663785cf2dd60e11b14915050949350505050565b806120103382611bd4565b61202c5760405162461bcd60e51b81526004016106d690612973565b6120368383611c33565b6120408383611cde565b60008281526007602052604081205460035490919061206190600190612884565b9050600060038281548110612078576120786127db565b906000526020600020015490508060038481548110612099576120996127db565b9060005260206000200181905550600382815481106120ba576120ba6127db565b60009182526020808320909101829055868252600790526040808220829055828252808220859055518691906001600160a01b038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050505050565b6001600160a01b0382166121445760405162461bcd60e51b81526004016106d69061281e565b61214e8282611e6b565b600380546000838152600760205260408082208390556001830184559281527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b909101839055905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c2b575050151592915050565b6001600160e01b03198116811461088457600080fd5b60006020828403121561222d57600080fd5b813561223881612205565b9392505050565b60005b8381101561225a578181015183820152602001612242565b50506000910152565b6000815180845261227b81602086016020860161223f565b601f01601f19169290920160200192915050565b6020815260006122386020830184612263565b6000602082840312156122b457600080fd5b5035919050565b80356001600160a01b038116811461173b57600080fd5b600080604083850312156122e557600080fd5b6122ee836122bb565b946020939093013593505050565b60006020828403121561230e57600080fd5b612238826122bb565b60008060006060848603121561232c57600080fd5b612335846122bb565b9250612343602085016122bb565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561239257612392612353565b604052919050565b600067ffffffffffffffff8311156123b4576123b4612353565b6123c7601f8401601f1916602001612369565b90508281528383830111156123db57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261240357600080fd5b6122388383356020850161239a565b60006020828403121561242457600080fd5b813567ffffffffffffffff81111561243b57600080fd5b611c2b848285016123f2565b6000602080838503121561245a57600080fd5b823567ffffffffffffffff8082111561247257600080fd5b818501915085601f83011261248657600080fd5b81358181111561249857612498612353565b8060051b91506124a9848301612369565b81815291830184019184810190888411156124c357600080fd5b938501935b838510156124e8576124d9856122bb565b825293850193908501906124c8565b98975050505050505050565b803560ff8116811461173b57600080fd5b60006060828403121561251757600080fd5b6040516060810181811067ffffffffffffffff8211171561253a5761253a612353565b8060405250809150823581526020830135602082015261255c604084016124f4565b60408201525092915050565b600080600060a0848603121561257d57600080fd5b612586846122bb565b92506125958560208601612505565b9150608084013590509250925092565b600080604083850312156125b857600080fd5b823591506125c8602084016124f4565b90509250929050565b8035801515811461173b57600080fd5b600080604083850312156125f457600080fd5b6125fd836122bb565b91506125c8602084016125d1565b6000806000806080858703121561262157600080fd5b61262a856122bb565b9350612638602086016122bb565b925060408501359150606085013567ffffffffffffffff81111561265b57600080fd5b8501601f8101871361266c57600080fd5b61267b8782356020840161239a565b91505092959194509250565b6000806080838503121561269a57600080fd5b823591506125c88460208501612505565b600080604083850312156126be57600080fd5b82359150602083013567ffffffffffffffff8111156126dc57600080fd5b6126e8858286016123f2565b9150509250929050565b60006020828403121561270457600080fd5b612238826125d1565b6000806040838503121561272057600080fd5b612729836122bb565b91506125c8602084016122bb565b600181811c9082168061274b57607f821691505b60208210810361276b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f4f6e6c792031206d696e74207061737320616c6c6f77656420706572207573656040820152603960f91b606082015260800190565b6020808252600f908201526e10dbdb9d1c9858dd081c185d5cd959608a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60208082526018908201527f5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161287d5761287d612855565b5060010190565b8181038181111561079457610794612855565b8082018082111561079457610794612855565b600060ff821660ff81036128c0576128c0612855565b60010192915050565b600081546128d681612737565b600182811680156128ee576001811461290357612932565b60ff1984168752821515830287019450612932565b8560005260208060002060005b858110156129295781548a820152908401908201612910565b50505082870194505b5050505092915050565b6000611c2b61294b83866128c9565b846128c9565b6000835161296381846020880161223f565b9190910191825250602001919050565b60208082526010908201526f21b0b7103737ba103a3930b739b332b960811b604082015260600190565b601f821115610e1857600081815260208120601f850160051c810160208610156129c45750805b601f850160051c820191505b818110156129e3578281556001016129d0565b505050505050565b815167ffffffffffffffff811115612a0557612a05612353565b612a1981612a138454612737565b8461299d565b602080601f831160018114612a4e5760008415612a365750858301515b600019600386901b1c1916600185901b1785556129e3565b600085815260208120601f198616915b82811015612a7d57888601518255948401946001909101908401612a5e565b5085821015612a9b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000611c2b6040830184612263565b60208082526024908201527f417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f6040820152633bb6b2b960e11b606082015260800190565b60018060a01b0384168152826020820152606060408201526000612b2f6060830184612263565b95945050505050565b600060208284031215612b4a57600080fd5b81516122388161220556fe516d5879563248555037687638586a783358365a4c55554d486b787364527551685a394477707a5a714831366a44a264697066735822122005c34c2317476cebbf44a2a9259f839740e5aeb2f2c84ecd93ff594547bc57f464736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025e5760003560e01c80638ab1d68111610146578063c87b56dd116100c3578063d734508311610087578063d734508314610581578063d76e87791461058e578063e272b892146105b1578063e985e9c5146105c4578063f9c67db4146105d7578063fef59ea5146105ea57600080fd5b8063c87b56dd14610537578063ca00043d1461054a578063d31af4841461055d578063d547cfb714610570578063d5abeb011461057857600080fd5b8063a22cb4651161010a578063a22cb465146104de578063a33cdc41146104f1578063b187bd2614610504578063b88d4fde14610511578063c400956a1461052457600080fd5b80638ab1d6811461048a5780638da5cb5b1461049d57806395d89b41146104b05780639a429a25146104b85780639c4d09a8146104cb57600080fd5b806342842e0e116101df5780636352211e116101a35780636352211e1461041857806370a082311461042b57806376c16f991461043e5780637d654c7f146104515780637da0349e14610464578063880cdc311461047757600080fd5b806342842e0e146103a157806342966c68146103b45780634f558e79146103c75780634f6ccce7146103f2578063558fc5e11461040557600080fd5b806318160ddd1161022657806318160ddd1461033357806323b872dd146103455780632f745c59146103585780633a0e6d431461036b5780633af32abf1461037e57600080fd5b806301ffc9a71461026357806306fdde03146102a5578063081812fc146102ba578063095ea7b3146102fb57806315761f0e14610310575b600080fd5b61029061027136600461221b565b6001600160e01b03191660009081526004602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102ad61060f565b60405161029c919061228f565b6102e36102c83660046122a2565b6000908152600960205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161029c565b61030e6103093660046122d2565b6106a1565b005b61029061031e3660046122fc565b600f6020526000908152604090205460ff1681565b6003545b60405190815260200161029c565b61030e610353366004612317565b6106af565b6103376103663660046122d2565b610713565b61030e6103793660046122fc565b61079a565b61029061038c3660046122fc565b60116020526000908152604090205460ff1681565b61030e6103af366004612317565b6107e8565b61030e6103c23660046122a2565b610858565b6102906103d53660046122a2565b6000908152600860205260409020546001600160a01b0316151590565b6103376104003660046122a2565b610887565b61030e610413366004612412565b6108f5565b6102e36104263660046122a2565b610928565b6103376104393660046122fc565b61095d565b61030e61044c3660046122fc565b6109a1565b61030e61045f3660046122a2565b610b9a565b61030e610472366004612447565b610c53565b61030e6104853660046122fc565b610e1d565b61030e6104983660046122fc565b610ee4565b600d546102e3906001600160a01b031681565b6102ad610f2f565b61030e6104c6366004612568565b610f3e565b61030e6104d93660046125a5565b6111a2565b61030e6104ec3660046125e1565b61127a565b61030e6104ff3660046122fc565b611284565b6015546102909060ff1681565b61030e61051f36600461260b565b6113b0565b6102e36105323660046122a2565b61140d565b6102ad6105453660046122a2565b611437565b6102e3610558366004612687565b6114d1565b61030e61056b3660046126ab565b6115ba565b6102ad611638565b61033760145481565b6013546102909060ff1681565b61029061059c3660046122a2565b60126020526000908152604090205460ff1681565b6102906105bf3660046126f2565b6116c6565b6102906105d236600461270d565b611740565b61030e6105e53660046126f2565b61176e565b6105fd6105f83660046122a2565b6117ab565b60405160ff909116815260200161029c565b60606000805461061e90612737565b80601f016020809104026020016040519081016040528092919081815260200182805461064a90612737565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b6106ab82826117e5565b5050565b816106b98161095d565b156106df5760405162461bcd60e51b81526004016106d690612771565b60405180910390fd5b60155460ff16156107025760405162461bcd60e51b81526004016106d6906127b2565b61070d848484611911565b50505050565b600061071e8361095d565b821061075c5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b6001600160a01b0383166000908152600560205260409020805483908110610786576107866127db565b906000526020600020015490505b92915050565b600d546001600160a01b031633146107c45760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b816107f28161095d565b1561080f5760405162461bcd60e51b81526004016106d690612771565b60155460ff16156108325760405162461bcd60e51b81526004016106d6906127b2565b61070d84848460405180604001604052806002815260200161060f60f31b8152506119e9565b60155460ff161561087b5760405162461bcd60e51b81526004016106d6906127b2565b61088481611a6a565b50565b600061089260035490565b82106108d05760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b600382815481106108e3576108e36127db565b90600052602060002001549050919050565b600d546001600160a01b0316331461091f5760405162461bcd60e51b81526004016106d6906127f1565b61088481611a7c565b6000818152600860205260408120546001600160a01b0316806107945760405162461bcd60e51b81526004016106d69061281e565b60006001600160a01b0382166109855760405162461bcd60e51b81526004016106d69061281e565b506001600160a01b03166000908152600a602052604090205490565b600d546001600160a01b031633146109cb5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16610a335760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f74206578697473000000000060448201526064016106d6565b6000805b600e54811015610a8e57826001600160a01b0316600e8281548110610a5e57610a5e6127db565b6000918252602090912001546001600160a01b031603610a7c578091505b80610a868161286b565b915050610a37565b50600e8054610a9f90600190612884565b81548110610aaf57610aaf6127db565b600091825260209091200154600e80546001600160a01b039092169183908110610adb57610adb6127db565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600e8054610b1490600190612884565b81548110610b2457610b246127db565b600091825260208083209190910180546001600160a01b03191690556001600160a01b038416808352600f82526040808420805460ff191690558051918252918101929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf8553391015b60405180910390a15050565b600d546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106d6906127f1565b8063075bcd1514610c065760405162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b60448201526064016106d6565b600d80546001600160a01b031916905560408051338152600060208201527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d91015b60405180910390a150565b60135460ff1615610c985760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b600d546001600160a01b0316331480610cc05750336000908152600f602052604090205460ff165b610d0c5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6014548151600354610d1e9190612897565b10610d5e5760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60006040518060600160405280602e8152602001612b56602e9139905060005b82518160ff161015610e1857610daf838260ff1681518110610da257610da26127db565b602002602001015161095d565b15610dcc5760405162461bcd60e51b81526004016106d690612771565b610e06838260ff1681518110610de457610de46127db565b6020026020010151610df560035490565b610e00906001612897565b84611ab8565b80610e10816128aa565b915050610d7e565b505050565b600d546001600160a01b03163314610e475760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b038116610e8f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016106d6565b600d80546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9101610c48565b600d546001600160a01b03163314610f0e5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60606001805461061e90612737565b82610f488161095d565b15610f655760405162461bcd60e51b81526004016106d690612771565b60135460ff1615610faa5760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b60155460ff1615610fcd5760405162461bcd60e51b81526004016106d6906127b2565b601454600354106110135760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60008281526012602052604090205460ff16156110725760405162461bcd60e51b815260206004820152601c60248201527f4475706c6963617465206e6f6e636520696e207369676e61747572650000000060448201526064016106d6565b6040805163daf0b3c560e01b6020808301919091526bffffffffffffffffffffffff1930606090811b821660248501526038840187905246605885015288901b1660788301528251808303606c018152608c909201909252805191012060006110db82866114d1565b6001600160a01b0381166000908152600f602052604090205490915060ff166111465760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e61747572652f6d6573736167650000000000000060448201526064016106d6565b6000848152601260209081526040808320805460ff19166001179055805160608101909152602e8082529091612b569083013990506111998761118860035490565b611193906001612897565b83611ab8565b50505050505050565b60155460ff16156111c55760405162461bcd60e51b81526004016106d6906127b2565b3360009081526011602052604090205460ff1661121d5760405162461bcd60e51b815260206004820152601660248201527510d85b1b195c881b9bdd081dda1a5d195b1a5cdd195960521b60448201526064016106d6565b600082815260106020908152604091829020805460ff191660ff851690811790915582518581529182015233918101919091527ff8fa114c2a702f597cbc7426fcd7e5b18937b14664cc15c313dbe300accc69ee90606001610b8e565b6106ab8282611acc565b600d546001600160a01b031633146112ae5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16156113175760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c726561647920657869737473000000000060448201526064016106d6565b600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000818152600f6020908152604091829020805460ff19168517905581519283528201929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339101610c48565b826113ba8161095d565b156113d75760405162461bcd60e51b81526004016106d690612771565b60155460ff16156113fa5760405162461bcd60e51b81526004016106d6906127b2565b611406858585856119e9565b5050505050565b600e818154811061141d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600860205260409020546060906001600160a01b03166114955760405162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016106d6565b6002600c60008481526020019081526020016000206040516020016114bb92919061293c565b6040516020818303038152906040529050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008185604051602001611521929190612951565b604051602081830303815290604052805190602001209050600060018286604001518760000151886020015160405160008152602001604052604051611583949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156115a5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600d546001600160a01b03163314806115e25750336000908152600f602052604090205460ff165b61162e5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6106ab8282611b8a565b6002805461164590612737565b80601f016020809104026020016040519081016040528092919081815260200182805461167190612737565b80156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b505050505081565b600d546000906001600160a01b031633146116f35760405162461bcd60e51b81526004016106d6906127f1565b6015805460ff19168315159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29060200160405180910390a15060015b919050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600d546001600160a01b031633146117985760405162461bcd60e51b81526004016106d6906127f1565b6013805460ff1916911515919091179055565b6000818152600860205260408120546001600160a01b03166117cf575060ff919050565b5060009081526010602052604090205460ff1690565b60006117f082610928565b9050806001600160a01b0316836001600160a01b03160361184d5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336001600160a01b038216148061186957506118698133611740565b6118b55760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c730060448201526064016106d6565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b8061191c3382611bd4565b6119385760405162461bcd60e51b81526004016106d690612973565b6001600160a01b03841661195e5760405162461bcd60e51b81526004016106d69061281e565b6001600160a01b0383166119845760405162461bcd60e51b81526004016106d69061281e565b61198e8483611c33565b6119988483611cde565b6119a28383611e6b565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b816119f43382611bd4565b611a105760405162461bcd60e51b81526004016106d690612973565b611a1b858585611911565b611a2785858585611f51565b6114065760405162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b60448201526064016106d6565b610884611a7682610928565b82612005565b6002611a8882826129eb565b507fe6e4cd5c2dc7d2c20519b41832cd550fd3ea1186bf299d108179bf71fb8e00e581604051610c48919061228f565b611ac28282611b8a565b610e18838361211e565b336001600160a01b03831603611b1e5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600c60205260409020611ba282826129eb565b507f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd8282604051610b8e929190612aab565b600080611be083610928565b9050806001600160a01b0316846001600160a01b03161480611c1b57506000838152600960205260409020546001600160a01b038581169116145b80611c2b5750611c2b8185611740565b949350505050565b816001600160a01b0316611c4682610928565b6001600160a01b031614611c6c5760405162461bcd60e51b81526004016106d690612ac4565b6000818152600960205260409020546001600160a01b0316156106ab5760008181526009602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b816001600160a01b0316611cf182610928565b6001600160a01b031614611d175760405162461bcd60e51b81526004016106d690612ac4565b6001600160a01b0382166000908152600a6020526040902054611d3c90600190612884565b6001600160a01b0383166000818152600a60209081526040808320949094558482526008815283822080546001600160a01b031916905560068152838220549282526005905291822054909190611d9590600190612884565b6001600160a01b03851660009081526005602052604081208054929350909183908110611dc457611dc46127db565b906000526020600020015490508060056000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110611e0857611e086127db565b60009182526020808320909101929092556001600160a01b0387168152600590915260408120805484908110611e4057611e406127db565b6000918252602080832090910192909255948552600690526040808520859055908452909220555050565b6000818152600860205260409020546001600160a01b031615611ec75760405162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b60448201526064016106d6565b600081815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600a909152902054611f09906001612897565b6001600160a01b039092166000908152600a60209081526040808320949094556005815283822080546001810182559083528183208101849055928252600690529190912055565b6000611f65846001600160a01b03166121cc565b611f7157506001611c2b565b60405163785cf2dd60e11b81526000906001600160a01b0386169063f0b9e5ba90611fa490899088908890600401612b08565b6020604051808303816000875af1158015611fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe79190612b38565b6001600160e01b03191663785cf2dd60e11b14915050949350505050565b806120103382611bd4565b61202c5760405162461bcd60e51b81526004016106d690612973565b6120368383611c33565b6120408383611cde565b60008281526007602052604081205460035490919061206190600190612884565b9050600060038281548110612078576120786127db565b906000526020600020015490508060038481548110612099576120996127db565b9060005260206000200181905550600382815481106120ba576120ba6127db565b60009182526020808320909101829055868252600790526040808220829055828252808220859055518691906001600160a01b038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050505050565b6001600160a01b0382166121445760405162461bcd60e51b81526004016106d69061281e565b61214e8282611e6b565b600380546000838152600760205260408082208390556001830184559281527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b909101839055905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c2b575050151592915050565b6001600160e01b03198116811461088457600080fd5b60006020828403121561222d57600080fd5b813561223881612205565b9392505050565b60005b8381101561225a578181015183820152602001612242565b50506000910152565b6000815180845261227b81602086016020860161223f565b601f01601f19169290920160200192915050565b6020815260006122386020830184612263565b6000602082840312156122b457600080fd5b5035919050565b80356001600160a01b038116811461173b57600080fd5b600080604083850312156122e557600080fd5b6122ee836122bb565b946020939093013593505050565b60006020828403121561230e57600080fd5b612238826122bb565b60008060006060848603121561232c57600080fd5b612335846122bb565b9250612343602085016122bb565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561239257612392612353565b604052919050565b600067ffffffffffffffff8311156123b4576123b4612353565b6123c7601f8401601f1916602001612369565b90508281528383830111156123db57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261240357600080fd5b6122388383356020850161239a565b60006020828403121561242457600080fd5b813567ffffffffffffffff81111561243b57600080fd5b611c2b848285016123f2565b6000602080838503121561245a57600080fd5b823567ffffffffffffffff8082111561247257600080fd5b818501915085601f83011261248657600080fd5b81358181111561249857612498612353565b8060051b91506124a9848301612369565b81815291830184019184810190888411156124c357600080fd5b938501935b838510156124e8576124d9856122bb565b825293850193908501906124c8565b98975050505050505050565b803560ff8116811461173b57600080fd5b60006060828403121561251757600080fd5b6040516060810181811067ffffffffffffffff8211171561253a5761253a612353565b8060405250809150823581526020830135602082015261255c604084016124f4565b60408201525092915050565b600080600060a0848603121561257d57600080fd5b612586846122bb565b92506125958560208601612505565b9150608084013590509250925092565b600080604083850312156125b857600080fd5b823591506125c8602084016124f4565b90509250929050565b8035801515811461173b57600080fd5b600080604083850312156125f457600080fd5b6125fd836122bb565b91506125c8602084016125d1565b6000806000806080858703121561262157600080fd5b61262a856122bb565b9350612638602086016122bb565b925060408501359150606085013567ffffffffffffffff81111561265b57600080fd5b8501601f8101871361266c57600080fd5b61267b8782356020840161239a565b91505092959194509250565b6000806080838503121561269a57600080fd5b823591506125c88460208501612505565b600080604083850312156126be57600080fd5b82359150602083013567ffffffffffffffff8111156126dc57600080fd5b6126e8858286016123f2565b9150509250929050565b60006020828403121561270457600080fd5b612238826125d1565b6000806040838503121561272057600080fd5b612729836122bb565b91506125c8602084016122bb565b600181811c9082168061274b57607f821691505b60208210810361276b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f4f6e6c792031206d696e74207061737320616c6c6f77656420706572207573656040820152603960f91b606082015260800190565b6020808252600f908201526e10dbdb9d1c9858dd081c185d5cd959608a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60208082526018908201527f5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161287d5761287d612855565b5060010190565b8181038181111561079457610794612855565b8082018082111561079457610794612855565b600060ff821660ff81036128c0576128c0612855565b60010192915050565b600081546128d681612737565b600182811680156128ee576001811461290357612932565b60ff1984168752821515830287019450612932565b8560005260208060002060005b858110156129295781548a820152908401908201612910565b50505082870194505b5050505092915050565b6000611c2b61294b83866128c9565b846128c9565b6000835161296381846020880161223f565b9190910191825250602001919050565b60208082526010908201526f21b0b7103737ba103a3930b739b332b960811b604082015260600190565b601f821115610e1857600081815260208120601f850160051c810160208610156129c45750805b601f850160051c820191505b818110156129e3578281556001016129d0565b505050505050565b815167ffffffffffffffff811115612a0557612a05612353565b612a1981612a138454612737565b8461299d565b602080601f831160018114612a4e5760008415612a365750858301515b600019600386901b1c1916600185901b1785556129e3565b600085815260208120601f198616915b82811015612a7d57888601518255948401946001909101908401612a5e565b5085821015612a9b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000611c2b6040830184612263565b60208082526024908201527f417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f6040820152633bb6b2b960e11b606082015260800190565b60018060a01b0384168152826020820152606060408201526000612b2f6060830184612263565b95945050505050565b600060208284031215612b4a57600080fd5b81516122388161220556fe516d5879563248555037687638586a783358365a4c55554d486b787364527551685a394477707a5a714831366a44a264697066735822122005c34c2317476cebbf44a2a9259f839740e5aeb2f2c84ecd93ff594547bc57f464736f6c63430008100033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenUri (string): ipfs://

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [2] : 697066733a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

115:5581:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17697:168:1;;;;;;:::i;:::-;-1:-1:-1;;;;;;17824:33:1;17795:4;17824:33;;;:19;:33;;;;;;;;;17697:168;;;;565:14:8;;558:22;540:41;;528:2;513:18;17697:168:1;;;;;;;;3128:85;;;:::i;:::-;;;;;;;:::i;6162:119::-;;;;;;:::i;:::-;6222:7;6249:24;;;:14;:24;;;;;;-1:-1:-1;;;;;6249:24:1;;6162:119;;;;-1:-1:-1;;;;;1697:32:8;;;1679:51;;1667:2;1652:18;6162:119:1;1533:203:8;531:103:2;;;;;;:::i;:::-;;:::i;:::-;;153:45:6;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17078:95:1;17149:9;:16;17078:95;;;2515:25:8;;;2503:2;2488:18;17078:95:1;2369:177:8;3286:211:5;;;;;;:::i;:::-;;:::i;16681:239:1:-;;;;;;:::i;:::-;;:::i;4427:125:5:-;;;;;;:::i;:::-;;:::i;384:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3505:225;;;;;;:::i;:::-;;:::i;4001:97::-;;;;;;:::i;:::-;;:::i;4922:153:1:-;;;;;;:::i;:::-;4977:4;5010:20;;;:10;:20;;;;;;-1:-1:-1;;;;;5010:20:1;5048:19;;;4922:153;17519:170;;;;;;:::i;:::-;;:::i;4286:133:5:-;;;;;;:::i;:::-;;:::i;4515:210:1:-;;;;;;:::i;:::-;;:::i;4100:183::-;;;;;;:::i;:::-;;:::i;1988:587:6:-;;;;;;:::i;:::-;;:::i;2821:221::-;;;;;;:::i;:::-;;:::i;2509:456:5:-;;;;;;:::i;:::-;;:::i;972:208:6:-;;;;;;:::i;:::-;;:::i;4560:128:5:-;;;;;;:::i;:::-;;:::i;88:20:6:-;;;;;-1:-1:-1;;;;;88:20:6;;;3327:89:1;;;:::i;1580:921:5:-;;;;;;:::i;:::-;;:::i;2973:305::-;;;;;;:::i;:::-;;:::i;642:122:2:-;;;;;;:::i;:::-;;:::i;1469:261:6:-;;;;;;:::i;:::-;;:::i;692:28:5:-;;;;;;;;;3738:255;;;;;;:::i;:::-;;:::i;115:29:6:-;;;;;;:::i;:::-;;:::i;2046:267:2:-;;;;;;:::i;:::-;;:::i;4979:369:5:-;;;;;;:::i;:::-;;:::i;4112:166::-;;;;;;:::i;:::-;;:::i;745:26:1:-;;;:::i;634:24:5:-;;;;;;552;;;;;;;;;494:49;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4806:165;;;;;;:::i;:::-;;:::i;7167:182:1:-;;;;;;:::i;:::-;;:::i;4696:102:5:-;;;;;;:::i;:::-;;:::i;5356:166::-;;;;;;:::i;:::-;;:::i;:::-;;;8982:4:8;8970:17;;;8952:36;;8940:2;8925:18;5356:166:5;8810:184:8;3128:85:1;3167:13;3200:5;3193:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3128:85;:::o;531:103:2:-;597:29;612:3;617:8;597:14;:29::i;:::-;531:103;;:::o;3286:211:5:-;3422:3;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;;;;;;;;;1365:8:::1;::::0;::::1;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::1;;;;;;;:::i;:::-;3448:41:::2;3468:5;3475:3;3480:8;3448:19;:41::i;:::-;3286:211:::0;;;;:::o;16681:239:1:-;16790:7;16832:17;16842:6;16832:9;:17::i;:::-;16823:6;:26;16815:52;;;;-1:-1:-1;;;16815:52:1;;10332:2:8;16815:52:1;;;10314:21:8;10371:2;10351:18;;;10344:30;-1:-1:-1;;;10390:18:8;;;10383:43;10443:18;;16815:52:1;10130:337:8;16815:52:1;-1:-1:-1;;;;;16885:19:1;;;;;;:11;:19;;;;;:27;;16905:6;;16885:27;;;;;;:::i;:::-;;;;;;;;;16878:34;;16681:239;;;;;:::o;4427:125:5:-;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;4507:30:5::1;;::::0;;;:13:::1;:30;::::0;;;;:37;;-1:-1:-1;;4507:37:5::1;4540:4;4507:37;::::0;;4427:125::o;3505:225::-;3645:3;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;1365:8:::1;::::0;::::1;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::1;;;;;;;:::i;:::-;3671:51:::2;3695:5;3702:3;3707:8;3671:51;;;;;;;;;;;;;-1:-1:-1::0;;;3671:51:5::2;;::::0;:23:::2;:51::i;4001:97::-:0;1365:8;;;;1364:9;1356:37;;;;-1:-1:-1;;;1356:37:5;;;;;;;:::i;:::-;4070:20:::1;4081:8;4070:10;:20::i;:::-;4001:97:::0;:::o;17519:170:1:-;17578:7;17615:13;17149:9;:16;;17078:95;17615:13;17606:6;:22;17598:48;;;;-1:-1:-1;;;17598:48:1;;10332:2:8;17598:48:1;;;10314:21:8;10371:2;10351:18;;;10344:30;-1:-1:-1;;;10390:18:8;;;10383:43;10443:18;;17598:48:1;10130:337:8;17598:48:1;17664:9;17674:6;17664:17;;;;;;;;:::i;:::-;;;;;;;;;17657:24;;17519:170;;;:::o;4286:133:5:-;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;4371:40:5::1;4397:13;4371:25;:40::i;4515:210:1:-:0;4571:7;4607:20;;;:10;:20;;;;;;-1:-1:-1;;;;;4607:20:1;;4638:56;;;;-1:-1:-1;;;4638:56:1;;;;;;;:::i;4100:183::-;4156:7;-1:-1:-1;;;;;4184:20:1;;4176:57;;;;-1:-1:-1;;;4176:57:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4251:24:1;;;;;:16;:24;;;;;;;4100:183::o;1988:587:6:-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;2072:26:6;::::1;;::::0;;;:13:::1;:26;::::0;;;;;::::1;;2064:66;;;::::0;-1:-1:-1;;;2064:66:6;;11507:2:8;2064:66:6::1;::::0;::::1;11489:21:8::0;11546:2;11526:18;;;11519:30;11585:29;11565:18;;;11558:57;11632:18;;2064:66:6::1;11305:351:8::0;2064:66:6::1;2141:18;::::0;2170:127:::1;2194:12;:19:::0;2190:23;::::1;2170:127;;;2258:11;-1:-1:-1::0;;;;;2239:30:6::1;:12;2252:1;2239:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;2239:15:6::1;:30:::0;2235:50:::1;;2284:1;2271:14;;2235:50;2215:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2170:127;;;-1:-1:-1::0;2376:12:6::1;2389:19:::0;;:23:::1;::::0;2411:1:::1;::::0;2389:23:::1;:::i;:::-;2376:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;2349:12:::1;:24:::0;;-1:-1:-1;;;;;2376:37:6;;::::1;::::0;2362:10;;2349:24;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:64:::0;;-1:-1:-1;;;;;;2349:64:6::1;-1:-1:-1::0;;;;;2349:64:6;;;::::1;::::0;;;::::1;::::0;;2431:12:::1;2444:19:::0;;:23:::1;::::0;-1:-1:-1;;2444:23:6::1;:::i;:::-;2431:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;2424:44:::0;;-1:-1:-1;;;;;;2424:44:6::1;::::0;;-1:-1:-1;;;;;2479:26:6;::::1;::::0;;;:13:::1;:26:::0;;;;;;:34;;-1:-1:-1;;2479:34:6::1;::::0;;2529:38;;12234:51:8;;;12301:18;;;12294:50;;;;2529:38:6::1;::::0;12207:18:8;2529:38:6::1;;;;;;;;2053:522;1988:587:::0;:::o;2821:221::-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;2909:15:::1;2928:9;2909:28;2901:53;;;::::0;-1:-1:-1;;;2901:53:6;;12557:2:8;2901:53:6::1;::::0;::::1;12539:21:8::0;12596:2;12576:18;;;12569:30;-1:-1:-1;;;12615:18:8;;;12608:42;12667:18;;2901:53:6::1;12355:336:8::0;2901:53:6::1;2965:5;:18:::0;;-1:-1:-1;;;;;;2965:18:6::1;::::0;;2999:35:::1;::::0;;3016:10:::1;12908:34:8::0;;-1:-1:-1;12973:2:8;12958:18;;12951:43;2999:35:6::1;::::0;12843:18:8;2999:35:6::1;;;;;;;;2821:221:::0;:::o;2509:456:5:-;1264:12;;;;1263:13;1255:41;;;;-1:-1:-1;;;1255:41:5;;13207:2:8;1255:41:5;;;13189:21:8;13246:2;13226:18;;;13219:30;-1:-1:-1;;;13265:18:8;;;13258:45;13320:18;;1255:41:5;13005:339:8;1255:41:5;616:5:6::1;::::0;-1:-1:-1;;;;;616:5:6::1;602:10;:19;::::0;:48:::1;;-1:-1:-1::0;639:10:6::1;625:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;602:48;580:127;;;::::0;-1:-1:-1;;;580:127:6;;13551:2:8;580:127:6::1;::::0;::::1;13533:21:8::0;13590:2;13570:18;;;13563:30;13629:31;13609:18;;;13602:59;13678:18;;580:127:6::1;13349:353:8::0;580:127:6::1;2646:9:5::2;::::0;2631:12;;17149:9:1;:16;2615:28:5::2;;;;:::i;:::-;:40;2607:69;;;::::0;-1:-1:-1;;;2607:69:5;;14039:2:8;2607:69:5::2;::::0;::::2;14021:21:8::0;14078:2;14058:18;;;14051:30;-1:-1:-1;;;14097:18:8;;;14090:46;14153:18;;2607:69:5::2;13837:340:8::0;2607:69:5::2;2687:17;:68;;;;;;;;;;;;;;;;;;;2770:7;2766:192;2783:5;:12;2781:1;:14;;;2766:192;;;2825:19;2835:5;2841:1;2835:8;;;;;;;;;;:::i;:::-;;;;;;;2825:9;:19::i;:::-;:24:::0;2817:70:::2;;;;-1:-1:-1::0;;;2817:70:5::2;;;;;;;:::i;:::-;2902:44;2913:5;2919:1;2913:8;;;;;;;;;;:::i;:::-;;;;;;;2923:13;17149:9:1::0;:16;;17078:95;2923:13:5::2;:17;::::0;2939:1:::2;2923:17;:::i;:::-;2942:3;2902:10;:44::i;:::-;2797:3:::0;::::2;::::0;::::2;:::i;:::-;;;;2766:192;;;;2596:369;2509:456:::0;:::o;972:208:6:-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;1048:25:6;::::1;1040:53;;;::::0;-1:-1:-1;;;1040:53:6;;14564:2:8;1040:53:6::1;::::0;::::1;14546:21:8::0;14603:2;14583:18;;;14576:30;-1:-1:-1;;;14622:18:8;;;14615:45;14677:18;;1040:53:6::1;14362:339:8::0;1040:53:6::1;1104:5;:17:::0;;-1:-1:-1;;;;;;1104:17:6::1;-1:-1:-1::0;;;;;1104:17:6;::::1;::::0;;::::1;::::0;;;1137:35:::1;::::0;;1154:10:::1;12908:34:8::0;;12973:2;12958:18;;12951:43;;;;1137:35:6::1;::::0;12843:18:8;1137:35:6::1;12696:304:8::0;4560:128:5;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;4642:30:5::1;4675:5;4642:30:::0;;;:13:::1;:30;::::0;;;;:38;;-1:-1:-1;;4642:38:5::1;::::0;;4560:128::o;3327:89:1:-;3368:13;3401:7;3394:14;;;;;:::i;1580:921:5:-;1721:4;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;1264:12:::1;::::0;::::1;;1263:13;1255:41;;;::::0;-1:-1:-1;;;1255:41:5;;13207:2:8;1255:41:5::1;::::0;::::1;13189:21:8::0;13246:2;13226:18;;;13219:30;-1:-1:-1;;;13265:18:8;;;13258:45;13320:18;;1255:41:5::1;13005:339:8::0;1255:41:5::1;1365:8:::2;::::0;::::2;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::2;;;;;;;:::i;:::-;1784:9:::3;::::0;17149::1;:16;1768:25:5::3;1760:54;;;::::0;-1:-1:-1;;;1760:54:5;;14039:2:8;1760:54:5::3;::::0;::::3;14021:21:8::0;14078:2;14058:18;;;14051:30;-1:-1:-1;;;14097:18:8;;;14090:46;14153:18;;1760:54:5::3;13837:340:8::0;1760:54:5::3;1848:30;::::0;;;:17:::3;:30;::::0;;;;;::::3;;1847:31;1825:109;;;::::0;-1:-1:-1;;;1825:109:5;;14908:2:8;1825:109:5::3;::::0;::::3;14890:21:8::0;14947:2;14927:18;;;14920:30;14986;14966:18;;;14959:58;15034:18;;1825:109:5::3;14706:352:8::0;1825:109:5::3;1984:191;::::0;;-1:-1:-1;;;1984:191:5::3;::::0;;::::3;15302:46:8::0;;;;-1:-1:-1;;2071:4:5::3;15435:2:8::0;15431:15;;;15427:24;;15414:11;;;15407:45;15468:12;;;15461:28;;;5646:9:5;15505:12:8;;;15498:28;15560:15;;;15556:24;15542:12;;;15535:46;1984:191:5;;;;;;;;;15597:13:8;;;;1984:191:5;;;1960:226;;;::::3;::::0;-1:-1:-1;2214:31:5::3;1960:226:::0;2230:14;2214:9:::3;:31::i;:::-;-1:-1:-1::0;;;;;2264:21:5;::::3;;::::0;;;:13:::3;:21;::::0;;;;;2197:48;;-1:-1:-1;2264:21:5::3;;2256:59;;;::::0;-1:-1:-1;;;2256:59:5;;15823:2:8;2256:59:5::3;::::0;::::3;15805:21:8::0;15862:2;15842:18;;;15835:30;15901:27;15881:18;;;15874:55;15946:18;;2256:59:5::3;15621:349:8::0;2256:59:5::3;2326:30;::::0;;;:17:::3;:30;::::0;;;;;;;:37;;-1:-1:-1;;2326:37:5::3;2359:4;2326:37;::::0;;2374:68;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;;;::::3;::::0;;::::3;;;;2453:40;2464:4;2470:13;17149:9:1::0;:16;;17078:95;2470:13:5::3;:17;::::0;2486:1:::3;2470:17;:::i;:::-;2489:3;2453:10;:40::i;:::-;1749:752;;;1580:921:::0;;;;:::o;2973:305::-;1365:8;;;;1364:9;1356:37;;;;-1:-1:-1;;;1356:37:5;;;;;;;:::i;:::-;3114:10:::1;3100:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;3092:60;;;::::0;-1:-1:-1;;;3092:60:5;;16177:2:8;3092:60:5::1;::::0;::::1;16159:21:8::0;16216:2;16196:18;;;16189:30;-1:-1:-1;;;16235:18:8;;;16228:52;16297:18;;3092:60:5::1;15975:346:8::0;3092:60:5::1;3163:22;::::0;;;:13:::1;:22;::::0;;;;;;;;:39;;-1:-1:-1;;3163:39:5::1;;::::0;::::1;::::0;;::::1;::::0;;;3218:52;;16524:25:8;;;16565:18;;;16558:45;3259:10:5::1;16619:18:8::0;;;16612:60;;;;3218:52:5::1;::::0;16512:2:8;16497:18;3218:52:5::1;16326:352:8::0;642:122:2;716:40;741:3;746:9;716:24;:40::i;1469:261:6:-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;1546:21:6;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;1545:22;1537:62;;;::::0;-1:-1:-1;;;1537:62:6;;16885:2:8;1537:62:6::1;::::0;::::1;16867:21:8::0;16924:2;16904:18;;;16897:30;16963:29;16943:18;;;16936:57;17010:18;;1537:62:6::1;16683:351:8::0;1537:62:6::1;1610:12;:25:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;1610:25:6::1;-1:-1:-1::0;;;;;1610:25:6;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1646:21:6;;;:13:::1;1610:25;1646:21:::0;;;;;;;;:28;;-1:-1:-1;;1646:28:6::1;::::0;::::1;::::0;;1690:32;;12234:51:8;;;12301:18;;12294:50;;;;1690:32:6::1;::::0;12207:18:8;1690:32:6::1;12066:284:8::0;3738:255:5;3907:3;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;1365:8:::1;::::0;::::1;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::1;;;;;;;:::i;:::-;3933:52:::2;3957:5;3964:3;3969:8;3979:5;3933:23;:52::i;:::-;3738:255:::0;;;;;:::o;115:29:6:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115:29:6;;-1:-1:-1;115:29:6;:::o;2046:267:2:-;4977:4:1;5010:20;;;:10;:20;;;;;;2148:13:2;;-1:-1:-1;;;;;5010:20:1;2179:49:2;;;;-1:-1:-1;;;2179:49:2;;17241:2:8;2179:49:2;;;17223:21:8;17280:2;17260:18;;;17253:30;-1:-1:-1;;;17299:18:8;;;17292:50;17359:18;;2179:49:2;17039:344:8;2179:49:2;2270:12;2284:9;:19;2294:8;2284:19;;;;;;;;;;;2253:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2239:66;;2046:267;;;:::o;4979:369:5:-;5085:7;5110:19;:56;;;;;;;;;;;;;;;;;;;5177:20;5227:6;5235:7;5210:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5200:44;;;;;;5177:67;;5255:14;5272:44;5282:12;5296:3;:5;;;5303:3;:5;;;5310:3;:5;;;5272:44;;;;;;;;;;;;;;;;;19138:25:8;;;19211:4;19199:17;;;;19194:2;19179:18;;19172:45;19248:2;19233:18;;19226:34;19291:2;19276:18;;19269:34;19125:3;19110:19;;18911:398;5272:44:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5272:44:5;;-1:-1:-1;;5272:44:5;;;4979:369;-1:-1:-1;;;;;;;4979:369:5:o;4112:166::-;616:5:6;;-1:-1:-1;;;;;616:5:6;602:10;:19;;:48;;-1:-1:-1;639:10:6;625:25;;;;:13;:25;;;;;;;;602:48;580:127;;;;-1:-1:-1;;;580:127:6;;13551:2:8;580:127:6;;;13533:21:8;13590:2;13570:18;;;13563:30;13629:31;13609:18;;;13602:59;13678:18;;580:127:6;13349:353:8;580:127:6;4233:37:5::1;4255:8;4265:4;4233:21;:37::i;745:26:1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4806:165:5:-;483:5:6;;4871:4:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;4888:8:5::1;:20:::0;;-1:-1:-1;;4888:20:5::1;::::0;::::1;;::::0;;::::1;::::0;;;4924:17:::1;::::0;540:41:8;;;4924:17:5::1;::::0;528:2:8;513:18;4924:17:5::1;;;;;;;-1:-1:-1::0;4959:4:5::1;523:1:6;4806:165:5::0;;;:::o;7167:182:1:-;-1:-1:-1;;;;;7305:25:1;;;7276:4;7305:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;7167:182::o;4696:102:5:-;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;4765:12:5::1;:25:::0;;-1:-1:-1;;4765:25:5::1;::::0;::::1;;::::0;;;::::1;::::0;;4696:102::o;5356:166::-;5419:5;5010:20:1;;;:10;:20;;;;;;-1:-1:-1;;;;;5010:20:1;5437:37:5;;-1:-1:-1;814:3:5;;5356:166;-1:-1:-1;5356:166:5:o;5437:37::-;-1:-1:-1;5492:22:5;;;;:13;:22;;;;;;;;;5356:166::o;5508:408:1:-;5577:13;5593:17;5601:8;5593:7;:17::i;:::-;5577:33;;5636:5;-1:-1:-1;;;;;5629:12:1;:3;-1:-1:-1;;;;;5629:12:1;;5621:48;;;;-1:-1:-1;;;5621:48:1;;19516:2:8;5621:48:1;;;19498:21:8;19555:2;19535:18;;;19528:30;-1:-1:-1;;;19574:18:8;;;19567:53;19637:18;;5621:48:1;19314:347:8;5621:48:1;5702:10;-1:-1:-1;;;;;5702:19:1;;;;:58;;;5725:35;5742:5;5749:10;5725:16;:35::i;:::-;5680:139;;;;-1:-1:-1;;;5680:139:1;;19868:2:8;5680:139:1;;;19850:21:8;19907:2;19887:18;;;19880:30;19946:33;19926:18;;;19919:61;19997:18;;5680:139:1;19666:355:8;5680:139:1;5832:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;;;;;5832:30:1;-1:-1:-1;;;;;5832:30:1;;;;;;;;;5878;;5832:24;;5878:30;;;;;;;5566:350;5508:408;;:::o;7796:444::-;7920:8;2363:39;2381:10;2393:8;2363:17;:39::i;:::-;2355:68;;;;-1:-1:-1;;;2355:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7949:19:1;::::1;7941:56;;;;-1:-1:-1::0;;;7941:56:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8016:17:1;::::1;8008:54;;;;-1:-1:-1::0;;;8008:54:1::1;;;;;;;:::i;:::-;8075:30;8089:5;8096:8;8075:13;:30::i;:::-;8116:32;8132:5;8139:8;8116:15;:32::i;:::-;8159:25;8170:3;8175:8;8159:10;:25::i;:::-;8223:8;8218:3;-1:-1:-1::0;;;;;8202:30:1::1;8211:5;-1:-1:-1::0;;;;;8202:30:1::1;;;;;;;;;;;7796:444:::0;;;;:::o;9853:405::-;10010:8;2363:39;2381:10;2393:8;2363:17;:39::i;:::-;2355:68;;;;-1:-1:-1;;;2355:68:1;;;;;;;:::i;:::-;10031:35:::1;10045:5;10052:3;10057:8;10031:13;:35::i;:::-;10149:53;10174:5;10181:3;10186:8;10196:5;10149:24;:53::i;:::-;10127:123;;;::::0;-1:-1:-1;;;10127:123:1;;20573:2:8;10127:123:1::1;::::0;::::1;20555:21:8::0;20612:2;20592:18;;;20585:30;-1:-1:-1;;;20631:18:8;;;20624:50;20691:18;;10127:123:1::1;20371:344:8::0;1932:106:2;1990:40;2002:17;2010:8;2002:7;:17::i;:::-;2021:8;1990:11;:40::i;1557:164::-;1635:12;:28;1650:13;1635:12;:28;:::i;:::-;;1679:34;1699:13;1679:34;;;;;;:::i;1729:195::-;1848:31;1864:8;1874:4;1848:15;:31::i;:::-;1890:26;1902:3;1907:8;1890:11;:26::i;6583:253:1:-;6675:10;-1:-1:-1;;;;;6668:17:1;;;6660:53;;;;-1:-1:-1;;;6660:53:1;;19516:2:8;6660:53:1;;;19498:21:8;19555:2;19535:18;;;19528:30;-1:-1:-1;;;19574:18:8;;;19567:53;19637:18;;6660:53:1;19314:347:8;6660:53:1;6742:10;6724:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;6724:34:1;;;;;;;;;;;;:46;;-1:-1:-1;;6724:46:1;;;;;;;;;;6786:42;;540:41:8;;;6724:34:1;;6742:10;6786:42;;513:18:8;6786:42:1;;;;;;;6583:253;;:::o;1385:164:2:-;1468:19;;;;:9;:19;;;;;:26;1490:4;1468:19;:26;:::i;:::-;;1510:31;1526:8;1536:4;1510:31;;;;;;;:::i;10630:474:1:-;10743:4;10765:13;10781:17;10789:8;10781:7;:17::i;:::-;10765:33;;10990:5;-1:-1:-1;;;;;10978:17:1;:8;-1:-1:-1;;;;;10978:17:1;;:67;;;-1:-1:-1;6222:7:1;6249:24;;;:14;:24;;;;;;-1:-1:-1;;;;;11012:33:1;;;6249:24;;11012:33;10978:67;:117;;;;11062:33;11079:5;11086:8;11062:16;:33::i;:::-;10970:126;10630:474;-1:-1:-1;;;;10630:474:1:o;12890:374::-;13010:6;-1:-1:-1;;;;;12989:27:1;:17;12997:8;12989:7;:17::i;:::-;-1:-1:-1;;;;;12989:27:1;;12967:113;;;;-1:-1:-1;;;12967:113:1;;;;;;;:::i;:::-;13131:1;13095:24;;;:14;:24;;;;;;-1:-1:-1;;;;;13095:24:1;:38;13091:166;;13185:1;13150:24;;;:14;:24;;;;;;:37;;-1:-1:-1;;;;;;13150:37:1;;;13207:38;13165:8;;13185:1;-1:-1:-1;;;;;13207:38:1;;;;;13185:1;;13207:38;12890:374;;:::o;14226:1107::-;14347:5;-1:-1:-1;;;;;14326:26:1;:17;14334:8;14326:7;:17::i;:::-;-1:-1:-1;;;;;14326:26:1;;14304:112;;;;-1:-1:-1;;;14304:112:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;14453:23:1;;;;;;:16;:23;;;;;;:27;;14479:1;;14453:27;:::i;:::-;-1:-1:-1;;;;;14427:23:1;;;;;;:16;:23;;;;;;;;:53;;;;14491:20;;;:10;:20;;;;;:33;;-1:-1:-1;;;;;;14491:33:1;;;14556:16;:26;;;;;;14618:18;;;:11;:18;;;;;:25;14556:26;;14427:23;14618:29;;14491:33;;14618:29;:::i;:::-;-1:-1:-1;;;;;14678:18:1;;14658:17;14678:18;;;:11;:18;;;;;:34;;14593:54;;-1:-1:-1;14658:17:1;;14593:54;;14678:34;;;;;;:::i;:::-;;;;;;;;;14658:54;;14758:9;14725:11;:18;14737:5;-1:-1:-1;;;;;14725:18:1;-1:-1:-1;;;;;14725:18:1;;;;;;;;;;;;14744:10;14725:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;14778:18:1;;;;:11;:18;;;;;;:34;;14797:14;;14778:34;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;15244:26;;;:16;:26;;;;;;:30;;;15285:27;;;;;;:40;-1:-1:-1;;14226:1107:1:o;13546:382::-;13657:1;13625:20;;;:10;:20;;;;;;-1:-1:-1;;;;;13625:20:1;:34;13617:67;;;;-1:-1:-1;;;13617:67:1;;23701:2:8;13617:67:1;;;23683:21:8;23740:2;23720:18;;;23713:30;-1:-1:-1;;;23759:18:8;;;23752:50;23819:18;;13617:67:1;23499:344:8;13617:67:1;13695:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;13695:26:1;-1:-1:-1;;;;;13695:26:1;;;;;;;;13756:21;;:16;:21;;;;;;:25;;-1:-1:-1;13756:25:1;:::i;:::-;-1:-1:-1;;;;;13732:21:1;;;;;;;:16;:21;;;;;;;;:49;;;;13809:11;:16;;;;;:23;;13843:31;;;;;;;;;;;;;;;;13885:26;;;:16;:26;;;;;;:35;13546:382::o;15870:428::-;16031:4;16053:16;:3;-1:-1:-1;;;;;16053:14:1;;:16::i;:::-;16048:61;;-1:-1:-1;16093:4:1;16086:11;;16048:61;16135:110;;-1:-1:-1;;;16135:110:1;;16119:13;;-1:-1:-1;;;;;16135:36:1;;;;;:110;;16186:5;;16206:8;;16229:5;;16135:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;16264:25:1;-1:-1:-1;;;16264:25:1;;-1:-1:-1;;15870:428:1;;;;;;:::o;11886:720::-;11974:8;2363:39;2381:10;2393:8;2363:17;:39::i;:::-;2355:68;;;;-1:-1:-1;;;2355:68:1;;;;;;;:::i;:::-;12000:31:::1;12014:6;12022:8;12000:13;:31::i;:::-;12042:33;12058:6;12066:8;12042:15;:33::i;:::-;12123:18;12144:24:::0;;;:14:::1;:24;::::0;;;;;12204:9:::1;:16:::0;12144:24;;12123:18;12204:20:::1;::::0;12223:1:::1;::::0;12204:20:::1;:::i;:::-;12179:45;;12235:17;12255:9;12265:14;12255:25;;;;;;;;:::i;:::-;;;;;;;;;12235:45;;12317:9;12293;12303:10;12293:21;;;;;;;;:::i;:::-;;;;;;;;:33;;;;12344:9;12354:14;12344:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;12337:32:::0;;;12467:24;;;:14:::1;:24:::0;;;;;;:28;;;12506:25;;;;;;:38;;;12560;12482:8;;12344:25;-1:-1:-1;;;;;12560:38:1;::::1;::::0;::::1;::::0;12344:25;;12560:38:::1;11989:617;;;11886:720:::0;;;:::o;11375:306::-;-1:-1:-1;;;;;11449:17:1;;11441:54;;;;-1:-1:-1;;;11441:54:1;;;;;;;:::i;:::-;11506:25;11517:3;11522:8;11506:10;:25::i;:::-;11569:9;:16;;11542:24;;;;:14;:24;;;;;;:43;;;11596:24;;;;;;;;;;;;;;;11638:35;;11557:8;;-1:-1:-1;;;;;11638:35:1;;;;;11542:24;;11638:35;11375:306;;:::o;496:641:0:-;556:4;1037:20;;867:66;1086:23;;;;;;:42;;-1:-1:-1;;1113:15:0;;;1078:51;-1:-1:-1;;496:641:0:o;14:131:8:-;-1:-1:-1;;;;;;88:32:8;;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:8:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:8;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:8;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:8:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:8;;1348:180;-1:-1:-1;1348:180:8:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:8;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:8:o;2178:186::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:29;2348:9;2329:29;:::i;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;2884:127::-;2945:10;2940:3;2936:20;2933:1;2926:31;2976:4;2973:1;2966:15;3000:4;2997:1;2990:15;3016:275;3087:2;3081:9;3152:2;3133:13;;-1:-1:-1;;3129:27:8;3117:40;;3187:18;3172:34;;3208:22;;;3169:62;3166:88;;;3234:18;;:::i;:::-;3270:2;3263:22;3016:275;;-1:-1:-1;3016:275:8:o;3296:407::-;3361:5;3395:18;3387:6;3384:30;3381:56;;;3417:18;;:::i;:::-;3455:57;3500:2;3479:15;;-1:-1:-1;;3475:29:8;3506:4;3471:40;3455:57;:::i;:::-;3446:66;;3535:6;3528:5;3521:21;3575:3;3566:6;3561:3;3557:16;3554:25;3551:45;;;3592:1;3589;3582:12;3551:45;3641:6;3636:3;3629:4;3622:5;3618:16;3605:43;3695:1;3688:4;3679:6;3672:5;3668:18;3664:29;3657:40;3296:407;;;;;:::o;3708:222::-;3751:5;3804:3;3797:4;3789:6;3785:17;3781:27;3771:55;;3822:1;3819;3812:12;3771:55;3844:80;3920:3;3911:6;3898:20;3891:4;3883:6;3879:17;3844:80;:::i;3935:322::-;4004:6;4057:2;4045:9;4036:7;4032:23;4028:32;4025:52;;;4073:1;4070;4063:12;4025:52;4113:9;4100:23;4146:18;4138:6;4135:30;4132:50;;;4178:1;4175;4168:12;4132:50;4201;4243:7;4234:6;4223:9;4219:22;4201:50;:::i;4262:952::-;4346:6;4377:2;4420;4408:9;4399:7;4395:23;4391:32;4388:52;;;4436:1;4433;4426:12;4388:52;4476:9;4463:23;4505:18;4546:2;4538:6;4535:14;4532:34;;;4562:1;4559;4552:12;4532:34;4600:6;4589:9;4585:22;4575:32;;4645:7;4638:4;4634:2;4630:13;4626:27;4616:55;;4667:1;4664;4657:12;4616:55;4703:2;4690:16;4725:2;4721;4718:10;4715:36;;;4731:18;;:::i;:::-;4777:2;4774:1;4770:10;4760:20;;4800:28;4824:2;4820;4816:11;4800:28;:::i;:::-;4862:15;;;4932:11;;;4928:20;;;4893:12;;;;4960:19;;;4957:39;;;4992:1;4989;4982:12;4957:39;5016:11;;;;5036:148;5052:6;5047:3;5044:15;5036:148;;;5118:23;5137:3;5118:23;:::i;:::-;5106:36;;5069:12;;;;5162;;;;5036:148;;;5203:5;4262:952;-1:-1:-1;;;;;;;;4262:952:8:o;5219:156::-;5285:20;;5345:4;5334:16;;5324:27;;5314:55;;5365:1;5362;5355:12;5380:544;5436:5;5484:4;5472:9;5467:3;5463:19;5459:30;5456:50;;;5502:1;5499;5492:12;5456:50;5535:2;5529:9;5577:4;5569:6;5565:17;5648:6;5636:10;5633:22;5612:18;5600:10;5597:34;5594:62;5591:88;;;5659:18;;:::i;:::-;5699:10;5695:2;5688:22;;5728:6;5719:15;;5771:9;5758:23;5750:6;5743:39;5843:2;5832:9;5828:18;5815:32;5810:2;5802:6;5798:15;5791:57;5881:36;5913:2;5902:9;5898:18;5881:36;:::i;:::-;5876:2;5868:6;5864:15;5857:61;;5380:544;;;;:::o;5929:375::-;6033:6;6041;6049;6102:3;6090:9;6081:7;6077:23;6073:33;6070:53;;;6119:1;6116;6109:12;6070:53;6142:29;6161:9;6142:29;:::i;:::-;6132:39;;6190:56;6238:7;6233:2;6222:9;6218:18;6190:56;:::i;:::-;6180:66;;6293:3;6282:9;6278:19;6265:33;6255:43;;5929:375;;;;;:::o;6309:250::-;6375:6;6383;6436:2;6424:9;6415:7;6411:23;6407:32;6404:52;;;6452:1;6449;6442:12;6404:52;6488:9;6475:23;6465:33;;6517:36;6549:2;6538:9;6534:18;6517:36;:::i;:::-;6507:46;;6309:250;;;;;:::o;6564:160::-;6629:20;;6685:13;;6678:21;6668:32;;6658:60;;6714:1;6711;6704:12;6729:254;6794:6;6802;6855:2;6843:9;6834:7;6830:23;6826:32;6823:52;;;6871:1;6868;6861:12;6823:52;6894:29;6913:9;6894:29;:::i;:::-;6884:39;;6942:35;6973:2;6962:9;6958:18;6942:35;:::i;6988:667::-;7083:6;7091;7099;7107;7160:3;7148:9;7139:7;7135:23;7131:33;7128:53;;;7177:1;7174;7167:12;7128:53;7200:29;7219:9;7200:29;:::i;:::-;7190:39;;7248:38;7282:2;7271:9;7267:18;7248:38;:::i;:::-;7238:48;;7333:2;7322:9;7318:18;7305:32;7295:42;;7388:2;7377:9;7373:18;7360:32;7415:18;7407:6;7404:30;7401:50;;;7447:1;7444;7437:12;7401:50;7470:22;;7523:4;7515:13;;7511:27;-1:-1:-1;7501:55:8;;7552:1;7549;7542:12;7501:55;7575:74;7641:7;7636:2;7623:16;7618:2;7614;7610:11;7575:74;:::i;:::-;7565:84;;;6988:667;;;;;;;:::o;7660:300::-;7755:6;7763;7816:3;7804:9;7795:7;7791:23;7787:33;7784:53;;;7833:1;7830;7823:12;7784:53;7869:9;7856:23;7846:33;;7898:56;7946:7;7941:2;7930:9;7926:18;7898:56;:::i;7965:390::-;8043:6;8051;8104:2;8092:9;8083:7;8079:23;8075:32;8072:52;;;8120:1;8117;8110:12;8072:52;8156:9;8143:23;8133:33;;8217:2;8206:9;8202:18;8189:32;8244:18;8236:6;8233:30;8230:50;;;8276:1;8273;8266:12;8230:50;8299;8341:7;8332:6;8321:9;8317:22;8299:50;:::i;:::-;8289:60;;;7965:390;;;;;:::o;8360:180::-;8416:6;8469:2;8457:9;8448:7;8444:23;8440:32;8437:52;;;8485:1;8482;8475:12;8437:52;8508:26;8524:9;8508:26;:::i;8545:260::-;8613:6;8621;8674:2;8662:9;8653:7;8649:23;8645:32;8642:52;;;8690:1;8687;8680:12;8642:52;8713:29;8732:9;8713:29;:::i;:::-;8703:39;;8761:38;8795:2;8784:9;8780:18;8761:38;:::i;8999:380::-;9078:1;9074:12;;;;9121;;;9142:61;;9196:4;9188:6;9184:17;9174:27;;9142:61;9249:2;9241:6;9238:14;9218:18;9215:38;9212:161;;9295:10;9290:3;9286:20;9283:1;9276:31;9330:4;9327:1;9320:15;9358:4;9355:1;9348:15;9212:161;;8999:380;;;:::o;9384:397::-;9586:2;9568:21;;;9625:2;9605:18;;;9598:30;9664:34;9659:2;9644:18;;9637:62;-1:-1:-1;;;9730:2:8;9715:18;;9708:31;9771:3;9756:19;;9384:397::o;9786:339::-;9988:2;9970:21;;;10027:2;10007:18;;;10000:30;-1:-1:-1;;;10061:2:8;10046:18;;10039:45;10116:2;10101:18;;9786:339::o;10472:127::-;10533:10;10528:3;10524:20;10521:1;10514:31;10564:4;10561:1;10554:15;10588:4;10585:1;10578:15;10604:343;10806:2;10788:21;;;10845:2;10825:18;;;10818:30;-1:-1:-1;;;10879:2:8;10864:18;;10857:49;10938:2;10923:18;;10604:343::o;10952:348::-;11154:2;11136:21;;;11193:2;11173:18;;;11166:30;11232:26;11227:2;11212:18;;11205:54;11291:2;11276:18;;10952:348::o;11661:127::-;11722:10;11717:3;11713:20;11710:1;11703:31;11753:4;11750:1;11743:15;11777:4;11774:1;11767:15;11793:135;11832:3;11853:17;;;11850:43;;11873:18;;:::i;:::-;-1:-1:-1;11920:1:8;11909:13;;11793:135::o;11933:128::-;12000:9;;;12021:11;;;12018:37;;;12035:18;;:::i;13707:125::-;13772:9;;;13793:10;;;13790:36;;;13806:18;;:::i;14182:175::-;14219:3;14263:4;14256:5;14252:16;14292:4;14283:7;14280:17;14277:43;;14300:18;;:::i;:::-;14349:1;14336:15;;14182:175;-1:-1:-1;;14182:175:8:o;17514:722::-;17564:3;17605:5;17599:12;17634:36;17660:9;17634:36;:::i;:::-;17689:1;17706:18;;;17733:133;;;;17880:1;17875:355;;;;17699:531;;17733:133;-1:-1:-1;;17766:24:8;;17754:37;;17839:14;;17832:22;17820:35;;17811:45;;;-1:-1:-1;17733:133:8;;17875:355;17906:5;17903:1;17896:16;17935:4;17980:2;17977:1;17967:16;18005:1;18019:165;18033:6;18030:1;18027:13;18019:165;;;18111:14;;18098:11;;;18091:35;18154:16;;;;18048:10;;18019:165;;;18023:3;;;18213:6;18208:3;18204:16;18197:23;;17699:531;;;;;17514:722;;;;:::o;18241:277::-;18414:3;18439:73;18473:38;18507:3;18499:6;18473:38;:::i;:::-;18465:6;18439:73;:::i;18523:383::-;18680:3;18718:6;18712:13;18734:66;18793:6;18788:3;18781:4;18773:6;18769:17;18734:66;:::i;:::-;18822:16;;;;18847:21;;;-1:-1:-1;18895:4:8;18884:16;;18523:383;-1:-1:-1;18523:383:8:o;20026:340::-;20228:2;20210:21;;;20267:2;20247:18;;;20240:30;-1:-1:-1;;;20301:2:8;20286:18;;20279:46;20357:2;20342:18;;20026:340::o;20720:545::-;20822:2;20817:3;20814:11;20811:448;;;20858:1;20883:5;20879:2;20872:17;20928:4;20924:2;20914:19;20998:2;20986:10;20982:19;20979:1;20975:27;20969:4;20965:38;21034:4;21022:10;21019:20;21016:47;;;-1:-1:-1;21057:4:8;21016:47;21112:2;21107:3;21103:12;21100:1;21096:20;21090:4;21086:31;21076:41;;21167:82;21185:2;21178:5;21175:13;21167:82;;;21230:17;;;21211:1;21200:13;21167:82;;;21171:3;;;20720:545;;;:::o;21441:1352::-;21567:3;21561:10;21594:18;21586:6;21583:30;21580:56;;;21616:18;;:::i;:::-;21645:97;21735:6;21695:38;21727:4;21721:11;21695:38;:::i;:::-;21689:4;21645:97;:::i;:::-;21797:4;;21861:2;21850:14;;21878:1;21873:663;;;;22580:1;22597:6;22594:89;;;-1:-1:-1;22649:19:8;;;22643:26;22594:89;-1:-1:-1;;21398:1:8;21394:11;;;21390:24;21386:29;21376:40;21422:1;21418:11;;;21373:57;22696:81;;21843:944;;21873:663;17461:1;17454:14;;;17498:4;17485:18;;-1:-1:-1;;21909:20:8;;;22027:236;22041:7;22038:1;22035:14;22027:236;;;22130:19;;;22124:26;22109:42;;22222:27;;;;22190:1;22178:14;;;;22057:19;;22027:236;;;22031:3;22291:6;22282:7;22279:19;22276:201;;;22352:19;;;22346:26;-1:-1:-1;;22435:1:8;22431:14;;;22447:3;22427:24;22423:37;22419:42;22404:58;22389:74;;22276:201;-1:-1:-1;;;;;22523:1:8;22507:14;;;22503:22;22490:36;;-1:-1:-1;21441:1352:8:o;22798:291::-;22975:6;22964:9;22957:25;23018:2;23013;23002:9;22998:18;22991:30;22938:4;23038:45;23079:2;23068:9;23064:18;23056:6;23038:45;:::i;23094:400::-;23296:2;23278:21;;;23335:2;23315:18;;;23308:30;23374:34;23369:2;23354:18;;23347:62;-1:-1:-1;;;23440:2:8;23425:18;;23418:34;23484:3;23469:19;;23094:400::o;23848:386::-;24080:1;24076;24071:3;24067:11;24063:19;24055:6;24051:32;24040:9;24033:51;24120:6;24115:2;24104:9;24100:18;24093:34;24163:2;24158;24147:9;24143:18;24136:30;24014:4;24183:45;24224:2;24213:9;24209:18;24201:6;24183:45;:::i;:::-;24175:53;23848:386;-1:-1:-1;;;;;23848:386:8:o;24239:249::-;24308:6;24361:2;24349:9;24340:7;24336:23;24332:32;24329:52;;;24377:1;24374;24367:12;24329:52;24409:9;24403:16;24428:30;24452:5;24428:30;:::i

Swarm Source

ipfs://05c34c2317476cebbf44a2a9259f839740e5aeb2f2c84ecd93ff594547bc57f4

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.