ETH Price: $3,050.72 (+3.41%)

Token

The Royals Ghana (GH)
 

Overview

Max Total Supply

3,000 GH

Holders

1,361

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 GH
0xb6182d889b239af48941add11ba7bdf48f12b181
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TheRoyalsGhana

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-25
*/

// SPDX-License-Identifier: MIT
 
pragma solidity ^0.8.7;


// File: contracts/Ownable.sol

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(msg.sender);
    }

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

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

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

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

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

// File: Strings.sol

/**
 * Source: Openzeppelin
 */

/**
 * @dev String operations.
 */
library Strings {

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal 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);
    }
}

// File: ECDSA.sol

// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

}

// File: Address.sol0

/**
 * Source: Openzeppelin
 */

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// File: IERC721Receiver.sol

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

// File: IERC165.sol

// https://eips.ethereum.org/EIPS/eip-165 


interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// File: IERC2981.sol


/**
 * Source: Openzeppelin
 */


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: ERC165.sol


/**
 * Source: Openzeppelin
 */


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

// File: IERC721.sol

// https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/ 


/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 is IERC165 {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// File: IERC721Metadata.sol


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

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

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

// File: ERC721.sol

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension
 * Made for efficiancy!
 */
contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable {
    using Address for address;
    using Strings for uint256;

    uint16 public totalSupply;

    uint16 internal _ankaraIdTracker;
    uint16 internal _kenteIdTracker = 2800;

    address public proxyRegistryAddress;

    string public baseURI;

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

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

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

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


    constructor(address _openseaProxyRegistry, string memory _baseURI) {
        proxyRegistryAddress = _openseaProxyRegistry;
        baseURI = _baseURI;
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() external pure override returns (string memory) {
        return "The Royals Ghana";
    }

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

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

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

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

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) external override {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return _operatorApprovals[owner][operator];
    }

    function setOpenseaProxyRegistry(address addr) external onlyOwner {
        proxyRegistryAddress = addr;
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mintAnkara(uint256 amount, address to) internal {
        uint tokenId = _ankaraIdTracker;

        _balances[to] += amount;
        
        for (uint i; i < amount; i++) {
            tokenId++;

            _owners[tokenId] = to;
            emit Transfer(address(0), to, tokenId);
        }
        
        totalSupply += uint16(amount);
        _ankaraIdTracker += uint16(amount);

        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "ERC721: transfer to non ERC721Receiver implementer"
        ); // checking it once will make sure that the address can recieve NFTs
    }

    function _mintKente(uint256 amount, address to) internal {
        uint tokenId = _kenteIdTracker;

        _balances[to] += amount;
        
        for (uint i; i < amount; i++) {
            tokenId++;

            _owners[tokenId] = to;
            emit Transfer(address(0), to, tokenId);
        }
        
        totalSupply += uint16(amount);
        _kenteIdTracker += uint16(amount);

        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "ERC721: transfer to non ERC721Receiver implementer"
        ); // checking it once will make sure that the address can recieve NFTs
    }

    function _mintKente(address to) internal {
        uint tokenId = _kenteIdTracker + 1;

        _balances[to]++;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
        
        totalSupply++;
        _kenteIdTracker++;

        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

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

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

        _balances[from]--;
        _balances[to]++;
        
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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

}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}


// File: TheRoyals.sol


