ETH Price: $3,461.09 (-0.22%)
Gas: 10 Gwei

Token

Atheneum (ATH)
 

Overview

Max Total Supply

5,000 ATH

Holders

150

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 ATH
0x3e9ed9dd46c5c5767f81d2d70dfacde8e0569d69
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:
Atheneum

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-08
*/

/*  ___  ________  _________   __________  ____  ___
   /   |/_  __/ / / / ____/ | / / ____/ / / /  |/  /
  / /| | / / / /_/ / __/ /  |/ / __/ / / / / /|_/ / 
 / ___ |/ / / __  / /___/ /|  / /___/ /_/ / /  / /  
/_/  |_/_/ /_/ /_/_____/_/ |_/_____/\____/_/  /_/   
                                                    
https://theatheneum.net
*/
/**
 *Submitted for verification at Etherscan.io on 2021-10-11
 * SPDX-License-Identifier: UNLICENSED
*/

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);
}


pragma solidity ^0.8.0;


/**
 * @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 Emitted when `owner` pays to purchase a specific image id.
     */
    event Purchase(address indexed owner, string imageId, string name);

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

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);
}

pragma solidity ^0.8.0;


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

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);
            }
        }
    }
}


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;
    }
}

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);
    }
}

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

contract Ownable {
    address _owner;

    constructor() {
        _owner = msg.sender;
    }

    modifier onlyOwner() {
        require(
            msg.sender == _owner,
            "Only the contract owner may call this function"
        );
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0));
        _owner = newOwner;
    }

    function withdrawBalance() external onlyOwner {
        payable(_owner).transfer(address(this).balance);
    }

    function withdrawAmountTo(address _recipient, uint256 _amount)
        external
        onlyOwner
    {
        require(address(this).balance >= _amount);
        payable(_recipient).transfer(_amount);
    }
}

pragma solidity ^0.8.0;


