ETH Price: $1,584.05 (-12.48%)

Token

Bullfy (Bullfy)
 

Overview

Max Total Supply

59 Bullfy

Holders

59

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
digitalmaster.eth
Balance
1 Bullfy
0xcabb179ca4f9360e4761121a2363a3af5587b1aa
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:
BullfyBeta

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 2 of 14: BullfyBeta.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.11;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./Counters.sol";
import "./Strings.sol";

/* 
/**


 .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------. 
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| |   ______     | || | _____  _____ | || |   _____      | || |   _____      | || |  _________   | || |  ____  ____  | |
| |  |_   _ \    | || ||_   _||_   _|| || |  |_   _|     | || |  |_   _|     | || | |_   ___  |  | || | |_  _||_  _| | |
| |    | |_) |   | || |  | |    | |  | || |    | |       | || |    | |       | || |   | |_  \_|  | || |   \ \  / /   | |
| |    |  __'.   | || |  | '    ' |  | || |    | |   _   | || |    | |   _   | || |   |  _|      | || |    \ \/ /    | |
| |   _| |__) |  | || |   \ `--' /   | || |   _| |__/ |  | || |   _| |__/ |  | || |  _| |_       | || |    _|  |_    | |
| |  |_______/   | || |    `.__.'    | || |  |________|  | || |  |________|  | || | |_____|      | || |   |______|   | |
| |              | || |              | || |              | || |              | || |              | || |              | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
 '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------' 
 .----------------.  .----------------.  .----------------.  .----------------.                                         
| .--------------. || .--------------. || .--------------. || .--------------. |                                        
| |   ______     | || |  _________   | || |  _________   | || |      __      | |                                        
| |  |_   _ \    | || | |_   ___  |  | || | |  _   _  |  | || |     /  \     | |                                        
| |    | |_) |   | || |   | |_  \_|  | || | |_/ | | \_|  | || |    / /\ \    | |                                        
| |    |  __'.   | || |   |  _|  _   | || |     | |      | || |   / ____ \   | |                                        
| |   _| |__) |  | || |  _| |___/ |  | || |    _| |_     | || | _/ /    \ \_ | |                                        
| |  |_______/   | || | |_________|  | || |   |_____|    | || ||____|  |____|| |                                        
| |              | || |              | || |              | || |              | |                                        
| '--------------' || '--------------' || '--------------' || '--------------' |                                        
 '----------------'  '----------------'  '----------------'  '----------------'                                         


@title ERC-721 token for Bullfy
@author drew10.eth

*/