contract TheRoyalsGhana is Ownable, IERC2981, ERC721 {
    
    bool private _onlyWhiteList;
    bool private _mintingEnabled;

    uint private EIP2981RoyaltyPercent;

    mapping (address => uint8) private amountMintedAnkara;
    mapping (address => uint8) private amountMintedKente;

    constructor(
        uint _royalty, 
        address _openseaProxyRegistry,
        string memory _tempBaseURI
    ) ERC721(_openseaProxyRegistry, _tempBaseURI) {
        EIP2981RoyaltyPercent = _royalty;
    }
    
    function mintFromReserveAnkara(uint amount, address to) external onlyOwner {
        require(amount + _ankaraIdTracker <= 200);
        _mintAnkara(amount, to);
    }

    function mintFromReserveKente(uint amount, address to) external onlyOwner {
        require(amount + _kenteIdTracker <= 2850);
        _mintKente(amount, to);
    }

    function batchMintFromReserveAnkara(uint[] memory amount, address[] memory to) external onlyOwner {
        uint startId = _ankaraIdTracker;
        (uint tokenId, uint total) = _batchMintFromReserve(amount, to, startId);

        require(tokenId <= 200, "Exceeds reserve!");
        _ankaraIdTracker += uint16(total);
    }

    function batchMintFromReserveKente(uint[] memory amount, address[] memory to) external onlyOwner {
        uint startId = _kenteIdTracker;
        (uint tokenId, uint total) = _batchMintFromReserve(amount, to, startId);

        require(tokenId <= 2850, "Exceeds reserve!");
        _kenteIdTracker += uint16(total);

    }

    function _batchMintFromReserve(uint[] memory amount, address[] memory to, uint startId) private returns(uint, uint) {
        uint length = amount.length;
        require(length == to.length, "array length missmatch");
        
        uint tokenId = startId;
        uint total;

        uint cAmount;
        address cTo;

        for (uint i; i < length; i++) {

            assembly {
                cAmount := mload(add(add(amount, 0x20), mul(i, 0x20)))
                cTo := mload(add(add(to, 0x20), mul(i, 0x20)))
            }

            require(!Address.isContract(cTo), "Cannot mint to contracts!");

            _balances[cTo] += cAmount;
            
            for (uint f; f < cAmount; f++) {
                tokenId++;

                _owners[tokenId] = cTo;
                emit Transfer(address(0), cTo, tokenId);
            }
            
            total += cAmount;
        }
        
        totalSupply += uint16(total);

        return (tokenId, total);
    }

    function mintAnkara(uint amount) external payable {
        require(amount + _ankaraIdTracker <= 2800, "Request exceeds max supply!");
        require(amount + amountMintedAnkara[msg.sender] <= 4 && amount != 0, "Request exceeds max per wallet!");
        require(msg.value == amount * 7e16, "ETH Amount is not correct!");
        
        amountMintedAnkara[msg.sender] += uint8(amount);
        _mintAnkara(amount, msg.sender);
    }

    function mintKente() external payable {
        require(_ankaraIdTracker <= 3000, "Request exceeds max supply!");
        require(amountMintedKente[msg.sender] == 0, "Request exceeds max per wallet!");
        require(msg.value == 7e17, "ETH Amount is not correct!");

        amountMintedKente[msg.sender]++;
        _mintKente(msg.sender);
    }

    function preMintAnkara(bytes calldata sig, uint256 amount) external payable {
        require(_onlyWhiteList, "Minting is not enabled!");
        require(_checkSig(msg.sender, sig), "User not whitelisted!");
        require(amount + amountMintedAnkara[msg.sender] <= 4 && amount != 0, "Request exceeds max per wallet!");
        require(msg.value == amount * 7e16, "ETH Amount is not correct!");

        amountMintedAnkara[msg.sender] += uint8(amount);
        _mintAnkara(amount, msg.sender);
    }

    function preMintKente(bytes calldata sig) external payable {
        require(_onlyWhiteList, "Minting is not enabled!");
        require(_checkSig(msg.sender, sig), "User not whitelisted!");
        require(amountMintedKente[msg.sender] == 0, "Request exceeds max per wallet!");
        require(msg.value == 7e17, "ETH Amount is not correct!");

        amountMintedKente[msg.sender]++;
        _mintKente(msg.sender);
    }

    function _checkSig(address _wallet, bytes memory _signature) private view returns(bool) {
        return ECDSA.recover(
            ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_wallet))),
            _signature
        ) == owner();
    }

    function getMsg(address _wallet) external pure returns(bytes32) {
        return keccak256(abi.encodePacked(_wallet));
    }

    function getSalesStatus() external view returns(bool onlyWhitelist, bool mintingEnabled) {
        onlyWhitelist = _onlyWhiteList;
        mintingEnabled = _mintingEnabled;
    }

    /**
     * @notice returns royalty info for EIP2981 supporting marketplaces
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) {
        require(_exists(tokenId), "Royality querry for non-existant token!");
        return(owner(), salePrice * EIP2981RoyaltyPercent / 10000);
    }

    /**
     * @notice sets the royalty percentage for EIP2981 supporting marketplaces
     * @dev percentage is in bassis points (parts per 10,000).
            Example: 5% = 500, 0.5% = 50 
     * @param amount - percent amount
     */
    function setRoyaltyPercent(uint256 amount) external onlyOwner {
        EIP2981RoyaltyPercent = amount; 
    }

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

    function withdraw() onlyOwner external {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance, gas: 2600}("");
        require(success, "Failed to withdraw payment!");
    }

    /**
     * @notice toggles pre sale
     * @dev enables the pre sale functions. NEVER USE THIS AFTER ENABLING THE PUBLIC SALE FUNCTIONS UNLESS ITS NECESSARY
     */
    function togglePresale() external onlyOwner {
        _onlyWhiteList = !_onlyWhiteList;
    }

    /**
     * @notice toggles the public sale
     * @dev enables/disables public sale functions and disables pre sale functions
     */
    function togglePublicSale() external onlyOwner {
        _onlyWhiteList = false;
        _mintingEnabled = !_mintingEnabled;
    }

    function tokensOfOwner(address owner) external view returns(uint[] memory) {
        uint[] memory tokens = new uint[](_balances[owner]);
        uint x;

        for (uint i = 1; i < 3001; i++) {
            if (_owners[i] == owner) {
                tokens[x] = i;
                x++;
            }
        }

        return tokens;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"address","name":"_openseaProxyRegistry","type":"address"},{"internalType":"string","name":"_tempBaseURI","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"batchMintFromReserveAnkara","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"batchMintFromReserveKente","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getMsg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getSalesStatus","outputs":[{"internalType":"bool","name":"onlyWhitelist","type":"bool"},{"internalType":"bool","name":"mintingEnabled","type":"bool"}],"stateMutability":"view","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":"uint256","name":"amount","type":"uint256"}],"name":"mintAnkara","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintFromReserveAnkara","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintFromReserveKente","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintKente","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"preMintAnkara","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"preMintKente","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setOpenseaProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000805461ffff60c01b191660af60c41b1790553480156200002557600080fd5b506040516200431f3803806200431f83398101604081905262000048916200018d565b8181620000553362000097565b600180546001600160a01b0319166001600160a01b038416179055805162000085906002906020840190620000e7565b50505060089290925550620002ea9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000f59062000297565b90600052602060002090601f01602090048101928262000119576000855562000164565b82601f106200013457805160ff191683800117855562000164565b8280016001018555821562000164579182015b828111156200016457825182559160200191906001019062000147565b506200017292915062000176565b5090565b5b8082111562000172576000815560010162000177565b600080600060608486031215620001a357600080fd5b8351602080860151919450906001600160a01b0381168114620001c557600080fd5b60408601519093506001600160401b0380821115620001e357600080fd5b818701915087601f830112620001f857600080fd5b8151818111156200020d576200020d620002d4565b604051601f8201601f19908116603f01168101908382118183101715620002385762000238620002d4565b816040528281528a868487010111156200025157600080fd5b600093505b8284101562000275578484018601518185018701529285019262000256565b82841115620002875760008684830101525b8096505050505050509250925092565b600181811c90821680620002ac57607f821691505b60208210811415620002ce57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61402580620002fa6000396000f3fe60806040526004361061026a5760003560e01c806370a0823111610153578063bd2f5244116100cb578063e546e0be1161007f578063f2fde38b11610064578063f2fde38b1461072e578063f468ab511461074e578063f69428291461076e57600080fd5b8063e546e0be146106fb578063e985e9c51461070e57600080fd5b8063cd7c0326116100b0578063cd7c0326146106be578063df3febfc146106de578063e222c7f9146106e657600080fd5b8063bd2f52441461067e578063c87b56dd1461069e57600080fd5b80638da5cb5b116101225780639a4fc640116101075780639a4fc6401461061e578063a22cb4651461063e578063b88d4fde1461065e57600080fd5b80638da5cb5b146105ba57806395d89b41146105d857600080fd5b806370a0823114610525578063715018a6146105455780638462151c1461055a5780638b2c92ab1461058757600080fd5b806334393743116101e657806355f804b3116101b55780636352211e1161019a5780636352211e146104dd5780636b3ad09c146104fd5780636c0360eb1461051057600080fd5b806355f804b3146104aa5780635d673af7146104ca57600080fd5b806334393743146104325780633ccfd60b1461044757806342842e0e1461045c578063428e2d641461047c57600080fd5b80630b6be3301161023d57806323b872dd1161022257806323b872dd146103b357806323e1d0ec146103d35780632a55205a146103f357600080fd5b80630b6be3301461034d57806318160ddd1461036d57600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a3660046138ae565b61078e565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152601081527f54686520526f79616c73204768616e610000000000000000000000000000000060208201525b60405161029b9190613c2c565b3480156102ff57600080fd5b5061031361030e3660046139dc565b6107ea565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b6103463660046137c2565b610895565b005b34801561035957600080fd5b5061034b6103683660046137ee565b6109c4565b34801561037957600080fd5b506000546103a09074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b3480156103bf57600080fd5b5061034b6103ce3660046136ce565b610af4565b3480156103df57600080fd5b5061034b6103ee3660046137ee565b610b7b565b3480156103ff57600080fd5b5061041361040e366004613a1a565b610c87565b604080516001600160a01b03909316835260208301919091520161029b565b34801561043e57600080fd5b5061034b610d46565b34801561045357600080fd5b5061034b610de1565b34801561046857600080fd5b5061034b6104773660046136ce565b610eea565b34801561048857600080fd5b5061049c610497366004613671565b610f05565b60405190815260200161029b565b3480156104b657600080fd5b5061034b6104c5366004613993565b610f58565b61034b6104d83660046138e8565b610fd8565b3480156104e957600080fd5b506103136104f83660046139dc565b6111ad565b61034b61050b36600461392a565b611238565b34801561051c57600080fd5b506102e6611432565b34801561053157600080fd5b5061049c610540366004613671565b6114c0565b34801561055157600080fd5b5061034b61155a565b34801561056657600080fd5b5061057a610575366004613671565b6115cf565b60405161029b9190613be8565b34801561059357600080fd5b5060075460ff8082169161010090041660408051921515835290151560208301520161029b565b3480156105c657600080fd5b506000546001600160a01b0316610313565b3480156105e457600080fd5b5060408051808201909152600281527f474800000000000000000000000000000000000000000000000000000000000060208201526102e6565b34801561062a57600080fd5b5061034b6106393660046139dc565b6116a8565b34801561064a57600080fd5b5061034b61065936600461378f565b611716565b34801561066a57600080fd5b5061034b61067936600461370f565b611721565b34801561068a57600080fd5b5061034b610699366004613671565b6117af565b3480156106aa57600080fd5b506102e66106b93660046139dc565b611852565b3480156106ca57600080fd5b50600154610313906001600160a01b031681565b61034b611911565b3480156106f257600080fd5b5061034b611a7b565b61034b6107093660046139dc565b611b3f565b34801561071a57600080fd5b5061028f610729366004613695565b611cd8565b34801561073a57600080fd5b5061034b610749366004613671565b611dbf565b34801561075a57600080fd5b5061034b6107693660046139f5565b611ead565b34801561077a57600080fd5b5061034b6107893660046139f5565b611f59565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806107e457506107e482612008565b92915050565b6000818152600360205260408120546001600160a01b03166108795760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000818152600360205260409020546001600160a01b039081169083168114156109275760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610870565b336001600160a01b038216148061094357506109438133611cd8565b6109b55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610870565b6109bf83836120eb565b505050565b336109d76000546001600160a01b031690565b6001600160a01b031614610a2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600080547801000000000000000000000000000000000000000000000000900461ffff169080610a5e858585612171565b91509150610b22821115610ab45760405162461bcd60e51b815260206004820152601060248201527f45786365656473207265736572766521000000000000000000000000000000006044820152606401610870565b80600060188282829054906101000a900461ffff16610ad39190613cb2565b92506101000a81548161ffff021916908361ffff1602179055505050505050565b610afe3382612378565b610b705760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610870565b6109bf83838361245d565b33610b8e6000546001600160a01b031690565b6001600160a01b031614610be45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b60008054760100000000000000000000000000000000000000000000900461ffff169080610c13858585612171565b9150915060c8821115610c685760405162461bcd60e51b815260206004820152601060248201527f45786365656473207265736572766521000000000000000000000000000000006044820152606401610870565b80600060168282829054906101000a900461ffff16610ad39190613cb2565b60008281526003602052604081205481906001600160a01b0316610d135760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e21000000000000000000000000000000000000000000000000006064820152608401610870565b6000546001600160a01b031661271060085485610d309190613d29565b610d3a9190613d15565b915091505b9250929050565b33610d596000546001600160a01b031690565b6001600160a01b031614610daf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b33610df46000546001600160a01b031690565b6001600160a01b031614610e4a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6040516000903390610a2890479084818181858888f193505050503d8060008114610e91576040519150601f19603f3d011682016040523d82523d6000602084013e610e96565b606091505b5050905080610ee75760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f207769746864726177207061796d656e742100000000006044820152606401610870565b50565b6109bf83838360405180602001604052806000815250611721565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201526000906034015b604051602081830303815290604052805190602001209050919050565b33610f6b6000546001600160a01b031690565b6001600160a01b031614610fc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b8051610fd49060029060208401906134a5565b5050565b60075460ff1661102a5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610870565b61106a3383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263892505050565b6110b65760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c69737465642100000000000000000000006044820152606401610870565b336000908152600a602052604090205460ff16156111165760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b346709b6e64a8ec600001461116d5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b336000908152600a60205260408120805460ff169161118b83613e8d565b91906101000a81548160ff021916908360ff16021790555050610fd4336126b4565b6000818152600360205260408120546001600160a01b0316806107e45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610870565b60075460ff1661128a5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610870565b6112ca3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263892505050565b6113165760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c69737465642100000000000000000000006044820152606401610870565b336000908152600960205260409020546004906113369060ff1683613cd8565b1115801561134357508015155b61138f5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b6113a08166f8b0a10e470000613d29565b34146113ee5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b336000908152600960205260408120805483929061141090849060ff16613cf0565b92506101000a81548160ff021916908360ff1602179055506109bf8133612892565b6002805461143f90613dde565b80601f016020809104026020016040519081016040528092919081815260200182805461146b90613dde565b80156114b85780601f1061148d576101008083540402835291602001916114b8565b820191906000526020600020905b81548152906001019060200180831161149b57829003601f168201915b505050505081565b60006001600160a01b03821661153e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610870565b506001600160a01b031660009081526004602052604090205490565b3361156d6000546001600160a01b031690565b6001600160a01b0316146115c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6115cd6000612a79565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff81111561160457611604613f7d565b60405190808252806020026020018201604052801561162d578160200160208202803683370190505b509050600060015b610bb981101561169f576000818152600360205260409020546001600160a01b038681169116141561168d578083838151811061167457611674613f4e565b60209081029190910101528161168981613e54565b9250505b8061169781613e54565b915050611635565b50909392505050565b336116bb6000546001600160a01b031690565b6001600160a01b0316146117115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600855565b610fd4338383612ae1565b61172b3383612378565b61179d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610870565b6117a984848484612bce565b50505050565b336117c26000546001600160a01b031690565b6001600160a01b0316146118185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b03166118df5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610870565b60026118ea83612c57565b6040516020016118fb929190613aa2565b6040516020818303038152906040529050919050565b600054610bb876010000000000000000000000000000000000000000000090910461ffff1611156119845760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610870565b336000908152600a602052604090205460ff16156119e45760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b346709b6e64a8ec6000014611a3b5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b336000908152600a60205260408120805460ff1691611a5983613e8d565b91906101000a81548160ff021916908360ff160217905550506115cd336126b4565b33611a8e6000546001600160a01b031690565b6001600160a01b031614611ae45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600780546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681900460ff1615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909116179055565b600054610af090611b6e90760100000000000000000000000000000000000000000000900461ffff1683613cd8565b1115611bbc5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610870565b33600090815260096020526040902054600490611bdc9060ff1683613cd8565b11158015611be957508015155b611c355760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b611c468166f8b0a10e470000613d29565b3414611c945760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b3360009081526009602052604081208054839290611cb690849060ff16613cf0565b92506101000a81548160ff021916908360ff160217905550610ee78133612892565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611d3e57600080fd5b505afa158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190613976565b6001600160a01b03161415611d8f5760019150506107e4565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b33611dd26000546001600160a01b031690565b6001600160a01b031614611e285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6001600160a01b038116611ea45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610870565b610ee781612a79565b33611ec06000546001600160a01b031690565b6001600160a01b031614611f165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b60005460c890611f4490760100000000000000000000000000000000000000000000900461ffff1684613cd8565b1115611f4f57600080fd5b610fd48282612892565b33611f6c6000546001600160a01b031690565b6001600160a01b031614611fc25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600054610b2290611ff3907801000000000000000000000000000000000000000000000000900461ffff1684613cd8565b1115611ffe57600080fd5b610fd48282612d89565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061209b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107e457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107e4565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612138826111ad565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b82518251600091829181146121c85760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d61746368000000000000000000006044820152606401610870565b8360008080805b8581101561232b576020810260208c01015192506020810260208b01015191506121f9823b151590565b156122465760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74206d696e7420746f20636f6e74726163747321000000000000006044820152606401610870565b6001600160a01b0382166000908152600460205260408120805485929061226e908490613cd8565b90915550600090505b8381101561230c578561228981613e54565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929950899350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061230481613e54565b915050612277565b506123178385613cd8565b93508061232381613e54565b9150506121cf565b5082600060148282829054906101000a900461ffff1661234b9190613cb2565b92506101000a81548161ffff021916908361ffff1602179055508383965096505050505050935093915050565b6000818152600360205260408120546001600160a01b03166124025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610870565b6000828152600360205260409020546001600160a01b039081169084168114806124455750836001600160a01b031661243a846107ea565b6001600160a01b0316145b8061245557506124558185611cd8565b949350505050565b6000818152600360205260409020546001600160a01b038481169116146124ec5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610870565b6001600160a01b0382166125675760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610870565b6125726000826120eb565b6001600160a01b038316600090815260046020526040812080549161259683613da9565b90915550506001600160a01b03821660009081526004602052604081208054916125bf83613e54565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201526001600160a01b03909116906126a39061269d9060340160405160208183030381529060405280519060200120612eca565b84612f05565b6001600160a01b0316149392505050565b600080546126e3907801000000000000000000000000000000000000000000000000900461ffff166001613cb2565b6001600160a01b0383166000908152600460205260408120805461ffff9390931693509061271083613e54565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46000805474010000000000000000000000000000000000000000900461ffff169060146127ae83613e32565b91906101000a81548161ffff021916908361ffff160217905550506000601881819054906101000a900461ffff16809291906127e990613e32565b91906101000a81548161ffff021916908361ffff160217905550506128206000838360405180602001604052806000815250612f29565b610fd45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b600080546001600160a01b0383168252600460205260408220805476010000000000000000000000000000000000000000000090920461ffff169285926128da908490613cd8565b90915550600090505b8381101561297857816128f581613e54565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061297081613e54565b9150506128e3565b5082600060148282829054906101000a900461ffff166129989190613cb2565b92506101000a81548161ffff021916908361ffff16021790555082600060168282829054906101000a900461ffff166129d19190613cb2565b92506101000a81548161ffff021916908361ffff160217905550612a076000838360405180602001604052806000815250612f29565b6109bf5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415612b435760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610870565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612bd984848461245d565b612be584848484612f29565b6117a95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b606081612c9757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612cc15780612cab81613e54565b9150612cba9050600a83613d15565b9150612c9b565b60008167ffffffffffffffff811115612cdc57612cdc613f7d565b6040519080825280601f01601f191660200182016040528015612d06576020820181803683370190505b5090505b841561245557612d1b600183613d66565b9150612d28600a86613ead565b612d33906030613cd8565b60f81b818381518110612d4857612d48613f4e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d82600a86613d15565b9450612d0a565b600080546001600160a01b03831682526004602052604082208054780100000000000000000000000000000000000000000000000090920461ffff16928592612dd3908490613cd8565b90915550600090505b83811015612e715781612dee81613e54565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480612e6981613e54565b915050612ddc565b5082600060148282829054906101000a900461ffff16612e919190613cb2565b92506101000a81548161ffff021916908361ffff16021790555082600060188282829054906101000a900461ffff166129d19190613cb2565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01610f3b565b6000806000612f1485856130f4565b91509150612f2181613161565b509392505050565b60006001600160a01b0384163b156130e9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f86903390899088908890600401613bac565b602060405180830381600087803b158015612fa057600080fd5b505af1925050508015612fee575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612feb918101906138cb565b60015b61309e573d80801561301c576040519150601f19603f3d011682016040523d82523d6000602084013e613021565b606091505b5080516130965760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612455565b506001949350505050565b60008082516041141561312b5760208301516040840151606085015160001a61311f87828585613352565b94509450505050610d3f565b825160401415613155576020830151604084015161314a86838361345d565b935093505050610d3f565b50600090506002610d3f565b600081600481111561317557613175613f1f565b141561317e5750565b600181600481111561319257613192613f1f565b14156131e05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610870565b60028160048111156131f4576131f4613f1f565b14156132425760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610870565b600381600481111561325657613256613f1f565b14156132ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610870565b60048160048111156132de576132de613f1f565b1415610ee75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610870565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156133895750600090506003613454565b8460ff16601b141580156133a157508460ff16601c14155b156133b25750600090506004613454565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613406573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b03811661344d57600060019250925050613454565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b0161349787828885613352565b935093505050935093915050565b8280546134b190613dde565b90600052602060002090601f0160209004810192826134d35760008555613519565b82601f106134ec57805160ff1916838001178555613519565b82800160010185558215613519579182015b828111156135195782518255916020019190600101906134fe565b50613525929150613529565b5090565b5b80821115613525576000815560010161352a565b600067ffffffffffffffff83111561355857613558613f7d565b61358960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613c3f565b905082815283838301111561359d57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126135c557600080fd5b813560206135da6135d583613c8e565b613c3f565b80838252828201915082860187848660051b89010111156135fa57600080fd5b60005b8581101561362257813561361081613fac565b845292840192908401906001016135fd565b5090979650505050505050565b60008083601f84011261364157600080fd5b50813567ffffffffffffffff81111561365957600080fd5b602083019150836020828501011115610d3f57600080fd5b60006020828403121561368357600080fd5b813561368e81613fac565b9392505050565b600080604083850312156136a857600080fd5b82356136b381613fac565b915060208301356136c381613fac565b809150509250929050565b6000806000606084860312156136e357600080fd5b83356136ee81613fac565b925060208401356136fe81613fac565b929592945050506040919091013590565b6000806000806080858703121561372557600080fd5b843561373081613fac565b9350602085013561374081613fac565b925060408501359150606085013567ffffffffffffffff81111561376357600080fd5b8501601f8101871361377457600080fd5b6137838782356020840161353e565b91505092959194509250565b600080604083850312156137a257600080fd5b82356137ad81613fac565b9150602083013580151581146136c357600080fd5b600080604083850312156137d557600080fd5b82356137e081613fac565b946020939093013593505050565b6000806040838503121561380157600080fd5b823567ffffffffffffffff8082111561381957600080fd5b818501915085601f83011261382d57600080fd5b8135602061383d6135d583613c8e565b8083825282820191508286018a848660051b890101111561385d57600080fd5b600096505b84871015613880578035835260019690960195918301918301613862565b509650508601359250508082111561389757600080fd5b506138a4858286016135b4565b9150509250929050565b6000602082840312156138c057600080fd5b813561368e81613fc1565b6000602082840312156138dd57600080fd5b815161368e81613fc1565b600080602083850312156138fb57600080fd5b823567ffffffffffffffff81111561391257600080fd5b61391e8582860161362f565b90969095509350505050565b60008060006040848603121561393f57600080fd5b833567ffffffffffffffff81111561395657600080fd5b6139628682870161362f565b909790965060209590950135949350505050565b60006020828403121561398857600080fd5b815161368e81613fac565b6000602082840312156139a557600080fd5b813567ffffffffffffffff8111156139bc57600080fd5b8201601f810184136139cd57600080fd5b6124558482356020840161353e565b6000602082840312156139ee57600080fd5b5035919050565b60008060408385031215613a0857600080fd5b8235915060208301356136c381613fac565b60008060408385031215613a2d57600080fd5b50508035926020909101359150565b60008151808452613a54816020860160208601613d7d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151613a98818560208601613d7d565b9290920192915050565b600080845481600182811c915080831680613abe57607f831692505b6020808410821415613af7577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613b0b5760018114613b3a57613b67565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613b67565b60008b81526020902060005b86811015613b5f5781548b820152908501908301613b46565b505084890196505b505050505050613ba3613b7a8286613a86565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613bde6080830184613a3c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c2057835183529284019291840191600101613c04565b50909695505050505050565b60208152600061368e6020830184613a3c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c8657613c86613f7d565b604052919050565b600067ffffffffffffffff821115613ca857613ca8613f7d565b5060051b60200190565b600061ffff808316818516808303821115613ccf57613ccf613ec1565b01949350505050565b60008219821115613ceb57613ceb613ec1565b500190565b600060ff821660ff84168060ff03821115613d0d57613d0d613ec1565b019392505050565b600082613d2457613d24613ef0565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6157613d61613ec1565b500290565b600082821015613d7857613d78613ec1565b500390565b60005b83811015613d98578181015183820152602001613d80565b838111156117a95750506000910152565b600081613db857613db8613ec1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613df257607f821691505b60208210811415613e2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff80831681811415613e4a57613e4a613ec1565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8657613e86613ec1565b5060010190565b600060ff821660ff811415613ea457613ea4613ec1565b60010192915050565b600082613ebc57613ebc613ef0565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114610ee757600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ee757600080fdfea26469706673582212202639447590cab8b0742383adae2530d3e3476258bb2e0b697fce81e2a5bc798a64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000005000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d5576615577375062615a666a415142626b787a42626a7458533453675878535534616e42427a794e677345672f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061026a5760003560e01c806370a0823111610153578063bd2f5244116100cb578063e546e0be1161007f578063f2fde38b11610064578063f2fde38b1461072e578063f468ab511461074e578063f69428291461076e57600080fd5b8063e546e0be146106fb578063e985e9c51461070e57600080fd5b8063cd7c0326116100b0578063cd7c0326146106be578063df3febfc146106de578063e222c7f9146106e657600080fd5b8063bd2f52441461067e578063c87b56dd1461069e57600080fd5b80638da5cb5b116101225780639a4fc640116101075780639a4fc6401461061e578063a22cb4651461063e578063b88d4fde1461065e57600080fd5b80638da5cb5b146105ba57806395d89b41146105d857600080fd5b806370a0823114610525578063715018a6146105455780638462151c1461055a5780638b2c92ab1461058757600080fd5b806334393743116101e657806355f804b3116101b55780636352211e1161019a5780636352211e146104dd5780636b3ad09c146104fd5780636c0360eb1461051057600080fd5b806355f804b3146104aa5780635d673af7146104ca57600080fd5b806334393743146104325780633ccfd60b1461044757806342842e0e1461045c578063428e2d641461047c57600080fd5b80630b6be3301161023d57806323b872dd1161022257806323b872dd146103b357806323e1d0ec146103d35780632a55205a146103f357600080fd5b80630b6be3301461034d57806318160ddd1461036d57600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a3660046138ae565b61078e565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152601081527f54686520526f79616c73204768616e610000000000000000000000000000000060208201525b60405161029b9190613c2c565b3480156102ff57600080fd5b5061031361030e3660046139dc565b6107ea565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b6103463660046137c2565b610895565b005b34801561035957600080fd5b5061034b6103683660046137ee565b6109c4565b34801561037957600080fd5b506000546103a09074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b3480156103bf57600080fd5b5061034b6103ce3660046136ce565b610af4565b3480156103df57600080fd5b5061034b6103ee3660046137ee565b610b7b565b3480156103ff57600080fd5b5061041361040e366004613a1a565b610c87565b604080516001600160a01b03909316835260208301919091520161029b565b34801561043e57600080fd5b5061034b610d46565b34801561045357600080fd5b5061034b610de1565b34801561046857600080fd5b5061034b6104773660046136ce565b610eea565b34801561048857600080fd5b5061049c610497366004613671565b610f05565b60405190815260200161029b565b3480156104b657600080fd5b5061034b6104c5366004613993565b610f58565b61034b6104d83660046138e8565b610fd8565b3480156104e957600080fd5b506103136104f83660046139dc565b6111ad565b61034b61050b36600461392a565b611238565b34801561051c57600080fd5b506102e6611432565b34801561053157600080fd5b5061049c610540366004613671565b6114c0565b34801561055157600080fd5b5061034b61155a565b34801561056657600080fd5b5061057a610575366004613671565b6115cf565b60405161029b9190613be8565b34801561059357600080fd5b5060075460ff8082169161010090041660408051921515835290151560208301520161029b565b3480156105c657600080fd5b506000546001600160a01b0316610313565b3480156105e457600080fd5b5060408051808201909152600281527f474800000000000000000000000000000000000000000000000000000000000060208201526102e6565b34801561062a57600080fd5b5061034b6106393660046139dc565b6116a8565b34801561064a57600080fd5b5061034b61065936600461378f565b611716565b34801561066a57600080fd5b5061034b61067936600461370f565b611721565b34801561068a57600080fd5b5061034b610699366004613671565b6117af565b3480156106aa57600080fd5b506102e66106b93660046139dc565b611852565b3480156106ca57600080fd5b50600154610313906001600160a01b031681565b61034b611911565b3480156106f257600080fd5b5061034b611a7b565b61034b6107093660046139dc565b611b3f565b34801561071a57600080fd5b5061028f610729366004613695565b611cd8565b34801561073a57600080fd5b5061034b610749366004613671565b611dbf565b34801561075a57600080fd5b5061034b6107693660046139f5565b611ead565b34801561077a57600080fd5b5061034b6107893660046139f5565b611f59565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806107e457506107e482612008565b92915050565b6000818152600360205260408120546001600160a01b03166108795760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000818152600360205260409020546001600160a01b039081169083168114156109275760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610870565b336001600160a01b038216148061094357506109438133611cd8565b6109b55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610870565b6109bf83836120eb565b505050565b336109d76000546001600160a01b031690565b6001600160a01b031614610a2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600080547801000000000000000000000000000000000000000000000000900461ffff169080610a5e858585612171565b91509150610b22821115610ab45760405162461bcd60e51b815260206004820152601060248201527f45786365656473207265736572766521000000000000000000000000000000006044820152606401610870565b80600060188282829054906101000a900461ffff16610ad39190613cb2565b92506101000a81548161ffff021916908361ffff1602179055505050505050565b610afe3382612378565b610b705760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610870565b6109bf83838361245d565b33610b8e6000546001600160a01b031690565b6001600160a01b031614610be45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b60008054760100000000000000000000000000000000000000000000900461ffff169080610c13858585612171565b9150915060c8821115610c685760405162461bcd60e51b815260206004820152601060248201527f45786365656473207265736572766521000000000000000000000000000000006044820152606401610870565b80600060168282829054906101000a900461ffff16610ad39190613cb2565b60008281526003602052604081205481906001600160a01b0316610d135760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e21000000000000000000000000000000000000000000000000006064820152608401610870565b6000546001600160a01b031661271060085485610d309190613d29565b610d3a9190613d15565b915091505b9250929050565b33610d596000546001600160a01b031690565b6001600160a01b031614610daf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b33610df46000546001600160a01b031690565b6001600160a01b031614610e4a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6040516000903390610a2890479084818181858888f193505050503d8060008114610e91576040519150601f19603f3d011682016040523d82523d6000602084013e610e96565b606091505b5050905080610ee75760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f207769746864726177207061796d656e742100000000006044820152606401610870565b50565b6109bf83838360405180602001604052806000815250611721565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201526000906034015b604051602081830303815290604052805190602001209050919050565b33610f6b6000546001600160a01b031690565b6001600160a01b031614610fc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b8051610fd49060029060208401906134a5565b5050565b60075460ff1661102a5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610870565b61106a3383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263892505050565b6110b65760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c69737465642100000000000000000000006044820152606401610870565b336000908152600a602052604090205460ff16156111165760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b346709b6e64a8ec600001461116d5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b336000908152600a60205260408120805460ff169161118b83613e8d565b91906101000a81548160ff021916908360ff16021790555050610fd4336126b4565b6000818152600360205260408120546001600160a01b0316806107e45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610870565b60075460ff1661128a5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006044820152606401610870565b6112ca3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263892505050565b6113165760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c69737465642100000000000000000000006044820152606401610870565b336000908152600960205260409020546004906113369060ff1683613cd8565b1115801561134357508015155b61138f5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b6113a08166f8b0a10e470000613d29565b34146113ee5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b336000908152600960205260408120805483929061141090849060ff16613cf0565b92506101000a81548160ff021916908360ff1602179055506109bf8133612892565b6002805461143f90613dde565b80601f016020809104026020016040519081016040528092919081815260200182805461146b90613dde565b80156114b85780601f1061148d576101008083540402835291602001916114b8565b820191906000526020600020905b81548152906001019060200180831161149b57829003601f168201915b505050505081565b60006001600160a01b03821661153e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610870565b506001600160a01b031660009081526004602052604090205490565b3361156d6000546001600160a01b031690565b6001600160a01b0316146115c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6115cd6000612a79565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff81111561160457611604613f7d565b60405190808252806020026020018201604052801561162d578160200160208202803683370190505b509050600060015b610bb981101561169f576000818152600360205260409020546001600160a01b038681169116141561168d578083838151811061167457611674613f4e565b60209081029190910101528161168981613e54565b9250505b8061169781613e54565b915050611635565b50909392505050565b336116bb6000546001600160a01b031690565b6001600160a01b0316146117115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600855565b610fd4338383612ae1565b61172b3383612378565b61179d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610870565b6117a984848484612bce565b50505050565b336117c26000546001600160a01b031690565b6001600160a01b0316146118185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b03166118df5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610870565b60026118ea83612c57565b6040516020016118fb929190613aa2565b6040516020818303038152906040529050919050565b600054610bb876010000000000000000000000000000000000000000000090910461ffff1611156119845760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610870565b336000908152600a602052604090205460ff16156119e45760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b346709b6e64a8ec6000014611a3b5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b336000908152600a60205260408120805460ff1691611a5983613e8d565b91906101000a81548160ff021916908360ff160217905550506115cd336126b4565b33611a8e6000546001600160a01b031690565b6001600160a01b031614611ae45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600780546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681900460ff1615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909116179055565b600054610af090611b6e90760100000000000000000000000000000000000000000000900461ffff1683613cd8565b1115611bbc5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c792100000000006044820152606401610870565b33600090815260096020526040902054600490611bdc9060ff1683613cd8565b11158015611be957508015155b611c355760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c657421006044820152606401610870565b611c468166f8b0a10e470000613d29565b3414611c945760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f7272656374210000000000006044820152606401610870565b3360009081526009602052604081208054839290611cb690849060ff16613cf0565b92506101000a81548160ff021916908360ff160217905550610ee78133612892565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611d3e57600080fd5b505afa158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190613976565b6001600160a01b03161415611d8f5760019150506107e4565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b33611dd26000546001600160a01b031690565b6001600160a01b031614611e285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6001600160a01b038116611ea45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610870565b610ee781612a79565b33611ec06000546001600160a01b031690565b6001600160a01b031614611f165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b60005460c890611f4490760100000000000000000000000000000000000000000000900461ffff1684613cd8565b1115611f4f57600080fd5b610fd48282612892565b33611f6c6000546001600160a01b031690565b6001600160a01b031614611fc25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b600054610b2290611ff3907801000000000000000000000000000000000000000000000000900461ffff1684613cd8565b1115611ffe57600080fd5b610fd48282612d89565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061209b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107e457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107e4565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612138826111ad565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b82518251600091829181146121c85760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d61746368000000000000000000006044820152606401610870565b8360008080805b8581101561232b576020810260208c01015192506020810260208b01015191506121f9823b151590565b156122465760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74206d696e7420746f20636f6e74726163747321000000000000006044820152606401610870565b6001600160a01b0382166000908152600460205260408120805485929061226e908490613cd8565b90915550600090505b8381101561230c578561228981613e54565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929950899350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061230481613e54565b915050612277565b506123178385613cd8565b93508061232381613e54565b9150506121cf565b5082600060148282829054906101000a900461ffff1661234b9190613cb2565b92506101000a81548161ffff021916908361ffff1602179055508383965096505050505050935093915050565b6000818152600360205260408120546001600160a01b03166124025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610870565b6000828152600360205260409020546001600160a01b039081169084168114806124455750836001600160a01b031661243a846107ea565b6001600160a01b0316145b8061245557506124558185611cd8565b949350505050565b6000818152600360205260409020546001600160a01b038481169116146124ec5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610870565b6001600160a01b0382166125675760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610870565b6125726000826120eb565b6001600160a01b038316600090815260046020526040812080549161259683613da9565b90915550506001600160a01b03821660009081526004602052604081208054916125bf83613e54565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201526001600160a01b03909116906126a39061269d9060340160405160208183030381529060405280519060200120612eca565b84612f05565b6001600160a01b0316149392505050565b600080546126e3907801000000000000000000000000000000000000000000000000900461ffff166001613cb2565b6001600160a01b0383166000908152600460205260408120805461ffff9390931693509061271083613e54565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46000805474010000000000000000000000000000000000000000900461ffff169060146127ae83613e32565b91906101000a81548161ffff021916908361ffff160217905550506000601881819054906101000a900461ffff16809291906127e990613e32565b91906101000a81548161ffff021916908361ffff160217905550506128206000838360405180602001604052806000815250612f29565b610fd45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b600080546001600160a01b0383168252600460205260408220805476010000000000000000000000000000000000000000000090920461ffff169285926128da908490613cd8565b90915550600090505b8381101561297857816128f581613e54565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061297081613e54565b9150506128e3565b5082600060148282829054906101000a900461ffff166129989190613cb2565b92506101000a81548161ffff021916908361ffff16021790555082600060168282829054906101000a900461ffff166129d19190613cb2565b92506101000a81548161ffff021916908361ffff160217905550612a076000838360405180602001604052806000815250612f29565b6109bf5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415612b435760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610870565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612bd984848461245d565b612be584848484612f29565b6117a95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b606081612c9757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612cc15780612cab81613e54565b9150612cba9050600a83613d15565b9150612c9b565b60008167ffffffffffffffff811115612cdc57612cdc613f7d565b6040519080825280601f01601f191660200182016040528015612d06576020820181803683370190505b5090505b841561245557612d1b600183613d66565b9150612d28600a86613ead565b612d33906030613cd8565b60f81b818381518110612d4857612d48613f4e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d82600a86613d15565b9450612d0a565b600080546001600160a01b03831682526004602052604082208054780100000000000000000000000000000000000000000000000090920461ffff16928592612dd3908490613cd8565b90915550600090505b83811015612e715781612dee81613e54565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480612e6981613e54565b915050612ddc565b5082600060148282829054906101000a900461ffff16612e919190613cb2565b92506101000a81548161ffff021916908361ffff16021790555082600060188282829054906101000a900461ffff166129d19190613cb2565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01610f3b565b6000806000612f1485856130f4565b91509150612f2181613161565b509392505050565b60006001600160a01b0384163b156130e9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f86903390899088908890600401613bac565b602060405180830381600087803b158015612fa057600080fd5b505af1925050508015612fee575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612feb918101906138cb565b60015b61309e573d80801561301c576040519150601f19603f3d011682016040523d82523d6000602084013e613021565b606091505b5080516130965760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610870565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612455565b506001949350505050565b60008082516041141561312b5760208301516040840151606085015160001a61311f87828585613352565b94509450505050610d3f565b825160401415613155576020830151604084015161314a86838361345d565b935093505050610d3f565b50600090506002610d3f565b600081600481111561317557613175613f1f565b141561317e5750565b600181600481111561319257613192613f1f565b14156131e05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610870565b60028160048111156131f4576131f4613f1f565b14156132425760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610870565b600381600481111561325657613256613f1f565b14156132ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610870565b60048160048111156132de576132de613f1f565b1415610ee75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610870565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156133895750600090506003613454565b8460ff16601b141580156133a157508460ff16601c14155b156133b25750600090506004613454565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613406573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b03811661344d57600060019250925050613454565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b0161349787828885613352565b935093505050935093915050565b8280546134b190613dde565b90600052602060002090601f0160209004810192826134d35760008555613519565b82601f106134ec57805160ff1916838001178555613519565b82800160010185558215613519579182015b828111156135195782518255916020019190600101906134fe565b50613525929150613529565b5090565b5b80821115613525576000815560010161352a565b600067ffffffffffffffff83111561355857613558613f7d565b61358960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613c3f565b905082815283838301111561359d57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126135c557600080fd5b813560206135da6135d583613c8e565b613c3f565b80838252828201915082860187848660051b89010111156135fa57600080fd5b60005b8581101561362257813561361081613fac565b845292840192908401906001016135fd565b5090979650505050505050565b60008083601f84011261364157600080fd5b50813567ffffffffffffffff81111561365957600080fd5b602083019150836020828501011115610d3f57600080fd5b60006020828403121561368357600080fd5b813561368e81613fac565b9392505050565b600080604083850312156136a857600080fd5b82356136b381613fac565b915060208301356136c381613fac565b809150509250929050565b6000806000606084860312156136e357600080fd5b83356136ee81613fac565b925060208401356136fe81613fac565b929592945050506040919091013590565b6000806000806080858703121561372557600080fd5b843561373081613fac565b9350602085013561374081613fac565b925060408501359150606085013567ffffffffffffffff81111561376357600080fd5b8501601f8101871361377457600080fd5b6137838782356020840161353e565b91505092959194509250565b600080604083850312156137a257600080fd5b82356137ad81613fac565b9150602083013580151581146136c357600080fd5b600080604083850312156137d557600080fd5b82356137e081613fac565b946020939093013593505050565b6000806040838503121561380157600080fd5b823567ffffffffffffffff8082111561381957600080fd5b818501915085601f83011261382d57600080fd5b8135602061383d6135d583613c8e565b8083825282820191508286018a848660051b890101111561385d57600080fd5b600096505b84871015613880578035835260019690960195918301918301613862565b509650508601359250508082111561389757600080fd5b506138a4858286016135b4565b9150509250929050565b6000602082840312156138c057600080fd5b813561368e81613fc1565b6000602082840312156138dd57600080fd5b815161368e81613fc1565b600080602083850312156138fb57600080fd5b823567ffffffffffffffff81111561391257600080fd5b61391e8582860161362f565b90969095509350505050565b60008060006040848603121561393f57600080fd5b833567ffffffffffffffff81111561395657600080fd5b6139628682870161362f565b909790965060209590950135949350505050565b60006020828403121561398857600080fd5b815161368e81613fac565b6000602082840312156139a557600080fd5b813567ffffffffffffffff8111156139bc57600080fd5b8201601f810184136139cd57600080fd5b6124558482356020840161353e565b6000602082840312156139ee57600080fd5b5035919050565b60008060408385031215613a0857600080fd5b8235915060208301356136c381613fac565b60008060408385031215613a2d57600080fd5b50508035926020909101359150565b60008151808452613a54816020860160208601613d7d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151613a98818560208601613d7d565b9290920192915050565b600080845481600182811c915080831680613abe57607f831692505b6020808410821415613af7577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613b0b5760018114613b3a57613b67565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613b67565b60008b81526020902060005b86811015613b5f5781548b820152908501908301613b46565b505084890196505b505050505050613ba3613b7a8286613a86565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613bde6080830184613a3c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c2057835183529284019291840191600101613c04565b50909695505050505050565b60208152600061368e6020830184613a3c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c8657613c86613f7d565b604052919050565b600067ffffffffffffffff821115613ca857613ca8613f7d565b5060051b60200190565b600061ffff808316818516808303821115613ccf57613ccf613ec1565b01949350505050565b60008219821115613ceb57613ceb613ec1565b500190565b600060ff821660ff84168060ff03821115613d0d57613d0d613ec1565b019392505050565b600082613d2457613d24613ef0565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6157613d61613ec1565b500290565b600082821015613d7857613d78613ec1565b500390565b60005b83811015613d98578181015183820152602001613d80565b838111156117a95750506000910152565b600081613db857613db8613ec1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680613df257607f821691505b60208210811415613e2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff80831681811415613e4a57613e4a613ec1565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8657613e86613ec1565b5060010190565b600060ff821660ff811415613ea457613ea4613ec1565b60010192915050565b600082613ebc57613ebc613ef0565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114610ee757600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ee757600080fdfea26469706673582212202639447590cab8b0742383adae2530d3e3476258bb2e0b697fce81e2a5bc798a64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d5576615577375062615a666a415142626b787a42626a7458533453675878535534616e42427a794e677345672f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _royalty (uint256): 5