contract Atheneum is Context, ERC165, IERC721, IERC721Metadata, Ownable {
    /**
     * @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}.
     */

    using Address for address;
    using Strings for uint256;

    // Max total supply
    uint256 public maxSupply = 5000;
    // Max poem topic length
    uint256 private _maxInputLength = 20;
    // purchase price
    uint256 private _purchasePrice = 80000000000000000 wei;

    uint256 private _maxMintsPerTx = 10;

    // baseURI for Metadata
    string private _metadataURI = "https://theatheneum.s3.us-east-2.amazonaws.com/";

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Token supply
    uint256 private _tokenSupply = 0;

    // 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;

    // Token Id to image name
    mapping(uint256 => string) private _tokenIdToName;

    // Token Id to poem
    mapping(uint256 => string) private _tokenIdToSvgHash;



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

    function setBaseURI(string memory newURI) external onlyOwner {
        _metadataURI = newURI;
    }

    function setMaxMintsPerTx(uint256 newMax) external onlyOwner {
        _maxMintsPerTx = newMax;
    }

    function setMaxInputLength(uint256 newMax) external onlyOwner {
        _maxInputLength = newMax;
    }

    function setPurchasePrice(uint256 newPrice) external onlyOwner {
        _purchasePrice = newPrice;
    }

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

    function tokenSupply() external view returns (uint256) {
        return _tokenSupply;
    }

    function purchasePrice() external view returns (uint256) {
        return _purchasePrice;
    }

    function _getPurchasePrice() public view returns(uint256) {
        if (_tokenSupply < 250) {
            return 0;
        } else if(_tokenSupply < 500) {
            return 10000000000000000 wei;
        } else if(_tokenSupply < 750) {
            return 20000000000000000 wei;
        } else if(_tokenSupply < 1000) {
            return 30000000000000000 wei;
        } else {
            return 40000000000000000 wei;
        }
    }

    function _mint(
        address _owner,
        string memory _topic,
        string memory _svgHash
    ) private returns (uint256) {
        uint256 _newTokenId = _tokenSupply + 1;

        _safeMint(_owner, _newTokenId);
        _tokenIdToName[_newTokenId] = _topic;
        _tokenIdToSvgHash[_newTokenId] = _svgHash;

        return _newTokenId;
    }

    function mint(
        string[] memory _topics,
        string[] memory _svgHashes
    ) external payable returns (uint256) {
        require(_tokenSupply+_topics.length < maxSupply, "Maximum supply has been reached");

        require(_topics.length < _maxMintsPerTx, "Attempting to mint too many tokens.");

        // require(
        //     bytes(_topic).length <= _maxInputLength,
        //     "Name of the image is too long"
        // );

        require(_topics.length == _svgHashes.length, "Bad input parameters");

        require(msg.value >= _getPurchasePrice()*_topics.length, "Insufficient message value");

        // require(
        //     !_namePurchases[_topic],
        //     "That named piece has already been purchased"
        // );
        uint256 _newTokenId = 0;

        for(uint i = 0; i < _topics.length; i++) {
            _newTokenId = _mint(
            msg.sender,
            _topics[i],
            _svgHashes[i]);   
        }

        return _newTokenId;
    }

    function ownerMint(
        // address _owner,
        string[] memory _topics,
        string[] memory _svgHashes
    ) external onlyOwner returns (uint256) {
        require(_tokenSupply + _topics.length < maxSupply, "Maximum supply has been reached");
        // require(
        //     bytes(_topic).length <= _maxInputLength,
        //     "Name of the image is too long"
        // );
        // require(
        //     !_namePurchases[_topic],
        //     "That named piece has already been purchased"
        // );
        uint256 _newTokenId = 0;

        for(uint i = 0; i < _topics.length; i++) {
            _newTokenId = _mint(
            msg.sender,
            _topics[i],
            _svgHashes[i]);   
        }

        return _newTokenId;
    }

    function tokenInfo(uint256 _tokenId)
        external
        view
        returns (
            string memory _imageName,
            string memory _imageId
        )
    {
        return (
            _tokenIdToName[_tokenId],
            _tokenIdToSvgHash[_tokenId]
        );
    }

    /**
     * @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 topic = _tokenIdToName[tokenId];
        string memory svgHash = _tokenIdToSvgHash[tokenId];

        // string memory output = string(abi.encodePacked(poem));
        string memory packed = string(abi.encodePacked('{"name": "', topic , '", "description": "A torn page, stolen from a book within the Atheneum. https://theatheneum.net", "image": "', _metadataURI, svgHash, '.svg"}'));
        string memory json = Base64.encode(bytes(packed));
        string memory output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = Atheneum.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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 = Atheneum.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;
        _tokenSupply += 1;

        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 = Atheneum.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(
            Atheneum.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(Atheneum.ownerOf(tokenId), to, tokenId);
    }

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


/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","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":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"imageId","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_getPurchasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","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":[{"internalType":"string[]","name":"_topics","type":"string[]"},{"internalType":"string[]","name":"_svgHashes","type":"string[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string[]","name":"_topics","type":"string[]"},{"internalType":"string[]","name":"_svgHashes","type":"string[]"}],"name":"ownerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchasePrice","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxInputLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxMintsPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPurchasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageId","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply","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":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAmountTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611388600155601460025567011c37937e080000600355600a6004556040518060600160405280602f8152602001620042a4602f9139600590805190602001906200005192919062000104565b5060006008553480156200006457600080fd5b50604051620042d3380380620042d383398181016040528101906200008a919062000226565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160069080519060200190620000e292919062000104565b508060079080519060200190620000fb92919062000104565b505050620003ca565b828054620001129062000336565b90600052602060002090601f01602090048101928262000136576000855562000182565b82601f106200015157805160ff191683800117855562000182565b8280016001018555821562000182579182015b828111156200018157825182559160200191906001019062000164565b5b50905062000191919062000195565b5090565b5b80821115620001b057600081600090555060010162000196565b5090565b6000620001cb620001c584620002cd565b62000299565b905082815260208101848484011115620001e457600080fd5b620001f184828562000300565b509392505050565b600082601f8301126200020b57600080fd5b81516200021d848260208601620001b4565b91505092915050565b600080604083850312156200023a57600080fd5b600083015167ffffffffffffffff8111156200025557600080fd5b6200026385828601620001f9565b925050602083015167ffffffffffffffff8111156200028157600080fd5b6200028f85828601620001f9565b9150509250929050565b6000604051905081810181811067ffffffffffffffff82111715620002c357620002c26200039b565b5b8060405250919050565b600067ffffffffffffffff821115620002eb57620002ea6200039b565b5b601f19601f8301169050602081019050919050565b60005b838110156200032057808201518184015260208101905062000303565b8381111562000330576000848401525b50505050565b600060028204905060018216806200034f57607f821691505b602082108114156200036657620003656200036c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613eca80620003da6000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063c87b56dd11610095578063defd6c5f11610064578063defd6c5f14610658578063e465f1f514610683578063e985e9c5146106ac578063f2fde38b146106e9576101c2565b8063c87b56dd14610589578063cc33c875146105c6578063d5abeb0114610604578063d72966621461062f576101c2565b806395d89b41116100d157806395d89b41146104e1578063a22cb4651461050c578063b88d4fde14610535578063c52f69311461055e576101c2565b806370a082311461044e5780637824407f1461048b5780638da5cb5b146104b6576101c2565b80633ba3518a1161016457806354ab36f91161013e57806354ab36f91461039457806355f804b3146103d15780635fd8c710146103fa5780636352211e14610411576101c2565b80633ba3518a1461031257806342842e0e146103425780634f1235dd1461036b576101c2565b8063095ea7b3116101a0578063095ea7b31461026c578063174da4a21461029557806318160ddd146102be57806323b872dd146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612bdb565b610712565b6040516101fb91906136e1565b60405180910390f35b34801561021057600080fd5b506102196107f4565b60405161022691906136fc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612c6e565b610886565b604051610263919061367a565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b33565b61090b565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612c6e565b610a23565b005b3480156102ca57600080fd5b506102d3610abb565b6040516102e091906139b5565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612a2d565b610ac5565b005b61032c60048036038101906103279190612b6f565b610b25565b60405161033991906139b5565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190612a2d565b610d10565b005b34801561037757600080fd5b50610392600480360381019061038d9190612c6e565b610d30565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612b6f565b610dc8565b6040516103c891906139b5565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612c2d565b610f63565b005b34801561040657600080fd5b5061040f61100b565b005b34801561041d57600080fd5b5061043860048036038101906104339190612c6e565b611102565b604051610445919061367a565b60405180910390f35b34801561045a57600080fd5b50610475600480360381019061047091906129c8565b6111b4565b60405161048291906139b5565b60405180910390f35b34801561049757600080fd5b506104a061126c565b6040516104ad91906139b5565b60405180910390f35b3480156104c257600080fd5b506104cb611276565b6040516104d8919061367a565b60405180910390f35b3480156104ed57600080fd5b506104f661129f565b60405161050391906136fc565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612af7565b611331565b005b34801561054157600080fd5b5061055c60048036038101906105579190612a7c565b6114b2565b005b34801561056a57600080fd5b50610573611514565b60405161058091906139b5565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab9190612c6e565b611589565b6040516105bd91906136fc565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612c6e565b61177a565b6040516105fb92919061371e565b60405180910390f35b34801561061057600080fd5b506106196118c4565b60405161062691906139b5565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612c6e565b6118ca565b005b34801561066457600080fd5b5061066d611962565b60405161067a91906139b5565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190612b33565b61196c565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906129f1565b611a52565b6040516106e091906136e1565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b91906129c8565b611ae6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107dd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ed57506107ec82611bf1565b5b9050919050565b60606006805461080390613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461082f90613cb0565b801561087c5780601f106108515761010080835404028352916020019161087c565b820191906000526020600020905b81548152906001019060200180831161085f57829003601f168201915b5050505050905090565b600061089182611c5b565b6108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c7906138d5565b60405180910390fd5b600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091682611102565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e90613955565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a6611cc7565b73ffffffffffffffffffffffffffffffffffffffff1614806109d557506109d4816109cf611cc7565b611a52565b5b610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b90613835565b60405180910390fd5b610a1e8383611ccf565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa890613895565b60405180910390fd5b8060048190555050565b6000600154905090565b610ad6610ad0611cc7565b82611d88565b610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613975565b60405180910390fd5b610b20838383611e66565b505050565b60006001548351600854610b399190613ae5565b10610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613935565b60405180910390fd5b600454835110610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590613795565b60405180910390fd5b8151835114610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990613995565b60405180910390fd5b8251610c0c611514565b610c169190613b6c565b341015610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f906137b5565b60405180910390fd5b6000805b8451811015610d0557610cf033868381518110610ca2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151868481518110610ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516120c2565b91508080610cfd90613ce2565b915050610c5c565b508091505092915050565b610d2b838383604051806020016040528060008152506114b2565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613895565b60405180910390fd5b8060028190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613895565b60405180910390fd5b6001548351600854610e6b9190613ae5565b10610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290613935565b60405180910390fd5b6000805b8451811015610f5857610f4333868381518110610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151868481518110610f36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516120c2565b91508080610f5090613ce2565b915050610eaf565b508091505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890613895565b60405180910390fd5b8060059080519060200190611007929190612765565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090613895565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110ff573d6000803e3d6000fd5b50565b6000806009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290613875565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c90613855565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600854905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546112ae90613cb0565b80601f01602080910402602001604051908101604052809291908181526020018280546112da90613cb0565b80156113275780601f106112fc57610100808354040283529160200191611327565b820191906000526020600020905b81548152906001019060200180831161130a57829003601f168201915b5050505050905090565b611339611cc7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906137f5565b60405180910390fd5b80600c60006113b4611cc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611461611cc7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a691906136e1565b60405180910390a35050565b6114c36114bd611cc7565b83611d88565b611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f990613975565b60405180910390fd5b61150e8484848461213b565b50505050565b600060fa600854101561152a5760009050611586565b6101f4600854101561154557662386f26fc100009050611586565b6102ee60085410156115605766470de4df8200009050611586565b6103e8600854101561157b57666a94d74f4300009050611586565b668e1bc9bf04000090505b90565b606061159482611c5b565b6115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90613915565b60405180910390fd5b6000600d600084815260200190815260200160002080546115f390613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461161f90613cb0565b801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b505050505090506000600e6000858152602001908152602001600020805461169390613cb0565b80601f01602080910402602001604051908101604052809291908181526020018280546116bf90613cb0565b801561170c5780601f106116e15761010080835404028352916020019161170c565b820191906000526020600020905b8154815290600101906020018083116116ef57829003601f168201915b5050505050905060008260058360405160200161172b93929190613606565b6040516020818303038152906040529050600061174782612197565b905060008160405160200161175c9190613658565b60405160208183030381529060405290508095505050505050919050565b606080600d6000848152602001908152602001600020600e60008581526020019081526020016000208180546117af90613cb0565b80601f01602080910402602001604051908101604052809291908181526020018280546117db90613cb0565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050915080805461183b90613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461186790613cb0565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b5050505050905091509150915091565b60015481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613895565b60405180910390fd5b8060038190555050565b6000600354905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190613895565b60405180910390fd5b80471015611a0757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611a4d573d6000803e3d6000fd5b505050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90613895565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bae57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b81600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4283611102565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d9382611c5b565b611dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc990613815565b60405180910390fd5b6000611ddd83611102565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e4c57508373ffffffffffffffffffffffffffffffffffffffff16611e3484610886565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e5d5750611e5c8185611a52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8682611102565b73ffffffffffffffffffffffffffffffffffffffff1614611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed3906138f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f43906137d5565b60405180910390fd5b611f57838383612355565b611f62600082611ccf565b6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fb29190613bc6565b925050819055506001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120099190613ae5565b92505081905550816009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060016008546120d49190613ae5565b90506120e0858261235a565b83600d60008381526020019081526020016000209080519060200190612107929190612765565b5082600e6000838152602001908152602001600020908051906020019061212f929190612765565b50809150509392505050565b612146848484611e66565b61215284848484612378565b612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890613755565b60405180910390fd5b50505050565b606060008251905060008114156121c05760405180602001604052806000815250915050612350565b600060036002836121d19190613ae5565b6121db9190613b3b565b60046121e79190613b6c565b905060006020826121f89190613ae5565b67ffffffffffffffff811115612237577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122695781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001613e55604091399050600181016020830160005b8681101561230d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612294565b506003860660018114612327576002811461233757612342565b613d3d60f01b6002830352612342565b603d60f81b60018303525b508484525050819450505050505b919050565b505050565b61237482826040518060200160405280600081525061250f565b5050565b60006123998473ffffffffffffffffffffffffffffffffffffffff1661256a565b15612502578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123c2611cc7565b8786866040518563ffffffff1660e01b81526004016123e49493929190613695565b602060405180830381600087803b1580156123fe57600080fd5b505af192505050801561242f57506040513d601f19601f8201168201806040525081019061242c9190612c04565b60015b6124b2573d806000811461245f576040519150601f19603f3d011682016040523d82523d6000602084013e612464565b606091505b506000815114156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190613755565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612507565b600190505b949350505050565b612519838361257d565b6125266000848484612378565b612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c90613755565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e4906138b5565b60405180910390fd5b6125f681611c5b565b15612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90613775565b60405180910390fd5b61264260008383612355565b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126929190613ae5565b92505081905550816009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860008282546126fe9190613ae5565b92505081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461277190613cb0565b90600052602060002090601f01602090048101928261279357600085556127da565b82601f106127ac57805160ff19168380011785556127da565b828001600101855582156127da579182015b828111156127d95782518255916020019190600101906127be565b5b5090506127e791906127eb565b5090565b5b808211156128045760008160009055506001016127ec565b5090565b600061281b61281684613a01565b6139d0565b9050808382526020820190508260005b8581101561285b57813585016128418882612989565b84526020840193506020830192505060018101905061282b565b5050509392505050565b600061287861287384613a2d565b6139d0565b90508281526020810184848401111561289057600080fd5b61289b848285613c6e565b509392505050565b60006128b66128b184613a5d565b6139d0565b9050828152602081018484840111156128ce57600080fd5b6128d9848285613c6e565b509392505050565b6000813590506128f081613df8565b92915050565b600082601f83011261290757600080fd5b8135612917848260208601612808565b91505092915050565b60008135905061292f81613e0f565b92915050565b60008135905061294481613e26565b92915050565b60008151905061295981613e26565b92915050565b600082601f83011261297057600080fd5b8135612980848260208601612865565b91505092915050565b600082601f83011261299a57600080fd5b81356129aa8482602086016128a3565b91505092915050565b6000813590506129c281613e3d565b92915050565b6000602082840312156129da57600080fd5b60006129e8848285016128e1565b91505092915050565b60008060408385031215612a0457600080fd5b6000612a12858286016128e1565b9250506020612a23858286016128e1565b9150509250929050565b600080600060608486031215612a4257600080fd5b6000612a50868287016128e1565b9350506020612a61868287016128e1565b9250506040612a72868287016129b3565b9150509250925092565b60008060008060808587031215612a9257600080fd5b6000612aa0878288016128e1565b9450506020612ab1878288016128e1565b9350506040612ac2878288016129b3565b925050606085013567ffffffffffffffff811115612adf57600080fd5b612aeb8782880161295f565b91505092959194509250565b60008060408385031215612b0a57600080fd5b6000612b18858286016128e1565b9250506020612b2985828601612920565b9150509250929050565b60008060408385031215612b4657600080fd5b6000612b54858286016128e1565b9250506020612b65858286016129b3565b9150509250929050565b60008060408385031215612b8257600080fd5b600083013567ffffffffffffffff811115612b9c57600080fd5b612ba8858286016128f6565b925050602083013567ffffffffffffffff811115612bc557600080fd5b612bd1858286016128f6565b9150509250929050565b600060208284031215612bed57600080fd5b6000612bfb84828501612935565b91505092915050565b600060208284031215612c1657600080fd5b6000612c248482850161294a565b91505092915050565b600060208284031215612c3f57600080fd5b600082013567ffffffffffffffff811115612c5957600080fd5b612c6584828501612989565b91505092915050565b600060208284031215612c8057600080fd5b6000612c8e848285016129b3565b91505092915050565b612ca081613bfa565b82525050565b612caf81613c0c565b82525050565b6000612cc082613aa2565b612cca8185613ab8565b9350612cda818560208601613c7d565b612ce381613de7565b840191505092915050565b6000612cf982613aad565b612d038185613ac9565b9350612d13818560208601613c7d565b612d1c81613de7565b840191505092915050565b6000612d3282613aad565b612d3c8185613ada565b9350612d4c818560208601613c7d565b80840191505092915050565b60008154612d6581613cb0565b612d6f8186613ada565b94506001821660008114612d8a5760018114612d9b57612dce565b60ff19831686528186019350612dce565b612da485613a8d565b60005b83811015612dc657815481890152600182019150602081019050612da7565b838801955050505b50505092915050565b6000612de4603283613ac9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612e4a601c83613ac9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612e8a602383613ac9565b91507f417474656d7074696e6720746f206d696e7420746f6f206d616e7920746f6b6560008301527f6e732e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ef0601a83613ac9565b91507f496e73756666696369656e74206d6573736167652076616c75650000000000006000830152602082019050919050565b6000612f30602483613ac9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f96601983613ac9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612fd6602c83613ac9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061303c603883613ac9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006130a2602a83613ac9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613108602983613ac9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061316e602e83613ac9565b91507f4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6c60008301527f20746869732066756e6374696f6e0000000000000000000000000000000000006020830152604082019050919050565b60006131d4602083613ac9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613214602c83613ac9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061327a602983613ac9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132e0602f83613ac9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613346600a83613ada565b91507f7b226e616d65223a2022000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613386600683613ada565b91507f2e737667227d00000000000000000000000000000000000000000000000000006000830152600682019050919050565b60006133c6601f83613ac9565b91507f4d6178696d756d20737570706c7920686173206265656e2072656163686564006000830152602082019050919050565b6000613406602183613ac9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061346c601d83613ada565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b60006134ac603183613ac9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613512606c83613ada565b91507f222c20226465736372697074696f6e223a20224120746f726e20706167652c2060008301527f73746f6c656e2066726f6d206120626f6f6b2077697468696e2074686520417460208301527f68656e65756d2e2068747470733a2f2f746865617468656e65756d2e6e65742260408301527f2c2022696d616765223a202200000000000000000000000000000000000000006060830152606c82019050919050565b60006135c4601483613ac9565b91507f42616420696e70757420706172616d65746572730000000000000000000000006000830152602082019050919050565b61360081613c64565b82525050565b600061361182613339565b915061361d8286612d27565b915061362882613505565b91506136348285612d58565b91506136408284612d27565b915061364b82613379565b9150819050949350505050565b60006136638261345f565b915061366f8284612d27565b915081905092915050565b600060208201905061368f6000830184612c97565b92915050565b60006080820190506136aa6000830187612c97565b6136b76020830186612c97565b6136c460408301856135f7565b81810360608301526136d68184612cb5565b905095945050505050565b60006020820190506136f66000830184612ca6565b92915050565b600060208201905081810360008301526137168184612cee565b905092915050565b600060408201905081810360008301526137388185612cee565b9050818103602083015261374c8184612cee565b90509392505050565b6000602082019050818103600083015261376e81612dd7565b9050919050565b6000602082019050818103600083015261378e81612e3d565b9050919050565b600060208201905081810360008301526137ae81612e7d565b9050919050565b600060208201905081810360008301526137ce81612ee3565b9050919050565b600060208201905081810360008301526137ee81612f23565b9050919050565b6000602082019050818103600083015261380e81612f89565b9050919050565b6000602082019050818103600083015261382e81612fc9565b9050919050565b6000602082019050818103600083015261384e8161302f565b9050919050565b6000602082019050818103600083015261386e81613095565b9050919050565b6000602082019050818103600083015261388e816130fb565b9050919050565b600060208201905081810360008301526138ae81613161565b9050919050565b600060208201905081810360008301526138ce816131c7565b9050919050565b600060208201905081810360008301526138ee81613207565b9050919050565b6000602082019050818103600083015261390e8161326d565b9050919050565b6000602082019050818103600083015261392e816132d3565b9050919050565b6000602082019050818103600083015261394e816133b9565b9050919050565b6000602082019050818103600083015261396e816133f9565b9050919050565b6000602082019050818103600083015261398e8161349f565b9050919050565b600060208201905081810360008301526139ae816135b7565b9050919050565b60006020820190506139ca60008301846135f7565b92915050565b6000604051905081810181811067ffffffffffffffff821117156139f7576139f6613db8565b5b8060405250919050565b600067ffffffffffffffff821115613a1c57613a1b613db8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a4857613a47613db8565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613a7857613a77613db8565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613af082613c64565b9150613afb83613c64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b3057613b2f613d2b565b5b828201905092915050565b6000613b4682613c64565b9150613b5183613c64565b925082613b6157613b60613d5a565b5b828204905092915050565b6000613b7782613c64565b9150613b8283613c64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bbb57613bba613d2b565b5b828202905092915050565b6000613bd182613c64565b9150613bdc83613c64565b925082821015613bef57613bee613d2b565b5b828203905092915050565b6000613c0582613c44565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c9b578082015181840152602081019050613c80565b83811115613caa576000848401525b50505050565b60006002820490506001821680613cc857607f821691505b60208210811415613cdc57613cdb613d89565b5b50919050565b6000613ced82613c64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d2057613d1f613d2b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613e0181613bfa565b8114613e0c57600080fd5b50565b613e1881613c0c565b8114613e2357600080fd5b50565b613e2f81613c18565b8114613e3a57600080fd5b50565b613e4681613c64565b8114613e5157600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220dc755a1010c098f29f30169a7f5b916eac5c66f5e5855f21d730b73f99df235764736f6c6343000800003368747470733a2f2f746865617468656e65756d2e73332e75732d656173742d322e616d617a6f6e6177732e636f6d2f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008417468656e65756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034154480000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806370a08231116100f7578063c87b56dd11610095578063defd6c5f11610064578063defd6c5f14610658578063e465f1f514610683578063e985e9c5146106ac578063f2fde38b146106e9576101c2565b8063c87b56dd14610589578063cc33c875146105c6578063d5abeb0114610604578063d72966621461062f576101c2565b806395d89b41116100d157806395d89b41146104e1578063a22cb4651461050c578063b88d4fde14610535578063c52f69311461055e576101c2565b806370a082311461044e5780637824407f1461048b5780638da5cb5b146104b6576101c2565b80633ba3518a1161016457806354ab36f91161013e57806354ab36f91461039457806355f804b3146103d15780635fd8c710146103fa5780636352211e14610411576101c2565b80633ba3518a1461031257806342842e0e146103425780634f1235dd1461036b576101c2565b8063095ea7b3116101a0578063095ea7b31461026c578063174da4a21461029557806318160ddd146102be57806323b872dd146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612bdb565b610712565b6040516101fb91906136e1565b60405180910390f35b34801561021057600080fd5b506102196107f4565b60405161022691906136fc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612c6e565b610886565b604051610263919061367a565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b33565b61090b565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612c6e565b610a23565b005b3480156102ca57600080fd5b506102d3610abb565b6040516102e091906139b5565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612a2d565b610ac5565b005b61032c60048036038101906103279190612b6f565b610b25565b60405161033991906139b5565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190612a2d565b610d10565b005b34801561037757600080fd5b50610392600480360381019061038d9190612c6e565b610d30565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612b6f565b610dc8565b6040516103c891906139b5565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612c2d565b610f63565b005b34801561040657600080fd5b5061040f61100b565b005b34801561041d57600080fd5b5061043860048036038101906104339190612c6e565b611102565b604051610445919061367a565b60405180910390f35b34801561045a57600080fd5b50610475600480360381019061047091906129c8565b6111b4565b60405161048291906139b5565b60405180910390f35b34801561049757600080fd5b506104a061126c565b6040516104ad91906139b5565b60405180910390f35b3480156104c257600080fd5b506104cb611276565b6040516104d8919061367a565b60405180910390f35b3480156104ed57600080fd5b506104f661129f565b60405161050391906136fc565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612af7565b611331565b005b34801561054157600080fd5b5061055c60048036038101906105579190612a7c565b6114b2565b005b34801561056a57600080fd5b50610573611514565b60405161058091906139b5565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab9190612c6e565b611589565b6040516105bd91906136fc565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190612c6e565b61177a565b6040516105fb92919061371e565b60405180910390f35b34801561061057600080fd5b506106196118c4565b60405161062691906139b5565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190612c6e565b6118ca565b005b34801561066457600080fd5b5061066d611962565b60405161067a91906139b5565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190612b33565b61196c565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906129f1565b611a52565b6040516106e091906136e1565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b91906129c8565b611ae6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107dd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ed57506107ec82611bf1565b5b9050919050565b60606006805461080390613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461082f90613cb0565b801561087c5780601f106108515761010080835404028352916020019161087c565b820191906000526020600020905b81548152906001019060200180831161085f57829003601f168201915b5050505050905090565b600061089182611c5b565b6108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c7906138d5565b60405180910390fd5b600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091682611102565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e90613955565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a6611cc7565b73ffffffffffffffffffffffffffffffffffffffff1614806109d557506109d4816109cf611cc7565b611a52565b5b610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b90613835565b60405180910390fd5b610a1e8383611ccf565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa890613895565b60405180910390fd5b8060048190555050565b6000600154905090565b610ad6610ad0611cc7565b82611d88565b610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613975565b60405180910390fd5b610b20838383611e66565b505050565b60006001548351600854610b399190613ae5565b10610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613935565b60405180910390fd5b600454835110610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590613795565b60405180910390fd5b8151835114610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990613995565b60405180910390fd5b8251610c0c611514565b610c169190613b6c565b341015610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f906137b5565b60405180910390fd5b6000805b8451811015610d0557610cf033868381518110610ca2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151868481518110610ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516120c2565b91508080610cfd90613ce2565b915050610c5c565b508091505092915050565b610d2b838383604051806020016040528060008152506114b2565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613895565b60405180910390fd5b8060028190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613895565b60405180910390fd5b6001548351600854610e6b9190613ae5565b10610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290613935565b60405180910390fd5b6000805b8451811015610f5857610f4333868381518110610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151868481518110610f36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516120c2565b91508080610f5090613ce2565b915050610eaf565b508091505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890613895565b60405180910390fd5b8060059080519060200190611007929190612765565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090613895565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110ff573d6000803e3d6000fd5b50565b6000806009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290613875565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c90613855565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600854905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546112ae90613cb0565b80601f01602080910402602001604051908101604052809291908181526020018280546112da90613cb0565b80156113275780601f106112fc57610100808354040283529160200191611327565b820191906000526020600020905b81548152906001019060200180831161130a57829003601f168201915b5050505050905090565b611339611cc7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906137f5565b60405180910390fd5b80600c60006113b4611cc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611461611cc7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a691906136e1565b60405180910390a35050565b6114c36114bd611cc7565b83611d88565b611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f990613975565b60405180910390fd5b61150e8484848461213b565b50505050565b600060fa600854101561152a5760009050611586565b6101f4600854101561154557662386f26fc100009050611586565b6102ee60085410156115605766470de4df8200009050611586565b6103e8600854101561157b57666a94d74f4300009050611586565b668e1bc9bf04000090505b90565b606061159482611c5b565b6115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90613915565b60405180910390fd5b6000600d600084815260200190815260200160002080546115f390613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461161f90613cb0565b801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b505050505090506000600e6000858152602001908152602001600020805461169390613cb0565b80601f01602080910402602001604051908101604052809291908181526020018280546116bf90613cb0565b801561170c5780601f106116e15761010080835404028352916020019161170c565b820191906000526020600020905b8154815290600101906020018083116116ef57829003601f168201915b5050505050905060008260058360405160200161172b93929190613606565b6040516020818303038152906040529050600061174782612197565b905060008160405160200161175c9190613658565b60405160208183030381529060405290508095505050505050919050565b606080600d6000848152602001908152602001600020600e60008581526020019081526020016000208180546117af90613cb0565b80601f01602080910402602001604051908101604052809291908181526020018280546117db90613cb0565b80156118285780601f106117fd57610100808354040283529160200191611828565b820191906000526020600020905b81548152906001019060200180831161180b57829003601f168201915b5050505050915080805461183b90613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461186790613cb0565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b5050505050905091509150915091565b60015481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613895565b60405180910390fd5b8060038190555050565b6000600354905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190613895565b60405180910390fd5b80471015611a0757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611a4d573d6000803e3d6000fd5b505050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90613895565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bae57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b81600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4283611102565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d9382611c5b565b611dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc990613815565b60405180910390fd5b6000611ddd83611102565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e4c57508373ffffffffffffffffffffffffffffffffffffffff16611e3484610886565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e5d5750611e5c8185611a52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8682611102565b73ffffffffffffffffffffffffffffffffffffffff1614611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed3906138f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f43906137d5565b60405180910390fd5b611f57838383612355565b611f62600082611ccf565b6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fb29190613bc6565b925050819055506001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120099190613ae5565b92505081905550816009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060016008546120d49190613ae5565b90506120e0858261235a565b83600d60008381526020019081526020016000209080519060200190612107929190612765565b5082600e6000838152602001908152602001600020908051906020019061212f929190612765565b50809150509392505050565b612146848484611e66565b61215284848484612378565b612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890613755565b60405180910390fd5b50505050565b606060008251905060008114156121c05760405180602001604052806000815250915050612350565b600060036002836121d19190613ae5565b6121db9190613b3b565b60046121e79190613b6c565b905060006020826121f89190613ae5565b67ffffffffffffffff811115612237577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122695781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001613e55604091399050600181016020830160005b8681101561230d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612294565b506003860660018114612327576002811461233757612342565b613d3d60f01b6002830352612342565b603d60f81b60018303525b508484525050819450505050505b919050565b505050565b61237482826040518060200160405280600081525061250f565b5050565b60006123998473ffffffffffffffffffffffffffffffffffffffff1661256a565b15612502578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123c2611cc7565b8786866040518563ffffffff1660e01b81526004016123e49493929190613695565b602060405180830381600087803b1580156123fe57600080fd5b505af192505050801561242f57506040513d601f19601f8201168201806040525081019061242c9190612c04565b60015b6124b2573d806000811461245f576040519150601f19603f3d011682016040523d82523d6000602084013e612464565b606091505b506000815114156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190613755565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612507565b600190505b949350505050565b612519838361257d565b6125266000848484612378565b612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c90613755565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e4906138b5565b60405180910390fd5b6125f681611c5b565b15612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90613775565b60405180910390fd5b61264260008383612355565b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126929190613ae5565b92505081905550816009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860008282546126fe9190613ae5565b92505081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461277190613cb0565b90600052602060002090601f01602090048101928261279357600085556127da565b82601f106127ac57805160ff19168380011785556127da565b828001600101855582156127da579182015b828111156127d95782518255916020019190600101906127be565b5b5090506127e791906127eb565b5090565b5b808211156128045760008160009055506001016127ec565b5090565b600061281b61281684613a01565b6139d0565b9050808382526020820190508260005b8581101561285b57813585016128418882612989565b84526020840193506020830192505060018101905061282b565b5050509392505050565b600061287861287384613a2d565b6139d0565b90508281526020810184848401111561289057600080fd5b61289b848285613c6e565b509392505050565b60006128b66128b184613a5d565b6139d0565b9050828152602081018484840111156128ce57600080fd5b6128d9848285613c6e565b509392505050565b6000813590506128f081613df8565b92915050565b600082601f83011261290757600080fd5b8135612917848260208601612808565b91505092915050565b60008135905061292f81613e0f565b92915050565b60008135905061294481613e26565b92915050565b60008151905061295981613e26565b92915050565b600082601f83011261297057600080fd5b8135612980848260208601612865565b91505092915050565b600082601f83011261299a57600080fd5b81356129aa8482602086016128a3565b91505092915050565b6000813590506129c281613e3d565b92915050565b6000602082840312156129da57600080fd5b60006129e8848285016128e1565b91505092915050565b60008060408385031215612a0457600080fd5b6000612a12858286016128e1565b9250506020612a23858286016128e1565b9150509250929050565b600080600060608486031215612a4257600080fd5b6000612a50868287016128e1565b9350506020612a61868287016128e1565b9250506040612a72868287016129b3565b9150509250925092565b60008060008060808587031215612a9257600080fd5b6000612aa0878288016128e1565b9450506020612ab1878288016128e1565b9350506040612ac2878288016129b3565b925050606085013567ffffffffffffffff811115612adf57600080fd5b612aeb8782880161295f565b91505092959194509250565b60008060408385031215612b0a57600080fd5b6000612b18858286016128e1565b9250506020612b2985828601612920565b9150509250929050565b60008060408385031215612b4657600080fd5b6000612b54858286016128e1565b9250506020612b65858286016129b3565b9150509250929050565b60008060408385031215612b8257600080fd5b600083013567ffffffffffffffff811115612b9c57600080fd5b612ba8858286016128f6565b925050602083013567ffffffffffffffff811115612bc557600080fd5b612bd1858286016128f6565b9150509250929050565b600060208284031215612bed57600080fd5b6000612bfb84828501612935565b91505092915050565b600060208284031215612c1657600080fd5b6000612c248482850161294a565b91505092915050565b600060208284031215612c3f57600080fd5b600082013567ffffffffffffffff811115612c5957600080fd5b612c6584828501612989565b91505092915050565b600060208284031215612c8057600080fd5b6000612c8e848285016129b3565b91505092915050565b612ca081613bfa565b82525050565b612caf81613c0c565b82525050565b6000612cc082613aa2565b612cca8185613ab8565b9350612cda818560208601613c7d565b612ce381613de7565b840191505092915050565b6000612cf982613aad565b612d038185613ac9565b9350612d13818560208601613c7d565b612d1c81613de7565b840191505092915050565b6000612d3282613aad565b612d3c8185613ada565b9350612d4c818560208601613c7d565b80840191505092915050565b60008154612d6581613cb0565b612d6f8186613ada565b94506001821660008114612d8a5760018114612d9b57612dce565b60ff19831686528186019350612dce565b612da485613a8d565b60005b83811015612dc657815481890152600182019150602081019050612da7565b838801955050505b50505092915050565b6000612de4603283613ac9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612e4a601c83613ac9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612e8a602383613ac9565b91507f417474656d7074696e6720746f206d696e7420746f6f206d616e7920746f6b6560008301527f6e732e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ef0601a83613ac9565b91507f496e73756666696369656e74206d6573736167652076616c75650000000000006000830152602082019050919050565b6000612f30602483613ac9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f96601983613ac9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612fd6602c83613ac9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061303c603883613ac9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006130a2602a83613ac9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613108602983613ac9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061316e602e83613ac9565b91507f4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6c60008301527f20746869732066756e6374696f6e0000000000000000000000000000000000006020830152604082019050919050565b60006131d4602083613ac9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613214602c83613ac9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061327a602983613ac9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132e0602f83613ac9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613346600a83613ada565b91507f7b226e616d65223a2022000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613386600683613ada565b91507f2e737667227d00000000000000000000000000000000000000000000000000006000830152600682019050919050565b60006133c6601f83613ac9565b91507f4d6178696d756d20737570706c7920686173206265656e2072656163686564006000830152602082019050919050565b6000613406602183613ac9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061346c601d83613ada565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b60006134ac603183613ac9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613512606c83613ada565b91507f222c20226465736372697074696f6e223a20224120746f726e20706167652c2060008301527f73746f6c656e2066726f6d206120626f6f6b2077697468696e2074686520417460208301527f68656e65756d2e2068747470733a2f2f746865617468656e65756d2e6e65742260408301527f2c2022696d616765223a202200000000000000000000000000000000000000006060830152606c82019050919050565b60006135c4601483613ac9565b91507f42616420696e70757420706172616d65746572730000000000000000000000006000830152602082019050919050565b61360081613c64565b82525050565b600061361182613339565b915061361d8286612d27565b915061362882613505565b91506136348285612d58565b91506136408284612d27565b915061364b82613379565b9150819050949350505050565b60006136638261345f565b915061366f8284612d27565b915081905092915050565b600060208201905061368f6000830184612c97565b92915050565b60006080820190506136aa6000830187612c97565b6136b76020830186612c97565b6136c460408301856135f7565b81810360608301526136d68184612cb5565b905095945050505050565b60006020820190506136f66000830184612ca6565b92915050565b600060208201905081810360008301526137168184612cee565b905092915050565b600060408201905081810360008301526137388185612cee565b9050818103602083015261374c8184612cee565b90509392505050565b6000602082019050818103600083015261376e81612dd7565b9050919050565b6000602082019050818103600083015261378e81612e3d565b9050919050565b600060208201905081810360008301526137ae81612e7d565b9050919050565b600060208201905081810360008301526137ce81612ee3565b9050919050565b600060208201905081810360008301526137ee81612f23565b9050919050565b6000602082019050818103600083015261380e81612f89565b9050919050565b6000602082019050818103600083015261382e81612fc9565b9050919050565b6000602082019050818103600083015261384e8161302f565b9050919050565b6000602082019050818103600083015261386e81613095565b9050919050565b6000602082019050818103600083015261388e816130fb565b9050919050565b600060208201905081810360008301526138ae81613161565b9050919050565b600060208201905081810360008301526138ce816131c7565b9050919050565b600060208201905081810360008301526138ee81613207565b9050919050565b6000602082019050818103600083015261390e8161326d565b9050919050565b6000602082019050818103600083015261392e816132d3565b9050919050565b6000602082019050818103600083015261394e816133b9565b9050919050565b6000602082019050818103600083015261396e816133f9565b9050919050565b6000602082019050818103600083015261398e8161349f565b9050919050565b600060208201905081810360008301526139ae816135b7565b9050919050565b60006020820190506139ca60008301846135f7565b92915050565b6000604051905081810181811067ffffffffffffffff821117156139f7576139f6613db8565b5b8060405250919050565b600067ffffffffffffffff821115613a1c57613a1b613db8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a4857613a47613db8565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613a7857613a77613db8565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613af082613c64565b9150613afb83613c64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b3057613b2f613d2b565b5b828201905092915050565b6000613b4682613c64565b9150613b5183613c64565b925082613b6157613b60613d5a565b5b828204905092915050565b6000613b7782613c64565b9150613b8283613c64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bbb57613bba613d2b565b5b828202905092915050565b6000613bd182613c64565b9150613bdc83613c64565b925082821015613bef57613bee613d2b565b5b828203905092915050565b6000613c0582613c44565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c9b578082015181840152602081019050613c80565b83811115613caa576000848401525b50505050565b60006002820490506001821680613cc857607f821691505b60208210811415613cdc57613cdb613d89565b5b50919050565b6000613ced82613c64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d2057613d1f613d2b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613e0181613bfa565b8114613e0c57600080fd5b50565b613e1881613c0c565b8114613e2357600080fd5b50565b613e2f81613c18565b8114613e3a57600080fd5b50565b613e4681613c64565b8114613e5157600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220dc755a1010c098f29f30169a7f5b916eac5c66f5e5855f21d730b73f99df235764736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008417468656e65756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034154480000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Atheneum
Arg [1] : symbol_ (string): ATH

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 417468656e65756d000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4154480000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

21036:19137:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26648:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27817:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29920:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29441:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22965:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23304:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30979:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24440:1031;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31426:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23076:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25479:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22856:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20667:112;;;;;;;;;;;;;:::i;:::-;;27424:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27067:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23402:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20422:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27986:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30300:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31682:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23608:449;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28161:866;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26279:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21480:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23189:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23503:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20787:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30698:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20517:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26648:355;26795:4;26852:25;26837:40;;;:11;:40;;;;:105;;;;26909:33;26894:48;;;:11;:48;;;;26837:105;:158;;;;26959:36;26983:11;26959:23;:36::i;:::-;26837:158;26817:178;;26648:355;;;:::o;27817:100::-;27871:13;27904:5;27897:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27817:100;:::o;29920:308::-;30041:7;30088:16;30096:7;30088;:16::i;:::-;30066:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30196:15;:24;30212:7;30196:24;;;;;;;;;;;;;;;;;;;;;30189:31;;29920:308;;;:::o;29441:413::-;29522:13;29538:25;29555:7;29538:16;:25::i;:::-;29522:41;;29588:5;29582:11;;:2;:11;;;;29574:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29682:5;29666:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29691:37;29708:5;29715:12;:10;:12::i;:::-;29691:16;:37::i;:::-;29666:62;29644:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29825:21;29834:2;29838:7;29825:8;:21::i;:::-;29441:413;;;:::o;22965:103::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;23054:6:::1;23037:14;:23;;;;22965:103:::0;:::o;23304:90::-;23350:7;23377:9;;23370:16;;23304:90;:::o;30979:376::-;31188:41;31207:12;:10;:12::i;:::-;31221:7;31188:18;:41::i;:::-;31166:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;31319:28;31329:4;31335:2;31339:7;31319:9;:28::i;:::-;30979:376;;;:::o;24440:1031::-;24558:7;24616:9;;24599:7;:14;24586:12;;:27;;;;:::i;:::-;:39;24578:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;24699:14;;24682:7;:14;:31;24674:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;24935:10;:17;24917:7;:14;:35;24909:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25031:7;:14;25011:19;:17;:19::i;:::-;:34;;;;:::i;:::-;24998:9;:47;;24990:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;25228:19;25268:6;25264:169;25284:7;:14;25280:1;:18;25264:169;;;25334:84;25354:10;25379:7;25387:1;25379:10;;;;;;;;;;;;;;;;;;;;;;25404;25415:1;25404:13;;;;;;;;;;;;;;;;;;;;;;25334:5;:84::i;:::-;25320:98;;25300:3;;;;;:::i;:::-;;;;25264:169;;;;25452:11;25445:18;;;24440:1031;;;;:::o;31426:185::-;31564:39;31581:4;31587:2;31591:7;31564:39;;;;;;;;;;;;:16;:39::i;:::-;31426:185;;;:::o;23076:105::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;23167:6:::1;23149:15;:24;;;;23076:105:::0;:::o;25479:792::-;25632:7;20314:6;;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;25692:9:::1;;25675:7;:14;25660:12;;:29;;;;:::i;:::-;:41;25652:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26028:19;26068:6:::0;26064:169:::1;26084:7;:14;26080:1;:18;26064:169;;;26134:84;26154:10;26179:7;26187:1;26179:10;;;;;;;;;;;;;;;;;;;;;;26204;26215:1;26204:13;;;;;;;;;;;;;;;;;;;;;;26134:5;:84::i;:::-;26120:98;;26100:3;;;;;:::i;:::-;;;;26064:169;;;;26252:11;26245:18;;;25479:792:::0;;;;:::o;22856:101::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;22943:6:::1;22928:12;:21;;;;;;;;;;;;:::i;:::-;;22856:101:::0;:::o;20667:112::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20732:6:::1;::::0;::::1;;;;;;;;20724:24;;:47;20749:21;20724:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;20667:112::o:0;27424:326::-;27541:7;27566:13;27582:7;:16;27590:7;27582:16;;;;;;;;;;;;;;;;;;;;;27566:32;;27648:1;27631:19;;:5;:19;;;;27609:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27737:5;27730:12;;;27424:326;;;:::o;27067:295::-;27184:7;27248:1;27231:19;;:5;:19;;;;27209:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27338:9;:16;27348:5;27338:16;;;;;;;;;;;;;;;;27331:23;;27067:295;;;:::o;23402:93::-;23448:7;23475:12;;23468:19;;23402:93;:::o;20422:87::-;20468:7;20495:6;;;;;;;;;;;20488:13;;20422:87;:::o;27986:104::-;28042:13;28075:7;28068:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27986:104;:::o;30300:327::-;30447:12;:10;:12::i;:::-;30435:24;;:8;:24;;;;30427:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30547:8;30502:18;:32;30521:12;:10;:12::i;:::-;30502:32;;;;;;;;;;;;;;;:42;30535:8;30502:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30600:8;30571:48;;30586:12;:10;:12::i;:::-;30571:48;;;30610:8;30571:48;;;;;;:::i;:::-;;;;;;;;30300:327;;:::o;31682:365::-;31871:41;31890:12;:10;:12::i;:::-;31904:7;31871:18;:41::i;:::-;31849:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;32000:39;32014:4;32020:2;32024:7;32033:5;32000:13;:39::i;:::-;31682:365;;;;:::o;23608:449::-;23657:7;23696:3;23681:12;;:18;23677:373;;;23723:1;23716:8;;;;23677:373;23760:3;23745:12;;:18;23742:308;;;23787:21;23780:28;;;;23742:308;23844:3;23829:12;;:18;23826:224;;;23871:21;23864:28;;;;23826:224;23928:4;23913:12;;:19;23910:140;;;23956:21;23949:28;;;;23910:140;24017:21;24010:28;;23608:449;;:::o;28161:866::-;28279:13;28332:16;28340:7;28332;:16::i;:::-;28310:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;28436:19;28458:14;:23;28473:7;28458:23;;;;;;;;;;;28436:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28492:21;28516:17;:26;28534:7;28516:26;;;;;;;;;;;28492:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28622:20;28683:5;28803:12;28817:7;28652:183;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28622:214;;28847:18;28868:28;28888:6;28868:13;:28::i;:::-;28847:49;;28907:20;28987:4;28937:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;28907:86;;29013:6;29006:13;;;;;;;28161:866;;;:::o;26279:297::-;26380:24;26419:22;26491:14;:24;26506:8;26491:24;;;;;;;;;;;26530:17;:27;26548:8;26530:27;;;;;;;;;;;26469:99;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26279:297;;;:::o;21480:31::-;;;;:::o;23189:107::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;23280:8:::1;23263:14;:25;;;;23189:107:::0;:::o;23503:97::-;23551:7;23578:14;;23571:21;;23503:97;:::o;20787:213::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20936:7:::1;20911:21;:32;;20903:41;;;::::0;::::1;;20963:10;20955:28;;:37;20984:7;20955:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;20787:213:::0;;:::o;30698:214::-;30840:4;30869:18;:25;30888:5;30869:25;;;;;;;;;;;;;;;:35;30895:8;30869:35;;;;;;;;;;;;;;;;;;;;;;;;;30862:42;;30698:214;;;;:::o;20517:142::-;20314:6;;;;;;;;;;20300:20;;:10;:20;;;20278:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20620:1:::1;20600:22;;:8;:22;;;;20592:31;;;::::0;::::1;;20643:8;20634:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;20517:142:::0;:::o;19898:207::-;20028:4;20072:25;20057:40;;;:11;:40;;;;20050:47;;19898:207;;;:::o;33594:127::-;33659:4;33711:1;33683:30;;:7;:16;33691:7;33683:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33676:37;;33594:127;;;:::o;16913:98::-;16966:7;16993:10;16986:17;;16913:98;:::o;37751:176::-;37853:2;37826:15;:24;37842:7;37826:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37911:7;37907:2;37871:48;;37880:25;37897:7;37880:16;:25::i;:::-;37871:48;;;;;;;;;;;;37751:176;;:::o;33888:454::-;34017:4;34061:16;34069:7;34061;:16::i;:::-;34039:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34160:13;34176:25;34193:7;34176:16;:25::i;:::-;34160:41;;34231:5;34220:16;;:7;:16;;;:64;;;;34277:7;34253:31;;:20;34265:7;34253:11;:20::i;:::-;:31;;;34220:64;:113;;;;34301:32;34318:5;34325:7;34301:16;:32::i;:::-;34220:113;34212:122;;;33888:454;;;;:::o;37016:617::-;37191:4;37162:33;;:25;37179:7;37162:16;:25::i;:::-;:33;;;37140:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37297:1;37283:16;;:2;:16;;;;37275:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37353:39;37374:4;37380:2;37384:7;37353:20;:39::i;:::-;37457:29;37474:1;37478:7;37457:8;:29::i;:::-;37518:1;37499:9;:15;37509:4;37499:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37547:1;37530:9;:13;37540:2;37530:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37578:2;37559:7;:16;37567:7;37559:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37617:7;37613:2;37598:27;;37607:4;37598:27;;;;;;;;;;;;37016:617;;;:::o;24065:367::-;24193:7;24213:19;24250:1;24235:12;;:16;;;;:::i;:::-;24213:38;;24264:30;24274:6;24282:11;24264:9;:30::i;:::-;24335:6;24305:14;:27;24320:11;24305:27;;;;;;;;;;;:36;;;;;;;;;;;;:::i;:::-;;24385:8;24352:17;:30;24370:11;24352:30;;;;;;;;;;;:41;;;;;;;;;;;;:::i;:::-;;24413:11;24406:18;;;24065:367;;;;;:::o;32929:352::-;33086:28;33096:4;33102:2;33106:7;33086:9;:28::i;:::-;33147:48;33170:4;33176:2;33180:7;33189:5;33147:22;:48::i;:::-;33125:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;32929:352;;;;:::o;40526:1607::-;40584:13;40610:11;40624:4;:11;40610:25;;40657:1;40650:3;:8;40646:23;;;40660:9;;;;;;;;;;;;;;;;;40646:23;40721:18;40759:1;40754;40748:3;:7;;;;:::i;:::-;40747:13;;;;:::i;:::-;40742:1;:19;;;;:::i;:::-;40721:40;;40819:19;40864:2;40851:10;:15;;;;:::i;:::-;40841:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40819:48;;40880:18;40901:5;;;;;;;;;;;;;;;;;40880:26;;40970:1;40963:5;40959:13;41015:2;41007:6;41003:15;41066:1;41034:777;41089:3;41086:1;41083:10;41034:777;;;41144:1;41141;41137:9;41132:14;;41202:8;41197:1;41191:4;41187:12;41181:19;41177:34;41282:4;41274:5;41270:2;41266:14;41262:25;41252:8;41248:40;41242:47;41321:3;41318:1;41314:11;41307:18;;41412:4;41403;41395:5;41391:2;41387:14;41383:25;41373:8;41369:40;41363:47;41359:58;41354:3;41350:68;41343:75;;41450:3;41447:1;41443:11;41436:18;;41540:4;41531;41523:5;41520:1;41516:13;41512:24;41502:8;41498:39;41492:46;41488:57;41483:3;41479:67;41472:74;;41578:3;41575:1;41571:11;41564:18;;41660:4;41651;41644:5;41640:16;41630:8;41626:31;41620:38;41616:49;41611:3;41607:59;41600:66;;41700:3;41695;41691:13;41684:20;;41742:3;41731:9;41724:22;41794:1;41783:9;41779:17;41766:30;;41113:698;;41034:777;;;41038:44;41843:1;41838:3;41834:11;41864:1;41859:84;;;;41962:1;41957:82;;;;41827:212;;41859:84;41920:6;41915:3;41911:16;41907:1;41896:9;41892:17;41885:43;41859:84;;41957:82;42018:4;42013:3;42009:14;42005:1;41994:9;41990:17;41983:41;41827:212;;42070:10;42062:6;42055:26;40928:1164;;42118:6;42104:21;;;;;;40526:1607;;;;:::o;40044:126::-;;;;:::o;34684:110::-;34760:26;34770:2;34774:7;34760:26;;;;;;;;;;;;:9;:26::i;:::-;34684:110;;:::o;38492:980::-;38647:4;38668:15;:2;:13;;;:15::i;:::-;38664:801;;;38737:2;38721:36;;;38780:12;:10;:12::i;:::-;38815:4;38842:7;38872:5;38721:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38700:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39096:1;39079:6;:13;:18;39075:320;;;39122:108;;;;;;;;;;:::i;:::-;;;;;;;;39075:320;39345:6;39339:13;39330:6;39326:2;39322:15;39315:38;38700:710;38970:41;;;38960:51;;;:6;:51;;;;38953:58;;;;;38664:801;39449:4;39442:11;;38492:980;;;;;;;:::o;35021:321::-;35151:18;35157:2;35161:7;35151:5;:18::i;:::-;35202:54;35233:1;35237:2;35241:7;35250:5;35202:22;:54::i;:::-;35180:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35021:321;;;:::o;8546:387::-;8606:4;8814:12;8881:7;8869:20;8861:28;;8924:1;8917:4;:8;8910:15;;;8546:387;;;:::o;35678:410::-;35772:1;35758:16;;:2;:16;;;;35750:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35831:16;35839:7;35831;:16::i;:::-;35830:17;35822:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35893:45;35922:1;35926:2;35930:7;35893:20;:45::i;:::-;35968:1;35951:9;:13;35961:2;35951:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35999:2;35980:7;:16;35988:7;35980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36028:1;36012:12;;:17;;;;;;;:::i;:::-;;;;;;;;36072:7;36068:2;36047:33;;36064:1;36047:33;;;;;;;;;;;;35678:410;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;23:615:1:-;;154:90;169:74;236:6;169:74;:::i;:::-;154:90;:::i;:::-;145:99;;264:5;292:6;285:5;278:21;318:4;311:5;307:16;300:23;;343:6;374:1;359:273;384:6;381:1;378:13;359:273;;;476:3;463:17;455:6;451:30;506:47;549:3;537:10;506:47;:::i;:::-;501:3;494:60;583:4;578:3;574:14;567:21;;617:4;612:3;608:14;601:21;;419:213;406:1;403;399:9;394:14;;359:273;;;363:14;135:503;;;;;;;:::o;644:342::-;;746:64;761:48;802:6;761:48;:::i;:::-;746:64;:::i;:::-;737:73;;833:6;826:5;819:21;871:4;864:5;860:16;909:3;900:6;895:3;891:16;888:25;885:2;;;926:1;923;916:12;885:2;939:41;973:6;968:3;963;939:41;:::i;:::-;727:259;;;;;;:::o;992:344::-;;1095:65;1110:49;1152:6;1110:49;:::i;:::-;1095:65;:::i;:::-;1086:74;;1183:6;1176:5;1169:21;1221:4;1214:5;1210:16;1259:3;1250:6;1245:3;1241:16;1238:25;1235:2;;;1276:1;1273;1266:12;1235:2;1289:41;1323:6;1318:3;1313;1289:41;:::i;:::-;1076:260;;;;;;:::o;1342:139::-;;1426:6;1413:20;1404:29;;1442:33;1469:5;1442:33;:::i;:::-;1394:87;;;;:::o;1503:323::-;;1633:3;1626:4;1618:6;1614:17;1610:27;1600:2;;1651:1;1648;1641:12;1600:2;1691:6;1678:20;1716:104;1816:3;1808:6;1801:4;1793:6;1789:17;1716:104;:::i;:::-;1707:113;;1590:236;;;;;:::o;1832:133::-;;1913:6;1900:20;1891:29;;1929:30;1953:5;1929:30;:::i;:::-;1881:84;;;;:::o;1971:137::-;;2054:6;2041:20;2032:29;;2070:32;2096:5;2070:32;:::i;:::-;2022:86;;;;:::o;2114:141::-;;2201:6;2195:13;2186:22;;2217:32;2243:5;2217:32;:::i;:::-;2176:79;;;;:::o;2274:271::-;;2378:3;2371:4;2363:6;2359:17;2355:27;2345:2;;2396:1;2393;2386:12;2345:2;2436:6;2423:20;2461:78;2535:3;2527:6;2520:4;2512:6;2508:17;2461:78;:::i;:::-;2452:87;;2335:210;;;;;:::o;2565:273::-;;2670:3;2663:4;2655:6;2651:17;2647:27;2637:2;;2688:1;2685;2678:12;2637:2;2728:6;2715:20;2753:79;2828:3;2820:6;2813:4;2805:6;2801:17;2753:79;:::i;:::-;2744:88;;2627:211;;;;;:::o;2844:139::-;;2928:6;2915:20;2906:29;;2944:33;2971:5;2944:33;:::i;:::-;2896:87;;;;:::o;2989:262::-;;3097:2;3085:9;3076:7;3072:23;3068:32;3065:2;;;3113:1;3110;3103:12;3065:2;3156:1;3181:53;3226:7;3217:6;3206:9;3202:22;3181:53;:::i;:::-;3171:63;;3127:117;3055:196;;;;:::o;3257:407::-;;;3382:2;3370:9;3361:7;3357:23;3353:32;3350:2;;;3398:1;3395;3388:12;3350:2;3441:1;3466:53;3511:7;3502:6;3491:9;3487:22;3466:53;:::i;:::-;3456:63;;3412:117;3568:2;3594:53;3639:7;3630:6;3619:9;3615:22;3594:53;:::i;:::-;3584:63;;3539:118;3340:324;;;;;:::o;3670:552::-;;;;3812:2;3800:9;3791:7;3787:23;3783:32;3780:2;;;3828:1;3825;3818:12;3780:2;3871:1;3896:53;3941:7;3932:6;3921:9;3917:22;3896:53;:::i;:::-;3886:63;;3842:117;3998:2;4024:53;4069:7;4060:6;4049:9;4045:22;4024:53;:::i;:::-;4014:63;;3969:118;4126:2;4152:53;4197:7;4188:6;4177:9;4173:22;4152:53;:::i;:::-;4142:63;;4097:118;3770:452;;;;;:::o;4228:809::-;;;;;4396:3;4384:9;4375:7;4371:23;4367:33;4364:2;;;4413:1;4410;4403:12;4364:2;4456:1;4481:53;4526:7;4517:6;4506:9;4502:22;4481:53;:::i;:::-;4471:63;;4427:117;4583:2;4609:53;4654:7;4645:6;4634:9;4630:22;4609:53;:::i;:::-;4599:63;;4554:118;4711:2;4737:53;4782:7;4773:6;4762:9;4758:22;4737:53;:::i;:::-;4727:63;;4682:118;4867:2;4856:9;4852:18;4839:32;4898:18;4890:6;4887:30;4884:2;;;4930:1;4927;4920:12;4884:2;4958:62;5012:7;5003:6;4992:9;4988:22;4958:62;:::i;:::-;4948:72;;4810:220;4354:683;;;;;;;:::o;5043:401::-;;;5165:2;5153:9;5144:7;5140:23;5136:32;5133:2;;;5181:1;5178;5171:12;5133:2;5224:1;5249:53;5294:7;5285:6;5274:9;5270:22;5249:53;:::i;:::-;5239:63;;5195:117;5351:2;5377:50;5419:7;5410:6;5399:9;5395:22;5377:50;:::i;:::-;5367:60;;5322:115;5123:321;;;;;:::o;5450:407::-;;;5575:2;5563:9;5554:7;5550:23;5546:32;5543:2;;;5591:1;5588;5581:12;5543:2;5634:1;5659:53;5704:7;5695:6;5684:9;5680:22;5659:53;:::i;:::-;5649:63;;5605:117;5761:2;5787:53;5832:7;5823:6;5812:9;5808:22;5787:53;:::i;:::-;5777:63;;5732:118;5533:324;;;;;:::o;5863:733::-;;;6058:2;6046:9;6037:7;6033:23;6029:32;6026:2;;;6074:1;6071;6064:12;6026:2;6145:1;6134:9;6130:17;6117:31;6175:18;6167:6;6164:30;6161:2;;;6207:1;6204;6197:12;6161:2;6235:88;6315:7;6306:6;6295:9;6291:22;6235:88;:::i;:::-;6225:98;;6088:245;6400:2;6389:9;6385:18;6372:32;6431:18;6423:6;6420:30;6417:2;;;6463:1;6460;6453:12;6417:2;6491:88;6571:7;6562:6;6551:9;6547:22;6491:88;:::i;:::-;6481:98;;6343:246;6016:580;;;;;:::o;6602:260::-;;6709:2;6697:9;6688:7;6684:23;6680:32;6677:2;;;6725:1;6722;6715:12;6677:2;6768:1;6793:52;6837:7;6828:6;6817:9;6813:22;6793:52;:::i;:::-;6783:62;;6739:116;6667:195;;;;:::o;6868:282::-;;6986:2;6974:9;6965:7;6961:23;6957:32;6954:2;;;7002:1;6999;6992:12;6954:2;7045:1;7070:63;7125:7;7116:6;7105:9;7101:22;7070:63;:::i;:::-;7060:73;;7016:127;6944:206;;;;:::o;7156:375::-;;7274:2;7262:9;7253:7;7249:23;7245:32;7242:2;;;7290:1;7287;7280:12;7242:2;7361:1;7350:9;7346:17;7333:31;7391:18;7383:6;7380:30;7377:2;;;7423:1;7420;7413:12;7377:2;7451:63;7506:7;7497:6;7486:9;7482:22;7451:63;:::i;:::-;7441:73;;7304:220;7232:299;;;;:::o;7537:262::-;;7645:2;7633:9;7624:7;7620:23;7616:32;7613:2;;;7661:1;7658;7651:12;7613:2;7704:1;7729:53;7774:7;7765:6;7754:9;7750:22;7729:53;:::i;:::-;7719:63;;7675:117;7603:196;;;;:::o;7805:118::-;7892:24;7910:5;7892:24;:::i;:::-;7887:3;7880:37;7870:53;;:::o;7929:109::-;8010:21;8025:5;8010:21;:::i;:::-;8005:3;7998:34;7988:50;;:::o;8044:360::-;;8158:38;8190:5;8158:38;:::i;:::-;8212:70;8275:6;8270:3;8212:70;:::i;:::-;8205:77;;8291:52;8336:6;8331:3;8324:4;8317:5;8313:16;8291:52;:::i;:::-;8368:29;8390:6;8368:29;:::i;:::-;8363:3;8359:39;8352:46;;8134:270;;;;;:::o;8410:364::-;;8526:39;8559:5;8526:39;:::i;:::-;8581:71;8645:6;8640:3;8581:71;:::i;:::-;8574:78;;8661:52;8706:6;8701:3;8694:4;8687:5;8683:16;8661:52;:::i;:::-;8738:29;8760:6;8738:29;:::i;:::-;8733:3;8729:39;8722:46;;8502:272;;;;;:::o;8780:377::-;;8914:39;8947:5;8914:39;:::i;:::-;8969:89;9051:6;9046:3;8969:89;:::i;:::-;8962:96;;9067:52;9112:6;9107:3;9100:4;9093:5;9089:16;9067:52;:::i;:::-;9144:6;9139:3;9135:16;9128:23;;8890:267;;;;;:::o;9187:845::-;;9327:5;9321:12;9356:36;9382:9;9356:36;:::i;:::-;9408:89;9490:6;9485:3;9408:89;:::i;:::-;9401:96;;9528:1;9517:9;9513:17;9544:1;9539:137;;;;9690:1;9685:341;;;;9506:520;;9539:137;9623:4;9619:9;9608;9604:25;9599:3;9592:38;9659:6;9654:3;9650:16;9643:23;;9539:137;;9685:341;9752:38;9784:5;9752:38;:::i;:::-;9812:1;9826:154;9840:6;9837:1;9834:13;9826:154;;;9914:7;9908:14;9904:1;9899:3;9895:11;9888:35;9964:1;9955:7;9951:15;9940:26;;9862:4;9859:1;9855:12;9850:17;;9826:154;;;10009:6;10004:3;10000:16;9993:23;;9692:334;;9506:520;;9294:738;;;;;;:::o;10038:382::-;;10201:67;10265:2;10260:3;10201:67;:::i;:::-;10194:74;;10298:34;10294:1;10289:3;10285:11;10278:55;10364:20;10359:2;10354:3;10350:12;10343:42;10411:2;10406:3;10402:12;10395:19;;10184:236;;;:::o;10426:326::-;;10589:67;10653:2;10648:3;10589:67;:::i;:::-;10582:74;;10686:30;10682:1;10677:3;10673:11;10666:51;10743:2;10738:3;10734:12;10727:19;;10572:180;;;:::o;10758:367::-;;10921:67;10985:2;10980:3;10921:67;:::i;:::-;10914:74;;11018:34;11014:1;11009:3;11005:11;10998:55;11084:5;11079:2;11074:3;11070:12;11063:27;11116:2;11111:3;11107:12;11100:19;;10904:221;;;:::o;11131:324::-;;11294:67;11358:2;11353:3;11294:67;:::i;:::-;11287:74;;11391:28;11387:1;11382:3;11378:11;11371:49;11446:2;11441:3;11437:12;11430:19;;11277:178;;;:::o;11461:368::-;;11624:67;11688:2;11683:3;11624:67;:::i;:::-;11617:74;;11721:34;11717:1;11712:3;11708:11;11701:55;11787:6;11782:2;11777:3;11773:12;11766:28;11820:2;11815:3;11811:12;11804:19;;11607:222;;;:::o;11835:323::-;;11998:67;12062:2;12057:3;11998:67;:::i;:::-;11991:74;;12095:27;12091:1;12086:3;12082:11;12075:48;12149:2;12144:3;12140:12;12133:19;;11981:177;;;:::o;12164:376::-;;12327:67;12391:2;12386:3;12327:67;:::i;:::-;12320:74;;12424:34;12420:1;12415:3;12411:11;12404:55;12490:14;12485:2;12480:3;12476:12;12469:36;12531:2;12526:3;12522:12;12515:19;;12310:230;;;:::o;12546:388::-;;12709:67;12773:2;12768:3;12709:67;:::i;:::-;12702:74;;12806:34;12802:1;12797:3;12793:11;12786:55;12872:26;12867:2;12862:3;12858:12;12851:48;12925:2;12920:3;12916:12;12909:19;;12692:242;;;:::o;12940:374::-;;13103:67;13167:2;13162:3;13103:67;:::i;:::-;13096:74;;13200:34;13196:1;13191:3;13187:11;13180:55;13266:12;13261:2;13256:3;13252:12;13245:34;13305:2;13300:3;13296:12;13289:19;;13086:228;;;:::o;13320:373::-;;13483:67;13547:2;13542:3;13483:67;:::i;:::-;13476:74;;13580:34;13576:1;13571:3;13567:11;13560:55;13646:11;13641:2;13636:3;13632:12;13625:33;13684:2;13679:3;13675:12;13668:19;;13466:227;;;:::o;13699:378::-;;13862:67;13926:2;13921:3;13862:67;:::i;:::-;13855:74;;13959:34;13955:1;13950:3;13946:11;13939:55;14025:16;14020:2;14015:3;14011:12;14004:38;14068:2;14063:3;14059:12;14052:19;;13845:232;;;:::o;14083:330::-;;14246:67;14310:2;14305:3;14246:67;:::i;:::-;14239:74;;14343:34;14339:1;14334:3;14330:11;14323:55;14404:2;14399:3;14395:12;14388:19;;14229:184;;;:::o;14419:376::-;;14582:67;14646:2;14641:3;14582:67;:::i;:::-;14575:74;;14679:34;14675:1;14670:3;14666:11;14659:55;14745:14;14740:2;14735:3;14731:12;14724:36;14786:2;14781:3;14777:12;14770:19;;14565:230;;;:::o;14801:373::-;;14964:67;15028:2;15023:3;14964:67;:::i;:::-;14957:74;;15061:34;15057:1;15052:3;15048:11;15041:55;15127:11;15122:2;15117:3;15113:12;15106:33;15165:2;15160:3;15156:12;15149:19;;14947:227;;;:::o;15180:379::-;;15343:67;15407:2;15402:3;15343:67;:::i;:::-;15336:74;;15440:34;15436:1;15431:3;15427:11;15420:55;15506:17;15501:2;15496:3;15492:12;15485:39;15550:2;15545:3;15541:12;15534:19;;15326:233;;;:::o;15565:398::-;;15746:85;15828:2;15823:3;15746:85;:::i;:::-;15739:92;;15861:66;15857:1;15852:3;15848:11;15841:87;15954:2;15949:3;15945:12;15938:19;;15729:234;;;:::o;15969:396::-;;16150:84;16232:1;16227:3;16150:84;:::i;:::-;16143:91;;16264:66;16260:1;16255:3;16251:11;16244:87;16357:1;16352:3;16348:11;16341:18;;16133:232;;;:::o;16371:329::-;;16534:67;16598:2;16593:3;16534:67;:::i;:::-;16527:74;;16631:33;16627:1;16622:3;16618:11;16611:54;16691:2;16686:3;16682:12;16675:19;;16517:183;;;:::o;16706:365::-;;16869:67;16933:2;16928:3;16869:67;:::i;:::-;16862:74;;16966:34;16962:1;16957:3;16953:11;16946:55;17032:3;17027:2;17022:3;17018:12;17011:25;17062:2;17057:3;17053:12;17046:19;;16852:219;;;:::o;17077:363::-;;17258:85;17340:2;17335:3;17258:85;:::i;:::-;17251:92;;17373:31;17369:1;17364:3;17360:11;17353:52;17431:2;17426:3;17422:12;17415:19;;17241:199;;;:::o;17446:381::-;;17609:67;17673:2;17668:3;17609:67;:::i;:::-;17602:74;;17706:34;17702:1;17697:3;17693:11;17686:55;17772:19;17767:2;17762:3;17758:12;17751:41;17818:2;17813:3;17809:12;17802:19;;17592:235;;;:::o;17833:662::-;;18014:86;18096:3;18091;18014:86;:::i;:::-;18007:93;;18130:66;18126:1;18121:3;18117:11;18110:87;18228:34;18223:2;18218:3;18214:12;18207:56;18294:66;18289:2;18284:3;18280:12;18273:88;18392:66;18387:2;18382:3;18378:12;18371:88;18485:3;18480;18476:13;18469:20;;17997:498;;;:::o;18501:318::-;;18664:67;18728:2;18723:3;18664:67;:::i;:::-;18657:74;;18761:22;18757:1;18752:3;18748:11;18741:43;18810:2;18805:3;18801:12;18794:19;;18647:172;;;:::o;18825:118::-;18912:24;18930:5;18912:24;:::i;:::-;18907:3;18900:37;18890:53;;:::o;18949:1387::-;;19499:148;19643:3;19499:148;:::i;:::-;19492:155;;19664:95;19755:3;19746:6;19664:95;:::i;:::-;19657:102;;19776:148;19920:3;19776:148;:::i;:::-;19769:155;;19941:92;20029:3;20020:6;19941:92;:::i;:::-;19934:99;;20050:95;20141:3;20132:6;20050:95;:::i;:::-;20043:102;;20162:148;20306:3;20162:148;:::i;:::-;20155:155;;20327:3;20320:10;;19481:855;;;;;;:::o;20342:541::-;;20597:148;20741:3;20597:148;:::i;:::-;20590:155;;20762:95;20853:3;20844:6;20762:95;:::i;:::-;20755:102;;20874:3;20867:10;;20579:304;;;;:::o;20889:222::-;;21020:2;21009:9;21005:18;20997:26;;21033:71;21101:1;21090:9;21086:17;21077:6;21033:71;:::i;:::-;20987:124;;;;:::o;21117:640::-;;21350:3;21339:9;21335:19;21327:27;;21364:71;21432:1;21421:9;21417:17;21408:6;21364:71;:::i;:::-;21445:72;21513:2;21502:9;21498:18;21489:6;21445:72;:::i;:::-;21527;21595:2;21584:9;21580:18;21571:6;21527:72;:::i;:::-;21646:9;21640:4;21636:20;21631:2;21620:9;21616:18;21609:48;21674:76;21745:4;21736:6;21674:76;:::i;:::-;21666:84;;21317:440;;;;;;;:::o;21763:210::-;;21888:2;21877:9;21873:18;21865:26;;21901:65;21963:1;21952:9;21948:17;21939:6;21901:65;:::i;:::-;21855:118;;;;:::o;21979:313::-;;22130:2;22119:9;22115:18;22107:26;;22179:9;22173:4;22169:20;22165:1;22154:9;22150:17;22143:47;22207:78;22280:4;22271:6;22207:78;:::i;:::-;22199:86;;22097:195;;;;:::o;22298:514::-;;22497:2;22486:9;22482:18;22474:26;;22546:9;22540:4;22536:20;22532:1;22521:9;22517:17;22510:47;22574:78;22647:4;22638:6;22574:78;:::i;:::-;22566:86;;22699:9;22693:4;22689:20;22684:2;22673:9;22669:18;22662:48;22727:78;22800:4;22791:6;22727:78;:::i;:::-;22719:86;;22464:348;;;;;:::o;22818:419::-;;23022:2;23011:9;23007:18;22999:26;;23071:9;23065:4;23061:20;23057:1;23046:9;23042:17;23035:47;23099:131;23225:4;23099:131;:::i;:::-;23091:139;;22989:248;;;:::o;23243:419::-;;23447:2;23436:9;23432:18;23424:26;;23496:9;23490:4;23486:20;23482:1;23471:9;23467:17;23460:47;23524:131;23650:4;23524:131;:::i;:::-;23516:139;;23414:248;;;:::o;23668:419::-;;23872:2;23861:9;23857:18;23849:26;;23921:9;23915:4;23911:20;23907:1;23896:9;23892:17;23885:47;23949:131;24075:4;23949:131;:::i;:::-;23941:139;;23839:248;;;:::o;24093:419::-;;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24264:248;;;:::o;24518:419::-;;24722:2;24711:9;24707:18;24699:26;;24771:9;24765:4;24761:20;24757:1;24746:9;24742:17;24735:47;24799:131;24925:4;24799:131;:::i;:::-;24791:139;;24689:248;;;:::o;24943:419::-;;25147:2;25136:9;25132:18;25124:26;;25196:9;25190:4;25186:20;25182:1;25171:9;25167:17;25160:47;25224:131;25350:4;25224:131;:::i;:::-;25216:139;;25114:248;;;:::o;25368:419::-;;25572:2;25561:9;25557:18;25549:26;;25621:9;25615:4;25611:20;25607:1;25596:9;25592:17;25585:47;25649:131;25775:4;25649:131;:::i;:::-;25641:139;;25539:248;;;:::o;25793:419::-;;25997:2;25986:9;25982:18;25974:26;;26046:9;26040:4;26036:20;26032:1;26021:9;26017:17;26010:47;26074:131;26200:4;26074:131;:::i;:::-;26066:139;;25964:248;;;:::o;26218:419::-;;26422:2;26411:9;26407:18;26399:26;;26471:9;26465:4;26461:20;26457:1;26446:9;26442:17;26435:47;26499:131;26625:4;26499:131;:::i;:::-;26491:139;;26389:248;;;:::o;26643:419::-;;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:131;27050:4;26924:131;:::i;:::-;26916:139;;26814:248;;;:::o;27068:419::-;;27272:2;27261:9;27257:18;27249:26;;27321:9;27315:4;27311:20;27307:1;27296:9;27292:17;27285:47;27349:131;27475:4;27349:131;:::i;:::-;27341:139;;27239:248;;;:::o;27493:419::-;;27697:2;27686:9;27682:18;27674:26;;27746:9;27740:4;27736:20;27732:1;27721:9;27717:17;27710:47;27774:131;27900:4;27774:131;:::i;:::-;27766:139;;27664:248;;;:::o;27918:419::-;;28122:2;28111:9;28107:18;28099:26;;28171:9;28165:4;28161:20;28157:1;28146:9;28142:17;28135:47;28199:131;28325:4;28199:131;:::i;:::-;28191:139;;28089:248;;;:::o;28343:419::-;;28547:2;28536:9;28532:18;28524:26;;28596:9;28590:4;28586:20;28582:1;28571:9;28567:17;28560:47;28624:131;28750:4;28624:131;:::i;:::-;28616:139;;28514:248;;;:::o;28768:419::-;;28972:2;28961:9;28957:18;28949:26;;29021:9;29015:4;29011:20;29007:1;28996:9;28992:17;28985:47;29049:131;29175:4;29049:131;:::i;:::-;29041:139;;28939:248;;;:::o;29193:419::-;;29397:2;29386:9;29382:18;29374:26;;29446:9;29440:4;29436:20;29432:1;29421:9;29417:17;29410:47;29474:131;29600:4;29474:131;:::i;:::-;29466:139;;29364:248;;;:::o;29618:419::-;;29822:2;29811:9;29807:18;29799:26;;29871:9;29865:4;29861:20;29857:1;29846:9;29842:17;29835:47;29899:131;30025:4;29899:131;:::i;:::-;29891:139;;29789:248;;;:::o;30043:419::-;;30247:2;30236:9;30232:18;30224:26;;30296:9;30290:4;30286:20;30282:1;30271:9;30267:17;30260:47;30324:131;30450:4;30324:131;:::i;:::-;30316:139;;30214:248;;;:::o;30468:419::-;;30672:2;30661:9;30657:18;30649:26;;30721:9;30715:4;30711:20;30707:1;30696:9;30692:17;30685:47;30749:131;30875:4;30749:131;:::i;:::-;30741:139;;30639:248;;;:::o;30893:222::-;;31024:2;31013:9;31009:18;31001:26;;31037:71;31105:1;31094:9;31090:17;31081:6;31037:71;:::i;:::-;30991:124;;;;:::o;31121:283::-;;31187:2;31181:9;31171:19;;31229:4;31221:6;31217:17;31336:6;31324:10;31321:22;31300:18;31288:10;31285:34;31282:62;31279:2;;;31347:18;;:::i;:::-;31279:2;31387:10;31383:2;31376:22;31161:243;;;;:::o;31410:321::-;;31587:18;31579:6;31576:30;31573:2;;;31609:18;;:::i;:::-;31573:2;31659:4;31651:6;31647:17;31639:25;;31719:4;31713;31709:15;31701:23;;31502:229;;;:::o;31737:331::-;;31888:18;31880:6;31877:30;31874:2;;;31910:18;;:::i;:::-;31874:2;31995:4;31991:9;31984:4;31976:6;31972:17;31968:33;31960:41;;32056:4;32050;32046:15;32038:23;;31803:265;;;:::o;32074:332::-;;32226:18;32218:6;32215:30;32212:2;;;32248:18;;:::i;:::-;32212:2;32333:4;32329:9;32322:4;32314:6;32310:17;32306:33;32298:41;;32394:4;32388;32384:15;32376:23;;32141:265;;;:::o;32412:141::-;;32484:3;32476:11;;32507:3;32504:1;32497:14;32541:4;32538:1;32528:18;32520:26;;32466:87;;;:::o;32559:98::-;;32644:5;32638:12;32628:22;;32617:40;;;:::o;32663:99::-;;32749:5;32743:12;32733:22;;32722:40;;;:::o;32768:168::-;;32885:6;32880:3;32873:19;32925:4;32920:3;32916:14;32901:29;;32863:73;;;;:::o;32942:169::-;;33060:6;33055:3;33048:19;33100:4;33095:3;33091:14;33076:29;;33038:73;;;;:::o;33117:148::-;;33256:3;33241:18;;33231:34;;;;:::o;33271:305::-;;33330:20;33348:1;33330:20;:::i;:::-;33325:25;;33364:20;33382:1;33364:20;:::i;:::-;33359:25;;33518:1;33450:66;33446:74;33443:1;33440:81;33437:2;;;33524:18;;:::i;:::-;33437:2;33568:1;33565;33561:9;33554:16;;33315:261;;;;:::o;33582:185::-;;33639:20;33657:1;33639:20;:::i;:::-;33634:25;;33673:20;33691:1;33673:20;:::i;:::-;33668:25;;33712:1;33702:2;;33717:18;;:::i;:::-;33702:2;33759:1;33756;33752:9;33747:14;;33624:143;;;;:::o;33773:348::-;;33836:20;33854:1;33836:20;:::i;:::-;33831:25;;33870:20;33888:1;33870:20;:::i;:::-;33865:25;;34058:1;33990:66;33986:74;33983:1;33980:81;33975:1;33968:9;33961:17;33957:105;33954:2;;;34065:18;;:::i;:::-;33954:2;34113:1;34110;34106:9;34095:20;;33821:300;;;;:::o;34127:191::-;;34187:20;34205:1;34187:20;:::i;:::-;34182:25;;34221:20;34239:1;34221:20;:::i;:::-;34216:25;;34260:1;34257;34254:8;34251:2;;;34265:18;;:::i;:::-;34251:2;34310:1;34307;34303:9;34295:17;;34172:146;;;;:::o;34324:96::-;;34390:24;34408:5;34390:24;:::i;:::-;34379:35;;34369:51;;;:::o;34426:90::-;;34503:5;34496:13;34489:21;34478:32;;34468:48;;;:::o;34522:149::-;;34598:66;34591:5;34587:78;34576:89;;34566:105;;;:::o;34677:126::-;;34754:42;34747:5;34743:54;34732:65;;34722:81;;;:::o;34809:77::-;;34875:5;34864:16;;34854:32;;;:::o;34892:154::-;34976:6;34971:3;34966;34953:30;35038:1;35029:6;35024:3;35020:16;35013:27;34943:103;;;:::o;35052:307::-;35120:1;35130:113;35144:6;35141:1;35138:13;35130:113;;;35229:1;35224:3;35220:11;35214:18;35210:1;35205:3;35201:11;35194:39;35166:2;35163:1;35159:10;35154:15;;35130:113;;;35261:6;35258:1;35255:13;35252:2;;;35341:1;35332:6;35327:3;35323:16;35316:27;35252:2;35101:258;;;;:::o;35365:320::-;;35446:1;35440:4;35436:12;35426:22;;35493:1;35487:4;35483:12;35514:18;35504:2;;35570:4;35562:6;35558:17;35548:27;;35504:2;35632;35624:6;35621:14;35601:18;35598:38;35595:2;;;35651:18;;:::i;:::-;35595:2;35416:269;;;;:::o;35691:233::-;;35753:24;35771:5;35753:24;:::i;:::-;35744:33;;35799:66;35792:5;35789:77;35786:2;;;35869:18;;:::i;:::-;35786:2;35916:1;35909:5;35905:13;35898:20;;35734:190;;;:::o;35930:180::-;35978:77;35975:1;35968:88;36075:4;36072:1;36065:15;36099:4;36096:1;36089:15;36116:180;36164:77;36161:1;36154:88;36261:4;36258:1;36251:15;36285:4;36282:1;36275:15;36302:180;36350:77;36347:1;36340:88;36447:4;36444:1;36437:15;36471:4;36468:1;36461:15;36488:180;36536:77;36533:1;36526:88;36633:4;36630:1;36623:15;36657:4;36654:1;36647:15;36674:102;;36766:2;36762:7;36757:2;36750:5;36746:14;36742:28;36732:38;;36722:54;;;:::o;36782:122::-;36855:24;36873:5;36855:24;:::i;:::-;36848:5;36845:35;36835:2;;36894:1;36891;36884:12;36835:2;36825:79;:::o;36910:116::-;36980:21;36995:5;36980:21;:::i;:::-;36973:5;36970:32;36960:2;;37016:1;37013;37006:12;36960:2;36950:76;:::o;37032:120::-;37104:23;37121:5;37104:23;:::i;:::-;37097:5;37094:34;37084:2;;37142:1;37139;37132:12;37084:2;37074:78;:::o;37158:122::-;37231:24;37249:5;37231:24;:::i;:::-;37224:5;37221:35;37211:2;;37270:1;37267;37260:12;37211:2;37201:79;:::o

Swarm Source

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