contract BullfyBeta is Ownable, ERC721Enumerable {
   using Strings for uint;
    using Counters for Counters.Counter;

    string private _tokenURI;
    string private _contractURI;
    Counters.Counter private _tokenIdCounter;
    
    uint public maxSupply = 1000;
    uint public tokenPrice = 0.01 ether;
    bool public saleStarted = false;
    bool public transfersEnabled = false;

    mapping(uint => uint) public expiryTime;

    constructor(
        string memory tokenURI_,
        string memory contractURI_
    ) ERC721("Bullfy", "Bullfy") {
        _tokenURI = tokenURI_;
        _contractURI = contractURI_;
    }

    /**
    * @notice Function modifier that is used to determine if the caller is
    * the owner. If not, run additional checks before proceeding.
    */
    modifier nonOwner(address to) {
        if (msg.sender != owner()) {
            require(transfersEnabled, "Token transfers are currently disabled.");
            require(balanceOf(to) == 0, "User already holds a token.");
        }
        _;
    }

    /**
    * @notice Function that is used to mint a token.
    */
    function mint() public payable {

        uint tokenIndex = _tokenIdCounter.current() + 1;

        require(tx.origin == msg.sender, "Caller must not be a contract.");
        require(saleStarted, "Sale has not started.");
        require(balanceOf(msg.sender) == 0, "User already holds a token.");
        require(msg.value == tokenPrice, "Incorrect Ether amount sent.");
        require(tokenIndex <= maxSupply, "Minted token would exceed total supply.");

        _tokenIdCounter.increment();

        _safeMint(msg.sender, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 15 days;
    }

    /**
    * @notice Function that is used to mint a token free of charge, only
    * callable by the owner.
    *
    * @param _receiver The receiving address of the newly minted token.
    */
    function ownerMint(address _receiver) public onlyOwner {

        uint tokenIndex = _tokenIdCounter.current() + 1;

        require(_receiver != address(0), "Receiver cannot be zero address.");
        require(tokenIndex <= maxSupply, "Minted token would exceed total supply.");

        if (msg.sender != _receiver) {
            require(balanceOf(_receiver) == 0, "User already holds a token.");
        }

        _tokenIdCounter.increment();

        _safeMint(_receiver, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 15 days;
    }

    /**
    * @notice Function that is used to extend/renew a tokens expiry date.
    *
    * @param _tokenId The token ID to extend/renew.
    */

    /**
    * @notice Function that is used to extend/renew a tokens expiry date for
    * 30 days free of charge, only callable by the owner.
    *
    * @param _tokenId The token ID to extend/renew.
    */

    /**
    * @notice Function that is used to extend/renew multiple tokens expiry date for
    * 365 days free of charge, only callable by the owner.
    *
    * @param _tokenIds The token IDs to extend/renew.
    */

    /**
    * @notice Function that is used to update the 'tokenPrice' variable,
    * only callable by the owner.
    *
    * @param _updatedTokenPrice The new token price in units of wei. E.g.
    * 500000000000000000 is 0.50 Ether.
    */
    function updateTokenPrice(uint _updatedTokenPrice) external onlyOwner {
        require(tokenPrice != _updatedTokenPrice, "Price has not changed.");
        tokenPrice = _updatedTokenPrice;
    }

    /**
    * @notice Function that is used to authenticate a user.
    *
    * @param _tokenId The desired token owned by a user.
    *
    * @return Returns a bool value determining if authentication was
    * was successful. 'true' is successful, 'false' if otherwise.
    */
    function authenticateUser(uint _tokenId) public view returns (bool) {
        require(_exists(_tokenId), "Token does not exist.");
        require(expiryTime[_tokenId] > block.timestamp, "Token has expired. Please renew!");

        return msg.sender == ownerOf(_tokenId) ? true : false;
    }

    /**
    * @notice Function that is used to increase the `maxSupply` value. Used
    * to emulate restocks once the maximum supply of tokens has been minted.
    *
    * @param _newTokens The amount of tokens to add to `maxSupply` value.
    */
    function addTokens(uint _newTokens) external onlyOwner {
        maxSupply += _newTokens;
    }

    /**
    * @notice Function that is used to decrease the `maxSupply` value. Used
    * to reduce the maximum supply in the event too many tokens have been added.
    *
    * @param _numTokens The amount of tokens to add to `maxSupply` value.
    */
    function removeTokens(uint _numTokens) external onlyOwner {
        require(maxSupply - _numTokens >= totalSupply(), "Supply cannot fall below minted tokens.");
        maxSupply -= _numTokens;
    }

    /**
    * @notice Function that is used to get the token URI for a specific token.
    *
    * @param _tokenId The token ID to fetch the token URI for.
    *
    * @return Returns a string value representing the token URI for the
    * specified token.
    */
    function tokenURI(uint _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(_tokenURI, _tokenId.toString()));
    }

    /**
    * @notice Function that is used to update the token URI for the contract,
    * only callable by the owner.
    * 
    * @param tokenURI_ A string value to replace the current '_tokenURI' value.
    */
    function setTokenURI(string calldata tokenURI_) external onlyOwner {
        _tokenURI = tokenURI_;
    }

    /**
    * @notice Function that is used to get the contract URI.
    *
    * @return Returns a string value representing the contract URI.
    */
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    /**
    * @notice Function that is used to update the contract URI, only callable
    * by the owner.
    * 
    * @param contractURI_ A string value to replace the current 'contractURI_'.
    */
    function setContractURI(string calldata contractURI_) external onlyOwner {
        _contractURI = contractURI_;
    }

    /**
    * @notice Function that is used to withdraw the balance of the contract,
    * only callable by the owner.
    */
    function withdrawBalance() public onlyOwner {
		payable(msg.sender).transfer(address(this).balance);
	}

    /**
    * @notice Function that is used to flip the sale state of the contract,
    * only callable by the owner.
    */
    function toggleSale() public onlyOwner {
        saleStarted = !saleStarted;
    }

    /**
    * @notice Function that is used to flip the transfer state of the contract,
    * only callable by the owner.
    */
    function toggleTransfers() public onlyOwner {
        transfersEnabled = !transfersEnabled;
    }

    /**
    * @notice Function that is used to get the total tokens minted.
    *
    * @return Returns a uint which indicates the total supply.
    */
    /**
    * @notice Function that is used to safely transfer a token from one owner to another,
    * this function has been overriden so that transfers can be disabled.
    */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override nonOwner(to) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Transfer caller is not owner nor approved.");
        require(expiryTime[tokenId] > block.timestamp, "Token has expired.");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
    * @notice Function that is used to transfer a token from one owner to another,
    * this function has been overriden so that transfers can be disabled.
    */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override nonOwner(to) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Transfer caller is not owner nor approved.");
        require(expiryTime[tokenId] > block.timestamp, "Token has expired.");
        _transfer(from, to, tokenId);
    }

}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 4 of 14: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 6 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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) public view virtual 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 virtual 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() public view virtual override returns (string memory) {
        return _name;
    }

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual 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) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), 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
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), 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 (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    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 = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

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

        _beforeTokenTransfer(address(0), to, tokenId);

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _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
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

File 7 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is IERC721Enumerable, ERC721  {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 8 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 9 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 11 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.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 12 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 13 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"contractURI_","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":"uint256","name":"_newTokens","type":"uint256"}],"name":"addTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"authenticateUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"expiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"removeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_updatedTokenPrice","type":"uint256"}],"name":"updateTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e8600e55662386f26fc10000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200005857600080fd5b50604051620050bd380380620050bd83398181016040528101906200007e919062000491565b6040518060400160405280600681526020017f42756c6c667900000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f42756c6c667900000000000000000000000000000000000000000000000000008152506200010a620000fe6200017860201b60201c565b6200018060201b60201c565b81600190805190602001906200012292919062000244565b5080600290805190602001906200013b92919062000244565b50505081600b90805190602001906200015692919062000244565b5080600c90805190602001906200016f92919062000244565b5050506200057b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002529062000545565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200035d8262000312565b810181811067ffffffffffffffff821117156200037f576200037e62000323565b5b80604052505050565b600062000394620002f4565b9050620003a2828262000352565b919050565b600067ffffffffffffffff821115620003c557620003c462000323565b5b620003d08262000312565b9050602081019050919050565b60005b83811015620003fd578082015181840152602081019050620003e0565b838111156200040d576000848401525b50505050565b60006200042a6200042484620003a7565b62000388565b9050828152602081018484840111156200044957620004486200030d565b5b62000456848285620003dd565b509392505050565b600082601f83011262000476576200047562000308565b5b81516200048884826020860162000413565b91505092915050565b60008060408385031215620004ab57620004aa620002fe565b5b600083015167ffffffffffffffff811115620004cc57620004cb62000303565b5b620004da858286016200045e565b925050602083015167ffffffffffffffff811115620004fe57620004fd62000303565b5b6200050c858286016200045e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055e57607f821691505b6020821081141562000575576200057462000516565b5b50919050565b614b32806200058b6000396000f3fe60806040526004361061020f5760003560e01c80637d8966e411610118578063bef97c87116100a0578063d5abeb011161006f578063d5abeb0114610766578063e0df5b6f14610791578063e8a3d485146107ba578063e985e9c5146107e5578063f2fde38b146108225761020f565b8063bef97c8714610698578063c6ed8990146106c3578063c87b56dd146106ec578063cdffd6ed146107295761020f565b806395d89b41116100e757806395d89b41146105b5578063a22cb465146105e0578063b88d4fde14610609578063b8cb65ee14610632578063be010c401461065b5761020f565b80637d8966e41461051f5780637ff9b596146105365780638da5cb5b14610561578063938e3d7b1461058c5761020f565b80633e5ac28f1161019b5780635fd8c7101161016a5780635fd8c7101461044e5780636352211e14610465578063676c0d77146104a257806370a08231146104cb578063715018a6146105085761020f565b80633e5ac28f146103a657806342842e0e146103bd5780634f6ccce7146103e65780635c474f9e146104235761020f565b80631249c58b116101e25780631249c58b146102e257806318160ddd146102ec5780631e3bcc8e1461031757806323b872dd146103405780632f745c59146103695761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613233565b61084b565b604051610248919061327b565b60405180910390f35b34801561025d57600080fd5b506102666108c5565b604051610273919061332f565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613387565b610957565b6040516102b091906133f5565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061343c565b6109dc565b005b6102ea610af4565b005b3480156102f857600080fd5b50610301610cdc565b60405161030e919061348b565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906134a6565b610ce9565b005b34801561034c57600080fd5b50610367600480360381019061036291906134d3565b610ef1565b005b34801561037557600080fd5b50610390600480360381019061038b919061343c565b61107d565b60405161039d919061348b565b60405180910390f35b3480156103b257600080fd5b506103bb611122565b005b3480156103c957600080fd5b506103e460048036038101906103df91906134d3565b6111ca565b005b3480156103f257600080fd5b5061040d60048036038101906104089190613387565b6111ea565b60405161041a919061348b565b60405180910390f35b34801561042f57600080fd5b5061043861125b565b604051610445919061327b565b60405180910390f35b34801561045a57600080fd5b5061046361126e565b005b34801561047157600080fd5b5061048c60048036038101906104879190613387565b611333565b60405161049991906133f5565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190613387565b6113e5565b005b3480156104d757600080fd5b506104f260048036038101906104ed91906134a6565b6114b0565b6040516104ff919061348b565b60405180910390f35b34801561051457600080fd5b5061051d611568565b005b34801561052b57600080fd5b506105346115f0565b005b34801561054257600080fd5b5061054b611698565b604051610558919061348b565b60405180910390f35b34801561056d57600080fd5b5061057661169e565b60405161058391906133f5565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae919061358b565b6116c7565b005b3480156105c157600080fd5b506105ca611759565b6040516105d7919061332f565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190613604565b6117eb565b005b34801561061557600080fd5b50610630600480360381019061062b9190613774565b611801565b005b34801561063e57600080fd5b5061065960048036038101906106549190613387565b61198f565b005b34801561066757600080fd5b50610682600480360381019061067d9190613387565b611a7e565b60405161068f919061348b565b60405180910390f35b3480156106a457600080fd5b506106ad611a96565b6040516106ba919061327b565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190613387565b611aa9565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613387565b611b41565b604051610720919061332f565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190613387565b611bbd565b60405161075d919061327b565b60405180910390f35b34801561077257600080fd5b5061077b611ca8565b604051610788919061348b565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b3919061358b565b611cae565b005b3480156107c657600080fd5b506107cf611d40565b6040516107dc919061332f565b60405180910390f35b3480156107f157600080fd5b5061080c600480360381019061080791906137f7565b611dd2565b604051610819919061327b565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906134a6565b611e66565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108be57506108bd82611f5e565b5b9050919050565b6060600180546108d490613866565b80601f016020809104026020016040519081016040528092919081815260200182805461090090613866565b801561094d5780601f106109225761010080835404028352916020019161094d565b820191906000526020600020905b81548152906001019060200180831161093057829003601f168201915b5050505050905090565b600061096282612040565b6109a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109989061390a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e782611333565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061399c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a776120ac565b73ffffffffffffffffffffffffffffffffffffffff161480610aa65750610aa581610aa06120ac565b611dd2565b5b610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613a2e565b60405180910390fd5b610aef83836120b4565b505050565b60006001610b02600d61216d565b610b0c9190613a7d565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390613b1f565b60405180910390fd5b601060009054906101000a900460ff16610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613b8b565b60405180910390fd5b6000610bd6336114b0565b14610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90613bf7565b60405180910390fd5b600f543414610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5190613c63565b60405180910390fd5b600e54811115610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613cf5565b60405180910390fd5b610ca9600d61217b565b610cb33382612191565b6213c68042610cc29190613a7d565b601160008381526020019081526020016000208190555050565b6000600980549050905090565b610cf16120ac565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61169e565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613d61565b60405180910390fd5b60006001610d73600d61216d565b610d7d9190613a7d565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690613dcd565b60405180910390fd5b600e54811115610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613cf5565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb3576000610e72836114b0565b14610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990613bf7565b60405180910390fd5b5b610ebd600d61217b565b610ec78282612191565b6213c68042610ed69190613a7d565b60116000838152602001908152602001600020819055505050565b81610efa61169e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fc757601060019054906101000a900460ff16610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613e5f565b60405180910390fd5b6000610f86826114b0565b14610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90613bf7565b60405180910390fd5b5b610fd8610fd26120ac565b836121af565b611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90613ef1565b60405180910390fd5b4260116000848152602001908152602001600020541161106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390613f5d565b60405180910390fd5b61107784848461228d565b50505050565b6000611088836114b0565b82106110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090613fef565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61112a6120ac565b73ffffffffffffffffffffffffffffffffffffffff1661114861169e565b73ffffffffffffffffffffffffffffffffffffffff161461119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613d61565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6111e583838360405180602001604052806000815250611801565b505050565b60006111f4610cdc565b8210611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614081565b60405180910390fd5b60098281548110611249576112486140a1565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6112766120ac565b73ffffffffffffffffffffffffffffffffffffffff1661129461169e565b73ffffffffffffffffffffffffffffffffffffffff16146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613d61565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611330573d6000803e3d6000fd5b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614142565b60405180910390fd5b80915050919050565b6113ed6120ac565b73ffffffffffffffffffffffffffffffffffffffff1661140b61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145890613d61565b60405180910390fd5b80600f5414156114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d906141ae565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890614240565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115706120ac565b73ffffffffffffffffffffffffffffffffffffffff1661158e61169e565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613d61565b60405180910390fd5b6115ee60006124e9565b565b6115f86120ac565b73ffffffffffffffffffffffffffffffffffffffff1661161661169e565b73ffffffffffffffffffffffffffffffffffffffff161461166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390613d61565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116cf6120ac565b73ffffffffffffffffffffffffffffffffffffffff166116ed61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613d61565b60405180910390fd5b8181600c9190611754929190613124565b505050565b60606002805461176890613866565b80601f016020809104026020016040519081016040528092919081815260200182805461179490613866565b80156117e15780601f106117b6576101008083540402835291602001916117e1565b820191906000526020600020905b8154815290600101906020018083116117c457829003601f168201915b5050505050905090565b6117fd6117f66120ac565b83836125ad565b5050565b8261180a61169e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d757601060019054906101000a900460ff1661188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290613e5f565b60405180910390fd5b6000611896826114b0565b146118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90613bf7565b60405180910390fd5b5b6118e86118e26120ac565b846121af565b611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613ef1565b60405180910390fd5b4260116000858152602001908152602001600020541161197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197390613f5d565b60405180910390fd5b6119888585858561271a565b5050505050565b6119976120ac565b73ffffffffffffffffffffffffffffffffffffffff166119b561169e565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290613d61565b60405180910390fd5b611a13610cdc565b81600e54611a219190614260565b1015611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990614306565b60405180910390fd5b80600e6000828254611a749190614260565b9250508190555050565b60116020528060005260406000206000915090505481565b601060019054906101000a900460ff1681565b611ab16120ac565b73ffffffffffffffffffffffffffffffffffffffff16611acf61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613d61565b60405180910390fd5b80600e6000828254611b379190613a7d565b9250508190555050565b6060611b4c82612040565b611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614372565b60405180910390fd5b600b611b9683612776565b604051602001611ba7929190614462565b6040516020818303038152906040529050919050565b6000611bc882612040565b611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614372565b60405180910390fd5b42601160008481526020019081526020016000205411611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c53906144d2565b60405180910390fd5b611c6582611333565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c9e576000611ca1565b60015b9050919050565b600e5481565b611cb66120ac565b73ffffffffffffffffffffffffffffffffffffffff16611cd461169e565b73ffffffffffffffffffffffffffffffffffffffff1614611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190613d61565b60405180910390fd5b8181600b9190611d3b929190613124565b505050565b6060600c8054611d4f90613866565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7b90613866565b8015611dc85780601f10611d9d57610100808354040283529160200191611dc8565b820191906000526020600020905b815481529060010190602001808311611dab57829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e6e6120ac565b73ffffffffffffffffffffffffffffffffffffffff16611e8c61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed990613d61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990614564565b60405180910390fd5b611f5b816124e9565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061202957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120395750612038826128d7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661212783611333565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6121ab828260405180602001604052806000815250612941565b5050565b60006121ba82612040565b6121f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f0906145f6565b60405180910390fd5b600061220483611333565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061227357508373ffffffffffffffffffffffffffffffffffffffff1661225b84610957565b73ffffffffffffffffffffffffffffffffffffffff16145b8061228457506122838185611dd2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122ad82611333565b73ffffffffffffffffffffffffffffffffffffffff1614612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90614688565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a9061471a565b60405180910390fd5b61237e83838361299c565b6123896000826120b4565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d99190614260565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124309190613a7d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261390614786565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161270d919061327b565b60405180910390a3505050565b61272584848461228d565b61273184848484612ab0565b612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790614818565b60405180910390fd5b50505050565b606060008214156127be576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128d2565b600082905060005b600082146127f05780806127d990614838565b915050600a826127e991906148b0565b91506127c6565b60008167ffffffffffffffff81111561280c5761280b613649565b5b6040519080825280601f01601f19166020018201604052801561283e5781602001600182028036833780820191505090505b5090505b600085146128cb576001826128579190614260565b9150600a8561286691906148e1565b60306128729190613a7d565b60f81b818381518110612888576128876140a1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128c491906148b0565b9450612842565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61294b8383612c38565b6129586000848484612ab0565b612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614818565b60405180910390fd5b505050565b6129a7838383612e06565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129ea576129e581612e0b565b612a29565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a2857612a278382612e54565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6c57612a6781612fc1565b612aab565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612aaa57612aa98282613092565b5b5b505050565b6000612ad18473ffffffffffffffffffffffffffffffffffffffff16613111565b15612c2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612afa6120ac565b8786866040518563ffffffff1660e01b8152600401612b1c9493929190614967565b6020604051808303816000875af1925050508015612b5857506040513d601f19601f82011682018060405250810190612b5591906149c8565b60015b612bdb573d8060008114612b88576040519150601f19603f3d011682016040523d82523d6000602084013e612b8d565b606091505b50600081511415612bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bca90614818565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c30565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9f90614a41565b60405180910390fd5b612cb181612040565b15612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce890614aad565b60405180910390fd5b612cfd6000838361299c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4d9190613a7d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e61846114b0565b612e6b9190614260565b9050600060086000848152602001908152602001600020549050818114612f50576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612fd59190614260565b90506000600a6000848152602001908152602001600020549050600060098381548110613005576130046140a1565b5b906000526020600020015490508060098381548110613027576130266140a1565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061307657613075614acd565b5b6001900381819060005260206000200160009055905550505050565b600061309d836114b0565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461313090613866565b90600052602060002090601f0160209004810192826131525760008555613199565b82601f1061316b57803560ff1916838001178555613199565b82800160010185558215613199579182015b8281111561319857823582559160200191906001019061317d565b5b5090506131a691906131aa565b5090565b5b808211156131c35760008160009055506001016131ab565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613210816131db565b811461321b57600080fd5b50565b60008135905061322d81613207565b92915050565b600060208284031215613249576132486131d1565b5b60006132578482850161321e565b91505092915050565b60008115159050919050565b61327581613260565b82525050565b6000602082019050613290600083018461326c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132d05780820151818401526020810190506132b5565b838111156132df576000848401525b50505050565b6000601f19601f8301169050919050565b600061330182613296565b61330b81856132a1565b935061331b8185602086016132b2565b613324816132e5565b840191505092915050565b6000602082019050818103600083015261334981846132f6565b905092915050565b6000819050919050565b61336481613351565b811461336f57600080fd5b50565b6000813590506133818161335b565b92915050565b60006020828403121561339d5761339c6131d1565b5b60006133ab84828501613372565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133df826133b4565b9050919050565b6133ef816133d4565b82525050565b600060208201905061340a60008301846133e6565b92915050565b613419816133d4565b811461342457600080fd5b50565b60008135905061343681613410565b92915050565b60008060408385031215613453576134526131d1565b5b600061346185828601613427565b925050602061347285828601613372565b9150509250929050565b61348581613351565b82525050565b60006020820190506134a0600083018461347c565b92915050565b6000602082840312156134bc576134bb6131d1565b5b60006134ca84828501613427565b91505092915050565b6000806000606084860312156134ec576134eb6131d1565b5b60006134fa86828701613427565b935050602061350b86828701613427565b925050604061351c86828701613372565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261354b5761354a613526565b5b8235905067ffffffffffffffff8111156135685761356761352b565b5b60208301915083600182028301111561358457613583613530565b5b9250929050565b600080602083850312156135a2576135a16131d1565b5b600083013567ffffffffffffffff8111156135c0576135bf6131d6565b5b6135cc85828601613535565b92509250509250929050565b6135e181613260565b81146135ec57600080fd5b50565b6000813590506135fe816135d8565b92915050565b6000806040838503121561361b5761361a6131d1565b5b600061362985828601613427565b925050602061363a858286016135ef565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613681826132e5565b810181811067ffffffffffffffff821117156136a05761369f613649565b5b80604052505050565b60006136b36131c7565b90506136bf8282613678565b919050565b600067ffffffffffffffff8211156136df576136de613649565b5b6136e8826132e5565b9050602081019050919050565b82818337600083830152505050565b6000613717613712846136c4565b6136a9565b90508281526020810184848401111561373357613732613644565b5b61373e8482856136f5565b509392505050565b600082601f83011261375b5761375a613526565b5b813561376b848260208601613704565b91505092915050565b6000806000806080858703121561378e5761378d6131d1565b5b600061379c87828801613427565b94505060206137ad87828801613427565b93505060406137be87828801613372565b925050606085013567ffffffffffffffff8111156137df576137de6131d6565b5b6137eb87828801613746565b91505092959194509250565b6000806040838503121561380e5761380d6131d1565b5b600061381c85828601613427565b925050602061382d85828601613427565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387e57607f821691505b6020821081141561389257613891613837565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138f4602c836132a1565b91506138ff82613898565b604082019050919050565b60006020820190508181036000830152613923816138e7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139866021836132a1565b91506139918261392a565b604082019050919050565b600060208201905081810360008301526139b581613979565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a186038836132a1565b9150613a23826139bc565b604082019050919050565b60006020820190508181036000830152613a4781613a0b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a8882613351565b9150613a9383613351565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ac857613ac7613a4e565b5b828201905092915050565b7f43616c6c6572206d757374206e6f74206265206120636f6e74726163742e0000600082015250565b6000613b09601e836132a1565b9150613b1482613ad3565b602082019050919050565b60006020820190508181036000830152613b3881613afc565b9050919050565b7f53616c6520686173206e6f7420737461727465642e0000000000000000000000600082015250565b6000613b756015836132a1565b9150613b8082613b3f565b602082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b7f5573657220616c726561647920686f6c6473206120746f6b656e2e0000000000600082015250565b6000613be1601b836132a1565b9150613bec82613bab565b602082019050919050565b60006020820190508181036000830152613c1081613bd4565b9050919050565b7f496e636f727265637420457468657220616d6f756e742073656e742e00000000600082015250565b6000613c4d601c836132a1565b9150613c5882613c17565b602082019050919050565b60006020820190508181036000830152613c7c81613c40565b9050919050565b7f4d696e74656420746f6b656e20776f756c642065786365656420746f74616c2060008201527f737570706c792e00000000000000000000000000000000000000000000000000602082015250565b6000613cdf6027836132a1565b9150613cea82613c83565b604082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d4b6020836132a1565b9150613d5682613d15565b602082019050919050565b60006020820190508181036000830152613d7a81613d3e565b9050919050565b7f52656365697665722063616e6e6f74206265207a65726f20616464726573732e600082015250565b6000613db76020836132a1565b9150613dc282613d81565b602082019050919050565b60006020820190508181036000830152613de681613daa565b9050919050565b7f546f6b656e207472616e7366657273206172652063757272656e746c7920646960008201527f7361626c65642e00000000000000000000000000000000000000000000000000602082015250565b6000613e496027836132a1565b9150613e5482613ded565b604082019050919050565b60006020820190508181036000830152613e7881613e3c565b9050919050565b7f5472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665642e00000000000000000000000000000000000000000000602082015250565b6000613edb602a836132a1565b9150613ee682613e7f565b604082019050919050565b60006020820190508181036000830152613f0a81613ece565b9050919050565b7f546f6b656e2068617320657870697265642e0000000000000000000000000000600082015250565b6000613f476012836132a1565b9150613f5282613f11565b602082019050919050565b60006020820190508181036000830152613f7681613f3a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613fd9602b836132a1565b9150613fe482613f7d565b604082019050919050565b6000602082019050818103600083015261400881613fcc565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061406b602c836132a1565b91506140768261400f565b604082019050919050565b6000602082019050818103600083015261409a8161405e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061412c6029836132a1565b9150614137826140d0565b604082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b7f507269636520686173206e6f74206368616e6765642e00000000000000000000600082015250565b60006141986016836132a1565b91506141a382614162565b602082019050919050565b600060208201905081810360008301526141c78161418b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061422a602a836132a1565b9150614235826141ce565b604082019050919050565b600060208201905081810360008301526142598161421d565b9050919050565b600061426b82613351565b915061427683613351565b92508282101561428957614288613a4e565b5b828203905092915050565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b60006142f06027836132a1565b91506142fb82614294565b604082019050919050565b6000602082019050818103600083015261431f816142e3565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061435c6015836132a1565b915061436782614326565b602082019050919050565b6000602082019050818103600083015261438b8161434f565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546143bf81613866565b6143c98186614392565b945060018216600081146143e457600181146143f557614428565b60ff19831686528186019350614428565b6143fe8561439d565b60005b8381101561442057815481890152600182019150602081019050614401565b838801955050505b50505092915050565b600061443c82613296565b6144468185614392565b93506144568185602086016132b2565b80840191505092915050565b600061446e82856143b2565b915061447a8284614431565b91508190509392505050565b7f546f6b656e2068617320657870697265642e20506c656173652072656e657721600082015250565b60006144bc6020836132a1565b91506144c782614486565b602082019050919050565b600060208201905081810360008301526144eb816144af565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061454e6026836132a1565b9150614559826144f2565b604082019050919050565b6000602082019050818103600083015261457d81614541565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006145e0602c836132a1565b91506145eb82614584565b604082019050919050565b6000602082019050818103600083015261460f816145d3565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146726029836132a1565b915061467d82614616565b604082019050919050565b600060208201905081810360008301526146a181614665565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147046024836132a1565b915061470f826146a8565b604082019050919050565b60006020820190508181036000830152614733816146f7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006147706019836132a1565b915061477b8261473a565b602082019050919050565b6000602082019050818103600083015261479f81614763565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148026032836132a1565b915061480d826147a6565b604082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b600061484382613351565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487657614875613a4e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148bb82613351565b91506148c683613351565b9250826148d6576148d5614881565b5b828204905092915050565b60006148ec82613351565b91506148f783613351565b92508261490757614906614881565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061493982614912565b614943818561491d565b93506149538185602086016132b2565b61495c816132e5565b840191505092915050565b600060808201905061497c60008301876133e6565b61498960208301866133e6565b614996604083018561347c565b81810360608301526149a8818461492e565b905095945050505050565b6000815190506149c281613207565b92915050565b6000602082840312156149de576149dd6131d1565b5b60006149ec848285016149b3565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a2b6020836132a1565b9150614a36826149f5565b602082019050919050565b60006020820190508181036000830152614a5a81614a1e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a97601c836132a1565b9150614aa282614a61565b602082019050919050565b60006020820190508181036000830152614ac681614a8a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220768bb987a653911512c7f1a842d6828f23825c36bec3954a530441b47e744afb64736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80637d8966e411610118578063bef97c87116100a0578063d5abeb011161006f578063d5abeb0114610766578063e0df5b6f14610791578063e8a3d485146107ba578063e985e9c5146107e5578063f2fde38b146108225761020f565b8063bef97c8714610698578063c6ed8990146106c3578063c87b56dd146106ec578063cdffd6ed146107295761020f565b806395d89b41116100e757806395d89b41146105b5578063a22cb465146105e0578063b88d4fde14610609578063b8cb65ee14610632578063be010c401461065b5761020f565b80637d8966e41461051f5780637ff9b596146105365780638da5cb5b14610561578063938e3d7b1461058c5761020f565b80633e5ac28f1161019b5780635fd8c7101161016a5780635fd8c7101461044e5780636352211e14610465578063676c0d77146104a257806370a08231146104cb578063715018a6146105085761020f565b80633e5ac28f146103a657806342842e0e146103bd5780634f6ccce7146103e65780635c474f9e146104235761020f565b80631249c58b116101e25780631249c58b146102e257806318160ddd146102ec5780631e3bcc8e1461031757806323b872dd146103405780632f745c59146103695761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613233565b61084b565b604051610248919061327b565b60405180910390f35b34801561025d57600080fd5b506102666108c5565b604051610273919061332f565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613387565b610957565b6040516102b091906133f5565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061343c565b6109dc565b005b6102ea610af4565b005b3480156102f857600080fd5b50610301610cdc565b60405161030e919061348b565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906134a6565b610ce9565b005b34801561034c57600080fd5b50610367600480360381019061036291906134d3565b610ef1565b005b34801561037557600080fd5b50610390600480360381019061038b919061343c565b61107d565b60405161039d919061348b565b60405180910390f35b3480156103b257600080fd5b506103bb611122565b005b3480156103c957600080fd5b506103e460048036038101906103df91906134d3565b6111ca565b005b3480156103f257600080fd5b5061040d60048036038101906104089190613387565b6111ea565b60405161041a919061348b565b60405180910390f35b34801561042f57600080fd5b5061043861125b565b604051610445919061327b565b60405180910390f35b34801561045a57600080fd5b5061046361126e565b005b34801561047157600080fd5b5061048c60048036038101906104879190613387565b611333565b60405161049991906133f5565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190613387565b6113e5565b005b3480156104d757600080fd5b506104f260048036038101906104ed91906134a6565b6114b0565b6040516104ff919061348b565b60405180910390f35b34801561051457600080fd5b5061051d611568565b005b34801561052b57600080fd5b506105346115f0565b005b34801561054257600080fd5b5061054b611698565b604051610558919061348b565b60405180910390f35b34801561056d57600080fd5b5061057661169e565b60405161058391906133f5565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae919061358b565b6116c7565b005b3480156105c157600080fd5b506105ca611759565b6040516105d7919061332f565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190613604565b6117eb565b005b34801561061557600080fd5b50610630600480360381019061062b9190613774565b611801565b005b34801561063e57600080fd5b5061065960048036038101906106549190613387565b61198f565b005b34801561066757600080fd5b50610682600480360381019061067d9190613387565b611a7e565b60405161068f919061348b565b60405180910390f35b3480156106a457600080fd5b506106ad611a96565b6040516106ba919061327b565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190613387565b611aa9565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613387565b611b41565b604051610720919061332f565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190613387565b611bbd565b60405161075d919061327b565b60405180910390f35b34801561077257600080fd5b5061077b611ca8565b604051610788919061348b565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b3919061358b565b611cae565b005b3480156107c657600080fd5b506107cf611d40565b6040516107dc919061332f565b60405180910390f35b3480156107f157600080fd5b5061080c600480360381019061080791906137f7565b611dd2565b604051610819919061327b565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906134a6565b611e66565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108be57506108bd82611f5e565b5b9050919050565b6060600180546108d490613866565b80601f016020809104026020016040519081016040528092919081815260200182805461090090613866565b801561094d5780601f106109225761010080835404028352916020019161094d565b820191906000526020600020905b81548152906001019060200180831161093057829003601f168201915b5050505050905090565b600061096282612040565b6109a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109989061390a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e782611333565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061399c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a776120ac565b73ffffffffffffffffffffffffffffffffffffffff161480610aa65750610aa581610aa06120ac565b611dd2565b5b610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613a2e565b60405180910390fd5b610aef83836120b4565b505050565b60006001610b02600d61216d565b610b0c9190613a7d565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390613b1f565b60405180910390fd5b601060009054906101000a900460ff16610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613b8b565b60405180910390fd5b6000610bd6336114b0565b14610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90613bf7565b60405180910390fd5b600f543414610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5190613c63565b60405180910390fd5b600e54811115610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613cf5565b60405180910390fd5b610ca9600d61217b565b610cb33382612191565b6213c68042610cc29190613a7d565b601160008381526020019081526020016000208190555050565b6000600980549050905090565b610cf16120ac565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61169e565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613d61565b60405180910390fd5b60006001610d73600d61216d565b610d7d9190613a7d565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690613dcd565b60405180910390fd5b600e54811115610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613cf5565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb3576000610e72836114b0565b14610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990613bf7565b60405180910390fd5b5b610ebd600d61217b565b610ec78282612191565b6213c68042610ed69190613a7d565b60116000838152602001908152602001600020819055505050565b81610efa61169e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fc757601060019054906101000a900460ff16610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613e5f565b60405180910390fd5b6000610f86826114b0565b14610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90613bf7565b60405180910390fd5b5b610fd8610fd26120ac565b836121af565b611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90613ef1565b60405180910390fd5b4260116000848152602001908152602001600020541161106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390613f5d565b60405180910390fd5b61107784848461228d565b50505050565b6000611088836114b0565b82106110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090613fef565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61112a6120ac565b73ffffffffffffffffffffffffffffffffffffffff1661114861169e565b73ffffffffffffffffffffffffffffffffffffffff161461119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613d61565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6111e583838360405180602001604052806000815250611801565b505050565b60006111f4610cdc565b8210611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614081565b60405180910390fd5b60098281548110611249576112486140a1565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6112766120ac565b73ffffffffffffffffffffffffffffffffffffffff1661129461169e565b73ffffffffffffffffffffffffffffffffffffffff16146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613d61565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611330573d6000803e3d6000fd5b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614142565b60405180910390fd5b80915050919050565b6113ed6120ac565b73ffffffffffffffffffffffffffffffffffffffff1661140b61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145890613d61565b60405180910390fd5b80600f5414156114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d906141ae565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890614240565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115706120ac565b73ffffffffffffffffffffffffffffffffffffffff1661158e61169e565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613d61565b60405180910390fd5b6115ee60006124e9565b565b6115f86120ac565b73ffffffffffffffffffffffffffffffffffffffff1661161661169e565b73ffffffffffffffffffffffffffffffffffffffff161461166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390613d61565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116cf6120ac565b73ffffffffffffffffffffffffffffffffffffffff166116ed61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613d61565b60405180910390fd5b8181600c9190611754929190613124565b505050565b60606002805461176890613866565b80601f016020809104026020016040519081016040528092919081815260200182805461179490613866565b80156117e15780601f106117b6576101008083540402835291602001916117e1565b820191906000526020600020905b8154815290600101906020018083116117c457829003601f168201915b5050505050905090565b6117fd6117f66120ac565b83836125ad565b5050565b8261180a61169e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d757601060019054906101000a900460ff1661188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290613e5f565b60405180910390fd5b6000611896826114b0565b146118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90613bf7565b60405180910390fd5b5b6118e86118e26120ac565b846121af565b611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613ef1565b60405180910390fd5b4260116000858152602001908152602001600020541161197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197390613f5d565b60405180910390fd5b6119888585858561271a565b5050505050565b6119976120ac565b73ffffffffffffffffffffffffffffffffffffffff166119b561169e565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290613d61565b60405180910390fd5b611a13610cdc565b81600e54611a219190614260565b1015611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990614306565b60405180910390fd5b80600e6000828254611a749190614260565b9250508190555050565b60116020528060005260406000206000915090505481565b601060019054906101000a900460ff1681565b611ab16120ac565b73ffffffffffffffffffffffffffffffffffffffff16611acf61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613d61565b60405180910390fd5b80600e6000828254611b379190613a7d565b9250508190555050565b6060611b4c82612040565b611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614372565b60405180910390fd5b600b611b9683612776565b604051602001611ba7929190614462565b6040516020818303038152906040529050919050565b6000611bc882612040565b611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614372565b60405180910390fd5b42601160008481526020019081526020016000205411611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c53906144d2565b60405180910390fd5b611c6582611333565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c9e576000611ca1565b60015b9050919050565b600e5481565b611cb66120ac565b73ffffffffffffffffffffffffffffffffffffffff16611cd461169e565b73ffffffffffffffffffffffffffffffffffffffff1614611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190613d61565b60405180910390fd5b8181600b9190611d3b929190613124565b505050565b6060600c8054611d4f90613866565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7b90613866565b8015611dc85780601f10611d9d57610100808354040283529160200191611dc8565b820191906000526020600020905b815481529060010190602001808311611dab57829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e6e6120ac565b73ffffffffffffffffffffffffffffffffffffffff16611e8c61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed990613d61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990614564565b60405180910390fd5b611f5b816124e9565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061202957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120395750612038826128d7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661212783611333565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6121ab828260405180602001604052806000815250612941565b5050565b60006121ba82612040565b6121f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f0906145f6565b60405180910390fd5b600061220483611333565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061227357508373ffffffffffffffffffffffffffffffffffffffff1661225b84610957565b73ffffffffffffffffffffffffffffffffffffffff16145b8061228457506122838185611dd2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122ad82611333565b73ffffffffffffffffffffffffffffffffffffffff1614612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90614688565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a9061471a565b60405180910390fd5b61237e83838361299c565b6123896000826120b4565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d99190614260565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124309190613a7d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261390614786565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161270d919061327b565b60405180910390a3505050565b61272584848461228d565b61273184848484612ab0565b612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790614818565b60405180910390fd5b50505050565b606060008214156127be576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128d2565b600082905060005b600082146127f05780806127d990614838565b915050600a826127e991906148b0565b91506127c6565b60008167ffffffffffffffff81111561280c5761280b613649565b5b6040519080825280601f01601f19166020018201604052801561283e5781602001600182028036833780820191505090505b5090505b600085146128cb576001826128579190614260565b9150600a8561286691906148e1565b60306128729190613a7d565b60f81b818381518110612888576128876140a1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128c491906148b0565b9450612842565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61294b8383612c38565b6129586000848484612ab0565b612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614818565b60405180910390fd5b505050565b6129a7838383612e06565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129ea576129e581612e0b565b612a29565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a2857612a278382612e54565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6c57612a6781612fc1565b612aab565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612aaa57612aa98282613092565b5b5b505050565b6000612ad18473ffffffffffffffffffffffffffffffffffffffff16613111565b15612c2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612afa6120ac565b8786866040518563ffffffff1660e01b8152600401612b1c9493929190614967565b6020604051808303816000875af1925050508015612b5857506040513d601f19601f82011682018060405250810190612b5591906149c8565b60015b612bdb573d8060008114612b88576040519150601f19603f3d011682016040523d82523d6000602084013e612b8d565b606091505b50600081511415612bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bca90614818565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c30565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9f90614a41565b60405180910390fd5b612cb181612040565b15612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce890614aad565b60405180910390fd5b612cfd6000838361299c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4d9190613a7d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e61846114b0565b612e6b9190614260565b9050600060086000848152602001908152602001600020549050818114612f50576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612fd59190614260565b90506000600a6000848152602001908152602001600020549050600060098381548110613005576130046140a1565b5b906000526020600020015490508060098381548110613027576130266140a1565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061307657613075614acd565b5b6001900381819060005260206000200160009055905550505050565b600061309d836114b0565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461313090613866565b90600052602060002090601f0160209004810192826131525760008555613199565b82601f1061316b57803560ff1916838001178555613199565b82800160010185558215613199579182015b8281111561319857823582559160200191906001019061317d565b5b5090506131a691906131aa565b5090565b5b808211156131c35760008160009055506001016131ab565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613210816131db565b811461321b57600080fd5b50565b60008135905061322d81613207565b92915050565b600060208284031215613249576132486131d1565b5b60006132578482850161321e565b91505092915050565b60008115159050919050565b61327581613260565b82525050565b6000602082019050613290600083018461326c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132d05780820151818401526020810190506132b5565b838111156132df576000848401525b50505050565b6000601f19601f8301169050919050565b600061330182613296565b61330b81856132a1565b935061331b8185602086016132b2565b613324816132e5565b840191505092915050565b6000602082019050818103600083015261334981846132f6565b905092915050565b6000819050919050565b61336481613351565b811461336f57600080fd5b50565b6000813590506133818161335b565b92915050565b60006020828403121561339d5761339c6131d1565b5b60006133ab84828501613372565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133df826133b4565b9050919050565b6133ef816133d4565b82525050565b600060208201905061340a60008301846133e6565b92915050565b613419816133d4565b811461342457600080fd5b50565b60008135905061343681613410565b92915050565b60008060408385031215613453576134526131d1565b5b600061346185828601613427565b925050602061347285828601613372565b9150509250929050565b61348581613351565b82525050565b60006020820190506134a0600083018461347c565b92915050565b6000602082840312156134bc576134bb6131d1565b5b60006134ca84828501613427565b91505092915050565b6000806000606084860312156134ec576134eb6131d1565b5b60006134fa86828701613427565b935050602061350b86828701613427565b925050604061351c86828701613372565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261354b5761354a613526565b5b8235905067ffffffffffffffff8111156135685761356761352b565b5b60208301915083600182028301111561358457613583613530565b5b9250929050565b600080602083850312156135a2576135a16131d1565b5b600083013567ffffffffffffffff8111156135c0576135bf6131d6565b5b6135cc85828601613535565b92509250509250929050565b6135e181613260565b81146135ec57600080fd5b50565b6000813590506135fe816135d8565b92915050565b6000806040838503121561361b5761361a6131d1565b5b600061362985828601613427565b925050602061363a858286016135ef565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613681826132e5565b810181811067ffffffffffffffff821117156136a05761369f613649565b5b80604052505050565b60006136b36131c7565b90506136bf8282613678565b919050565b600067ffffffffffffffff8211156136df576136de613649565b5b6136e8826132e5565b9050602081019050919050565b82818337600083830152505050565b6000613717613712846136c4565b6136a9565b90508281526020810184848401111561373357613732613644565b5b61373e8482856136f5565b509392505050565b600082601f83011261375b5761375a613526565b5b813561376b848260208601613704565b91505092915050565b6000806000806080858703121561378e5761378d6131d1565b5b600061379c87828801613427565b94505060206137ad87828801613427565b93505060406137be87828801613372565b925050606085013567ffffffffffffffff8111156137df576137de6131d6565b5b6137eb87828801613746565b91505092959194509250565b6000806040838503121561380e5761380d6131d1565b5b600061381c85828601613427565b925050602061382d85828601613427565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387e57607f821691505b6020821081141561389257613891613837565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138f4602c836132a1565b91506138ff82613898565b604082019050919050565b60006020820190508181036000830152613923816138e7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139866021836132a1565b91506139918261392a565b604082019050919050565b600060208201905081810360008301526139b581613979565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a186038836132a1565b9150613a23826139bc565b604082019050919050565b60006020820190508181036000830152613a4781613a0b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a8882613351565b9150613a9383613351565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ac857613ac7613a4e565b5b828201905092915050565b7f43616c6c6572206d757374206e6f74206265206120636f6e74726163742e0000600082015250565b6000613b09601e836132a1565b9150613b1482613ad3565b602082019050919050565b60006020820190508181036000830152613b3881613afc565b9050919050565b7f53616c6520686173206e6f7420737461727465642e0000000000000000000000600082015250565b6000613b756015836132a1565b9150613b8082613b3f565b602082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b7f5573657220616c726561647920686f6c6473206120746f6b656e2e0000000000600082015250565b6000613be1601b836132a1565b9150613bec82613bab565b602082019050919050565b60006020820190508181036000830152613c1081613bd4565b9050919050565b7f496e636f727265637420457468657220616d6f756e742073656e742e00000000600082015250565b6000613c4d601c836132a1565b9150613c5882613c17565b602082019050919050565b60006020820190508181036000830152613c7c81613c40565b9050919050565b7f4d696e74656420746f6b656e20776f756c642065786365656420746f74616c2060008201527f737570706c792e00000000000000000000000000000000000000000000000000602082015250565b6000613cdf6027836132a1565b9150613cea82613c83565b604082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d4b6020836132a1565b9150613d5682613d15565b602082019050919050565b60006020820190508181036000830152613d7a81613d3e565b9050919050565b7f52656365697665722063616e6e6f74206265207a65726f20616464726573732e600082015250565b6000613db76020836132a1565b9150613dc282613d81565b602082019050919050565b60006020820190508181036000830152613de681613daa565b9050919050565b7f546f6b656e207472616e7366657273206172652063757272656e746c7920646960008201527f7361626c65642e00000000000000000000000000000000000000000000000000602082015250565b6000613e496027836132a1565b9150613e5482613ded565b604082019050919050565b60006020820190508181036000830152613e7881613e3c565b9050919050565b7f5472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665642e00000000000000000000000000000000000000000000602082015250565b6000613edb602a836132a1565b9150613ee682613e7f565b604082019050919050565b60006020820190508181036000830152613f0a81613ece565b9050919050565b7f546f6b656e2068617320657870697265642e0000000000000000000000000000600082015250565b6000613f476012836132a1565b9150613f5282613f11565b602082019050919050565b60006020820190508181036000830152613f7681613f3a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613fd9602b836132a1565b9150613fe482613f7d565b604082019050919050565b6000602082019050818103600083015261400881613fcc565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061406b602c836132a1565b91506140768261400f565b604082019050919050565b6000602082019050818103600083015261409a8161405e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061412c6029836132a1565b9150614137826140d0565b604082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b7f507269636520686173206e6f74206368616e6765642e00000000000000000000600082015250565b60006141986016836132a1565b91506141a382614162565b602082019050919050565b600060208201905081810360008301526141c78161418b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061422a602a836132a1565b9150614235826141ce565b604082019050919050565b600060208201905081810360008301526142598161421d565b9050919050565b600061426b82613351565b915061427683613351565b92508282101561428957614288613a4e565b5b828203905092915050565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b60006142f06027836132a1565b91506142fb82614294565b604082019050919050565b6000602082019050818103600083015261431f816142e3565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b600061435c6015836132a1565b915061436782614326565b602082019050919050565b6000602082019050818103600083015261438b8161434f565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546143bf81613866565b6143c98186614392565b945060018216600081146143e457600181146143f557614428565b60ff19831686528186019350614428565b6143fe8561439d565b60005b8381101561442057815481890152600182019150602081019050614401565b838801955050505b50505092915050565b600061443c82613296565b6144468185614392565b93506144568185602086016132b2565b80840191505092915050565b600061446e82856143b2565b915061447a8284614431565b91508190509392505050565b7f546f6b656e2068617320657870697265642e20506c656173652072656e657721600082015250565b60006144bc6020836132a1565b91506144c782614486565b602082019050919050565b600060208201905081810360008301526144eb816144af565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061454e6026836132a1565b9150614559826144f2565b604082019050919050565b6000602082019050818103600083015261457d81614541565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006145e0602c836132a1565b91506145eb82614584565b604082019050919050565b6000602082019050818103600083015261460f816145d3565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146726029836132a1565b915061467d82614616565b604082019050919050565b600060208201905081810360008301526146a181614665565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147046024836132a1565b915061470f826146a8565b604082019050919050565b60006020820190508181036000830152614733816146f7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006147706019836132a1565b915061477b8261473a565b602082019050919050565b6000602082019050818103600083015261479f81614763565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148026032836132a1565b915061480d826147a6565b604082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b600061484382613351565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487657614875613a4e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148bb82613351565b91506148c683613351565b9250826148d6576148d5614881565b5b828204905092915050565b60006148ec82613351565b91506148f783613351565b92508261490757614906614881565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061493982614912565b614943818561491d565b93506149538185602086016132b2565b61495c816132e5565b840191505092915050565b600060808201905061497c60008301876133e6565b61498960208301866133e6565b614996604083018561347c565b81810360608301526149a8818461492e565b905095945050505050565b6000815190506149c281613207565b92915050565b6000602082840312156149de576149dd6131d1565b5b60006149ec848285016149b3565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a2b6020836132a1565b9150614a36826149f5565b602082019050919050565b60006020820190508181036000830152614a5a81614a1e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a97601c836132a1565b9150614aa282614a61565b602082019050919050565b60006020820190508181036000830152614ac681614a8a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220768bb987a653911512c7f1a842d6828f23825c36bec3954a530441b47e744afb64736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : tokenURI_ (string):
Arg [1] : contractURI_ (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

2967:8472:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1019:224:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2486:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4045:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3568:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4118:619:1;;;:::i;:::-;;1659:113:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4946:569:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11065:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1327:256:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10021:99:1;;;;;;;;;;;;;:::i;:::-;;5205:185:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1849:233:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3290:31:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9554:105;;;;;;;;;;;;;:::i;:::-;;2180:239:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6368:198:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1910:208:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:12;;;;;;;;;;;;;:::i;:::-;;9796:84:1;;;;;;;;;;;;;:::i;:::-;;3248:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1063:87:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9297:119:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2655:104:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4338:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10468:413:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7784:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3373:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3328:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7421:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8266:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6861:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3213:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8716:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8986:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4564:164:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1972:201:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1019:224:6;1121:4;1160:35;1145:50;;;:11;:50;;;;:90;;;;1199:36;1223:11;1199:23;:36::i;:::-;1145:90;1138:97;;1019:224;;;:::o;2486:100:5:-;2540:13;2573:5;2566:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2486:100;:::o;4045:221::-;4121:7;4149:16;4157:7;4149;:16::i;:::-;4141:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4234:15;:24;4250:7;4234:24;;;;;;;;;;;;;;;;;;;;;4227:31;;4045:221;;;:::o;3568:411::-;3649:13;3665:23;3680:7;3665:14;:23::i;:::-;3649:39;;3713:5;3707:11;;:2;:11;;;;3699:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3807:5;3791:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3816:37;3833:5;3840:12;:10;:12::i;:::-;3816:16;:37::i;:::-;3791:62;3769:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3950:21;3959:2;3963:7;3950:8;:21::i;:::-;3638:341;3568:411;;:::o;4118:619:1:-;4162:15;4208:1;4180:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;4162:47;;4243:10;4230:23;;:9;:23;;;4222:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4307:11;;;;;;;;;;;4299:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;4388:1;4363:21;4373:10;4363:9;:21::i;:::-;:26;4355:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4453:10;;4440:9;:23;4432:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4529:9;;4515:10;:23;;4507:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4595:27;:15;:25;:27::i;:::-;4635:33;4645:10;4657;4635:9;:33::i;:::-;4722:7;4704:15;:25;;;;:::i;:::-;4679:10;:22;4690:10;4679:22;;;;;;;;;;;:50;;;;4149:588;4118:619::o;1659:113:6:-;1720:7;1747:10;:17;;;;1740:24;;1659:113;:::o;4946:569:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5014:15:1::1;5060:1;5032:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;5014:47;;5103:1;5082:23;;:9;:23;;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5175:9;;5161:10;:23;;5153:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;5259:9;5245:23;;:10;:23;;;5241:121;;5317:1;5293:20;5303:9;5293;:20::i;:::-;:25;5285:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5241:121;5374:27;:15;:25;:27::i;:::-;5414:32;5424:9;5435:10;5414:9;:32::i;:::-;5500:7;5482:15;:25;;;;:::i;:::-;5457:10;:22;5468:10;5457:22;;;;;;;;;;;:50;;;;5001:514;4946:569:::0;:::o;11065:369::-;11197:2;3843:7;:5;:7::i;:::-;3829:21;;:10;:21;;;3825:195;;3875:16;;;;;;;;;;;3867:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3975:1;3958:13;3968:2;3958:9;:13::i;:::-;:18;3950:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3825:195;11220:41:::1;11239:12;:10;:12::i;:::-;11253:7;11220:18;:41::i;:::-;11212:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;11349:15;11327:10;:19;11338:7;11327:19;;;;;;;;;;;;:37;11319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11398:28;11408:4;11414:2;11418:7;11398:9;:28::i;:::-;11065:369:::0;;;;:::o;1327:256:6:-;1424:7;1460:23;1477:5;1460:16;:23::i;:::-;1452:5;:31;1444:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1549:12;:19;1562:5;1549:19;;;;;;;;;;;;;;;:26;1569:5;1549:26;;;;;;;;;;;;1542:33;;1327:256;;;;:::o;10021:99:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10096:16:1::1;;;;;;;;;;;10095:17;10076:16;;:36;;;;;;;;;;;;;;;;;;10021:99::o:0;5205:185:5:-;5343:39;5360:4;5366:2;5370:7;5343:39;;;;;;;;;;;;:16;:39::i;:::-;5205:185;;;:::o;1849:233:6:-;1924:7;1960:30;:28;:30::i;:::-;1952:5;:38;1944:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2057:10;2068:5;2057:17;;;;;;;;:::i;:::-;;;;;;;;;;2050:24;;1849:233;;;:::o;3290:31:1:-;;;;;;;;;;;;;:::o;9554:105::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9611:10:1::1;9603:28;;:51;9632:21;9603:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9554:105::o:0;2180:239:5:-;2252:7;2272:13;2288:7;:16;2296:7;2288:16;;;;;;;;;;;;;;;;;;;;;2272:32;;2340:1;2323:19;;:5;:19;;;;2315:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2406:5;2399:12;;;2180:239;;;:::o;6368:198:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6471:18:1::1;6457:10;;:32;;6449:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6540:18;6527:10;:31;;;;6368:198:::0;:::o;1910:208:5:-;1982:7;2027:1;2010:19;;:5;:19;;;;2002:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2094:9;:16;2104:5;2094:16;;;;;;;;;;;;;;;;2087:23;;1910:208;;;:::o;1714:103:12:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;9796:84:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9861:11:1::1;;;;;;;;;;;9860:12;9846:11;;:26;;;;;;;;;;;;;;;;;;9796:84::o:0;3248:35::-;;;;:::o;1063:87:12:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;9297:119:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9396:12:1::1;;9381;:27;;;;;;;:::i;:::-;;9297:119:::0;;:::o;2655:104:5:-;2711:13;2744:7;2737:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2655:104;:::o;4338:155::-;4433:52;4452:12;:10;:12::i;:::-;4466:8;4476;4433:18;:52::i;:::-;4338:155;;:::o;10468:413:1:-;10633:2;3843:7;:5;:7::i;:::-;3829:21;;:10;:21;;;3825:195;;3875:16;;;;;;;;;;;3867:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3975:1;3958:13;3968:2;3958:9;:13::i;:::-;:18;3950:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3825:195;10656:41:::1;10675:12;:10;:12::i;:::-;10689:7;10656:18;:41::i;:::-;10648:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;10785:15;10763:10;:19;10774:7;10763:19;;;;;;;;;;;;:37;10755:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10834:39;10848:4;10854:2;10858:7;10867:5;10834:13;:39::i;:::-;10468:413:::0;;;;;:::o;7784:202::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7887:13:1::1;:11;:13::i;:::-;7873:10;7861:9;;:22;;;;:::i;:::-;:39;;7853:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;7968:10;7955:9;;:23;;;;;;;:::i;:::-;;;;;;;;7784:202:::0;:::o;3373:39::-;;;;;;;;;;;;;;;;;:::o;3328:36::-;;;;;;;;;;;;;:::o;7421:97::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7500:10:1::1;7487:9;;:23;;;;;;;:::i;:::-;;;;;;;;7421:97:::0;:::o;8266:222::-;8329:13;8363:17;8371:8;8363:7;:17::i;:::-;8355:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;8448:9;8459:19;:8;:17;:19::i;:::-;8431:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8417:63;;8266:222;;;:::o;6861:298::-;6923:4;6948:17;6956:8;6948:7;:17::i;:::-;6940:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;7033:15;7010:10;:20;7021:8;7010:20;;;;;;;;;;;;:38;7002:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;7119:17;7127:8;7119:7;:17::i;:::-;7105:31;;:10;:31;;;:46;;7146:5;7105:46;;;7139:4;7105:46;7098:53;;6861:298;;;:::o;3213:28::-;;;;:::o;8716:107::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8806:9:1::1;;8794;:21;;;;;;;:::i;:::-;;8716:107:::0;;:::o;8986:97::-;9030:13;9063:12;9056:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8986:97;:::o;4564:164:5:-;4661:4;4685:18;:25;4704:5;4685:25;;;;;;;;;;;;;;;:35;4711:8;4685:35;;;;;;;;;;;;;;;;;;;;;;;;;4678:42;;4564:164;;;;:::o;1972:201:12:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;;;2053:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;1541:305:5:-;1643:4;1695:25;1680:40;;;:11;:40;;;;:105;;;;1752:33;1737:48;;;:11;:48;;;;1680:105;:158;;;;1802:36;1826:11;1802:23;:36::i;:::-;1680:158;1660:178;;1541:305;;;:::o;7299:127::-;7364:4;7416:1;7388:30;;:7;:16;7396:7;7388:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7381:37;;7299:127;;;:::o;656:98:2:-;709:7;736:10;729:17;;656:98;:::o;11281:174:5:-;11383:2;11356:15;:24;11372:7;11356:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11439:7;11435:2;11401:46;;11410:23;11425:7;11410:14;:23::i;:::-;11401:46;;;;;;;;;;;;11281:174;;:::o;848:114:3:-;913:7;940;:14;;;933:21;;848:114;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;8283:110:5:-;8359:26;8369:2;8373:7;8359:26;;;;;;;;;;;;:9;:26::i;:::-;8283:110;;:::o;7593:348::-;7686:4;7711:16;7719:7;7711;:16::i;:::-;7703:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7787:13;7803:23;7818:7;7803:14;:23::i;:::-;7787:39;;7856:5;7845:16;;:7;:16;;;:51;;;;7889:7;7865:31;;:20;7877:7;7865:11;:20::i;:::-;:31;;;7845:51;:87;;;;7900:32;7917:5;7924:7;7900:16;:32::i;:::-;7845:87;7837:96;;;7593:348;;;;:::o;10585:578::-;10744:4;10717:31;;:23;10732:7;10717:14;:23::i;:::-;:31;;;10709:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10827:1;10813:16;;:2;:16;;;;10805:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10883:39;10904:4;10910:2;10914:7;10883:20;:39::i;:::-;10987:29;11004:1;11008:7;10987:8;:29::i;:::-;11048:1;11029:9;:15;11039:4;11029:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11077:1;11060:9;:13;11070:2;11060:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11108:2;11089:7;:16;11097:7;11089:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11147:7;11143:2;11128:27;;11137:4;11128:27;;;;;;;;;;;;10585:578;;;:::o;2333:191:12:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;11597:315:5:-;11752:8;11743:17;;:5;:17;;;;11735:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11839:8;11801:18;:25;11820:5;11801:25;;;;;;;;;;;;;;;:35;11827:8;11801:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11885:8;11863:41;;11878:5;11863:41;;;11895:8;11863:41;;;;;;:::i;:::-;;;;;;;;11597:315;;;:::o;6671:::-;6828:28;6838:4;6844:2;6848:7;6828:9;:28::i;:::-;6875:48;6898:4;6904:2;6908:7;6917:5;6875:22;:48::i;:::-;6867:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6671:315;;;;:::o;342:723:13:-;398:13;628:1;619:5;:10;615:53;;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;854:157:4:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;8620:321:5:-;8750:18;8756:2;8760:7;8750:5;:18::i;:::-;8801:54;8832:1;8836:2;8840:7;8849:5;8801:22;:54::i;:::-;8779:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8620:321;;;:::o;2695:589:6:-;2839:45;2866:4;2872:2;2876:7;2839:26;:45::i;:::-;2917:1;2901:18;;:4;:18;;;2897:187;;;2936:40;2968:7;2936:31;:40::i;:::-;2897:187;;;3006:2;2998:10;;:4;:10;;;2994:90;;3025:47;3058:4;3064:7;3025:32;:47::i;:::-;2994:90;2897:187;3112:1;3098:16;;:2;:16;;;3094:183;;;3131:45;3168:7;3131:36;:45::i;:::-;3094:183;;;3204:4;3198:10;;:2;:10;;;3194:83;;3225:40;3253:2;3257:7;3225:27;:40::i;:::-;3194:83;3094:183;2695:589;;;:::o;12477:799:5:-;12632:4;12653:15;:2;:13;;;:15::i;:::-;12649:620;;;12705:2;12689:36;;;12726:12;:10;:12::i;:::-;12740:4;12746:7;12755:5;12689:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12685:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12948:1;12931:6;:13;:18;12927:272;;;12974:60;;;;;;;;;;:::i;:::-;;;;;;;;12927:272;13149:6;13143:13;13134:6;13130:2;13126:15;13119:38;12685:529;12822:41;;;12812:51;;;:6;:51;;;;12805:58;;;;;12649:620;13253:4;13246:11;;12477:799;;;;;;;:::o;9277:382::-;9371:1;9357:16;;:2;:16;;;;9349:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9430:16;9438:7;9430;:16::i;:::-;9429:17;9421:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9492:45;9521:1;9525:2;9529:7;9492:20;:45::i;:::-;9567:1;9550:9;:13;9560:2;9550:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9598:2;9579:7;:16;9587:7;9579:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9643:7;9639:2;9618:33;;9635:1;9618:33;;;;;;;;;;;;9277:382;;:::o;13848:126::-;;;;:::o;4007:164:6:-;4111:10;:17;;;;4084:15;:24;4100:7;4084:24;;;;;;;;;;;:44;;;;4139:10;4155:7;4139:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4007:164;:::o;4798:988::-;5064:22;5114:1;5089:22;5106:4;5089:16;:22::i;:::-;:26;;;;:::i;:::-;5064:51;;5126:18;5147:17;:26;5165:7;5147:26;;;;;;;;;;;;5126:47;;5294:14;5280:10;:28;5276:328;;5325:19;5347:12;:18;5360:4;5347:18;;;;;;;;;;;;;;;:34;5366:14;5347:34;;;;;;;;;;;;5325:56;;5431:11;5398:12;:18;5411:4;5398:18;;;;;;;;;;;;;;;:30;5417:10;5398:30;;;;;;;;;;;:44;;;;5548:10;5515:17;:30;5533:11;5515:30;;;;;;;;;;;:43;;;;5310:294;5276:328;5700:17;:26;5718:7;5700:26;;;;;;;;;;;5693:33;;;5744:12;:18;5757:4;5744:18;;;;;;;;;;;;;;;:34;5763:14;5744:34;;;;;;;;;;;5737:41;;;4879:907;;4798:988;;:::o;6081:1079::-;6334:22;6379:1;6359:10;:17;;;;:21;;;;:::i;:::-;6334:46;;6391:18;6412:15;:24;6428:7;6412:24;;;;;;;;;;;;6391:45;;6763:19;6785:10;6796:14;6785:26;;;;;;;;:::i;:::-;;;;;;;;;;6763:48;;6849:11;6824:10;6835;6824:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6960:10;6929:15;:28;6945:11;6929:28;;;;;;;;;;;:41;;;;7101:15;:24;7117:7;7101:24;;;;;;;;;;;7094:31;;;7136:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6152:1008;;;6081:1079;:::o;3585:221::-;3670:14;3687:20;3704:2;3687:16;:20::i;:::-;3670:37;;3745:7;3718:12;:16;3731:2;3718:16;;;;;;;;;;;;;;;:24;3735:6;3718:24;;;;;;;;;;;:34;;;;3792:6;3763:17;:26;3781:7;3763:26;;;;;;;;;;;:35;;;;3659:147;3585:221;;:::o;797:387:0:-;857:4;1065:12;1132:7;1120:20;1112:28;;1175:1;1168:4;:8;1161:15;;;797:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:117;6605:1;6602;6595:12;6633:553;6691:8;6701:6;6751:3;6744:4;6736:6;6732:17;6728:27;6718:122;;6759:79;;:::i;:::-;6718:122;6872:6;6859:20;6849:30;;6902:18;6894:6;6891:30;6888:117;;;6924:79;;:::i;:::-;6888:117;7038:4;7030:6;7026:17;7014:29;;7092:3;7084:4;7076:6;7072:17;7062:8;7058:32;7055:41;7052:128;;;7099:79;;:::i;:::-;7052:128;6633:553;;;;;:::o;7192:529::-;7263:6;7271;7320:2;7308:9;7299:7;7295:23;7291:32;7288:119;;;7326:79;;:::i;:::-;7288:119;7474:1;7463:9;7459:17;7446:31;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:65;7696:7;7687:6;7676:9;7672:22;7639:65;:::i;:::-;7621:83;;;;7417:297;7192:529;;;;;:::o;7727:116::-;7797:21;7812:5;7797:21;:::i;:::-;7790:5;7787:32;7777:60;;7833:1;7830;7823:12;7777:60;7727:116;:::o;7849:133::-;7892:5;7930:6;7917:20;7908:29;;7946:30;7970:5;7946:30;:::i;:::-;7849:133;;;;:::o;7988:468::-;8053:6;8061;8110:2;8098:9;8089:7;8085:23;8081:32;8078:119;;;8116:79;;:::i;:::-;8078:119;8236:1;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8207:117;8363:2;8389:50;8431:7;8422:6;8411:9;8407:22;8389:50;:::i;:::-;8379:60;;8334:115;7988:468;;;;;:::o;8462:117::-;8571:1;8568;8561:12;8585:180;8633:77;8630:1;8623:88;8730:4;8727:1;8720:15;8754:4;8751:1;8744:15;8771:281;8854:27;8876:4;8854:27;:::i;:::-;8846:6;8842:40;8984:6;8972:10;8969:22;8948:18;8936:10;8933:34;8930:62;8927:88;;;8995:18;;:::i;:::-;8927:88;9035:10;9031:2;9024:22;8814:238;8771:281;;:::o;9058:129::-;9092:6;9119:20;;:::i;:::-;9109:30;;9148:33;9176:4;9168:6;9148:33;:::i;:::-;9058:129;;;:::o;9193:307::-;9254:4;9344:18;9336:6;9333:30;9330:56;;;9366:18;;:::i;:::-;9330:56;9404:29;9426:6;9404:29;:::i;:::-;9396:37;;9488:4;9482;9478:15;9470:23;;9193:307;;;:::o;9506:154::-;9590:6;9585:3;9580;9567:30;9652:1;9643:6;9638:3;9634:16;9627:27;9506:154;;;:::o;9666:410::-;9743:5;9768:65;9784:48;9825:6;9784:48;:::i;:::-;9768:65;:::i;:::-;9759:74;;9856:6;9849:5;9842:21;9894:4;9887:5;9883:16;9932:3;9923:6;9918:3;9914:16;9911:25;9908:112;;;9939:79;;:::i;:::-;9908:112;10029:41;10063:6;10058:3;10053;10029:41;:::i;:::-;9749:327;9666:410;;;;;:::o;10095:338::-;10150:5;10199:3;10192:4;10184:6;10180:17;10176:27;10166:122;;10207:79;;:::i;:::-;10166:122;10324:6;10311:20;10349:78;10423:3;10415:6;10408:4;10400:6;10396:17;10349:78;:::i;:::-;10340:87;;10156:277;10095:338;;;;:::o;10439:943::-;10534:6;10542;10550;10558;10607:3;10595:9;10586:7;10582:23;10578:33;10575:120;;;10614:79;;:::i;:::-;10575:120;10734:1;10759:53;10804:7;10795:6;10784:9;10780:22;10759:53;:::i;:::-;10749:63;;10705:117;10861:2;10887:53;10932:7;10923:6;10912:9;10908:22;10887:53;:::i;:::-;10877:63;;10832:118;10989:2;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10960:118;11145:2;11134:9;11130:18;11117:32;11176:18;11168:6;11165:30;11162:117;;;11198:79;;:::i;:::-;11162:117;11303:62;11357:7;11348:6;11337:9;11333:22;11303:62;:::i;:::-;11293:72;;11088:287;10439:943;;;;;;;:::o;11388:474::-;11456:6;11464;11513:2;11501:9;11492:7;11488:23;11484:32;11481:119;;;11519:79;;:::i;:::-;11481:119;11639:1;11664:53;11709:7;11700:6;11689:9;11685:22;11664:53;:::i;:::-;11654:63;;11610:117;11766:2;11792:53;11837:7;11828:6;11817:9;11813:22;11792:53;:::i;:::-;11782:63;;11737:118;11388:474;;;;;:::o;11868:180::-;11916:77;11913:1;11906:88;12013:4;12010:1;12003:15;12037:4;12034:1;12027:15;12054:320;12098:6;12135:1;12129:4;12125:12;12115:22;;12182:1;12176:4;12172:12;12203:18;12193:81;;12259:4;12251:6;12247:17;12237:27;;12193:81;12321:2;12313:6;12310:14;12290:18;12287:38;12284:84;;;12340:18;;:::i;:::-;12284:84;12105:269;12054:320;;;:::o;12380:231::-;12520:34;12516:1;12508:6;12504:14;12497:58;12589:14;12584:2;12576:6;12572:15;12565:39;12380:231;:::o;12617:366::-;12759:3;12780:67;12844:2;12839:3;12780:67;:::i;:::-;12773:74;;12856:93;12945:3;12856:93;:::i;:::-;12974:2;12969:3;12965:12;12958:19;;12617:366;;;:::o;12989:419::-;13155:4;13193:2;13182:9;13178:18;13170:26;;13242:9;13236:4;13232:20;13228:1;13217:9;13213:17;13206:47;13270:131;13396:4;13270:131;:::i;:::-;13262:139;;12989:419;;;:::o;13414:220::-;13554:34;13550:1;13542:6;13538:14;13531:58;13623:3;13618:2;13610:6;13606:15;13599:28;13414:220;:::o;13640:366::-;13782:3;13803:67;13867:2;13862:3;13803:67;:::i;:::-;13796:74;;13879:93;13968:3;13879:93;:::i;:::-;13997:2;13992:3;13988:12;13981:19;;13640:366;;;:::o;14012:419::-;14178:4;14216:2;14205:9;14201:18;14193:26;;14265:9;14259:4;14255:20;14251:1;14240:9;14236:17;14229:47;14293:131;14419:4;14293:131;:::i;:::-;14285:139;;14012:419;;;:::o;14437:243::-;14577:34;14573:1;14565:6;14561:14;14554:58;14646:26;14641:2;14633:6;14629:15;14622:51;14437:243;:::o;14686:366::-;14828:3;14849:67;14913:2;14908:3;14849:67;:::i;:::-;14842:74;;14925:93;15014:3;14925:93;:::i;:::-;15043:2;15038:3;15034:12;15027:19;;14686:366;;;:::o;15058:419::-;15224:4;15262:2;15251:9;15247:18;15239:26;;15311:9;15305:4;15301:20;15297:1;15286:9;15282:17;15275:47;15339:131;15465:4;15339:131;:::i;:::-;15331:139;;15058:419;;;:::o;15483:180::-;15531:77;15528:1;15521:88;15628:4;15625:1;15618:15;15652:4;15649:1;15642:15;15669:305;15709:3;15728:20;15746:1;15728:20;:::i;:::-;15723:25;;15762:20;15780:1;15762:20;:::i;:::-;15757:25;;15916:1;15848:66;15844:74;15841:1;15838:81;15835:107;;;15922:18;;:::i;:::-;15835:107;15966:1;15963;15959:9;15952:16;;15669:305;;;;:::o;15980:180::-;16120:32;16116:1;16108:6;16104:14;16097:56;15980:180;:::o;16166:366::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:419::-;16704:4;16742:2;16731:9;16727:18;16719:26;;16791:9;16785:4;16781:20;16777:1;16766:9;16762:17;16755:47;16819:131;16945:4;16819:131;:::i;:::-;16811:139;;16538:419;;;:::o;16963:171::-;17103:23;17099:1;17091:6;17087:14;17080:47;16963:171;:::o;17140:366::-;17282:3;17303:67;17367:2;17362:3;17303:67;:::i;:::-;17296:74;;17379:93;17468:3;17379:93;:::i;:::-;17497:2;17492:3;17488:12;17481:19;;17140:366;;;:::o;17512:419::-;17678:4;17716:2;17705:9;17701:18;17693:26;;17765:9;17759:4;17755:20;17751:1;17740:9;17736:17;17729:47;17793:131;17919:4;17793:131;:::i;:::-;17785:139;;17512:419;;;:::o;17937:177::-;18077:29;18073:1;18065:6;18061:14;18054:53;17937:177;:::o;18120:366::-;18262:3;18283:67;18347:2;18342:3;18283:67;:::i;:::-;18276:74;;18359:93;18448:3;18359:93;:::i;:::-;18477:2;18472:3;18468:12;18461:19;;18120:366;;;:::o;18492:419::-;18658:4;18696:2;18685:9;18681:18;18673:26;;18745:9;18739:4;18735:20;18731:1;18720:9;18716:17;18709:47;18773:131;18899:4;18773:131;:::i;:::-;18765:139;;18492:419;;;:::o;18917:178::-;19057:30;19053:1;19045:6;19041:14;19034:54;18917:178;:::o;19101:366::-;19243:3;19264:67;19328:2;19323:3;19264:67;:::i;:::-;19257:74;;19340:93;19429:3;19340:93;:::i;:::-;19458:2;19453:3;19449:12;19442:19;;19101:366;;;:::o;19473:419::-;19639:4;19677:2;19666:9;19662:18;19654:26;;19726:9;19720:4;19716:20;19712:1;19701:9;19697:17;19690:47;19754:131;19880:4;19754:131;:::i;:::-;19746:139;;19473:419;;;:::o;19898:226::-;20038:34;20034:1;20026:6;20022:14;20015:58;20107:9;20102:2;20094:6;20090:15;20083:34;19898:226;:::o;20130:366::-;20272:3;20293:67;20357:2;20352:3;20293:67;:::i;:::-;20286:74;;20369:93;20458:3;20369:93;:::i;:::-;20487:2;20482:3;20478:12;20471:19;;20130:366;;;:::o;20502:419::-;20668:4;20706:2;20695:9;20691:18;20683:26;;20755:9;20749:4;20745:20;20741:1;20730:9;20726:17;20719:47;20783:131;20909:4;20783:131;:::i;:::-;20775:139;;20502:419;;;:::o;20927:182::-;21067:34;21063:1;21055:6;21051:14;21044:58;20927:182;:::o;21115:366::-;21257:3;21278:67;21342:2;21337:3;21278:67;:::i;:::-;21271:74;;21354:93;21443:3;21354:93;:::i;:::-;21472:2;21467:3;21463:12;21456:19;;21115:366;;;:::o;21487:419::-;21653:4;21691:2;21680:9;21676:18;21668:26;;21740:9;21734:4;21730:20;21726:1;21715:9;21711:17;21704:47;21768:131;21894:4;21768:131;:::i;:::-;21760:139;;21487:419;;;:::o;21912:182::-;22052:34;22048:1;22040:6;22036:14;22029:58;21912:182;:::o;22100:366::-;22242:3;22263:67;22327:2;22322:3;22263:67;:::i;:::-;22256:74;;22339:93;22428:3;22339:93;:::i;:::-;22457:2;22452:3;22448:12;22441:19;;22100:366;;;:::o;22472:419::-;22638:4;22676:2;22665:9;22661:18;22653:26;;22725:9;22719:4;22715:20;22711:1;22700:9;22696:17;22689:47;22753:131;22879:4;22753:131;:::i;:::-;22745:139;;22472:419;;;:::o;22897:226::-;23037:34;23033:1;23025:6;23021:14;23014:58;23106:9;23101:2;23093:6;23089:15;23082:34;22897:226;:::o;23129:366::-;23271:3;23292:67;23356:2;23351:3;23292:67;:::i;:::-;23285:74;;23368:93;23457:3;23368:93;:::i;:::-;23486:2;23481:3;23477:12;23470:19;;23129:366;;;:::o;23501:419::-;23667:4;23705:2;23694:9;23690:18;23682:26;;23754:9;23748:4;23744:20;23740:1;23729:9;23725:17;23718:47;23782:131;23908:4;23782:131;:::i;:::-;23774:139;;23501:419;;;:::o;23926:229::-;24066:34;24062:1;24054:6;24050:14;24043:58;24135:12;24130:2;24122:6;24118:15;24111:37;23926:229;:::o;24161:366::-;24303:3;24324:67;24388:2;24383:3;24324:67;:::i;:::-;24317:74;;24400:93;24489:3;24400:93;:::i;:::-;24518:2;24513:3;24509:12;24502:19;;24161:366;;;:::o;24533:419::-;24699:4;24737:2;24726:9;24722:18;24714:26;;24786:9;24780:4;24776:20;24772:1;24761:9;24757:17;24750:47;24814:131;24940:4;24814:131;:::i;:::-;24806:139;;24533:419;;;:::o;24958:168::-;25098:20;25094:1;25086:6;25082:14;25075:44;24958:168;:::o;25132:366::-;25274:3;25295:67;25359:2;25354:3;25295:67;:::i;:::-;25288:74;;25371:93;25460:3;25371:93;:::i;:::-;25489:2;25484:3;25480:12;25473:19;;25132:366;;;:::o;25504:419::-;25670:4;25708:2;25697:9;25693:18;25685:26;;25757:9;25751:4;25747:20;25743:1;25732:9;25728:17;25721:47;25785:131;25911:4;25785:131;:::i;:::-;25777:139;;25504:419;;;:::o;25929:230::-;26069:34;26065:1;26057:6;26053:14;26046:58;26138:13;26133:2;26125:6;26121:15;26114:38;25929:230;:::o;26165:366::-;26307:3;26328:67;26392:2;26387:3;26328:67;:::i;:::-;26321:74;;26404:93;26493:3;26404:93;:::i;:::-;26522:2;26517:3;26513:12;26506:19;;26165:366;;;:::o;26537:419::-;26703:4;26741:2;26730:9;26726:18;26718:26;;26790:9;26784:4;26780:20;26776:1;26765:9;26761:17;26754:47;26818:131;26944:4;26818:131;:::i;:::-;26810:139;;26537:419;;;:::o;26962:231::-;27102:34;27098:1;27090:6;27086:14;27079:58;27171:14;27166:2;27158:6;27154:15;27147:39;26962:231;:::o;27199:366::-;27341:3;27362:67;27426:2;27421:3;27362:67;:::i;:::-;27355:74;;27438:93;27527:3;27438:93;:::i;:::-;27556:2;27551:3;27547:12;27540:19;;27199:366;;;:::o;27571:419::-;27737:4;27775:2;27764:9;27760:18;27752:26;;27824:9;27818:4;27814:20;27810:1;27799:9;27795:17;27788:47;27852:131;27978:4;27852:131;:::i;:::-;27844:139;;27571:419;;;:::o;27996:180::-;28044:77;28041:1;28034:88;28141:4;28138:1;28131:15;28165:4;28162:1;28155:15;28182:228;28322:34;28318:1;28310:6;28306:14;28299:58;28391:11;28386:2;28378:6;28374:15;28367:36;28182:228;:::o;28416:366::-;28558:3;28579:67;28643:2;28638:3;28579:67;:::i;:::-;28572:74;;28655:93;28744:3;28655:93;:::i;:::-;28773:2;28768:3;28764:12;28757:19;;28416:366;;;:::o;28788:419::-;28954:4;28992:2;28981:9;28977:18;28969:26;;29041:9;29035:4;29031:20;29027:1;29016:9;29012:17;29005:47;29069:131;29195:4;29069:131;:::i;:::-;29061:139;;28788:419;;;:::o;29213:172::-;29353:24;29349:1;29341:6;29337:14;29330:48;29213:172;:::o;29391:366::-;29533:3;29554:67;29618:2;29613:3;29554:67;:::i;:::-;29547:74;;29630:93;29719:3;29630:93;:::i;:::-;29748:2;29743:3;29739:12;29732:19;;29391:366;;;:::o;29763:419::-;29929:4;29967:2;29956:9;29952:18;29944:26;;30016:9;30010:4;30006:20;30002:1;29991:9;29987:17;29980:47;30044:131;30170:4;30044:131;:::i;:::-;30036:139;;29763:419;;;:::o;30188:229::-;30328:34;30324:1;30316:6;30312:14;30305:58;30397:12;30392:2;30384:6;30380:15;30373:37;30188:229;:::o;30423:366::-;30565:3;30586:67;30650:2;30645:3;30586:67;:::i;:::-;30579:74;;30662:93;30751:3;30662:93;:::i;:::-;30780:2;30775:3;30771:12;30764:19;;30423:366;;;:::o;30795:419::-;30961:4;30999:2;30988:9;30984:18;30976:26;;31048:9;31042:4;31038:20;31034:1;31023:9;31019:17;31012:47;31076:131;31202:4;31076:131;:::i;:::-;31068:139;;30795:419;;;:::o;31220:191::-;31260:4;31280:20;31298:1;31280:20;:::i;:::-;31275:25;;31314:20;31332:1;31314:20;:::i;:::-;31309:25;;31353:1;31350;31347:8;31344:34;;;31358:18;;:::i;:::-;31344:34;31403:1;31400;31396:9;31388:17;;31220:191;;;;:::o;31417:226::-;31557:34;31553:1;31545:6;31541:14;31534:58;31626:9;31621:2;31613:6;31609:15;31602:34;31417:226;:::o;31649:366::-;31791:3;31812:67;31876:2;31871:3;31812:67;:::i;:::-;31805:74;;31888:93;31977:3;31888:93;:::i;:::-;32006:2;32001:3;31997:12;31990:19;;31649:366;;;:::o;32021:419::-;32187:4;32225:2;32214:9;32210:18;32202:26;;32274:9;32268:4;32264:20;32260:1;32249:9;32245:17;32238:47;32302:131;32428:4;32302:131;:::i;:::-;32294:139;;32021:419;;;:::o;32446:171::-;32586:23;32582:1;32574:6;32570:14;32563:47;32446:171;:::o;32623:366::-;32765:3;32786:67;32850:2;32845:3;32786:67;:::i;:::-;32779:74;;32862:93;32951:3;32862:93;:::i;:::-;32980:2;32975:3;32971:12;32964:19;;32623:366;;;:::o;32995:419::-;33161:4;33199:2;33188:9;33184:18;33176:26;;33248:9;33242:4;33238:20;33234:1;33223:9;33219:17;33212:47;33276:131;33402:4;33276:131;:::i;:::-;33268:139;;32995:419;;;:::o;33420:148::-;33522:11;33559:3;33544:18;;33420:148;;;;:::o;33574:141::-;33623:4;33646:3;33638:11;;33669:3;33666:1;33659:14;33703:4;33700:1;33690:18;33682:26;;33574:141;;;:::o;33745:845::-;33848:3;33885:5;33879:12;33914:36;33940:9;33914:36;:::i;:::-;33966:89;34048:6;34043:3;33966:89;:::i;:::-;33959:96;;34086:1;34075:9;34071:17;34102:1;34097:137;;;;34248:1;34243:341;;;;34064:520;;34097:137;34181:4;34177:9;34166;34162:25;34157:3;34150:38;34217:6;34212:3;34208:16;34201:23;;34097:137;;34243:341;34310:38;34342:5;34310:38;:::i;:::-;34370:1;34384:154;34398:6;34395:1;34392:13;34384:154;;;34472:7;34466:14;34462:1;34457:3;34453:11;34446:35;34522:1;34513:7;34509:15;34498:26;;34420:4;34417:1;34413:12;34408:17;;34384:154;;;34567:6;34562:3;34558:16;34551:23;;34250:334;;34064:520;;33852:738;;33745:845;;;;:::o;34596:377::-;34702:3;34730:39;34763:5;34730:39;:::i;:::-;34785:89;34867:6;34862:3;34785:89;:::i;:::-;34778:96;;34883:52;34928:6;34923:3;34916:4;34909:5;34905:16;34883:52;:::i;:::-;34960:6;34955:3;34951:16;34944:23;;34706:267;34596:377;;;;:::o;34979:429::-;35156:3;35178:92;35266:3;35257:6;35178:92;:::i;:::-;35171:99;;35287:95;35378:3;35369:6;35287:95;:::i;:::-;35280:102;;35399:3;35392:10;;34979:429;;;;;:::o;35414:182::-;35554:34;35550:1;35542:6;35538:14;35531:58;35414:182;:::o;35602:366::-;35744:3;35765:67;35829:2;35824:3;35765:67;:::i;:::-;35758:74;;35841:93;35930:3;35841:93;:::i;:::-;35959:2;35954:3;35950:12;35943:19;;35602:366;;;:::o;35974:419::-;36140:4;36178:2;36167:9;36163:18;36155:26;;36227:9;36221:4;36217:20;36213:1;36202:9;36198:17;36191:47;36255:131;36381:4;36255:131;:::i;:::-;36247:139;;35974:419;;;:::o;36399:225::-;36539:34;36535:1;36527:6;36523:14;36516:58;36608:8;36603:2;36595:6;36591:15;36584:33;36399:225;:::o;36630:366::-;36772:3;36793:67;36857:2;36852:3;36793:67;:::i;:::-;36786:74;;36869:93;36958:3;36869:93;:::i;:::-;36987:2;36982:3;36978:12;36971:19;;36630:366;;;:::o;37002:419::-;37168:4;37206:2;37195:9;37191:18;37183:26;;37255:9;37249:4;37245:20;37241:1;37230:9;37226:17;37219:47;37283:131;37409:4;37283:131;:::i;:::-;37275:139;;37002:419;;;:::o;37427:231::-;37567:34;37563:1;37555:6;37551:14;37544:58;37636:14;37631:2;37623:6;37619:15;37612:39;37427:231;:::o;37664:366::-;37806:3;37827:67;37891:2;37886:3;37827:67;:::i;:::-;37820:74;;37903:93;37992:3;37903:93;:::i;:::-;38021:2;38016:3;38012:12;38005:19;;37664:366;;;:::o;38036:419::-;38202:4;38240:2;38229:9;38225:18;38217:26;;38289:9;38283:4;38279:20;38275:1;38264:9;38260:17;38253:47;38317:131;38443:4;38317:131;:::i;:::-;38309:139;;38036:419;;;:::o;38461:228::-;38601:34;38597:1;38589:6;38585:14;38578:58;38670:11;38665:2;38657:6;38653:15;38646:36;38461:228;:::o;38695:366::-;38837:3;38858:67;38922:2;38917:3;38858:67;:::i;:::-;38851:74;;38934:93;39023:3;38934:93;:::i;:::-;39052:2;39047:3;39043:12;39036:19;;38695:366;;;:::o;39067:419::-;39233:4;39271:2;39260:9;39256:18;39248:26;;39320:9;39314:4;39310:20;39306:1;39295:9;39291:17;39284:47;39348:131;39474:4;39348:131;:::i;:::-;39340:139;;39067:419;;;:::o;39492:223::-;39632:34;39628:1;39620:6;39616:14;39609:58;39701:6;39696:2;39688:6;39684:15;39677:31;39492:223;:::o;39721:366::-;39863:3;39884:67;39948:2;39943:3;39884:67;:::i;:::-;39877:74;;39960:93;40049:3;39960:93;:::i;:::-;40078:2;40073:3;40069:12;40062:19;;39721:366;;;:::o;40093:419::-;40259:4;40297:2;40286:9;40282:18;40274:26;;40346:9;40340:4;40336:20;40332:1;40321:9;40317:17;40310:47;40374:131;40500:4;40374:131;:::i;:::-;40366:139;;40093:419;;;:::o;40518:175::-;40658:27;40654:1;40646:6;40642:14;40635:51;40518:175;:::o;40699:366::-;40841:3;40862:67;40926:2;40921:3;40862:67;:::i;:::-;40855:74;;40938:93;41027:3;40938:93;:::i;:::-;41056:2;41051:3;41047:12;41040:19;;40699:366;;;:::o;41071:419::-;41237:4;41275:2;41264:9;41260:18;41252:26;;41324:9;41318:4;41314:20;41310:1;41299:9;41295:17;41288:47;41352:131;41478:4;41352:131;:::i;:::-;41344:139;;41071:419;;;:::o;41496:237::-;41636:34;41632:1;41624:6;41620:14;41613:58;41705:20;41700:2;41692:6;41688:15;41681:45;41496:237;:::o;41739:366::-;41881:3;41902:67;41966:2;41961:3;41902:67;:::i;:::-;41895:74;;41978:93;42067:3;41978:93;:::i;:::-;42096:2;42091:3;42087:12;42080:19;;41739:366;;;:::o;42111:419::-;42277:4;42315:2;42304:9;42300:18;42292:26;;42364:9;42358:4;42354:20;42350:1;42339:9;42335:17;42328:47;42392:131;42518:4;42392:131;:::i;:::-;42384:139;;42111:419;;;:::o;42536:233::-;42575:3;42598:24;42616:5;42598:24;:::i;:::-;42589:33;;42644:66;42637:5;42634:77;42631:103;;;42714:18;;:::i;:::-;42631:103;42761:1;42754:5;42750:13;42743:20;;42536:233;;;:::o;42775:180::-;42823:77;42820:1;42813:88;42920:4;42917:1;42910:15;42944:4;42941:1;42934:15;42961:185;43001:1;43018:20;43036:1;43018:20;:::i;:::-;43013:25;;43052:20;43070:1;43052:20;:::i;:::-;43047:25;;43091:1;43081:35;;43096:18;;:::i;:::-;43081:35;43138:1;43135;43131:9;43126:14;;42961:185;;;;:::o;43152:176::-;43184:1;43201:20;43219:1;43201:20;:::i;:::-;43196:25;;43235:20;43253:1;43235:20;:::i;:::-;43230:25;;43274:1;43264:35;;43279:18;;:::i;:::-;43264:35;43320:1;43317;43313:9;43308:14;;43152:176;;;;:::o;43334:98::-;43385:6;43419:5;43413:12;43403:22;;43334:98;;;:::o;43438:168::-;43521:11;43555:6;43550:3;43543:19;43595:4;43590:3;43586:14;43571:29;;43438:168;;;;:::o;43612:360::-;43698:3;43726:38;43758:5;43726:38;:::i;:::-;43780:70;43843:6;43838:3;43780:70;:::i;:::-;43773:77;;43859:52;43904:6;43899:3;43892:4;43885:5;43881:16;43859:52;:::i;:::-;43936:29;43958:6;43936:29;:::i;:::-;43931:3;43927:39;43920:46;;43702:270;43612:360;;;;:::o;43978:640::-;44173:4;44211:3;44200:9;44196:19;44188:27;;44225:71;44293:1;44282:9;44278:17;44269:6;44225:71;:::i;:::-;44306:72;44374:2;44363:9;44359:18;44350:6;44306:72;:::i;:::-;44388;44456:2;44445:9;44441:18;44432:6;44388:72;:::i;:::-;44507:9;44501:4;44497:20;44492:2;44481:9;44477:18;44470:48;44535:76;44606:4;44597:6;44535:76;:::i;:::-;44527:84;;43978:640;;;;;;;:::o;44624:141::-;44680:5;44711:6;44705:13;44696:22;;44727:32;44753:5;44727:32;:::i;:::-;44624:141;;;;:::o;44771:349::-;44840:6;44889:2;44877:9;44868:7;44864:23;44860:32;44857:119;;;44895:79;;:::i;:::-;44857:119;45015:1;45040:63;45095:7;45086:6;45075:9;45071:22;45040:63;:::i;:::-;45030:73;;44986:127;44771:349;;;;:::o;45126:182::-;45266:34;45262:1;45254:6;45250:14;45243:58;45126:182;:::o;45314:366::-;45456:3;45477:67;45541:2;45536:3;45477:67;:::i;:::-;45470:74;;45553:93;45642:3;45553:93;:::i;:::-;45671:2;45666:3;45662:12;45655:19;;45314:366;;;:::o;45686:419::-;45852:4;45890:2;45879:9;45875:18;45867:26;;45939:9;45933:4;45929:20;45925:1;45914:9;45910:17;45903:47;45967:131;46093:4;45967:131;:::i;:::-;45959:139;;45686:419;;;:::o;46111:178::-;46251:30;46247:1;46239:6;46235:14;46228:54;46111:178;:::o;46295:366::-;46437:3;46458:67;46522:2;46517:3;46458:67;:::i;:::-;46451:74;;46534:93;46623:3;46534:93;:::i;:::-;46652:2;46647:3;46643:12;46636:19;;46295:366;;;:::o;46667:419::-;46833:4;46871:2;46860:9;46856:18;46848:26;;46920:9;46914:4;46910:20;46906:1;46895:9;46891:17;46884:47;46948:131;47074:4;46948:131;:::i;:::-;46940:139;;46667:419;;;:::o;47092:180::-;47140:77;47137:1;47130:88;47237:4;47234:1;47227:15;47261:4;47258:1;47251:15

Swarm Source

ipfs://768bb987a653911512c7f1a842d6828f23825c36bec3954a530441b47e744afb
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.