Arg [1] : _openseaProxyRegistry (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [2] : _tempBaseURI (string): https://ipfs.io/ipfs/QmUvaUw7PbaZfjAQBbkxzBbjtXS4SgXxSU4anBBzyNgsEg/

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f516d557661557737506261
Arg [5] : 5a666a415142626b787a42626a7458533453675878535534616e42427a794e67
Arg [6] : 7345672f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

34358:7521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40503:241;;;;;;;;;;-1:-1:-1;40503:241:0;;;;;:::i;:::-;;:::i;:::-;;;13054:14:1;;13047:22;13029:41;;13017:2;13002:18;40503:241:0;;;;;;;;23787:107;;;;;;;;;;-1:-1:-1;23861:25:0;;;;;;;;;;;;;;;;;23787:107;;;;;;;:::i;25008:213::-;;;;;;;;;;-1:-1:-1;25008:213:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11367:55:1;;;11349:74;;11337:2;11322:18;25008:213:0;11203:226:1;24548:394:0;;;;;;;;;;-1:-1:-1;24548:394:0;;;;;:::i;:::-;;:::i;:::-;;35577:330;;;;;;;;;;-1:-1:-1;35577:330:0;;;;;:::i;:::-;;:::i;21990:25::-;;;;;;;;;;-1:-1:-1;21990:25:0;;;;;;;;;;;;;;25103:6:1;25091:19;;;25073:38;;25061:2;25046:18;21990:25:0;24929:188:1;26098:331:0;;;;;;;;;;-1:-1:-1;26098:331:0;;;;;:::i;:::-;;:::i;35239:330::-;;;;;;;;;;-1:-1:-1;35239:330:0;;;;;:::i;:::-;;:::i;39788:279::-;;;;;;;;;;-1:-1:-1;39788:279:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12142:55:1;;;12124:74;;12229:2;12214:18;;12207:34;;;;12097:18;39788:279:0;11950:297:1;41137:95:0;;;;;;;;;;;;;:::i;40752:204::-;;;;;;;;;;;;;:::i;26500:179::-;;;;;;;;;;-1:-1:-1;26500:179:0;;;;;:::i;:::-;;:::i;38978:126::-;;;;;;;;;;-1:-1:-1;38978:126:0;;;;;:::i;:::-;;:::i;:::-;;;13500:25:1;;;13488:2;13473:18;38978:126:0;13354:177:1;24396:90:0;;;;;;;;;;-1:-1:-1;24396:90:0;;;;;:::i;:::-;;:::i;38275:432::-;;;;;;:::i;:::-;;:::i;23489:231::-;;;;;;;;;;-1:-1:-1;23489:231:0;;;;;:::i;:::-;;:::i;37759:508::-;;;;;;:::i;:::-;;:::i;22154:21::-;;;;;;;;;;;;;:::i;23225:202::-;;;;;;;;;;-1:-1:-1;23225:202:0;;;;;:::i;:::-;;:::i;1675:96::-;;;;;;;;;;;;;:::i;41523:353::-;;;;;;;;;;-1:-1:-1;41523:353:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39112:181::-;;;;;;;;;;-1:-1:-1;39228:14:0;;;;;;;;39270:15;;;39112:181;;;13268:14:1;;13261:22;13243:41;;13327:14;;13320:22;13315:2;13300:18;;13293:50;13216:18;39112:181:0;13081:268:1;1026:87:0;;;;;;;;;;-1:-1:-1;1072:7:0;1099:6;-1:-1:-1;;;;;1099:6:0;1026:87;;23963:95;;;;;;;;;;-1:-1:-1;24039:11:0;;;;;;;;;;;;;;;;;23963:95;;40319:112;;;;;;;;;;-1:-1:-1;40319:112:0;;;;;:::i;:::-;;:::i;25293:147::-;;;;;;;;;;-1:-1:-1;25293:147:0;;;;;:::i;:::-;;:::i;26750:318::-;;;;;;;;;;-1:-1:-1;26750:318:0;;;;;:::i;:::-;;:::i;25919:112::-;;;;;;;;;;-1:-1:-1;25919:112:0;;;;;:::i;:::-;;:::i;24129:259::-;;;;;;;;;;-1:-1:-1;24129:259:0;;;;;:::i;:::-;;:::i;22110:35::-;;;;;;;;;;-1:-1:-1;22110:35:0;;;;-1:-1:-1;;;;;22110:35:0;;;37397:354;;;:::i;41382:133::-;;;;;;;;;;;;;:::i;36947:442::-;;;;;;:::i;:::-;;:::i;25511:400::-;;;;;;;;;;-1:-1:-1;25511:400:0;;;;;:::i;:::-;;:::i;1926:194::-;;;;;;;;;;-1:-1:-1;1926:194:0;;;;;:::i;:::-;;:::i;34887:169::-;;;;;;;;;;-1:-1:-1;34887:169:0;;;;;:::i;:::-;;:::i;35064:167::-;;;;;;;;;;-1:-1:-1;35064:167:0;;;;;:::i;:::-;;:::i;40503:241::-;40605:4;40642:41;;;40657:26;40642:41;;:94;;;40700:36;40724:11;40700:23;:36::i;:::-;40622:114;40503:241;-1:-1:-1;;40503:241:0:o;25008:213::-;25076:7;28598:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28598:16:0;25096:73;;;;-1:-1:-1;;;25096:73:0;;22064:2:1;25096:73:0;;;22046:21:1;22103:2;22083:18;;;22076:30;22142:34;22122:18;;;22115:62;22213:14;22193:18;;;22186:42;22245:19;;25096:73:0;;;;;;;;;-1:-1:-1;25189:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25189:24:0;;25008:213::o;24548:394::-;24623:13;24639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24639:16:0;;;;24674:11;;;;;24666:57;;;;-1:-1:-1;;;24666:57:0;;23254:2:1;24666:57:0;;;23236:21:1;23293:2;23273:18;;;23266:30;23332:34;23312:18;;;23305:62;23403:3;23383:18;;;23376:31;23424:19;;24666:57:0;23052:397:1;24666:57:0;24758:10;-1:-1:-1;;;;;24758:19:0;;;;:58;;;24781:35;24798:5;24805:10;24781:16;:35::i;:::-;24736:164;;;;-1:-1:-1;;;24736:164:0;;19306:2:1;24736:164:0;;;19288:21:1;19345:2;19325:18;;;19318:30;19384:34;19364:18;;;19357:62;19455:26;19435:18;;;19428:54;19499:19;;24736:164:0;19104:420:1;24736:164:0;24913:21;24922:2;24926:7;24913:8;:21::i;:::-;24612:330;24548:394;;:::o;35577:330::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;35685:12:::1;35700:15:::0;;;;::::1;;;::::0;35685:12;35755:42:::1;35777:6:::0;35785:2;35700:15;35755:21:::1;:42::i;:::-;35726:71;;;;35829:4;35818:7;:15;;35810:44;;;::::0;-1:-1:-1;;;35810:44:0;;21311:2:1;35810:44:0::1;::::0;::::1;21293:21:1::0;21350:2;21330:18;;;21323:30;21389:18;21369;;;21362:46;21425:18;;35810:44:0::1;21109:340:1::0;35810:44:0::1;35891:5;35865:15;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35674:233;;;35577:330:::0;;:::o;26098:331::-;26287:39;26306:10;26318:7;26287:18;:39::i;:::-;26279:101;;;;-1:-1:-1;;;26279:101:0;;24007:2:1;26279:101:0;;;23989:21:1;24046:2;24026:18;;;24019:30;24085:34;24065:18;;;24058:62;24156:19;24136:18;;;24129:47;24193:19;;26279:101:0;23805:413:1;26279:101:0;26393:28;26403:4;26409:2;26413:7;26393:9;:28::i;35239:330::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;35348:12:::1;35363:16:::0;;;;::::1;;;::::0;35348:12;35419:42:::1;35441:6:::0;35449:2;35363:16;35419:21:::1;:42::i;:::-;35390:71;;;;35493:3;35482:7;:14;;35474:43;;;::::0;-1:-1:-1;;;35474:43:0;;21311:2:1;35474:43:0::1;::::0;::::1;21293:21:1::0;21350:2;21330:18;;;21323:30;21389:18;21369;;;21362:46;21425:18;;35474:43:0::1;21109:340:1::0;35474:43:0::1;35555:5;35528:16;;:33;;;;;;;;;;;;;;;;:::i;39788:279::-:0;39870:16;28598;;;:7;:16;;;;;;39870;;-1:-1:-1;;;;;28598:16:0;39922:68;;;;-1:-1:-1;;;39922:68:0;;21656:2:1;39922:68:0;;;21638:21:1;21695:2;21675:18;;;21668:30;21734:34;21714:18;;;21707:62;21805:9;21785:18;;;21778:37;21832:19;;39922:68:0;21454:403:1;39922:68:0;1072:7;1099:6;-1:-1:-1;;;;;1099:6:0;40053:5;40029:21;;40017:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;40001:58;;;;39788:279;;;;;;:::o;41137:95::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;41210:14:::1;::::0;;41192:32;;::::1;41210:14;::::0;;::::1;41209:15;41192:32;::::0;;41137:95::o;40752:204::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;40821:69:::1;::::0;40803:12:::1;::::0;40829:10:::1;::::0;40881:4:::1;::::0;40853:21:::1;::::0;40803:12;40821:69;40803:12;40821:69;40853:21;40829:10;40881:4;40821:69:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40802:88;;;40909:7;40901:47;;;::::0;-1:-1:-1;;;40901:47:0;;20552:2:1;40901:47:0::1;::::0;::::1;20534:21:1::0;20591:2;20571:18;;;20564:30;20630:29;20610:18;;;20603:57;20677:18;;40901:47:0::1;20350:351:1::0;40901:47:0::1;40791:165;40752:204::o:0;26500:179::-;26632:39;26649:4;26655:2;26659:7;26632:39;;;;;;;;;;;;:16;:39::i;38978:126::-;39070:25;;9080:66:1;9067:2;9063:15;;;9059:88;39070:25:0;;;9047:101:1;39033:7:0;;9164:12:1;;39070:25:0;;;;;;;;;;;;;39060:36;;;;;;39053:43;;38978:126;;;:::o;24396:90::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;24465:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;24396:90:::0;:::o;38275:432::-;38353:14;;;;38345:50;;;;-1:-1:-1;;;38345:50:0;;17423:2:1;38345:50:0;;;17405:21:1;17462:2;17442:18;;;17435:30;17501:25;17481:18;;;17474:53;17544:18;;38345:50:0;17221:347:1;38345:50:0;38414:26;38424:10;38436:3;;38414:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38414:9:0;;-1:-1:-1;;;38414:26:0:i;:::-;38406:60;;;;-1:-1:-1;;;38406:60:0;;24425:2:1;38406:60:0;;;24407:21:1;24464:2;24444:18;;;24437:30;24503:23;24483:18;;;24476:51;24544:18;;38406:60:0;24223:345:1;38406:60:0;38503:10;38485:29;;;;:17;:29;;;;;;;;:34;38477:78;;;;-1:-1:-1;;;38477:78:0;;18946:2:1;38477:78:0;;;18928:21:1;18985:2;18965:18;;;18958:30;19024:33;19004:18;;;18997:61;19075:18;;38477:78:0;18744:355:1;38477:78:0;38574:9;38587:4;38574:17;38566:56;;;;-1:-1:-1;;;38566:56:0;;17775:2:1;38566:56:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:28;17833:18;;;17826:56;17899:18;;38566:56:0;17573:350:1;38566:56:0;38653:10;38635:29;;;;:17;:29;;;;;:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;38677:22;38688:10;38677;:22::i;23489:231::-;23553:7;23589:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23589:16:0;23624:19;23616:73;;;;-1:-1:-1;;;23616:73:0;;20142:2:1;23616:73:0;;;20124:21:1;20181:2;20161:18;;;20154:30;20220:34;20200:18;;;20193:62;20291:11;20271:18;;;20264:39;20320:19;;23616:73:0;19940:405:1;37759:508:0;37854:14;;;;37846:50;;;;-1:-1:-1;;;37846:50:0;;17423:2:1;37846:50:0;;;17405:21:1;17462:2;17442:18;;;17435:30;17501:25;17481:18;;;17474:53;17544:18;;37846:50:0;17221:347:1;37846:50:0;37915:26;37925:10;37937:3;;37915:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37915:9:0;;-1:-1:-1;;;37915:26:0:i;:::-;37907:60;;;;-1:-1:-1;;;37907:60:0;;24425:2:1;37907:60:0;;;24407:21:1;24464:2;24444:18;;;24437:30;24503:23;24483:18;;;24476:51;24544:18;;37907:60:0;24223:345:1;37907:60:0;38014:10;37995:30;;;;:18;:30;;;;;;38029:1;;37986:39;;37995:30;;37986:6;:39;:::i;:::-;:44;;:59;;;;-1:-1:-1;38034:11:0;;;37986:59;37978:103;;;;-1:-1:-1;;;37978:103:0;;18946:2:1;37978:103:0;;;18928:21:1;18985:2;18965:18;;;18958:30;19024:33;19004:18;;;18997:61;19075:18;;37978:103:0;18744:355:1;37978:103:0;38113:13;:6;38122:4;38113:13;:::i;:::-;38100:9;:26;38092:65;;;;-1:-1:-1;;;38092:65:0;;17775:2:1;38092:65:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:28;17833:18;;;17826:56;17899:18;;38092:65:0;17573:350:1;38092:65:0;38189:10;38170:30;;;;:18;:30;;;;;:47;;38210:6;;38170:30;:47;;38210:6;;38170:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38228:31;38240:6;38248:10;38228:11;:31::i;22154:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23225:202::-;23291:7;-1:-1:-1;;;;;23319:19:0;;23311:74;;;;-1:-1:-1;;;23311:74:0;;19731:2:1;23311:74:0;;;19713:21:1;19770:2;19750:18;;;19743:30;19809:34;19789:18;;;19782:62;19880:12;19860:18;;;19853:40;19910:19;;23311:74:0;19529:406:1;23311:74:0;-1:-1:-1;;;;;;23403:16:0;;;;;:9;:16;;;;;;;23225:202::o;1675:96::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;1742:21:::1;1760:1;1742:9;:21::i;:::-;1675:96::o:0;41523:353::-;-1:-1:-1;;;;;41643:16:0;;41609:20;41643:16;;;:9;:16;;;;;;41583:13;;41609:20;41632:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41632:28:0;-1:-1:-1;41609:51:0;-1:-1:-1;41671:6:0;41704:1;41690:153;41711:4;41707:1;:8;41690:153;;;41741:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;41741:19:0;;;:10;;:19;41737:95;;;41793:1;41781:6;41788:1;41781:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;41813:3;;;;:::i;:::-;;;;41737:95;41717:3;;;;:::i;:::-;;;;41690:153;;;-1:-1:-1;41862:6:0;;41523:353;-1:-1:-1;;;41523:353:0:o;40319:112::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;40392:21:::1;:30:::0;40319:112::o;25293:147::-;25382:50;25401:10;25413:8;25423;25382:18;:50::i;26750:318::-;26917:39;26936:10;26948:7;26917:18;:39::i;:::-;26909:101;;;;-1:-1:-1;;;26909:101:0;;24007:2:1;26909:101:0;;;23989:21:1;24046:2;24026:18;;;24019:30;24085:34;24065:18;;;24058:62;24156:19;24136:18;;;24129:47;24193:19;;26909:101:0;23805:413:1;26909:101:0;27021:39;27035:4;27041:2;27045:7;27054:5;27021:13;:39::i;:::-;26750:318;;;;:::o;25919:112::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;25996:20:::1;:27:::0;;;::::1;-1:-1:-1::0;;;;;25996:27:0;;;::::1;::::0;;;::::1;::::0;;25919:112::o;24129:259::-;28574:4;28598:16;;;:7;:16;;;;;;24196:13;;-1:-1:-1;;;;;28598:16:0;24222:76;;;;-1:-1:-1;;;24222:76:0;;22838:2:1;24222:76:0;;;22820:21:1;22877:2;22857:18;;;22850:30;22916:34;22896:18;;;22889:62;22987:17;22967:18;;;22960:45;23022:19;;24222:76:0;22636:411:1;24222:76:0;24342:7;24351:18;:7;:16;:18::i;:::-;24325:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24311:69;;24129:259;;;:::o;37397:354::-;37454:16;;37474:4;37454:16;;;;;;:24;;37446:64;;;;-1:-1:-1;;;37446:64:0;;24775:2:1;37446:64:0;;;24757:21:1;24814:2;24794:18;;;24787:30;24853:29;24833:18;;;24826:57;24900:18;;37446:64:0;24573:351:1;37446:64:0;37547:10;37529:29;;;;:17;:29;;;;;;;;:34;37521:78;;;;-1:-1:-1;;;37521:78:0;;18946:2:1;37521:78:0;;;18928:21:1;18985:2;18965:18;;;18958:30;19024:33;19004:18;;;18997:61;19075:18;;37521:78:0;18744:355:1;37521:78:0;37618:9;37631:4;37618:17;37610:56;;;;-1:-1:-1;;;37610:56:0;;17775:2:1;37610:56:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:28;17833:18;;;17826:56;17899:18;;37610:56:0;17573:350:1;37610:56:0;37697:10;37679:29;;;;:17;:29;;;;;:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;37721:22;37732:10;37721;:22::i;41382:133::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;41440:14:::1;:22:::0;;::::1;::::0;;::::1;41492:15:::0;;::::1;41440:22;41492:15;41491:16;41473:34;::::0;;;;::::1;::::0;;41382:133::o;36947:442::-;37025:16;;37045:4;;37016:25;;37025:16;;;;;37016:6;:25;:::i;:::-;:33;;37008:73;;;;-1:-1:-1;;;37008:73:0;;24775:2:1;37008:73:0;;;24757:21:1;24814:2;24794:18;;;24787:30;24853:29;24833:18;;;24826:57;24900:18;;37008:73:0;24573:351:1;37008:73:0;37128:10;37109:30;;;;:18;:30;;;;;;37143:1;;37100:39;;37109:30;;37100:6;:39;:::i;:::-;:44;;:59;;;;-1:-1:-1;37148:11:0;;;37100:59;37092:103;;;;-1:-1:-1;;;37092:103:0;;18946:2:1;37092:103:0;;;18928:21:1;18985:2;18965:18;;;18958:30;19024:33;19004:18;;;18997:61;19075:18;;37092:103:0;18744:355:1;37092:103:0;37227:13;:6;37236:4;37227:13;:::i;:::-;37214:9;:26;37206:65;;;;-1:-1:-1;;;37206:65:0;;17775:2:1;37206:65:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:28;17833:18;;;17826:56;17899:18;;37206:65:0;17573:350:1;37206:65:0;37311:10;37292:30;;;;:18;:30;;;;;:47;;37332:6;;37292:30;:47;;37332:6;;37292:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37350:31;37362:6;37370:10;37350:11;:31::i;25511:400::-;25724:20;;25768:28;;;;;-1:-1:-1;;;;;11367:55:1;;;25768:28:0;;;11349:74:1;25600:4:0;;25724:20;;;25760:49;;;;25724:20;;25768:21;;11322:18:1;;25768:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25760:49:0;;25756:93;;;25833:4;25826:11;;;;;25756:93;-1:-1:-1;;;;;;;25868:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25511:400::o;1926:194::-;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;-1:-1:-1;;;;;2017:22:0;::::1;2009:73;;;::::0;-1:-1:-1;;;2009:73:0;;15851:2:1;2009:73:0::1;::::0;::::1;15833:21:1::0;15890:2;15870:18;;;15863:30;15929:34;15909:18;;;15902:62;16000:8;15980:18;;;15973:36;16026:19;;2009:73:0::1;15649:402:1::0;2009:73:0::1;2093:19;2103:8;2093:9;:19::i;34887:169::-:0;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;34990:16:::1;::::0;35010:3:::1;::::0;34981:25:::1;::::0;34990:16;;::::1;;;34981:6:::0;:25:::1;:::i;:::-;:32;;34973:41;;;::::0;::::1;;35025:23;35037:6;35045:2;35025:11;:23::i;35064:167::-:0;1257:10;1246:7;1072;1099:6;-1:-1:-1;;;;;1099:6:0;;1026:87;1246:7;-1:-1:-1;;;;;1246:21:0;;1238:66;;;;-1:-1:-1;;;1238:66:0;;22477:2:1;1238:66:0;;;22459:21:1;;;22496:18;;;22489:30;22555:34;22535:18;;;22528:62;22607:18;;1238:66:0;22275:356:1;1238:66:0;35166:15:::1;::::0;35185:4:::1;::::0;35157:24:::1;::::0;35166:15;;::::1;;;35157:6:::0;:24:::1;:::i;:::-;:32;;35149:41;;;::::0;::::1;;35201:22;35212:6;35220:2;35201:10;:22::i;22856:305::-:0;22958:4;22995:40;;;23010:25;22995:40;;:105;;-1:-1:-1;23052:48:0;;;23067:33;23052:48;22995:105;:158;;;-1:-1:-1;15078:25:0;15063:40;;;;23117:36;14954:157;32196:174;32271:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;32271:29:0;;;;;;;;:24;;32325:23;32271:24;32325:14;:23::i;:::-;-1:-1:-1;;;;;32316:46:0;;;;;;;;;;;32196:174;;:::o;35915:1024::-;36056:13;;36098:9;;36019:4;;;;36088:19;;36080:54;;;;-1:-1:-1;;;36080:54:0;;23656:2:1;36080:54:0;;;23638:21:1;23695:2;23675:18;;;23668:30;23734:24;23714:18;;;23707:52;23776:18;;36080:54:0;23454:346:1;36080:54:0;36170:7;36155:12;;;;36258:589;36275:6;36271:1;:10;36258:589;;;36380:4;36377:1;36373:12;36366:4;36358:6;36354:17;36350:36;36344:43;36333:54;;36444:4;36441:1;36437:12;36430:4;36426:2;36422:13;36418:32;36412:39;36405:46;;36491:23;36510:3;11933:20;11981:8;;;11610:387;36491:23;36490:24;36482:62;;;;-1:-1:-1;;;36482:62:0;;15497:2:1;36482:62:0;;;15479:21:1;15536:2;15516:18;;;15509:30;15575:27;15555:18;;;15548:55;15620:18;;36482:62:0;15295:349:1;36482:62:0;-1:-1:-1;;;;;36561:14:0;;;;;;:9;:14;;;;;:25;;36579:7;;36561:14;:25;;36579:7;;36561:25;:::i;:::-;;;;-1:-1:-1;36620:6:0;;-1:-1:-1;36615:176:0;36632:7;36628:1;:11;36615:176;;;36665:9;;;;:::i;:::-;36695:16;;;;:7;:16;;;;;;:22;;;;-1:-1:-1;;;;;36695:22:0;;;;;;;;36741:34;;36695:16;;-1:-1:-1;36695:16:0;;-1:-1:-1;36695:22:0;36741:34;;36695:16;;36741:34;36641:3;;;;:::i;:::-;;;;36615:176;;;-1:-1:-1;36819:16:0;36828:7;36819:16;;:::i;:::-;;-1:-1:-1;36283:3:0;;;;:::i;:::-;;;;36258:589;;;;36889:5;36867:11;;:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36916:7;36925:5;36908:23;;;;;;;;;35915:1024;;;;;;:::o;28803:341::-;28896:4;28598:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28598:16:0;28913:73;;;;-1:-1:-1;;;28913:73:0;;18533:2:1;28913:73:0;;;18515:21:1;18572:2;18552:18;;;18545:30;18611:34;18591:18;;;18584:62;18682:14;18662:18;;;18655:42;18714:19;;28913:73:0;18331:408:1;28913:73:0;28997:13;29013:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29013:16:0;;;;29048;;;;;:51;;;29092:7;-1:-1:-1;;;;;29068:31:0;:20;29080:7;29068:11;:20::i;:::-;-1:-1:-1;;;;;29068:31:0;;29048:51;:87;;;;29103:32;29120:5;29127:7;29103:16;:32::i;:::-;29040:96;28803:341;-1:-1:-1;;;;28803:341:0:o;31559:519::-;31691:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;31691:24:0;;;:16;;:24;31683:74;;;;-1:-1:-1;;;31683:74:0;;16258:2:1;31683:74:0;;;16240:21:1;16297:2;16277:18;;;16270:30;16336:34;16316:18;;;16309:62;16407:7;16387:18;;;16380:35;16432:19;;31683:74:0;16056:401:1;31683:74:0;-1:-1:-1;;;;;31776:16:0;;31768:65;;;;-1:-1:-1;;;31768:65:0;;16664:2:1;31768:65:0;;;16646:21:1;16703:2;16683:18;;;16676:30;16742:34;16722:18;;;16715:62;16813:6;16793:18;;;16786:34;16837:19;;31768:65:0;16462:400:1;31768:65:0;31898:29;31915:1;31919:7;31898:8;:29::i;:::-;-1:-1:-1;;;;;31940:15:0;;;;;;:9;:15;;;;;:17;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;31968:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;32004:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;32004:21:0;;;;;;;;;32043:27;;32004:16;;32043:27;;;;;;;31559:519;;;:::o;38715:255::-;38797:4;1099:6;;38888:25;;9080:66:1;9067:2;9063:15;;;9059:88;38888:25:0;;;9047:101:1;-1:-1:-1;;;;;1099:6:0;;;;38821:130;;38849:66;;9164:12:1;;38888:25:0;;;;;;;;;;;;38878:36;;;;;;38849:28;:66::i;:::-;38930:10;38821:13;:130::i;:::-;-1:-1:-1;;;;;38821:141:0;;;38715:255;-1:-1:-1;;;38715:255:0:o;30791:431::-;30843:12;30858:15;;:19;;:15;;;;;30876:1;30858:19;:::i;:::-;-1:-1:-1;;;;;30890:13:0;;;;;;:9;:13;;;;;:15;;30843:34;;;;;;-1:-1:-1;30890:13:0;:15;;;:::i;:::-;;;;-1:-1:-1;;30916:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;30916:21:0;;;;;;;;30955:33;;30916:16;;;30955:33;;30916:16;;30955:33;31009:11;:13;;;;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;31033:15;;:17;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;31085:51;31116:1;31120:2;31124:7;31085:51;;;;;;;;;;;;:22;:51::i;:::-;31063:151;;;;-1:-1:-1;;;31063:151:0;;15078:2:1;31063:151:0;;;15060:21:1;15117:2;15097:18;;;15090:30;15156:34;15136:18;;;15129:62;15227:20;15207:18;;;15200:48;15265:19;;31063:151:0;14876:414:1;29480:649:0;29549:12;29564:16;;-1:-1:-1;;;;;29593:13:0;;;;:9;:13;;;;;:23;;29564:16;;;;;;;29610:6;;29593:23;;29610:6;;29593:23;:::i;:::-;;;;-1:-1:-1;29642:6:0;;-1:-1:-1;29637:157:0;29654:6;29650:1;:10;29637:157;;;29682:9;;;;:::i;:::-;29708:16;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29708:21:0;;;;;;;;29749:33;;29708:16;;-1:-1:-1;29708:16:0;;-1:-1:-1;29708:21:0;29749:33;;29708:16;;29749:33;29662:3;;;;:::i;:::-;;;;29637:157;;;;29836:6;29814:11;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29881:6;29854:16;;:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29923:51;29954:1;29958:2;29962:7;29923:51;;;;;;;;;;;;:22;:51::i;:::-;29901:151;;;;-1:-1:-1;;;29901:151:0;;15078:2:1;29901:151:0;;;15060:21:1;15117:2;15097:18;;;15090:30;15156:34;15136:18;;;15129:62;15227:20;15207:18;;;15200:48;15265:19;;29901:151:0;14876:414:1;2128:173:0;2184:16;2203:6;;-1:-1:-1;;;;;2220:17:0;;;;;;;;;;2253:40;;2203:6;;;;;;;2253:40;;2184:16;2253:40;2173:128;2128:173;:::o;32512:315::-;32667:8;-1:-1:-1;;;;;32658:17:0;:5;-1:-1:-1;;;;;32658:17:0;;;32650:55;;;;-1:-1:-1;;;32650:55:0;;17069:2:1;32650:55:0;;;17051:21:1;17108:2;17088:18;;;17081:30;17147:27;17127:18;;;17120:55;17192:18;;32650:55:0;16867:349:1;32650:55:0;-1:-1:-1;;;;;32716:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;32778:41;;13029::1;;;32778::0;;13002:18:1;32778:41:0;;;;;;;32512:315;;;:::o;27950:::-;28107:28;28117:4;28123:2;28127:7;28107:9;:28::i;:::-;28154:48;28177:4;28183:2;28187:7;28196:5;28154:22;:48::i;:::-;28146:111;;;;-1:-1:-1;;;28146:111:0;;15078:2:1;28146:111:0;;;15060:21:1;15117:2;15097:18;;;15090:30;15156:34;15136:18;;;15129:62;15227:20;15207:18;;;15200:48;15265:19;;28146:111:0;14876:414:1;2530:723:0;2586:13;2807:10;2803:53;;-1:-1:-1;;2834:10:0;;;;;;;;;;;;;;;;;;2530:723::o;2803:53::-;2881:5;2866:12;2922:78;2929:9;;2922:78;;2955:8;;;;:::i;:::-;;-1:-1:-1;2978:10:0;;-1:-1:-1;2986:2:0;2978:10;;:::i;:::-;;;2922:78;;;3010:19;3042:6;3032:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3032:17:0;;3010:39;;3060:154;3067:10;;3060:154;;3094:11;3104:1;3094:11;;:::i;:::-;;-1:-1:-1;3163:10:0;3171:2;3163:5;:10;:::i;:::-;3150:24;;:2;:24;:::i;:::-;3137:39;;3120:6;3127;3120:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3191:11:0;3200:2;3191:11;;:::i;:::-;;;3060:154;;30137:646;30205:12;30220:15;;-1:-1:-1;;;;;30248:13:0;;;;:9;:13;;;;;:23;;30220:15;;;;;;;30265:6;;30248:23;;30265:6;;30248:23;:::i;:::-;;;;-1:-1:-1;30297:6:0;;-1:-1:-1;30292:157:0;30309:6;30305:1;:10;30292:157;;;30337:9;;;;:::i;:::-;30363:16;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;30363:21:0;;;;;;;;30404:33;;30363:16;;-1:-1:-1;30363:16:0;;-1:-1:-1;30363:21:0;30404:33;;30363:16;;30404:33;30317:3;;;;:::i;:::-;;;;30292:157;;;;30491:6;30469:11;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30535:6;30509:15;;:33;;;;;;;;;;;;;;;;:::i;10589:269::-;10791:58;;10850:66:1;10791:58:0;;;10838:79:1;10933:12;;;10926:28;;;10658:7:0;;10970:12:1;;10791:58:0;10608:380:1;7590:231:0;7668:7;7689:17;7708:18;7730:27;7741:4;7747:9;7730:10;:27::i;:::-;7688:69;;;;7768:18;7780:5;7768:11;:18::i;:::-;-1:-1:-1;7804:9:0;7590:231;-1:-1:-1;;;7590:231:0:o;33392:798::-;33548:4;-1:-1:-1;;;;;33569:13:0;;11933:20;11981:8;33565:618;;33605:70;;;;;-1:-1:-1;;;;;33605:36:0;;;;;:70;;33642:10;;33654:4;;33660:7;;33669:5;;33605:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33605:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33601:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33845:13:0;;33841:272;;33888:60;;-1:-1:-1;;;33888:60:0;;15078:2:1;33888:60:0;;;15060:21:1;15117:2;15097:18;;;15090:30;15156:34;15136:18;;;15129:62;15227:20;15207:18;;;15200:48;15265:19;;33888:60:0;14876:414:1;33841:272:0;34063:6;34057:13;34048:6;34044:2;34040:15;34033:38;33601:527;33726:51;;33736:41;33726:51;;-1:-1:-1;33719:58:0;;33565:618;-1:-1:-1;34167:4:0;33392:798;;;;;;:::o;5480:1308::-;5561:7;5570:12;5795:9;:16;5815:2;5795:22;5791:990;;;6091:4;6076:20;;6070:27;6141:4;6126:20;;6120:27;6199:4;6184:20;;6178:27;5834:9;6170:36;6242:25;6253:4;6170:36;6070:27;6120;6242:10;:25::i;:::-;6235:32;;;;;;;;;5791:990;6289:9;:16;6309:2;6289:22;6285:496;;;6564:4;6549:20;;6543:27;6615:4;6600:20;;6594:27;6657:23;6668:4;6543:27;6594;6657:10;:23::i;:::-;6650:30;;;;;;;;6285:496;-1:-1:-1;6729:1:0;;-1:-1:-1;6733:35:0;6713:56;;3751:643;3829:20;3820:5;:29;;;;;;;;:::i;:::-;;3816:571;;;3751:643;:::o;3816:571::-;3927:29;3918:5;:38;;;;;;;;:::i;:::-;;3914:473;;;3973:34;;-1:-1:-1;;;3973:34:0;;14365:2:1;3973:34:0;;;14347:21:1;14404:2;14384:18;;;14377:30;14443:26;14423:18;;;14416:54;14487:18;;3973:34:0;14163:348:1;3914:473:0;4038:35;4029:5;:44;;;;;;;;:::i;:::-;;4025:362;;;4090:41;;-1:-1:-1;;;4090:41:0;;14718:2:1;4090:41:0;;;14700:21:1;14757:2;14737:18;;;14730:30;14796:33;14776:18;;;14769:61;14847:18;;4090:41:0;14516:355:1;4025:362:0;4162:30;4153:5;:39;;;;;;;;:::i;:::-;;4149:238;;;4209:44;;-1:-1:-1;;;4209:44:0;;18130:2:1;4209:44:0;;;18112:21:1;18169:2;18149:18;;;18142:30;18208:34;18188:18;;;18181:62;18279:4;18259:18;;;18252:32;18301:19;;4209:44:0;17928:398:1;4149:238:0;4284:30;4275:5;:39;;;;;;;;:::i;:::-;;4271:116;;;4331:44;;-1:-1:-1;;;4331:44:0;;20908:2:1;4331:44:0;;;20890:21:1;20947:2;20927:18;;;20920:30;20986:34;20966:18;;;20959:62;21057:4;21037:18;;;21030:32;21079:19;;4331:44:0;20706:398:1;8657:1632:0;8788:7;;9722:66;9709:79;;9705:163;;;-1:-1:-1;9821:1:0;;-1:-1:-1;9825:30:0;9805:51;;9705:163;9882:1;:7;;9887:2;9882:7;;:18;;;;;9893:1;:7;;9898:2;9893:7;;9882:18;9878:102;;;-1:-1:-1;9933:1:0;;-1:-1:-1;9937:30:0;9917:51;;9878:102;10094:24;;;10077:14;10094:24;;;;;;;;;13763:25:1;;;13836:4;13824:17;;13804:18;;;13797:45;;;;13858:18;;;13851:34;;;13901:18;;;13894:34;;;10094:24:0;;13735:19:1;;10094:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10094:24:0;;;;;;-1:-1:-1;;;;;;;10133:20:0;;10129:103;;10186:1;10190:29;10170:50;;;;;;;10129:103;10252:6;-1:-1:-1;10260:20:0;;-1:-1:-1;8657:1632:0;;;;;;;;:::o;8084:391::-;8198:7;;8307:66;8299:75;;8401:3;8397:12;;;8411:2;8393:21;8442:25;8453:4;8393:21;8462:1;8299:75;8442:10;:25::i;:::-;8435:32;;;;;;8084:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:748::-;538:5;591:3;584:4;576:6;572:17;568:27;558:55;;609:1;606;599:12;558:55;645:6;632:20;671:4;695:60;711:43;751:2;711:43;:::i;:::-;695:60;:::i;:::-;777:3;801:2;796:3;789:15;829:2;824:3;820:12;813:19;;864:2;856:6;852:15;916:3;911:2;905;902:1;898:10;890:6;886:23;882:32;879:41;876:61;;;933:1;930;923:12;876:61;955:1;965:238;979:2;976:1;973:9;965:238;;;1050:3;1037:17;1067:31;1092:5;1067:31;:::i;:::-;1111:18;;1149:12;;;;1181;;;;997:1;990:9;965:238;;;-1:-1:-1;1221:5:1;;484:748;-1:-1:-1;;;;;;;484:748:1:o;1237:347::-;1288:8;1298:6;1352:3;1345:4;1337:6;1333:17;1329:27;1319:55;;1370:1;1367;1360:12;1319:55;-1:-1:-1;1393:20:1;;1436:18;1425:30;;1422:50;;;1468:1;1465;1458:12;1422:50;1505:4;1497:6;1493:17;1481:29;;1557:3;1550:4;1541:6;1533;1529:19;1525:30;1522:39;1519:59;;;1574:1;1571;1564:12;1589:247;1648:6;1701:2;1689:9;1680:7;1676:23;1672:32;1669:52;;;1717:1;1714;1707:12;1669:52;1756:9;1743:23;1775:31;1800:5;1775:31;:::i;:::-;1825:5;1589:247;-1:-1:-1;;;1589:247:1:o;1841:388::-;1909:6;1917;1970:2;1958:9;1949:7;1945:23;1941:32;1938:52;;;1986:1;1983;1976:12;1938:52;2025:9;2012:23;2044:31;2069:5;2044:31;:::i;:::-;2094:5;-1:-1:-1;2151:2:1;2136:18;;2123:32;2164:33;2123:32;2164:33;:::i;:::-;2216:7;2206:17;;;1841:388;;;;;:::o;2234:456::-;2311:6;2319;2327;2380:2;2368:9;2359:7;2355:23;2351:32;2348:52;;;2396:1;2393;2386:12;2348:52;2435:9;2422:23;2454:31;2479:5;2454:31;:::i;:::-;2504:5;-1:-1:-1;2561:2:1;2546:18;;2533:32;2574:33;2533:32;2574:33;:::i;:::-;2234:456;;2626:7;;-1:-1:-1;;;2680:2:1;2665:18;;;;2652:32;;2234:456::o;2695:794::-;2790:6;2798;2806;2814;2867:3;2855:9;2846:7;2842:23;2838:33;2835:53;;;2884:1;2881;2874:12;2835:53;2923:9;2910:23;2942:31;2967:5;2942:31;:::i;:::-;2992:5;-1:-1:-1;3049:2:1;3034:18;;3021:32;3062:33;3021:32;3062:33;:::i;:::-;3114:7;-1:-1:-1;3168:2:1;3153:18;;3140:32;;-1:-1:-1;3223:2:1;3208:18;;3195:32;3250:18;3239:30;;3236:50;;;3282:1;3279;3272:12;3236:50;3305:22;;3358:4;3350:13;;3346:27;-1:-1:-1;3336:55:1;;3387:1;3384;3377:12;3336:55;3410:73;3475:7;3470:2;3457:16;3452:2;3448;3444:11;3410:73;:::i;:::-;3400:83;;;2695:794;;;;;;;:::o;3494:416::-;3559:6;3567;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;:::-;3744:5;-1:-1:-1;3801:2:1;3786:18;;3773:32;3843:15;;3836:23;3824:36;;3814:64;;3874:1;3871;3864:12;3915:315;3983:6;3991;4044:2;4032:9;4023:7;4019:23;4015:32;4012:52;;;4060:1;4057;4050:12;4012:52;4099:9;4086:23;4118:31;4143:5;4118:31;:::i;:::-;4168:5;4220:2;4205:18;;;;4192:32;;-1:-1:-1;;;3915:315:1:o;4235:1151::-;4353:6;4361;4414:2;4402:9;4393:7;4389:23;4385:32;4382:52;;;4430:1;4427;4420:12;4382:52;4470:9;4457:23;4499:18;4540:2;4532:6;4529:14;4526:34;;;4556:1;4553;4546:12;4526:34;4594:6;4583:9;4579:22;4569:32;;4639:7;4632:4;4628:2;4624:13;4620:27;4610:55;;4661:1;4658;4651:12;4610:55;4697:2;4684:16;4719:4;4743:60;4759:43;4799:2;4759:43;:::i;4743:60::-;4825:3;4849:2;4844:3;4837:15;4877:2;4872:3;4868:12;4861:19;;4908:2;4904;4900:11;4956:7;4951:2;4945;4942:1;4938:10;4934:2;4930:19;4926:28;4923:41;4920:61;;;4977:1;4974;4967:12;4920:61;4999:1;4990:10;;5009:163;5023:2;5020:1;5017:9;5009:163;;;5080:17;;5068:30;;5041:1;5034:9;;;;;5118:12;;;;5150;;5009:163;;;-1:-1:-1;5191:5:1;-1:-1:-1;;5234:18:1;;5221:32;;-1:-1:-1;;5265:16:1;;;5262:36;;;5294:1;5291;5284:12;5262:36;;5317:63;5372:7;5361:8;5350:9;5346:24;5317:63;:::i;:::-;5307:73;;;4235:1151;;;;;:::o;5391:245::-;5449:6;5502:2;5490:9;5481:7;5477:23;5473:32;5470:52;;;5518:1;5515;5508:12;5470:52;5557:9;5544:23;5576:30;5600:5;5576:30;:::i;5641:249::-;5710:6;5763:2;5751:9;5742:7;5738:23;5734:32;5731:52;;;5779:1;5776;5769:12;5731:52;5811:9;5805:16;5830:30;5854:5;5830:30;:::i;5895:409::-;5965:6;5973;6026:2;6014:9;6005:7;6001:23;5997:32;5994:52;;;6042:1;6039;6032:12;5994:52;6082:9;6069:23;6115:18;6107:6;6104:30;6101:50;;;6147:1;6144;6137:12;6101:50;6186:58;6236:7;6227:6;6216:9;6212:22;6186:58;:::i;:::-;6263:8;;6160:84;;-1:-1:-1;5895:409:1;-1:-1:-1;;;;5895:409:1:o;6309:477::-;6388:6;6396;6404;6457:2;6445:9;6436:7;6432:23;6428:32;6425:52;;;6473:1;6470;6463:12;6425:52;6513:9;6500:23;6546:18;6538:6;6535:30;6532:50;;;6578:1;6575;6568:12;6532:50;6617:58;6667:7;6658:6;6647:9;6643:22;6617:58;:::i;:::-;6694:8;;6591:84;;-1:-1:-1;6776:2:1;6761:18;;;;6748:32;;6309:477;-1:-1:-1;;;;6309:477:1:o;6791:280::-;6890:6;6943:2;6931:9;6922:7;6918:23;6914:32;6911:52;;;6959:1;6956;6949:12;6911:52;6991:9;6985:16;7010:31;7035:5;7010:31;:::i;7076:450::-;7145:6;7198:2;7186:9;7177:7;7173:23;7169:32;7166:52;;;7214:1;7211;7204:12;7166:52;7254:9;7241:23;7287:18;7279:6;7276:30;7273:50;;;7319:1;7316;7309:12;7273:50;7342:22;;7395:4;7387:13;;7383:27;-1:-1:-1;7373:55:1;;7424:1;7421;7414:12;7373:55;7447:73;7512:7;7507:2;7494:16;7489:2;7485;7481:11;7447:73;:::i;7531:180::-;7590:6;7643:2;7631:9;7622:7;7618:23;7614:32;7611:52;;;7659:1;7656;7649:12;7611:52;-1:-1:-1;7682:23:1;;7531:180;-1:-1:-1;7531:180:1:o;7716:315::-;7784:6;7792;7845:2;7833:9;7824:7;7820:23;7816:32;7813:52;;;7861:1;7858;7851:12;7813:52;7897:9;7884:23;7874:33;;7957:2;7946:9;7942:18;7929:32;7970:31;7995:5;7970:31;:::i;8036:248::-;8104:6;8112;8165:2;8153:9;8144:7;8140:23;8136:32;8133:52;;;8181:1;8178;8171:12;8133:52;-1:-1:-1;;8204:23:1;;;8274:2;8259:18;;;8246:32;;-1:-1:-1;8036:248:1:o;8289:316::-;8330:3;8368:5;8362:12;8395:6;8390:3;8383:19;8411:63;8467:6;8460:4;8455:3;8451:14;8444:4;8437:5;8433:16;8411:63;:::i;:::-;8519:2;8507:15;8524:66;8503:88;8494:98;;;;8594:4;8490:109;;8289:316;-1:-1:-1;;8289:316:1:o;8610:185::-;8652:3;8690:5;8684:12;8705:52;8750:6;8745:3;8738:4;8731:5;8727:16;8705:52;:::i;:::-;8773:16;;;;;8610:185;-1:-1:-1;;8610:185:1:o;9187:1416::-;9464:3;9493:1;9526:6;9520:13;9556:3;9578:1;9606:9;9602:2;9598:18;9588:28;;9666:2;9655:9;9651:18;9688;9678:61;;9732:4;9724:6;9720:17;9710:27;;9678:61;9758:2;9806;9798:6;9795:14;9775:18;9772:38;9769:222;;;9845:77;9840:3;9833:90;9946:4;9943:1;9936:15;9976:4;9971:3;9964:17;9769:222;10007:18;10034:162;;;;10210:1;10205:320;;;;10000:525;;10034:162;10082:66;10071:9;10067:82;10062:3;10055:95;10179:6;10174:3;10170:16;10163:23;;10034:162;;10205:320;25904:1;25897:14;;;25941:4;25928:18;;10300:1;10314:165;10328:6;10325:1;10322:13;10314:165;;;10406:14;;10393:11;;;10386:35;10449:16;;;;10343:10;;10314:165;;;10318:3;;10508:6;10503:3;10499:16;10492:23;;10000:525;;;;;;;10541:56;10566:30;10592:3;10584:6;10566:30;:::i;:::-;8872:7;8860:20;;8905:1;8896:11;;8800:113;10541:56;10534:63;9187:1416;-1:-1:-1;;;;;9187:1416:1:o;11434:511::-;11628:4;-1:-1:-1;;;;;11738:2:1;11730:6;11726:15;11715:9;11708:34;11790:2;11782:6;11778:15;11773:2;11762:9;11758:18;11751:43;;11830:6;11825:2;11814:9;11810:18;11803:34;11873:3;11868:2;11857:9;11853:18;11846:31;11894:45;11934:3;11923:9;11919:19;11911:6;11894:45;:::i;:::-;11886:53;11434:511;-1:-1:-1;;;;;;11434:511:1:o;12252:632::-;12423:2;12475:21;;;12545:13;;12448:18;;;12567:22;;;12394:4;;12423:2;12646:15;;;;12620:2;12605:18;;;12394:4;12689:169;12703:6;12700:1;12697:13;12689:169;;;12764:13;;12752:26;;12833:15;;;;12798:12;;;;12725:1;12718:9;12689:169;;;-1:-1:-1;12875:3:1;;12252:632;-1:-1:-1;;;;;;12252:632:1:o;13939:219::-;14088:2;14077:9;14070:21;14051:4;14108:44;14148:2;14137:9;14133:18;14125:6;14108:44;:::i;25304:334::-;25375:2;25369:9;25431:2;25421:13;;25436:66;25417:86;25405:99;;25534:18;25519:34;;25555:22;;;25516:62;25513:88;;;25581:18;;:::i;:::-;25617:2;25610:22;25304:334;;-1:-1:-1;25304:334:1:o;25643:183::-;25703:4;25736:18;25728:6;25725:30;25722:56;;;25758:18;;:::i;:::-;-1:-1:-1;25803:1:1;25799:14;25815:4;25795:25;;25643:183::o;25957:224::-;25996:3;26024:6;26057:2;26054:1;26050:10;26087:2;26084:1;26080:10;26118:3;26114:2;26110:12;26105:3;26102:21;26099:47;;;26126:18;;:::i;:::-;26162:13;;25957:224;-1:-1:-1;;;;25957:224:1:o;26186:128::-;26226:3;26257:1;26253:6;26250:1;26247:13;26244:39;;;26263:18;;:::i;:::-;-1:-1:-1;26299:9:1;;26186:128::o;26319:204::-;26357:3;26393:4;26390:1;26386:12;26425:4;26422:1;26418:12;26460:3;26454:4;26450:14;26445:3;26442:23;26439:49;;;26468:18;;:::i;:::-;26504:13;;26319:204;-1:-1:-1;;;26319:204:1:o;26528:120::-;26568:1;26594;26584:35;;26599:18;;:::i;:::-;-1:-1:-1;26633:9:1;;26528:120::o;26653:228::-;26693:7;26819:1;26751:66;26747:74;26744:1;26741:81;26736:1;26729:9;26722:17;26718:105;26715:131;;;26826:18;;:::i;:::-;-1:-1:-1;26866:9:1;;26653:228::o;26886:125::-;26926:4;26954:1;26951;26948:8;26945:34;;;26959:18;;:::i;:::-;-1:-1:-1;26996:9:1;;26886:125::o;27016:258::-;27088:1;27098:113;27112:6;27109:1;27106:13;27098:113;;;27188:11;;;27182:18;27169:11;;;27162:39;27134:2;27127:10;27098:113;;;27229:6;27226:1;27223:13;27220:48;;;-1:-1:-1;;27264:1:1;27246:16;;27239:27;27016:258::o;27279:196::-;27318:3;27346:5;27336:39;;27355:18;;:::i;:::-;-1:-1:-1;27402:66:1;27391:78;;27279:196::o;27480:437::-;27559:1;27555:12;;;;27602;;;27623:61;;27677:4;27669:6;27665:17;27655:27;;27623:61;27730:2;27722:6;27719:14;27699:18;27696:38;27693:218;;;27767:77;27764:1;27757:88;27868:4;27865:1;27858:15;27896:4;27893:1;27886:15;27693:218;;27480:437;;;:::o;27922:197::-;27960:3;27988:6;28029:2;28022:5;28018:14;28056:2;28047:7;28044:15;28041:41;;;28062:18;;:::i;:::-;28111:1;28098:15;;27922:197;-1:-1:-1;;;27922:197:1:o;28124:195::-;28163:3;28194:66;28187:5;28184:77;28181:103;;;28264:18;;:::i;:::-;-1:-1:-1;28311:1:1;28300:13;;28124:195::o;28324:175::-;28361:3;28405:4;28398:5;28394:16;28434:4;28425:7;28422:17;28419:43;;;28442:18;;:::i;:::-;28491:1;28478:15;;28324:175;-1:-1:-1;;28324:175:1:o;28504:112::-;28536:1;28562;28552:35;;28567:18;;:::i;:::-;-1:-1:-1;28601:9:1;;28504:112::o;28621:184::-;28673:77;28670:1;28663:88;28770:4;28767:1;28760:15;28794:4;28791:1;28784:15;28810:184;28862:77;28859:1;28852:88;28959:4;28956:1;28949:15;28983:4;28980:1;28973:15;28999:184;29051:77;29048:1;29041:88;29148:4;29145:1;29138:15;29172:4;29169:1;29162:15;29188:184;29240:77;29237:1;29230:88;29337:4;29334:1;29327:15;29361:4;29358:1;29351:15;29377:184;29429:77;29426:1;29419:88;29526:4;29523:1;29516:15;29550:4;29547:1;29540:15;29566:154;-1:-1:-1;;;;;29645:5:1;29641:54;29634:5;29631:65;29621:93;;29710:1;29707;29700:12;29725:177;29810:66;29803:5;29799:78;29792:5;29789:89;29779:117;;29892:1;29889;29882:12

Swarm Source

ipfs://2639447590cab8b0742383adae2530d3e3476258bb2e0b697fce81e2a5bc798a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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