ETH Price: $2,626.78 (+1.15%)

Token

AdjectiveNounVerb (ANV)
 

Overview

Max Total Supply

12 ANV

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ANV
0x942eA8Fbe052F53c81e8bcC702100541d7a3be77
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:
AdjectiveNounVerb

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
 */

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        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 = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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(to).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 {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract AdjectiveNounVerb is ERC721Enumerable, ReentrancyGuard, Ownable {
    string[] private adjectives = [
        "afraid",
        "all",
        "angry",
        "beige",
        "big",
        "bitter",
        "blue",
        "brave",
        "bumpy",
        "deep",
        "dirty",
        "solid",
        "some",
        "sour",
        "spicy",
        "spotty",
        "stale",
        "strange",
        "strong",
        "stupid",
        "tangy",
        "tasty",
        "thin",
        "thirty",
        "three",
        "tiny",
        "tired",
        "happy",
        "yellow",
        "young",
        "yummy"
    ];

    string[] private nouns = [
        "apes",
        "animals",
        "dogs",
        "baths",
        "memes",
        "otters",
        "owls",
        "pandas",
        "vitaliks",
        "panthers",
        "turkeys",
        "turtles",
        "vans",
        "tigers",
        "walruses",
        "koalas",
        "windows",
        "wolves",
        "wombats",
        "worms",
        "zoos"
    ];

    string[] private verbs = [
        "boogie",
        "snoop",
        "argue",
        "attack",
        "bake",
        "bathe",
        "battle",
        "dance",
        "beam",
        "chew",
        "clap",
        "deliver",
        "design",
        "eat",
        "greet",
        "impress",
        "invent",
        "march",
        "mate",
        "wink",
        "work",
        "twerk"
    ];

    string[] private descriptors = ["gm", "wow", "gmi", "lfg", "looks rare"];

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getAdjectives(string memory id)
        public
        view
        returns (string memory)
    {
        return pluck(id, "ADJECTIVES", adjectives, false);
    }

    function getNouns(string memory id) public view returns (string memory) {
        return pluck(id, "NOUNS", nouns, false);
    }

    function getVerbs(string memory id) public view returns (string memory) {
        return pluck(id, "VERBS", verbs, false);
    }

    function getGreatness(string memory id)
        public
        view
        returns (string memory)
    {
        return pluck(id, "DESCRIPTOR", descriptors, true);
    }

    function getForegroundColor(string memory id, string memory keyPrefix)
        public
        view
        returns (string memory)
    {
        uint256 color = (random(string(abi.encodePacked(keyPrefix, id))) % 55) +
            200;
        bytes memory colorHexString = toHexString(color);
        colorHexString = abi.encodePacked(colorHexString[2], colorHexString[3]);
        return string(colorHexString);
    }

    function getBackgroundColor(string memory id, string memory keyPrefix)
        public
        view
        returns (string memory)
    {
        uint256 color = (random(string(abi.encodePacked(keyPrefix, id))) % 100);
        bytes memory colorHexString = toHexString(color);
        colorHexString = abi.encodePacked(colorHexString[2], colorHexString[3]);
        return string(colorHexString);
    }

    function pluck(
        string memory tokenId,
        string memory keyPrefix,
        string[] memory sourceArray,
        bool isRare
    ) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, tokenId)));
        string memory output = sourceArray[rand % sourceArray.length];
        if (isRare == true) {
            uint256 greatness = rand % 50;
            if (greatness > 48) {
                output = sourceArray[4];
            } else if (greatness > 45) {
                output = sourceArray[3];
            } else if (greatness > 40) {
                output = sourceArray[2];
            } else if (greatness > 33) {
                output = sourceArray[1];
            } else {
                output = sourceArray[0];
            }
        }
        return output;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        string memory id = toString(tokenId);

        string[17] memory parts;
        parts[
            0
        ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 512 512"><style>.base { fill: #';

        parts[1] = getBackgroundColor(id, "R");

        parts[2] = getBackgroundColor(id, "G");

        parts[3] = getBackgroundColor(id, "B");

        parts[
            4
        ] = '; font-family: sans-serif; font-size: 64px; }.small { font-size: 32px }</style><rect width="100%" height="100%" fill="#';

        parts[5] = getForegroundColor(id, "R");

        parts[6] = getForegroundColor(id, "G");

        parts[7] = getForegroundColor(id, "B");

        parts[
            8
        ] = '" /><text id="adjective" x="50%" y="35%" dominant-baseline="middle" text-anchor="middle" class="base">';

        parts[9] = getAdjectives(id);

        parts[
            10
        ] = '</text><text id="noun" x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" class="base">';

        parts[11] = getNouns(id);

        parts[
            12
        ] = '</text><text id="verb" x="50%" y="65%" dominant-baseline="middle" text-anchor="middle" class="base">';

        parts[13] = getVerbs(id);

        parts[
            14
        ] = '</text><text id="descriptor" x="50%" y="5%" dominant-baseline="middle" text-anchor="middle" class="base small">';

        parts[15] = getGreatness(id);

        parts[
            16
        ] = '</text><animate href="#adjective" attributeName="y" from="35%" to="20%" values="35%; 20%; 35%" dur="0.5s" begin="click" repeatCount="indefinite" fill="freeze" id="anim2"/><animate href="#noun" attributeName="x" from="30%" to="70%" values="50%; 30%; 50%; 70%; 50%;" dur="1s" begin="click" repeatCount="indefinite" fill="freeze" id="anim3"/><animate href="#verb" attributeName="y" from="65%" to="80%" values="65%; 80%; 65%;" dur="0.2s" begin="click" repeatCount="indefinite" fill="freeze" id="anim3"/><animate href="#descriptor" attributeName="x" from="50%" to="50%" values="-5%; 105%;" dur="4s" begin="click" repeatCount="indefinite" fill="freeze" id="anim"/></svg>';

        string memory output = string(
            abi.encodePacked(
                parts[0],
                parts[1],
                parts[2],
                parts[3],
                parts[4],
                parts[5],
                parts[6],
                parts[7],
                parts[8]
            )
        );
        output = string(
            abi.encodePacked(
                output,
                parts[9],
                parts[10],
                parts[11],
                parts[12],
                parts[13],
                parts[14],
                parts[15],
                parts[16]
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Adjective Noun Verb ID #',
                        toString(tokenId),
                        '", "description": "Randomly generated adjectives, nouns and verbs", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '", "attributes": [{ "trait_type": "Adjective", "value": "',
                        parts[9],
                        '" }, { "trait_type": "Noun", "value": "',
                        parts[11],
                        '" }, { "trait_type": "Verb", "value": "',
                        parts[13],
                        '" }, { "trait_type": "Greatness", "value": "',
                        parts[15],
                        '" }]}'
                    )
                )
            )
        );
        output = string(
            abi.encodePacked("data:application/json;base64,", json)
        );

        return output;
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 901, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }

    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 900 && tokenId < 937, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }

    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (bytes 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 (bytes 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 buffer;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }

    constructor() ERC721("AdjectiveNounVerb", "ANV") Ownable() {}
}

/// [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":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"getAdjectives","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"id","type":"string"},{"internalType":"string","name":"keyPrefix","type":"string"}],"name":"getBackgroundColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"keyPrefix","type":"string"}],"name":"getForegroundColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"getGreatness","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"getNouns","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"getVerbs","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806103e001604052806040518060400160405280600681526020017f616672616964000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616e67727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626569676500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626967000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f626974746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f627261766500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f62756d707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f646565700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f646972747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736f6c696400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f736f6d650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f736f75720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f737069637900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73706f747479000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f7374616c6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f737472616e67650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7374726f6e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f737475706964000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f74616e677900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746173747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7468696e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746869727479000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746872656500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f74696e790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746972656400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f686170707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f79656c6c6f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f796f756e6700000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f79756d6d79000000000000000000000000000000000000000000000000000000815250815250600c90601f6200074592919062001456565b50604051806102a001604052806040518060400160405280600481526020017f617065730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f616e696d616c730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f646f67730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626174687300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6d656d657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f7474657273000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6f776c730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f70616e646173000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f766974616c696b7300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f70616e746865727300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7475726b6579730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f747572746c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f76616e730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746967657273000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f77616c727573657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6b6f616c6173000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f77696e646f77730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f776f6c766573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f776f6d626174730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776f726d7300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7a6f6f7300000000000000000000000000000000000000000000000000000000815250815250600d90601562000c39929190620014bd565b50604051806102c001604052806040518060400160405280600681526020017f626f6f676965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736e6f6f7000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f617267756500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f61747461636b000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f62616b650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626174686500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f626174746c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64616e636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6265616d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f636865770000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f636c61700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f64656c697665720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f64657369676e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f656174000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265657400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f696d70726573730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f696e76656e74000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6d6172636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d6174650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f77696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f776f726b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f747765726b000000000000000000000000000000000000000000000000000000815250815250600e9060166200116892919062001524565b506040518060a001604052806040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f776f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f676d69000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6c6667000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6c6f6f6b73207261726500000000000000000000000000000000000000000000815250815250600f906005620012ab9291906200158b565b50348015620012b957600080fd5b506040518060400160405280601181526020017f41646a6563746976654e6f756e566572620000000000000000000000000000008152506040518060400160405280600381526020017f414e56000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200133e929190620015f2565b50806001908051906020019062001357929190620015f2565b5050506001600a8190555062001382620013766200138860201b60201c565b6200139060201b60201c565b62001775565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620014aa579160200282015b82811115620014a957825182908051906020019062001498929190620015f2565b509160200191906001019062001477565b5b509050620014b9919062001683565b5090565b82805482825590600052602060002090810192821562001511579160200282015b8281111562001510578251829080519060200190620014ff929190620015f2565b5091602001919060010190620014de565b5b50905062001520919062001683565b5090565b82805482825590600052602060002090810192821562001578579160200282015b828111156200157757825182908051906020019062001566929190620015f2565b509160200191906001019062001545565b5b50905062001587919062001683565b5090565b828054828255906000526020600020908101928215620015df579160200282015b82811115620015de578251829080519060200190620015cd929190620015f2565b5091602001919060010190620015ac565b5b509050620015ee919062001683565b5090565b828054620016009062001710565b90600052602060002090601f01602090048101928262001624576000855562001670565b82601f106200163f57805160ff191683800117855562001670565b8280016001018555821562001670579182015b828111156200166f57825182559160200191906001019062001652565b5b5090506200167f9190620016ab565b5090565b5b80821115620016a757600081816200169d9190620016ca565b5060010162001684565b5090565b5b80821115620016c6576000816000905550600101620016ac565b5090565b508054620016d89062001710565b6000825580601f10620016ec57506200170d565b601f0160209004906000526020600020908101906200170c9190620016ab565b5b50565b600060028204905060018216806200172957607f821691505b6020821081141562001740576200173f62001746565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615ca780620017856000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063ad39741011610097578063e7e538c211610071578063e7e538c214610504578063e985e9c514610534578063f2fde38b14610564578063f4124c0114610580576101a9565b8063ad39741014610488578063b88d4fde146104b8578063c87b56dd146104d4576101a9565b80638da5cb5b116100d35780638da5cb5b1461040057806392974fde1461041e57806395d89b411461044e578063a22cb4651461046c576101a9565b806370a0823114610396578063715018a6146103c65780637e2874a4146103d0576101a9565b80632f745c5911610166578063434f48c411610140578063434f48c4146102ea5780634a3930a6146103065780634f6ccce7146103365780636352211e14610366576101a9565b80632f745c5914610282578063379607f5146102b257806342842e0e146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c39190614120565b6105b0565b6040516101d59190614f61565b60405180910390f35b6101e661062a565b6040516101f39190614f7c565b60405180910390f35b6102166004803603810190610211919061421f565b6106bc565b6040516102239190614efa565b60405180910390f35b610246600480360381019061024191906140e4565b610741565b005b610250610859565b60405161025d919061521e565b60405180910390f35b610280600480360381019061027b9190613fde565b610866565b005b61029c600480360381019061029791906140e4565b6108c6565b6040516102a9919061521e565b60405180910390f35b6102cc60048036038101906102c7919061421f565b61096b565b005b6102e860048036038101906102e39190613fde565b610a25565b005b61030460048036038101906102ff919061421f565b610a45565b005b610320600480360381019061031b9190614172565b610b7c565b60405161032d9190614f7c565b60405180910390f35b610350600480360381019061034b919061421f565b610c98565b60405161035d919061521e565b60405180910390f35b610380600480360381019061037b919061421f565b610d2f565b60405161038d9190614efa565b60405180910390f35b6103b060048036038101906103ab9190613f79565b610de1565b6040516103bd919061521e565b60405180910390f35b6103ce610e99565b005b6103ea60048036038101906103e591906141b3565b610f21565b6040516103f79190614f7c565b60405180910390f35b61040861102d565b6040516104159190614efa565b60405180910390f35b61043860048036038101906104339190614172565b611057565b6040516104459190614f7c565b60405180910390f35b610456611173565b6040516104639190614f7c565b60405180910390f35b610486600480360381019061048191906140a8565b611205565b005b6104a2600480360381019061049d9190614172565b611386565b6040516104af9190614f7c565b60405180910390f35b6104d260048036038101906104cd919061402d565b6114a2565b005b6104ee60048036038101906104e9919061421f565b611504565b6040516104fb9190614f7c565b60405180910390f35b61051e60048036038101906105199190614172565b6121bd565b60405161052b9190614f7c565b60405180910390f35b61054e60048036038101906105499190613fa2565b6122d9565b60405161055b9190614f61565b60405180910390f35b61057e60048036038101906105799190613f79565b61236d565b005b61059a600480360381019061059591906141b3565b612465565b6040516105a79190614f7c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610623575061062282612565565b5b9050919050565b6060600080546106399061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546106659061552e565b80156106b25780601f10610687576101008083540402835291602001916106b2565b820191906000526020600020905b81548152906001019060200180831161069557829003601f168201915b5050505050905090565b60006106c782612647565b610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd9061511e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074c82610d2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b49061519e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107dc6126b3565b73ffffffffffffffffffffffffffffffffffffffff16148061080b575061080a816108056126b3565b6122d9565b5b61084a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108419061509e565b60405180910390fd5b61085483836126bb565b505050565b6000600880549050905090565b6108776108716126b3565b82612774565b6108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad906151be565b60405180910390fd5b6108c1838383612852565b505050565b60006108d183610de1565b8210610912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090990614fbe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a8906151fe565b60405180910390fd5b6002600a819055506000811180156109ca575061038581105b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a009061515e565b60405180910390fd5b610a1a610a146126b3565b82612aae565b6001600a8190555050565b610a40838383604051806020016040528060008152506114a2565b505050565b6002600a541415610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a82906151fe565b60405180910390fd5b6002600a81905550610a9b6126b3565b73ffffffffffffffffffffffffffffffffffffffff16610ab961102d565b73ffffffffffffffffffffffffffffffffffffffff1614610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b069061513e565b60405180910390fd5b61038481118015610b2157506103a981105b610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b579061515e565b60405180910390fd5b610b71610b6b61102d565b82612aae565b6001600a8190555050565b6060610c91826040518060400160405280600581526020017f4e4f554e53000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610c86578382906000526020600020018054610bf99061552e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c259061552e565b8015610c725780601f10610c4757610100808354040283529160200191610c72565b820191906000526020600020905b815481529060010190602001808311610c5557829003601f168201915b505050505081526020019060010190610bda565b505050506000612acc565b9050919050565b6000610ca2610859565b8210610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda906151de565b60405180910390fd5b60088281548110610d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906150de565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e49906150be565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ea16126b3565b73ffffffffffffffffffffffffffffffffffffffff16610ebf61102d565b73ffffffffffffffffffffffffffffffffffffffff1614610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9061513e565b60405180910390fd5b610f1f6000612d0a565b565b6060600060c86037610f538587604051602001610f3f929190614d90565b604051602081830303815290604052612dd0565b610f5d91906155b3565b610f67919061530d565b90506000610f7482612e03565b905080600281518110610fb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b81600381518110610ff5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b604051602001611011929190614d4d565b6040516020818303038152906040529050809250505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606061116c826040518060400160405280600a81526020017f44455343524950544f5200000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156111615783829060005260206000200180546110d49061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546111009061552e565b801561114d5780601f106111225761010080835404028352916020019161114d565b820191906000526020600020905b81548152906001019060200180831161113057829003601f168201915b5050505050815260200190600101906110b5565b505050506001612acc565b9050919050565b6060600180546111829061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae9061552e565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b5050505050905090565b61120d6126b3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061505e565b60405180910390fd5b80600560006112886126b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113356126b3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161137a9190614f61565b60405180910390a35050565b606061149b826040518060400160405280600a81526020017f41444a4543544956455300000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156114905783829060005260206000200180546114039061552e565b80601f016020809104026020016040519081016040528092919081815260200182805461142f9061552e565b801561147c5780601f106114515761010080835404028352916020019161147c565b820191906000526020600020905b81548152906001019060200180831161145f57829003601f168201915b5050505050815260200190600101906113e4565b505050506000612acc565b9050919050565b6114b36114ad6126b3565b83612774565b6114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e9906151be565b60405180910390fd5b6114fe84848484612e89565b50505050565b6060600061151183612ee5565b905061151b613e18565b6040518060a0016040528060788152602001615bfa607891398160006011811061156e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115b5826040518060400160405280600181526020017f5200000000000000000000000000000000000000000000000000000000000000815250612465565b816001601181106115ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611636826040518060400160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250612465565b81600260118110611670577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506116b7826040518060400160405280600181526020017f4200000000000000000000000000000000000000000000000000000000000000815250612465565b816003601181106116f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a001604052806077815260200161570e607791398160046011811061174c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611793826040518060400160405280600181526020017f5200000000000000000000000000000000000000000000000000000000000000815250610f21565b816005601181106117cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611814826040518060400160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250610f21565b8160066011811061184e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611895826040518060400160405280600181526020017f4200000000000000000000000000000000000000000000000000000000000000815250610f21565b816007601181106118cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a00160405280606681526020016157f4606691398160086011811061192a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061193b82611386565b81600960118110611975577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a0016040528060648152602001615af26064913981600a601181106119d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506119e182610b7c565b81600b60118110611a1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a0016040528060648152602001615b966064913981600c60118110611a76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a87826121bd565b81600d60118110611ac1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a00160405280606f8152602001615785606f913981600e60118110611b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611b2d82611057565b81600f60118110611b67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806102c00160405280610298815260200161585a610298913981601060118110611bc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250600081600060118110611c09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600160118110611c48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260118110611c87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600360118110611cc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600460118110611d05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560118110611d44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660118110611d83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600760118110611dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189600860118110611e01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611e1e99989796959493929190614db4565b60405160208183030381529060405290508082600960118110611e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a60118110611ea9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b60118110611ee8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c60118110611f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d60118110611f66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60118110611fa5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f60118110611fe4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189601060118110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161204099989796959493929190614db4565b6040516020818303038152906040529050600061218d61205f87612ee5565b61206884613092565b856009601181106120a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600b601181106120e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600d60118110612120577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f6011811061215f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161217996959493929190614e33565b604051602081830303815290604052613092565b9050806040516020016121a09190614ed8565b604051602081830303815290604052915081945050505050919050565b60606122d2826040518060400160405280600581526020017f5645524253000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156122c757838290600052602060002001805461223a9061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546122669061552e565b80156122b35780601f10612288576101008083540402835291602001916122b3565b820191906000526020600020905b81548152906001019060200180831161229657829003601f168201915b50505050508152602001906001019061221b565b505050506000612acc565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123756126b3565b73ffffffffffffffffffffffffffffffffffffffff1661239361102d565b73ffffffffffffffffffffffffffffffffffffffff16146123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e09061513e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090614ffe565b60405180910390fd5b61246281612d0a565b50565b6060600060646124958486604051602001612481929190614d90565b604051602081830303815290604052612dd0565b61249f91906155b3565b905060006124ac82612e03565b9050806002815181106124e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b8160038151811061252d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b604051602001612549929190614d4d565b6040516020818303038152906040529050809250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612640575061263f82613250565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661272e83610d2f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061277f82612647565b6127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b59061507e565b60405180910390fd5b60006127c983610d2f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061283857508373ffffffffffffffffffffffffffffffffffffffff16612820846106bc565b73ffffffffffffffffffffffffffffffffffffffff16145b80612849575061284881856122d9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661287282610d2f565b73ffffffffffffffffffffffffffffffffffffffff16146128c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bf9061517e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f9061503e565b60405180910390fd5b6129438383836132ba565b61294e6000826126bb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299e91906153ee565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f5919061530d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612ac88282604051806020016040528060008152506133ce565b5050565b60606000612afa8587604051602001612ae6929190614d90565b604051602081830303815290604052612dd0565b9050600084855183612b0c91906155b3565b81518110612b43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600115158415151415612cfd576000603283612b6991906155b3565b90506030811115612bbd5785600481518110612bae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cfb565b602d811115612c0f5785600381518110612c00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cfa565b6028811115612c615785600281518110612c52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cf9565b6021811115612cb35785600181518110612ca4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cf8565b85600081518110612ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015191505b5b5b5b505b8092505050949350505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081604051602001612de39190614d79565b6040516020818303038152906040528051906020012060001c9050919050565b60606000821415612e4b576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050612e84565b600082905060005b60008214612e75578080612e6690615560565b915050600882901c9150612e53565b612e7f8482613429565b925050505b919050565b612e94848484612852565b612ea084848484613723565b612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed690614fde565b60405180910390fd5b50505050565b60606000821415612f2d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061308d565b600082905060005b60008214612f5f578080612f4890615560565b915050600a82612f589190615363565b9150612f35565b60008167ffffffffffffffff811115612fa1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612fd35781602001600182028036833780820191505090505b5090505b6000851461308657600182612fec91906153ee565b9150600a85612ffb91906155b3565b6030613007919061530d565b60f81b818381518110613043577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561307f9190615363565b9450612fd7565b8093505050505b919050565b606060008251905060008114156130bb576040518060200160405280600081525091505061324b565b600060036002836130cc919061530d565b6130d69190615363565b60046130e29190615394565b905060006020826130f3919061530d565b67ffffffffffffffff811115613132577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131645781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615b56604091399050600181016020830160005b868110156132085760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061318f565b50600386066001811461322257600281146132325761323d565b613d3d60f01b600283035261323d565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132c58383836138ba565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561330857613303816138bf565b613347565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613346576133458382613908565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338a5761338581613a75565b6133c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133c8576133c78282613bb8565b5b5b505050565b6133d88383613c37565b6133e56000848484613723565b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b90614fde565b60405180910390fd5b505050565b60606000600283600261343c9190615394565b613446919061530d565b67ffffffffffffffff811115613485577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134b75781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613515577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061359f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026135df9190615394565b6135e9919061530d565b90505b60018111156136d5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613651577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061368e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806136ce90615504565b90506135ec565b5060008414613719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371090614f9e565b60405180910390fd5b8091505092915050565b60006137448473ffffffffffffffffffffffffffffffffffffffff16613e05565b156138ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261376d6126b3565b8786866040518563ffffffff1660e01b815260040161378f9493929190614f15565b602060405180830381600087803b1580156137a957600080fd5b505af19250505080156137da57506040513d601f19601f820116820180604052508101906137d79190614149565b60015b61385d573d806000811461380a576040519150601f19603f3d011682016040523d82523d6000602084013e61380f565b606091505b50600081511415613855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384c90614fde565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138b2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161391584610de1565b61391f91906153ee565b9050600060076000848152602001908152602001600020549050818114613a04576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a8991906153ee565b9050600060096000848152602001908152602001600020549050600060088381548110613adf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613b27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613bc383610de1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9e906150fe565b60405180910390fd5b613cb081612647565b15613cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ce79061501e565b60405180910390fd5b613cfc600083836132ba565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d4c919061530d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b6060815260200190600190039081613e285790505090565b6000613e53613e4e8461526a565b615239565b905082815260208101848484011115613e6b57600080fd5b613e768482856154c2565b509392505050565b6000613e91613e8c8461529a565b615239565b905082815260208101848484011115613ea957600080fd5b613eb48482856154c2565b509392505050565b600081359050613ecb816156b1565b92915050565b600081359050613ee0816156c8565b92915050565b600081359050613ef5816156df565b92915050565b600081519050613f0a816156df565b92915050565b600082601f830112613f2157600080fd5b8135613f31848260208601613e40565b91505092915050565b600082601f830112613f4b57600080fd5b8135613f5b848260208601613e7e565b91505092915050565b600081359050613f73816156f6565b92915050565b600060208284031215613f8b57600080fd5b6000613f9984828501613ebc565b91505092915050565b60008060408385031215613fb557600080fd5b6000613fc385828601613ebc565b9250506020613fd485828601613ebc565b9150509250929050565b600080600060608486031215613ff357600080fd5b600061400186828701613ebc565b935050602061401286828701613ebc565b925050604061402386828701613f64565b9150509250925092565b6000806000806080858703121561404357600080fd5b600061405187828801613ebc565b945050602061406287828801613ebc565b935050604061407387828801613f64565b925050606085013567ffffffffffffffff81111561409057600080fd5b61409c87828801613f10565b91505092959194509250565b600080604083850312156140bb57600080fd5b60006140c985828601613ebc565b92505060206140da85828601613ed1565b9150509250929050565b600080604083850312156140f757600080fd5b600061410585828601613ebc565b925050602061411685828601613f64565b9150509250929050565b60006020828403121561413257600080fd5b600061414084828501613ee6565b91505092915050565b60006020828403121561415b57600080fd5b600061416984828501613efb565b91505092915050565b60006020828403121561418457600080fd5b600082013567ffffffffffffffff81111561419e57600080fd5b6141aa84828501613f3a565b91505092915050565b600080604083850312156141c657600080fd5b600083013567ffffffffffffffff8111156141e057600080fd5b6141ec85828601613f3a565b925050602083013567ffffffffffffffff81111561420957600080fd5b61421585828601613f3a565b9150509250929050565b60006020828403121561423157600080fd5b600061423f84828501613f64565b91505092915050565b61425181615422565b82525050565b61426081615434565b82525050565b61427761427282615440565b6155a9565b82525050565b6000614288826152ca565b61429281856152e0565b93506142a28185602086016154d1565b6142ab816156a0565b840191505092915050565b60006142c1826152d5565b6142cb81856152f1565b93506142db8185602086016154d1565b6142e4816156a0565b840191505092915050565b60006142fa826152d5565b6143048185615302565b93506143148185602086016154d1565b80840191505092915050565b600061432d6020836152f1565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061436d602b836152f1565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006143d36032836152f1565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006144396026836152f1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061449f601c836152f1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006144df602c83615302565b91507f22207d2c207b202274726169745f74797065223a202247726561746e6573732260008301527f2c202276616c7565223a202200000000000000000000000000000000000000006020830152602c82019050919050565b6000614545600583615302565b91507f22207d5d7d0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000614585603983615302565b91507f222c202261747472696275746573223a205b7b202274726169745f747970652260008301527f3a202241646a656374697665222c202276616c7565223a2022000000000000006020830152603982019050919050565b60006145eb6024836152f1565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146516019836152f1565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614691602c836152f1565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146f7606883615302565b91507f222c20226465736372697074696f6e223a202252616e646f6d6c792067656e6560008301527f72617465642061646a656374697665732c206e6f756e7320616e64207665726260208301527f73222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60408301527f3b6261736536342c0000000000000000000000000000000000000000000000006060830152606882019050919050565b60006147a96038836152f1565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061480f602a836152f1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148756029836152f1565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148db6020836152f1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061491b602c836152f1565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614981602283615302565b91507f7b226e616d65223a202241646a656374697665204e6f756e205665726220494460008301527f20230000000000000000000000000000000000000000000000000000000000006020830152602282019050919050565b60006149e76020836152f1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a276010836152f1565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b6000614a67602783615302565b91507f22207d2c207b202274726169745f74797065223a202256657262222c2022766160008301527f6c7565223a2022000000000000000000000000000000000000000000000000006020830152602782019050919050565b6000614acd6029836152f1565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b336021836152f1565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b99602783615302565b91507f22207d2c207b202274726169745f74797065223a20224e6f756e222c2022766160008301527f6c7565223a2022000000000000000000000000000000000000000000000000006020830152602782019050919050565b6000614bff601d83615302565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614c3f6031836152f1565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614ca5602c836152f1565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614d0b601f836152f1565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b614d47816154b8565b82525050565b6000614d598285614266565b600182019150614d698284614266565b6001820191508190509392505050565b6000614d8582846142ef565b915081905092915050565b6000614d9c82856142ef565b9150614da882846142ef565b91508190509392505050565b6000614dc0828c6142ef565b9150614dcc828b6142ef565b9150614dd8828a6142ef565b9150614de482896142ef565b9150614df082886142ef565b9150614dfc82876142ef565b9150614e0882866142ef565b9150614e1482856142ef565b9150614e2082846142ef565b91508190509a9950505050505050505050565b6000614e3e82614974565b9150614e4a82896142ef565b9150614e55826146ea565b9150614e6182886142ef565b9150614e6c82614578565b9150614e7882876142ef565b9150614e8382614b8c565b9150614e8f82866142ef565b9150614e9a82614a5a565b9150614ea682856142ef565b9150614eb1826144d2565b9150614ebd82846142ef565b9150614ec882614538565b9150819050979650505050505050565b6000614ee382614bf2565b9150614eef82846142ef565b915081905092915050565b6000602082019050614f0f6000830184614248565b92915050565b6000608082019050614f2a6000830187614248565b614f376020830186614248565b614f446040830185614d3e565b8181036060830152614f56818461427d565b905095945050505050565b6000602082019050614f766000830184614257565b92915050565b60006020820190508181036000830152614f9681846142b6565b905092915050565b60006020820190508181036000830152614fb781614320565b9050919050565b60006020820190508181036000830152614fd781614360565b9050919050565b60006020820190508181036000830152614ff7816143c6565b9050919050565b600060208201905081810360008301526150178161442c565b9050919050565b6000602082019050818103600083015261503781614492565b9050919050565b60006020820190508181036000830152615057816145de565b9050919050565b6000602082019050818103600083015261507781614644565b9050919050565b6000602082019050818103600083015261509781614684565b9050919050565b600060208201905081810360008301526150b78161479c565b9050919050565b600060208201905081810360008301526150d781614802565b9050919050565b600060208201905081810360008301526150f781614868565b9050919050565b60006020820190508181036000830152615117816148ce565b9050919050565b600060208201905081810360008301526151378161490e565b9050919050565b60006020820190508181036000830152615157816149da565b9050919050565b6000602082019050818103600083015261517781614a1a565b9050919050565b6000602082019050818103600083015261519781614ac0565b9050919050565b600060208201905081810360008301526151b781614b26565b9050919050565b600060208201905081810360008301526151d781614c32565b9050919050565b600060208201905081810360008301526151f781614c98565b9050919050565b6000602082019050818103600083015261521781614cfe565b9050919050565b60006020820190506152336000830184614d3e565b92915050565b6000604051905081810181811067ffffffffffffffff821117156152605761525f615671565b5b8060405250919050565b600067ffffffffffffffff82111561528557615284615671565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152b5576152b4615671565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615318826154b8565b9150615323836154b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615358576153576155e4565b5b828201905092915050565b600061536e826154b8565b9150615379836154b8565b92508261538957615388615613565b5b828204905092915050565b600061539f826154b8565b91506153aa836154b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153e3576153e26155e4565b5b828202905092915050565b60006153f9826154b8565b9150615404836154b8565b925082821015615417576154166155e4565b5b828203905092915050565b600061542d82615498565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156154ef5780820151818401526020810190506154d4565b838111156154fe576000848401525b50505050565b600061550f826154b8565b91506000821415615523576155226155e4565b5b600182039050919050565b6000600282049050600182168061554657607f821691505b6020821081141561555a57615559615642565b5b50919050565b600061556b826154b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561559e5761559d6155e4565b5b600182019050919050565b6000819050919050565b60006155be826154b8565b91506155c9836154b8565b9250826155d9576155d8615613565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6156ba81615422565b81146156c557600080fd5b50565b6156d181615434565b81146156dc57600080fd5b50565b6156e88161546c565b81146156f357600080fd5b50565b6156ff816154b8565b811461570a57600080fd5b5056fe3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20363470783b207d2e736d616c6c207b20666f6e742d73697a653a2033327078207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22233c2f746578743e3c746578742069643d2264657363726970746f722220783d223530252220793d2235252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736520736d616c6c223e22202f3e3c746578742069643d2261646a6563746976652220783d223530252220793d223335252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d2262617365223e3c2f746578743e3c616e696d61746520687265663d222361646a65637469766522206174747269627574654e616d653d2279222066726f6d3d223335252220746f3d22323025222076616c7565733d223335253b203230253b2033352522206475723d22302e35732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d32222f3e3c616e696d61746520687265663d22236e6f756e22206174747269627574654e616d653d2278222066726f6d3d223330252220746f3d22373025222076616c7565733d223530253b203330253b203530253b203730253b203530253b22206475723d2231732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d33222f3e3c616e696d61746520687265663d22237665726222206174747269627574654e616d653d2279222066726f6d3d223635252220746f3d22383025222076616c7565733d223635253b203830253b203635253b22206475723d22302e32732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d33222f3e3c616e696d61746520687265663d222364657363726970746f7222206174747269627574654e616d653d2278222066726f6d3d223530252220746f3d22353025222076616c7565733d222d35253b20313035253b22206475723d2234732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d222f3e3c2f7376673e3c2f746578743e3c746578742069643d226e6f756e2220783d223530252220793d223530252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c746578742069643d22766572622220783d223530252220793d223635252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035313220353132223e3c7374796c653e2e62617365207b2066696c6c3a2023a26469706673582212200572675cba783cfca4f1a7e3dc762700dff0baa3e64cd64b884ba2ebe70d883464736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063ad39741011610097578063e7e538c211610071578063e7e538c214610504578063e985e9c514610534578063f2fde38b14610564578063f4124c0114610580576101a9565b8063ad39741014610488578063b88d4fde146104b8578063c87b56dd146104d4576101a9565b80638da5cb5b116100d35780638da5cb5b1461040057806392974fde1461041e57806395d89b411461044e578063a22cb4651461046c576101a9565b806370a0823114610396578063715018a6146103c65780637e2874a4146103d0576101a9565b80632f745c5911610166578063434f48c411610140578063434f48c4146102ea5780634a3930a6146103065780634f6ccce7146103365780636352211e14610366576101a9565b80632f745c5914610282578063379607f5146102b257806342842e0e146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c39190614120565b6105b0565b6040516101d59190614f61565b60405180910390f35b6101e661062a565b6040516101f39190614f7c565b60405180910390f35b6102166004803603810190610211919061421f565b6106bc565b6040516102239190614efa565b60405180910390f35b610246600480360381019061024191906140e4565b610741565b005b610250610859565b60405161025d919061521e565b60405180910390f35b610280600480360381019061027b9190613fde565b610866565b005b61029c600480360381019061029791906140e4565b6108c6565b6040516102a9919061521e565b60405180910390f35b6102cc60048036038101906102c7919061421f565b61096b565b005b6102e860048036038101906102e39190613fde565b610a25565b005b61030460048036038101906102ff919061421f565b610a45565b005b610320600480360381019061031b9190614172565b610b7c565b60405161032d9190614f7c565b60405180910390f35b610350600480360381019061034b919061421f565b610c98565b60405161035d919061521e565b60405180910390f35b610380600480360381019061037b919061421f565b610d2f565b60405161038d9190614efa565b60405180910390f35b6103b060048036038101906103ab9190613f79565b610de1565b6040516103bd919061521e565b60405180910390f35b6103ce610e99565b005b6103ea60048036038101906103e591906141b3565b610f21565b6040516103f79190614f7c565b60405180910390f35b61040861102d565b6040516104159190614efa565b60405180910390f35b61043860048036038101906104339190614172565b611057565b6040516104459190614f7c565b60405180910390f35b610456611173565b6040516104639190614f7c565b60405180910390f35b610486600480360381019061048191906140a8565b611205565b005b6104a2600480360381019061049d9190614172565b611386565b6040516104af9190614f7c565b60405180910390f35b6104d260048036038101906104cd919061402d565b6114a2565b005b6104ee60048036038101906104e9919061421f565b611504565b6040516104fb9190614f7c565b60405180910390f35b61051e60048036038101906105199190614172565b6121bd565b60405161052b9190614f7c565b60405180910390f35b61054e60048036038101906105499190613fa2565b6122d9565b60405161055b9190614f61565b60405180910390f35b61057e60048036038101906105799190613f79565b61236d565b005b61059a600480360381019061059591906141b3565b612465565b6040516105a79190614f7c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610623575061062282612565565b5b9050919050565b6060600080546106399061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546106659061552e565b80156106b25780601f10610687576101008083540402835291602001916106b2565b820191906000526020600020905b81548152906001019060200180831161069557829003601f168201915b5050505050905090565b60006106c782612647565b610706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fd9061511e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074c82610d2f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b49061519e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107dc6126b3565b73ffffffffffffffffffffffffffffffffffffffff16148061080b575061080a816108056126b3565b6122d9565b5b61084a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108419061509e565b60405180910390fd5b61085483836126bb565b505050565b6000600880549050905090565b6108776108716126b3565b82612774565b6108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad906151be565b60405180910390fd5b6108c1838383612852565b505050565b60006108d183610de1565b8210610912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090990614fbe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a8906151fe565b60405180910390fd5b6002600a819055506000811180156109ca575061038581105b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a009061515e565b60405180910390fd5b610a1a610a146126b3565b82612aae565b6001600a8190555050565b610a40838383604051806020016040528060008152506114a2565b505050565b6002600a541415610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a82906151fe565b60405180910390fd5b6002600a81905550610a9b6126b3565b73ffffffffffffffffffffffffffffffffffffffff16610ab961102d565b73ffffffffffffffffffffffffffffffffffffffff1614610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b069061513e565b60405180910390fd5b61038481118015610b2157506103a981105b610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b579061515e565b60405180910390fd5b610b71610b6b61102d565b82612aae565b6001600a8190555050565b6060610c91826040518060400160405280600581526020017f4e4f554e53000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610c86578382906000526020600020018054610bf99061552e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c259061552e565b8015610c725780601f10610c4757610100808354040283529160200191610c72565b820191906000526020600020905b815481529060010190602001808311610c5557829003601f168201915b505050505081526020019060010190610bda565b505050506000612acc565b9050919050565b6000610ca2610859565b8210610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda906151de565b60405180910390fd5b60088281548110610d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906150de565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e49906150be565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ea16126b3565b73ffffffffffffffffffffffffffffffffffffffff16610ebf61102d565b73ffffffffffffffffffffffffffffffffffffffff1614610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9061513e565b60405180910390fd5b610f1f6000612d0a565b565b6060600060c86037610f538587604051602001610f3f929190614d90565b604051602081830303815290604052612dd0565b610f5d91906155b3565b610f67919061530d565b90506000610f7482612e03565b905080600281518110610fb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b81600381518110610ff5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b604051602001611011929190614d4d565b6040516020818303038152906040529050809250505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606061116c826040518060400160405280600a81526020017f44455343524950544f5200000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156111615783829060005260206000200180546110d49061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546111009061552e565b801561114d5780601f106111225761010080835404028352916020019161114d565b820191906000526020600020905b81548152906001019060200180831161113057829003601f168201915b5050505050815260200190600101906110b5565b505050506001612acc565b9050919050565b6060600180546111829061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae9061552e565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b5050505050905090565b61120d6126b3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112729061505e565b60405180910390fd5b80600560006112886126b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113356126b3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161137a9190614f61565b60405180910390a35050565b606061149b826040518060400160405280600a81526020017f41444a4543544956455300000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156114905783829060005260206000200180546114039061552e565b80601f016020809104026020016040519081016040528092919081815260200182805461142f9061552e565b801561147c5780601f106114515761010080835404028352916020019161147c565b820191906000526020600020905b81548152906001019060200180831161145f57829003601f168201915b5050505050815260200190600101906113e4565b505050506000612acc565b9050919050565b6114b36114ad6126b3565b83612774565b6114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e9906151be565b60405180910390fd5b6114fe84848484612e89565b50505050565b6060600061151183612ee5565b905061151b613e18565b6040518060a0016040528060788152602001615bfa607891398160006011811061156e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115b5826040518060400160405280600181526020017f5200000000000000000000000000000000000000000000000000000000000000815250612465565b816001601181106115ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611636826040518060400160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250612465565b81600260118110611670577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506116b7826040518060400160405280600181526020017f4200000000000000000000000000000000000000000000000000000000000000815250612465565b816003601181106116f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a001604052806077815260200161570e607791398160046011811061174c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611793826040518060400160405280600181526020017f5200000000000000000000000000000000000000000000000000000000000000815250610f21565b816005601181106117cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611814826040518060400160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250610f21565b8160066011811061184e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611895826040518060400160405280600181526020017f4200000000000000000000000000000000000000000000000000000000000000815250610f21565b816007601181106118cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a00160405280606681526020016157f4606691398160086011811061192a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061193b82611386565b81600960118110611975577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a0016040528060648152602001615af26064913981600a601181106119d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506119e182610b7c565b81600b60118110611a1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a0016040528060648152602001615b966064913981600c60118110611a76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a87826121bd565b81600d60118110611ac1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060a00160405280606f8152602001615785606f913981600e60118110611b1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611b2d82611057565b81600f60118110611b67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806102c00160405280610298815260200161585a610298913981601060118110611bc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250600081600060118110611c09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600160118110611c48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260118110611c87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600360118110611cc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600460118110611d05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560118110611d44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660118110611d83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600760118110611dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189600860118110611e01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611e1e99989796959493929190614db4565b60405160208183030381529060405290508082600960118110611e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a60118110611ea9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b60118110611ee8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c60118110611f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d60118110611f66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60118110611fa5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f60118110611fe4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189601060118110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161204099989796959493929190614db4565b6040516020818303038152906040529050600061218d61205f87612ee5565b61206884613092565b856009601181106120a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600b601181106120e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600d60118110612120577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f6011811061215f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161217996959493929190614e33565b604051602081830303815290604052613092565b9050806040516020016121a09190614ed8565b604051602081830303815290604052915081945050505050919050565b60606122d2826040518060400160405280600581526020017f5645524253000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156122c757838290600052602060002001805461223a9061552e565b80601f01602080910402602001604051908101604052809291908181526020018280546122669061552e565b80156122b35780601f10612288576101008083540402835291602001916122b3565b820191906000526020600020905b81548152906001019060200180831161229657829003601f168201915b50505050508152602001906001019061221b565b505050506000612acc565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123756126b3565b73ffffffffffffffffffffffffffffffffffffffff1661239361102d565b73ffffffffffffffffffffffffffffffffffffffff16146123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e09061513e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090614ffe565b60405180910390fd5b61246281612d0a565b50565b6060600060646124958486604051602001612481929190614d90565b604051602081830303815290604052612dd0565b61249f91906155b3565b905060006124ac82612e03565b9050806002815181106124e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b8160038151811061252d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b604051602001612549929190614d4d565b6040516020818303038152906040529050809250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061263057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612640575061263f82613250565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661272e83610d2f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061277f82612647565b6127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b59061507e565b60405180910390fd5b60006127c983610d2f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061283857508373ffffffffffffffffffffffffffffffffffffffff16612820846106bc565b73ffffffffffffffffffffffffffffffffffffffff16145b80612849575061284881856122d9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661287282610d2f565b73ffffffffffffffffffffffffffffffffffffffff16146128c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bf9061517e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f9061503e565b60405180910390fd5b6129438383836132ba565b61294e6000826126bb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299e91906153ee565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f5919061530d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612ac88282604051806020016040528060008152506133ce565b5050565b60606000612afa8587604051602001612ae6929190614d90565b604051602081830303815290604052612dd0565b9050600084855183612b0c91906155b3565b81518110612b43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600115158415151415612cfd576000603283612b6991906155b3565b90506030811115612bbd5785600481518110612bae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cfb565b602d811115612c0f5785600381518110612c00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cfa565b6028811115612c615785600281518110612c52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cf9565b6021811115612cb35785600181518110612ca4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519150612cf8565b85600081518110612ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015191505b5b5b5b505b8092505050949350505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081604051602001612de39190614d79565b6040516020818303038152906040528051906020012060001c9050919050565b60606000821415612e4b576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050612e84565b600082905060005b60008214612e75578080612e6690615560565b915050600882901c9150612e53565b612e7f8482613429565b925050505b919050565b612e94848484612852565b612ea084848484613723565b612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed690614fde565b60405180910390fd5b50505050565b60606000821415612f2d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061308d565b600082905060005b60008214612f5f578080612f4890615560565b915050600a82612f589190615363565b9150612f35565b60008167ffffffffffffffff811115612fa1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612fd35781602001600182028036833780820191505090505b5090505b6000851461308657600182612fec91906153ee565b9150600a85612ffb91906155b3565b6030613007919061530d565b60f81b818381518110613043577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561307f9190615363565b9450612fd7565b8093505050505b919050565b606060008251905060008114156130bb576040518060200160405280600081525091505061324b565b600060036002836130cc919061530d565b6130d69190615363565b60046130e29190615394565b905060006020826130f3919061530d565b67ffffffffffffffff811115613132577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131645781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615b56604091399050600181016020830160005b868110156132085760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061318f565b50600386066001811461322257600281146132325761323d565b613d3d60f01b600283035261323d565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132c58383836138ba565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561330857613303816138bf565b613347565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613346576133458382613908565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338a5761338581613a75565b6133c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133c8576133c78282613bb8565b5b5b505050565b6133d88383613c37565b6133e56000848484613723565b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b90614fde565b60405180910390fd5b505050565b60606000600283600261343c9190615394565b613446919061530d565b67ffffffffffffffff811115613485577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134b75781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613515577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061359f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026135df9190615394565b6135e9919061530d565b90505b60018111156136d5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613651577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061368e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806136ce90615504565b90506135ec565b5060008414613719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371090614f9e565b60405180910390fd5b8091505092915050565b60006137448473ffffffffffffffffffffffffffffffffffffffff16613e05565b156138ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261376d6126b3565b8786866040518563ffffffff1660e01b815260040161378f9493929190614f15565b602060405180830381600087803b1580156137a957600080fd5b505af19250505080156137da57506040513d601f19601f820116820180604052508101906137d79190614149565b60015b61385d573d806000811461380a576040519150601f19603f3d011682016040523d82523d6000602084013e61380f565b606091505b50600081511415613855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384c90614fde565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138b2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161391584610de1565b61391f91906153ee565b9050600060076000848152602001908152602001600020549050818114613a04576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a8991906153ee565b9050600060096000848152602001908152602001600020549050600060088381548110613adf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613b27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613bc383610de1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9e906150fe565b60405180910390fd5b613cb081612647565b15613cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ce79061501e565b60405180910390fd5b613cfc600083836132ba565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d4c919061530d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b6060815260200190600190039081613e285790505090565b6000613e53613e4e8461526a565b615239565b905082815260208101848484011115613e6b57600080fd5b613e768482856154c2565b509392505050565b6000613e91613e8c8461529a565b615239565b905082815260208101848484011115613ea957600080fd5b613eb48482856154c2565b509392505050565b600081359050613ecb816156b1565b92915050565b600081359050613ee0816156c8565b92915050565b600081359050613ef5816156df565b92915050565b600081519050613f0a816156df565b92915050565b600082601f830112613f2157600080fd5b8135613f31848260208601613e40565b91505092915050565b600082601f830112613f4b57600080fd5b8135613f5b848260208601613e7e565b91505092915050565b600081359050613f73816156f6565b92915050565b600060208284031215613f8b57600080fd5b6000613f9984828501613ebc565b91505092915050565b60008060408385031215613fb557600080fd5b6000613fc385828601613ebc565b9250506020613fd485828601613ebc565b9150509250929050565b600080600060608486031215613ff357600080fd5b600061400186828701613ebc565b935050602061401286828701613ebc565b925050604061402386828701613f64565b9150509250925092565b6000806000806080858703121561404357600080fd5b600061405187828801613ebc565b945050602061406287828801613ebc565b935050604061407387828801613f64565b925050606085013567ffffffffffffffff81111561409057600080fd5b61409c87828801613f10565b91505092959194509250565b600080604083850312156140bb57600080fd5b60006140c985828601613ebc565b92505060206140da85828601613ed1565b9150509250929050565b600080604083850312156140f757600080fd5b600061410585828601613ebc565b925050602061411685828601613f64565b9150509250929050565b60006020828403121561413257600080fd5b600061414084828501613ee6565b91505092915050565b60006020828403121561415b57600080fd5b600061416984828501613efb565b91505092915050565b60006020828403121561418457600080fd5b600082013567ffffffffffffffff81111561419e57600080fd5b6141aa84828501613f3a565b91505092915050565b600080604083850312156141c657600080fd5b600083013567ffffffffffffffff8111156141e057600080fd5b6141ec85828601613f3a565b925050602083013567ffffffffffffffff81111561420957600080fd5b61421585828601613f3a565b9150509250929050565b60006020828403121561423157600080fd5b600061423f84828501613f64565b91505092915050565b61425181615422565b82525050565b61426081615434565b82525050565b61427761427282615440565b6155a9565b82525050565b6000614288826152ca565b61429281856152e0565b93506142a28185602086016154d1565b6142ab816156a0565b840191505092915050565b60006142c1826152d5565b6142cb81856152f1565b93506142db8185602086016154d1565b6142e4816156a0565b840191505092915050565b60006142fa826152d5565b6143048185615302565b93506143148185602086016154d1565b80840191505092915050565b600061432d6020836152f1565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b600061436d602b836152f1565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006143d36032836152f1565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006144396026836152f1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061449f601c836152f1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006144df602c83615302565b91507f22207d2c207b202274726169745f74797065223a202247726561746e6573732260008301527f2c202276616c7565223a202200000000000000000000000000000000000000006020830152602c82019050919050565b6000614545600583615302565b91507f22207d5d7d0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000614585603983615302565b91507f222c202261747472696275746573223a205b7b202274726169745f747970652260008301527f3a202241646a656374697665222c202276616c7565223a2022000000000000006020830152603982019050919050565b60006145eb6024836152f1565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146516019836152f1565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614691602c836152f1565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146f7606883615302565b91507f222c20226465736372697074696f6e223a202252616e646f6d6c792067656e6560008301527f72617465642061646a656374697665732c206e6f756e7320616e64207665726260208301527f73222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60408301527f3b6261736536342c0000000000000000000000000000000000000000000000006060830152606882019050919050565b60006147a96038836152f1565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061480f602a836152f1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148756029836152f1565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148db6020836152f1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061491b602c836152f1565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614981602283615302565b91507f7b226e616d65223a202241646a656374697665204e6f756e205665726220494460008301527f20230000000000000000000000000000000000000000000000000000000000006020830152602282019050919050565b60006149e76020836152f1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a276010836152f1565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b6000614a67602783615302565b91507f22207d2c207b202274726169745f74797065223a202256657262222c2022766160008301527f6c7565223a2022000000000000000000000000000000000000000000000000006020830152602782019050919050565b6000614acd6029836152f1565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b336021836152f1565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b99602783615302565b91507f22207d2c207b202274726169745f74797065223a20224e6f756e222c2022766160008301527f6c7565223a2022000000000000000000000000000000000000000000000000006020830152602782019050919050565b6000614bff601d83615302565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614c3f6031836152f1565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614ca5602c836152f1565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614d0b601f836152f1565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b614d47816154b8565b82525050565b6000614d598285614266565b600182019150614d698284614266565b6001820191508190509392505050565b6000614d8582846142ef565b915081905092915050565b6000614d9c82856142ef565b9150614da882846142ef565b91508190509392505050565b6000614dc0828c6142ef565b9150614dcc828b6142ef565b9150614dd8828a6142ef565b9150614de482896142ef565b9150614df082886142ef565b9150614dfc82876142ef565b9150614e0882866142ef565b9150614e1482856142ef565b9150614e2082846142ef565b91508190509a9950505050505050505050565b6000614e3e82614974565b9150614e4a82896142ef565b9150614e55826146ea565b9150614e6182886142ef565b9150614e6c82614578565b9150614e7882876142ef565b9150614e8382614b8c565b9150614e8f82866142ef565b9150614e9a82614a5a565b9150614ea682856142ef565b9150614eb1826144d2565b9150614ebd82846142ef565b9150614ec882614538565b9150819050979650505050505050565b6000614ee382614bf2565b9150614eef82846142ef565b915081905092915050565b6000602082019050614f0f6000830184614248565b92915050565b6000608082019050614f2a6000830187614248565b614f376020830186614248565b614f446040830185614d3e565b8181036060830152614f56818461427d565b905095945050505050565b6000602082019050614f766000830184614257565b92915050565b60006020820190508181036000830152614f9681846142b6565b905092915050565b60006020820190508181036000830152614fb781614320565b9050919050565b60006020820190508181036000830152614fd781614360565b9050919050565b60006020820190508181036000830152614ff7816143c6565b9050919050565b600060208201905081810360008301526150178161442c565b9050919050565b6000602082019050818103600083015261503781614492565b9050919050565b60006020820190508181036000830152615057816145de565b9050919050565b6000602082019050818103600083015261507781614644565b9050919050565b6000602082019050818103600083015261509781614684565b9050919050565b600060208201905081810360008301526150b78161479c565b9050919050565b600060208201905081810360008301526150d781614802565b9050919050565b600060208201905081810360008301526150f781614868565b9050919050565b60006020820190508181036000830152615117816148ce565b9050919050565b600060208201905081810360008301526151378161490e565b9050919050565b60006020820190508181036000830152615157816149da565b9050919050565b6000602082019050818103600083015261517781614a1a565b9050919050565b6000602082019050818103600083015261519781614ac0565b9050919050565b600060208201905081810360008301526151b781614b26565b9050919050565b600060208201905081810360008301526151d781614c32565b9050919050565b600060208201905081810360008301526151f781614c98565b9050919050565b6000602082019050818103600083015261521781614cfe565b9050919050565b60006020820190506152336000830184614d3e565b92915050565b6000604051905081810181811067ffffffffffffffff821117156152605761525f615671565b5b8060405250919050565b600067ffffffffffffffff82111561528557615284615671565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152b5576152b4615671565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615318826154b8565b9150615323836154b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615358576153576155e4565b5b828201905092915050565b600061536e826154b8565b9150615379836154b8565b92508261538957615388615613565b5b828204905092915050565b600061539f826154b8565b91506153aa836154b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153e3576153e26155e4565b5b828202905092915050565b60006153f9826154b8565b9150615404836154b8565b925082821015615417576154166155e4565b5b828203905092915050565b600061542d82615498565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156154ef5780820151818401526020810190506154d4565b838111156154fe576000848401525b50505050565b600061550f826154b8565b91506000821415615523576155226155e4565b5b600182039050919050565b6000600282049050600182168061554657607f821691505b6020821081141561555a57615559615642565b5b50919050565b600061556b826154b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561559e5761559d6155e4565b5b600182019050919050565b6000819050919050565b60006155be826154b8565b91506155c9836154b8565b9250826155d9576155d8615613565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6156ba81615422565b81146156c557600080fd5b50565b6156d181615434565b81146156dc57600080fd5b50565b6156e88161546c565b81146156f357600080fd5b50565b6156ff816154b8565b811461570a57600080fd5b5056fe3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20363470783b207d2e736d616c6c207b20666f6e742d73697a653a2033327078207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22233c2f746578743e3c746578742069643d2264657363726970746f722220783d223530252220793d2235252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736520736d616c6c223e22202f3e3c746578742069643d2261646a6563746976652220783d223530252220793d223335252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d2262617365223e3c2f746578743e3c616e696d61746520687265663d222361646a65637469766522206174747269627574654e616d653d2279222066726f6d3d223335252220746f3d22323025222076616c7565733d223335253b203230253b2033352522206475723d22302e35732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d32222f3e3c616e696d61746520687265663d22236e6f756e22206174747269627574654e616d653d2278222066726f6d3d223330252220746f3d22373025222076616c7565733d223530253b203330253b203530253b203730253b203530253b22206475723d2231732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d33222f3e3c616e696d61746520687265663d22237665726222206174747269627574654e616d653d2279222066726f6d3d223635252220746f3d22383025222076616c7565733d223635253b203830253b203635253b22206475723d22302e32732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d33222f3e3c616e696d61746520687265663d222364657363726970746f7222206174747269627574654e616d653d2278222066726f6d3d223530252220746f3d22353025222076616c7565733d222d35253b20313035253b22206475723d2234732220626567696e3d22636c69636b2220726570656174436f756e743d22696e646566696e697465222066696c6c3d22667265657a65222069643d22616e696d222f3e3c2f7376673e3c2f746578743e3c746578742069643d226e6f756e2220783d223530252220793d223530252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c746578742069643d22766572622220783d223530252220793d223635252220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035313220353132223e3c7374796c653e2e62617365207b2066696c6c3a2023a26469706673582212200572675cba783cfca4f1a7e3dc762700dff0baa3e64cd64b884ba2ebe70d883464736f6c63430008000033

Deployed Bytecode Sourcemap

46464:10559:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40052:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26417:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28110:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27633:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40855:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29169:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40436:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54740:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29616:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54919:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48434:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41045:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26024:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25667:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10103:94;;;:::i;:::-;;48894:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9452:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48710:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26586:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28490:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48249:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29872:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50618:4114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48572:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28888:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10352:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49330:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40052:300;40199:4;40256:35;40241:50;;;:11;:50;;;;:103;;;;40308:36;40332:11;40308:23;:36::i;:::-;40241:103;40221:123;;40052:300;;;:::o;26417:100::-;26471:13;26504:5;26497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26417:100;:::o;28110:308::-;28231:7;28278:16;28286:7;28278;:16::i;:::-;28256:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28386:15;:24;28402:7;28386:24;;;;;;;;;;;;;;;;;;;;;28379:31;;28110:308;;;:::o;27633:411::-;27714:13;27730:23;27745:7;27730:14;:23::i;:::-;27714:39;;27778:5;27772:11;;:2;:11;;;;27764:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27872:5;27856:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27881:37;27898:5;27905:12;:10;:12::i;:::-;27881:16;:37::i;:::-;27856:62;27834:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28015:21;28024:2;28028:7;28015:8;:21::i;:::-;27633:411;;;:::o;40855:113::-;40916:7;40943:10;:17;;;;40936:24;;40855:113;:::o;29169:376::-;29378:41;29397:12;:10;:12::i;:::-;29411:7;29378:18;:41::i;:::-;29356:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29509:28;29519:4;29525:2;29529:7;29509:9;:28::i;:::-;29169:376;;;:::o;40436:343::-;40578:7;40633:23;40650:5;40633:16;:23::i;:::-;40625:5;:31;40603:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;40745:12;:19;40758:5;40745:19;;;;;;;;;;;;;;;:26;40765:5;40745:26;;;;;;;;;;;;40738:33;;40436:343;;;;:::o;54740:171::-;12420:1;13016:7;;:19;;13008:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12420:1;13149:7;:18;;;;54821:1:::1;54811:7;:11;:28;;;;;54836:3;54826:7;:13;54811:28;54803:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54871:32;54881:12;:10;:12::i;:::-;54895:7;54871:9;:32::i;:::-;12376:1:::0;13328:7;:22;;;;54740:171;:::o;29616:185::-;29754:39;29771:4;29777:2;29781:7;29754:39;;;;;;;;;;;;:16;:39::i;:::-;29616:185;;;:::o;54919:183::-;12420:1;13016:7;;:19;;13008:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12420:1;13149:7;:18;;;;9683:12:::1;:10;:12::i;:::-;9672:23;;:7;:5;:7::i;:::-;:23;;;9664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55015:3:::2;55005:7;:13;:30;;;;;55032:3;55022:7;:13;55005:30;54997:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55067:27;55077:7;:5;:7::i;:::-;55086;55067:9;:27::i;:::-;12376:1:::0;13328:7;:22;;;;54919:183;:::o;48434:130::-;48491:13;48524:32;48530:2;48524:32;;;;;;;;;;;;;;;;;48543:5;48524:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48550:5;48524;:32::i;:::-;48517:39;;48434:130;;;:::o;41045:320::-;41165:7;41220:30;:28;:30::i;:::-;41212:5;:38;41190:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;41340:10;41351:5;41340:17;;;;;;;;;;;;;;;;;;;;;;;;41333:24;;41045:320;;;:::o;26024:326::-;26141:7;26166:13;26182:7;:16;26190:7;26182:16;;;;;;;;;;;;;;;;;;;;;26166:32;;26248:1;26231:19;;:5;:19;;;;26209:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26337:5;26330:12;;;26024:326;;;:::o;25667:295::-;25784:7;25848:1;25831:19;;:5;:19;;;;25809:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25938:9;:16;25948:5;25938:16;;;;;;;;;;;;;;;;25931:23;;25667:295;;;:::o;10103:94::-;9683:12;:10;:12::i;:::-;9672:23;;:7;:5;:7::i;:::-;:23;;;9664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10168:21:::1;10186:1;10168:9;:21::i;:::-;10103:94::o:0;48894:428::-;49013:13;49044;49130:3;49111:2;49061:47;49092:9;49103:2;49075:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49061:6;:47::i;:::-;:52;;;;:::i;:::-;49060:73;;;;:::i;:::-;49044:89;;49144:27;49174:18;49186:5;49174:11;:18::i;:::-;49144:48;;49237:14;49252:1;49237:17;;;;;;;;;;;;;;;;;;;;;;;;49256:14;49271:1;49256:17;;;;;;;;;;;;;;;;;;;;;;;;49220:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49203:71;;49299:14;49285:29;;;;48894:428;;;;:::o;9452:87::-;9498:7;9525:6;;;;;;;;;;;9518:13;;9452:87;:::o;48710:176::-;48798:13;48836:42;48842:2;48836:42;;;;;;;;;;;;;;;;;48860:11;48836:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48873:4;48836:5;:42::i;:::-;48829:49;;48710:176;;;:::o;26586:104::-;26642:13;26675:7;26668:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26586:104;:::o;28490:327::-;28637:12;:10;:12::i;:::-;28625:24;;:8;:24;;;;28617:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28737:8;28692:18;:32;28711:12;:10;:12::i;:::-;28692:32;;;;;;;;;;;;;;;:42;28725:8;28692:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28790:8;28761:48;;28776:12;:10;:12::i;:::-;28761:48;;;28800:8;28761:48;;;;;;:::i;:::-;;;;;;;;28490:327;;:::o;48249:177::-;48338:13;48376:42;48382:2;48376:42;;;;;;;;;;;;;;;;;48400:10;48376:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48412:5;48376;:42::i;:::-;48369:49;;48249:177;;;:::o;29872:365::-;30061:41;30080:12;:10;:12::i;:::-;30094:7;30061:18;:41::i;:::-;30039:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30190:39;30204:4;30210:2;30214:7;30223:5;30190:13;:39::i;:::-;29872:365;;;;:::o;50618:4114::-;50719:13;50750:16;50769:17;50778:7;50769:8;:17::i;:::-;50750:36;;50799:23;;:::i;:::-;50833:157;;;;;;;;;;;;;;;;;:5;50853:1;50833:32;;;;;;;;;;;;;;;;;;:157;;;;51014:27;51033:2;51014:27;;;;;;;;;;;;;;;;;:18;:27::i;:::-;51003:5;51009:1;51003:8;;;;;;;;;;;;;;;;;;:38;;;;51065:27;51084:2;51065:27;;;;;;;;;;;;;;;;;:18;:27::i;:::-;51054:5;51060:1;51054:8;;;;;;;;;;;;;;;;;;:38;;;;51116:27;51135:2;51116:27;;;;;;;;;;;;;;;;;:18;:27::i;:::-;51105:5;51111:1;51105:8;;;;;;;;;;;;;;;;;;:38;;;;51156:156;;;;;;;;;;;;;;;;;:5;51176:1;51156:32;;;;;;;;;;;;;;;;;;:156;;;;51336:27;51355:2;51336:27;;;;;;;;;;;;;;;;;:18;:27::i;:::-;51325:5;51331:1;51325:8;;;;;;;;;;;;;;;;;;:38;;;;51387:27;51406:2;51387:27;;;;;;;;;;;;;;;;;:18;:27::i;:::-;51376:5;51382:1;51376:8;;;;;;;;;;;;;;;;;;:38;;;;51438:27;51457:2;51438:27;;;;;;;;;;;;;;;;;:18;:27::i;:::-;51427:5;51433:1;51427:8;;;;;;;;;;;;;;;;;;:38;;;;51478:139;;;;;;;;;;;;;;;;;:5;51498:1;51478:32;;;;;;;;;;;;;;;;;;:139;;;;51641:17;51655:2;51641:13;:17::i;:::-;51630:5;51636:1;51630:8;;;;;;;;;;;;;;;;;;:28;;;;51671:138;;;;;;;;;;;;;;;;;:5;51691:2;51671:33;;;;;;;;;;;;;;;;;;:138;;;;51834:12;51843:2;51834:8;:12::i;:::-;51822:5;51828:2;51822:9;;;;;;;;;;;;;;;;;;:24;;;;51859:138;;;;;;;;;;;;;;;;;:5;51879:2;51859:33;;;;;;;;;;;;;;;;;;:138;;;;52022:12;52031:2;52022:8;:12::i;:::-;52010:5;52016:2;52010:9;;;;;;;;;;;;;;;;;;:24;;;;52047:149;;;;;;;;;;;;;;;;;:5;52067:2;52047:33;;;;;;;;;;;;;;;;;;:149;;;;52221:16;52234:2;52221:12;:16::i;:::-;52209:5;52215:2;52209:9;;;;;;;;;;;;;;;;;;:28;;;;52250:702;;;;;;;;;;;;;;;;;:5;52270:2;52250:33;;;;;;;;;;;;;;;;;;:702;;;;52965:20;53044:5;53050:1;53044:8;;;;;;;;;;;;;;;;;;;53071:5;53077:1;53071:8;;;;;;;;;;;;;;;;;;;53098:5;53104:1;53098:8;;;;;;;;;;;;;;;;;;;53125:5;53131:1;53125:8;;;;;;;;;;;;;;;;;;;53152:5;53158:1;53152:8;;;;;;;;;;;;;;;;;;;53179:5;53185:1;53179:8;;;;;;;;;;;;;;;;;;;53206:5;53212:1;53206:8;;;;;;;;;;;;;;;;;;;53233:5;53239:1;53233:8;;;;;;;;;;;;;;;;;;;53260:5;53266:1;53260:8;;;;;;;;;;;;;;;;;;;53009:274;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52965:329;;53370:6;53395:5;53401:1;53395:8;;;;;;;;;;;;;;;;;;;53422:5;53428:2;53422:9;;;;;;;;;;;;;;;;;;;53450:5;53456:2;53450:9;;;;;;;;;;;;;;;;;;;53478:5;53484:2;53478:9;;;;;;;;;;;;;;;;;;;53506:5;53512:2;53506:9;;;;;;;;;;;;;;;;;;;53534:5;53540:2;53534:9;;;;;;;;;;;;;;;;;;;53562:5;53568:2;53562:9;;;;;;;;;;;;;;;;;;;53590:5;53596:2;53590:9;;;;;;;;;;;;;;;;;;;53335:279;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53305:320;;53638:18;53659:932;53846:17;53855:7;53846:8;:17::i;:::-;54023:28;54043:6;54023:13;:28::i;:::-;54164:5;54170:1;54164:8;;;;;;;;;;;;;;;;;;;54267:5;54273:2;54267:9;;;;;;;;;;;;;;;;;;;54371:5;54377:2;54371:9;;;;;;;;;;;;;;;;;;;54480:5;54486:2;54480:9;;;;;;;;;;;;;;;;;;;53740:806;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53659:13;:932::i;:::-;53638:953;;54682:4;54632:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;54602:96;;54718:6;54711:13;;;;;;50618:4114;;;:::o;48572:130::-;48629:13;48662:32;48668:2;48662:32;;;;;;;;;;;;;;;;;48681:5;48662:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48688:5;48662;:32::i;:::-;48655:39;;48572:130;;;:::o;28888:214::-;29030:4;29059:18;:25;29078:5;29059:25;;;;;;;;;;;;;;;:35;29085:8;29059:35;;;;;;;;;;;;;;;;;;;;;;;;;29052:42;;28888:214;;;;:::o;10352:229::-;9683:12;:10;:12::i;:::-;9672:23;;:7;:5;:7::i;:::-;:23;;;9664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10475:1:::1;10455:22;;:8;:22;;;;10433:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;10554:19;10564:8;10554:9;:19::i;:::-;10352:229:::0;:::o;49330:410::-;49449:13;49480;49547:3;49497:47;49528:9;49539:2;49511:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49497:6;:47::i;:::-;:53;;;;:::i;:::-;49480:71;;49562:27;49592:18;49604:5;49592:11;:18::i;:::-;49562:48;;49655:14;49670:1;49655:17;;;;;;;;;;;;;;;;;;;;;;;;49674:14;49689:1;49674:17;;;;;;;;;;;;;;;;;;;;;;;;49638:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49621:71;;49717:14;49703:29;;;;49330:410;;;;:::o;25248:355::-;25395:4;25452:25;25437:40;;;:11;:40;;;;:105;;;;25509:33;25494:48;;;:11;:48;;;;25437:105;:158;;;;25559:36;25583:11;25559:23;:36::i;:::-;25437:158;25417:178;;25248:355;;;:::o;31784:127::-;31849:4;31901:1;31873:30;;:7;:16;31881:7;31873:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31866:37;;31784:127;;;:::o;8303:98::-;8356:7;8383:10;8376:17;;8303:98;:::o;35907:174::-;36009:2;35982:15;:24;35998:7;35982:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36065:7;36061:2;36027:46;;36036:23;36051:7;36036:14;:23::i;:::-;36027:46;;;;;;;;;;;;35907:174;;:::o;32078:452::-;32207:4;32251:16;32259:7;32251;:16::i;:::-;32229:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32350:13;32366:23;32381:7;32366:14;:23::i;:::-;32350:39;;32419:5;32408:16;;:7;:16;;;:64;;;;32465:7;32441:31;;:20;32453:7;32441:11;:20::i;:::-;:31;;;32408:64;:113;;;;32489:32;32506:5;32513:7;32489:16;:32::i;:::-;32408:113;32400:122;;;32078:452;;;;:::o;35174:615::-;35347:4;35320:31;;:23;35335:7;35320:14;:23::i;:::-;:31;;;35298:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;35453:1;35439:16;;:2;:16;;;;35431:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35509:39;35530:4;35536:2;35540:7;35509:20;:39::i;:::-;35613:29;35630:1;35634:7;35613:8;:29::i;:::-;35674:1;35655:9;:15;35665:4;35655:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35703:1;35686:9;:13;35696:2;35686:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35734:2;35715:7;:16;35723:7;35715:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35773:7;35769:2;35754:27;;35763:4;35754:27;;;;;;;;;;;;35174:615;;;:::o;32872:110::-;32948:26;32958:2;32962:7;32948:26;;;;;;;;;;;;:9;:26::i;:::-;32872:110;;:::o;49748:862::-;49919:13;49945:12;49960:52;49991:9;50002:7;49974:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49960:6;:52::i;:::-;49945:67;;50023:20;50046:11;50065;:18;50058:4;:25;;;;:::i;:::-;50046:38;;;;;;;;;;;;;;;;;;;;;;50023:61;;50109:4;50099:14;;:6;:14;;;50095:484;;;50130:17;50157:2;50150:4;:9;;;;:::i;:::-;50130:29;;50190:2;50178:9;:14;50174:394;;;50222:11;50234:1;50222:14;;;;;;;;;;;;;;;;;;;;;;50213:23;;50174:394;;;50274:2;50262:9;:14;50258:310;;;50306:11;50318:1;50306:14;;;;;;;;;;;;;;;;;;;;;;50297:23;;50258:310;;;50358:2;50346:9;:14;50342:226;;;50390:11;50402:1;50390:14;;;;;;;;;;;;;;;;;;;;;;50381:23;;50342:226;;;50442:2;50430:9;:14;50426:142;;;50474:11;50486:1;50474:14;;;;;;;;;;;;;;;;;;;;;;50465:23;;50426:142;;;50538:11;50550:1;50538:14;;;;;;;;;;;;;;;;;;;;;;50529:23;;50426:142;50342:226;50258:310;50174:394;50095:484;;50596:6;50589:13;;;;49748:862;;;;;;:::o;10589:173::-;10645:16;10664:6;;;;;;;;;;;10645:25;;10690:8;10681:6;;:17;;;;;;;;;;;;;;;;;;10745:8;10714:40;;10735:8;10714:40;;;;;;;;;;;;10589:173;;:::o;48103:138::-;48163:7;48225:5;48208:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;48198:34;;;;;;48190:43;;48183:50;;48103:138;;;:::o;55279:339::-;55338:12;55376:1;55367:5;:10;55363:56;;;55394:13;;;;;;;;;;;;;;;;;;;;;55363:56;55429:12;55444:5;55429:20;;55460:14;55489:78;55504:1;55496:4;:9;55489:78;;55522:8;;;;;:::i;:::-;;;;55554:1;55545:10;;;;;55489:78;;;55584:26;55596:5;55603:6;55584:11;:26::i;:::-;55577:33;;;;55279:339;;;;:::o;31119:352::-;31276:28;31286:4;31292:2;31296:7;31276:9;:28::i;:::-;31337:48;31360:4;31366:2;31370:7;31379:5;31337:22;:48::i;:::-;31315:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31119:352;;;;:::o;56228:723::-;56284:13;56514:1;56505:5;:10;56501:53;;;56532:10;;;;;;;;;;;;;;;;;;;;;56501:53;56564:12;56579:5;56564:20;;56595:14;56620:78;56635:1;56627:4;:9;56620:78;;56653:8;;;;;:::i;:::-;;;;56684:2;56676:10;;;;;:::i;:::-;;;56620:78;;;56708:19;56740:6;56730:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56708:39;;56758:154;56774:1;56765:5;:10;56758:154;;56802:1;56792:11;;;;;:::i;:::-;;;56869:2;56861:5;:10;;;;:::i;:::-;56848:2;:24;;;;:::i;:::-;56835:39;;56818:6;56825;56818:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;56898:2;56889:11;;;;;:::i;:::-;;;56758:154;;;56936:6;56922:21;;;;;56228:723;;;;:::o;57383:1790::-;57441:13;57467:11;57481:4;:11;57467:25;;57514:1;57507:3;:8;57503:23;;;57517:9;;;;;;;;;;;;;;;;;57503:23;57578:18;57616:1;57611;57605:3;:7;;;;:::i;:::-;57604:13;;;;:::i;:::-;57599:1;:19;;;;:::i;:::-;57578:40;;57676:19;57721:2;57708:10;:15;;;;:::i;:::-;57698:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57676:48;;57737:18;57758:5;;;;;;;;;;;;;;;;;57737:26;;57827:1;57820:5;57816:13;57872:2;57864:6;57860:15;57923:1;57891:960;57946:3;57943:1;57940:10;57891:960;;;58001:1;57998;57994:9;57989:14;;58059:8;58054:1;58048:4;58044:12;58038:19;58034:34;58139:4;58131:5;58127:2;58123:14;58119:25;58109:8;58105:40;58099:47;58178:3;58175:1;58171:11;58164:18;;58312:4;58303;58295:5;58291:2;58287:14;58283:25;58273:8;58269:40;58263:47;58259:58;58233:3;58207:129;58200:136;;58368:3;58365:1;58361:11;58354:18;;58501:4;58492;58484:5;58481:1;58477:13;58473:24;58463:8;58459:39;58453:46;58449:57;58423:3;58397:128;58390:135;;58557:3;58554:1;58550:11;58543:18;;58682:4;58673;58666:5;58662:16;58652:8;58648:31;58642:38;58638:49;58612:3;58586:120;58579:127;;58740:3;58735;58731:13;58724:20;;58782:3;58771:9;58764:22;58834:1;58823:9;58819:17;58806:30;;57970:881;;57891:960;;;57895:44;58883:1;58878:3;58874:11;58904:1;58899:84;;;;59002:1;58997:82;;;;58867:212;;58899:84;58960:6;58955:3;58951:16;58947:1;58936:9;58932:17;58925:43;58899:84;;58997:82;59058:4;59053:3;59049:14;59045:1;59034:9;59030:17;59023:41;58867:212;;59110:10;59102:6;59095:26;57785:1347;;59158:6;59144:21;;;;;;57383:1790;;;;:::o;23807:207::-;23937:4;23981:25;23966:40;;;:11;:40;;;;23959:47;;23807:207;;;:::o;41978:589::-;42122:45;42149:4;42155:2;42159:7;42122:26;:45::i;:::-;42200:1;42184:18;;:4;:18;;;42180:187;;;42219:40;42251:7;42219:31;:40::i;:::-;42180:187;;;42289:2;42281:10;;:4;:10;;;42277:90;;42308:47;42341:4;42347:7;42308:32;:47::i;:::-;42277:90;42180:187;42395:1;42381:16;;:2;:16;;;42377:183;;;42414:45;42451:7;42414:36;:45::i;:::-;42377:183;;;42487:4;42481:10;;:2;:10;;;42477:83;;42508:40;42536:2;42540:7;42508:27;:40::i;:::-;42477:83;42377:183;41978:589;;;:::o;33209:321::-;33339:18;33345:2;33349:7;33339:5;:18::i;:::-;33390:54;33421:1;33425:2;33429:7;33438:5;33390:22;:54::i;:::-;33368:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33209:321;;;:::o;55746:474::-;55848:12;55878:19;55923:1;55914:6;55910:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;55900:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55878:47;;55936:15;:6;55943:1;55936:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;55962;:6;55969:1;55962:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;55993:9;56018:1;56009:6;56005:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;55993:26;;55988:135;56025:1;56021;:5;55988:135;;;56060:12;56081:3;56073:5;:11;56060:25;;;;;;;;;;;;;;;;;;56048:6;56055:1;56048:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;56110:1;56100:11;;;;;56028:3;;;;:::i;:::-;;;55988:135;;;;56150:1;56141:5;:10;56133:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56206:6;56199:13;;;55746:474;;;;:::o;36646:984::-;36801:4;36822:15;:2;:13;;;:15::i;:::-;36818:805;;;36891:2;36875:36;;;36934:12;:10;:12::i;:::-;36969:4;36996:7;37026:5;36875:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36854:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37254:1;37237:6;:13;:18;37233:320;;;37280:108;;;;;;;;;;:::i;:::-;;;;;;;;37233:320;37503:6;37497:13;37488:6;37484:2;37480:15;37473:38;36854:714;37124:45;;;37114:55;;;:6;:55;;;;37107:62;;;;;36818:805;37607:4;37600:11;;36646:984;;;;;;;:::o;38202:126::-;;;;:::o;43290:164::-;43394:10;:17;;;;43367:15;:24;43383:7;43367:24;;;;;;;;;;;:44;;;;43422:10;43438:7;43422:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43290:164;:::o;44081:1002::-;44361:22;44411:1;44386:22;44403:4;44386:16;:22::i;:::-;:26;;;;:::i;:::-;44361:51;;44423:18;44444:17;:26;44462:7;44444:26;;;;;;;;;;;;44423:47;;44591:14;44577:10;:28;44573:328;;44622:19;44644:12;:18;44657:4;44644:18;;;;;;;;;;;;;;;:34;44663:14;44644:34;;;;;;;;;;;;44622:56;;44728:11;44695:12;:18;44708:4;44695:18;;;;;;;;;;;;;;;:30;44714:10;44695:30;;;;;;;;;;;:44;;;;44845:10;44812:17;:30;44830:11;44812:30;;;;;;;;;;;:43;;;;44573:328;;44997:17;:26;45015:7;44997:26;;;;;;;;;;;44990:33;;;45041:12;:18;45054:4;45041:18;;;;;;;;;;;;;;;:34;45060:14;45041:34;;;;;;;;;;;45034:41;;;44081:1002;;;;:::o;45378:1079::-;45631:22;45676:1;45656:10;:17;;;;:21;;;;:::i;:::-;45631:46;;45688:18;45709:15;:24;45725:7;45709:24;;;;;;;;;;;;45688:45;;46060:19;46082:10;46093:14;46082:26;;;;;;;;;;;;;;;;;;;;;;;;46060:48;;46146:11;46121:10;46132;46121:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46257:10;46226:15;:28;46242:11;46226:28;;;;;;;;;;;:41;;;;46398:15;:24;46414:7;46398:24;;;;;;;;;;;46391:31;;;46433:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45378:1079;;;;:::o;42868:221::-;42953:14;42970:20;42987:2;42970:16;:20::i;:::-;42953:37;;43028:7;43001:12;:16;43014:2;43001:16;;;;;;;;;;;;;;;:24;43018:6;43001:24;;;;;;;;;;;:34;;;;43075:6;43046:17;:26;43064:7;43046:26;;;;;;;;;;;:35;;;;42868:221;;;:::o;33866:382::-;33960:1;33946:16;;:2;:16;;;;33938:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34019:16;34027:7;34019;:16::i;:::-;34018:17;34010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34081:45;34110:1;34114:2;34118:7;34081:20;:45::i;:::-;34156:1;34139:9;:13;34149:2;34139:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34187:2;34168:7;:16;34176:7;34168:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34232:7;34228:2;34207:33;;34224:1;34207:33;;;;;;;;;;;;33866:382;;:::o;15528:387::-;15588:4;15796:12;15863:7;15851:20;15843:28;;15906:1;15899:4;:8;15892:15;;;15528:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:633::-;;;5961:2;5949:9;5940:7;5936:23;5932:32;5929:2;;;5977:1;5974;5967:12;5929:2;6048:1;6037:9;6033:17;6020:31;6078:18;6070:6;6067:30;6064:2;;;6110:1;6107;6100:12;6064:2;6138:63;6193:7;6184:6;6173:9;6169:22;6138:63;:::i;:::-;6128:73;;5991:220;6278:2;6267:9;6263:18;6250:32;6309:18;6301:6;6298:30;6295:2;;;6341:1;6338;6331:12;6295:2;6369:63;6424:7;6415:6;6404:9;6400:22;6369:63;:::i;:::-;6359:73;;6221:221;5919:530;;;;;:::o;6455:262::-;;6563:2;6551:9;6542:7;6538:23;6534:32;6531:2;;;6579:1;6576;6569:12;6531:2;6622:1;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6593:117;6521:196;;;;:::o;6723:118::-;6810:24;6828:5;6810:24;:::i;:::-;6805:3;6798:37;6788:53;;:::o;6847:109::-;6928:21;6943:5;6928:21;:::i;:::-;6923:3;6916:34;6906:50;;:::o;6962:153::-;7065:43;7084:23;7101:5;7084:23;:::i;:::-;7065:43;:::i;:::-;7060:3;7053:56;7043:72;;:::o;7121:360::-;;7235:38;7267:5;7235:38;:::i;:::-;7289:70;7352:6;7347:3;7289:70;:::i;:::-;7282:77;;7368:52;7413:6;7408:3;7401:4;7394:5;7390:16;7368:52;:::i;:::-;7445:29;7467:6;7445:29;:::i;:::-;7440:3;7436:39;7429:46;;7211:270;;;;;:::o;7487:364::-;;7603:39;7636:5;7603:39;:::i;:::-;7658:71;7722:6;7717:3;7658:71;:::i;:::-;7651:78;;7738:52;7783:6;7778:3;7771:4;7764:5;7760:16;7738:52;:::i;:::-;7815:29;7837:6;7815:29;:::i;:::-;7810:3;7806:39;7799:46;;7579:272;;;;;:::o;7857:377::-;;7991:39;8024:5;7991:39;:::i;:::-;8046:89;8128:6;8123:3;8046:89;:::i;:::-;8039:96;;8144:52;8189:6;8184:3;8177:4;8170:5;8166:16;8144:52;:::i;:::-;8221:6;8216:3;8212:16;8205:23;;7967:267;;;;;:::o;8240:330::-;;8403:67;8467:2;8462:3;8403:67;:::i;:::-;8396:74;;8500:34;8496:1;8491:3;8487:11;8480:55;8561:2;8556:3;8552:12;8545:19;;8386:184;;;:::o;8576:375::-;;8739:67;8803:2;8798:3;8739:67;:::i;:::-;8732:74;;8836:34;8832:1;8827:3;8823:11;8816:55;8902:13;8897:2;8892:3;8888:12;8881:35;8942:2;8937:3;8933:12;8926:19;;8722:229;;;:::o;8957:382::-;;9120:67;9184:2;9179:3;9120:67;:::i;:::-;9113:74;;9217:34;9213:1;9208:3;9204:11;9197:55;9283:20;9278:2;9273:3;9269:12;9262:42;9330:2;9325:3;9321:12;9314:19;;9103:236;;;:::o;9345:370::-;;9508:67;9572:2;9567:3;9508:67;:::i;:::-;9501:74;;9605:34;9601:1;9596:3;9592:11;9585:55;9671:8;9666:2;9661:3;9657:12;9650:30;9706:2;9701:3;9697:12;9690:19;;9491:224;;;:::o;9721:326::-;;9884:67;9948:2;9943:3;9884:67;:::i;:::-;9877:74;;9981:30;9977:1;9972:3;9968:11;9961:51;10038:2;10033:3;10029:12;10022:19;;9867:180;;;:::o;10053:496::-;;10234:85;10316:2;10311:3;10234:85;:::i;:::-;10227:92;;10349:66;10345:1;10340:3;10336:11;10329:87;10447:66;10442:2;10437:3;10433:12;10426:88;10540:2;10535:3;10531:12;10524:19;;10217:332;;;:::o;10555:396::-;;10736:84;10818:1;10813:3;10736:84;:::i;:::-;10729:91;;10850:66;10846:1;10841:3;10837:11;10830:87;10943:1;10938:3;10934:11;10927:18;;10719:232;;;:::o;10957:496::-;;11138:85;11220:2;11215:3;11138:85;:::i;:::-;11131:92;;11253:66;11249:1;11244:3;11240:11;11233:87;11351:66;11346:2;11341:3;11337:12;11330:88;11444:2;11439:3;11435:12;11428:19;;11121:332;;;:::o;11459:368::-;;11622:67;11686:2;11681:3;11622:67;:::i;:::-;11615:74;;11719:34;11715:1;11710:3;11706:11;11699:55;11785:6;11780:2;11775:3;11771:12;11764:28;11818:2;11813:3;11809:12;11802:19;;11605:222;;;:::o;11833:323::-;;11996:67;12060:2;12055:3;11996:67;:::i;:::-;11989:74;;12093:27;12089:1;12084:3;12080:11;12073:48;12147:2;12142:3;12138:12;12131:19;;11979:177;;;:::o;12162:376::-;;12325:67;12389:2;12384:3;12325:67;:::i;:::-;12318:74;;12422:34;12418:1;12413:3;12409:11;12402:55;12488:14;12483:2;12478:3;12474:12;12467:36;12529:2;12524:3;12520:12;12513:19;;12308:230;;;:::o;12544:606::-;;12725:86;12807:3;12802;12725:86;:::i;:::-;12718:93;;12841:66;12837:1;12832:3;12828:11;12821:87;12939:34;12934:2;12929:3;12925:12;12918:56;13005:66;13000:2;12995:3;12991:12;12984:88;13103:10;13098:2;13093:3;13089:12;13082:32;13140:3;13135;13131:13;13124:20;;12708:442;;;:::o;13156:388::-;;13319:67;13383:2;13378:3;13319:67;:::i;:::-;13312:74;;13416:34;13412:1;13407:3;13403:11;13396:55;13482:26;13477:2;13472:3;13468:12;13461:48;13535:2;13530:3;13526:12;13519:19;;13302:242;;;:::o;13550:374::-;;13713:67;13777:2;13772:3;13713:67;:::i;:::-;13706:74;;13810:34;13806:1;13801:3;13797:11;13790:55;13876:12;13871:2;13866:3;13862:12;13855:34;13915:2;13910:3;13906:12;13899:19;;13696:228;;;:::o;13930:373::-;;14093:67;14157:2;14152:3;14093:67;:::i;:::-;14086:74;;14190:34;14186:1;14181:3;14177:11;14170:55;14256:11;14251:2;14246:3;14242:12;14235:33;14294:2;14289:3;14285:12;14278:19;;14076:227;;;:::o;14309:330::-;;14472:67;14536:2;14531:3;14472:67;:::i;:::-;14465:74;;14569:34;14565:1;14560:3;14556:11;14549:55;14630:2;14625:3;14621:12;14614:19;;14455:184;;;:::o;14645:376::-;;14808:67;14872:2;14867:3;14808:67;:::i;:::-;14801:74;;14905:34;14901:1;14896:3;14892:11;14885:55;14971:14;14966:2;14961:3;14957:12;14950:36;15012:2;15007:3;15003:12;14996:19;;14791:230;;;:::o;15027:434::-;;15208:85;15290:2;15285:3;15208:85;:::i;:::-;15201:92;;15323:66;15319:1;15314:3;15310:11;15303:87;15421:4;15416:2;15411:3;15407:12;15400:26;15452:2;15447:3;15443:12;15436:19;;15191:270;;;:::o;15467:330::-;;15630:67;15694:2;15689:3;15630:67;:::i;:::-;15623:74;;15727:34;15723:1;15718:3;15714:11;15707:55;15788:2;15783:3;15779:12;15772:19;;15613:184;;;:::o;15803:314::-;;15966:67;16030:2;16025:3;15966:67;:::i;:::-;15959:74;;16063:18;16059:1;16054:3;16050:11;16043:39;16108:2;16103:3;16099:12;16092:19;;15949:168;;;:::o;16123:496::-;;16304:85;16386:2;16381:3;16304:85;:::i;:::-;16297:92;;16419:66;16415:1;16410:3;16406:11;16399:87;16517:66;16512:2;16507:3;16503:12;16496:88;16610:2;16605:3;16601:12;16594:19;;16287:332;;;:::o;16625:373::-;;16788:67;16852:2;16847:3;16788:67;:::i;:::-;16781:74;;16885:34;16881:1;16876:3;16872:11;16865:55;16951:11;16946:2;16941:3;16937:12;16930:33;16989:2;16984:3;16980:12;16973:19;;16771:227;;;:::o;17004:365::-;;17167:67;17231:2;17226:3;17167:67;:::i;:::-;17160:74;;17264:34;17260:1;17255:3;17251:11;17244:55;17330:3;17325:2;17320:3;17316:12;17309:25;17360:2;17355:3;17351:12;17344:19;;17150:219;;;:::o;17375:496::-;;17556:85;17638:2;17633:3;17556:85;:::i;:::-;17549:92;;17671:66;17667:1;17662:3;17658:11;17651:87;17769:66;17764:2;17759:3;17755:12;17748:88;17862:2;17857:3;17853:12;17846:19;;17539:332;;;:::o;17877:363::-;;18058:85;18140:2;18135:3;18058:85;:::i;:::-;18051:92;;18173:31;18169:1;18164:3;18160:11;18153:52;18231:2;18226:3;18222:12;18215:19;;18041:199;;;:::o;18246:381::-;;18409:67;18473:2;18468:3;18409:67;:::i;:::-;18402:74;;18506:34;18502:1;18497:3;18493:11;18486:55;18572:19;18567:2;18562:3;18558:12;18551:41;18618:2;18613:3;18609:12;18602:19;;18392:235;;;:::o;18633:376::-;;18796:67;18860:2;18855:3;18796:67;:::i;:::-;18789:74;;18893:34;18889:1;18884:3;18880:11;18873:55;18959:14;18954:2;18949:3;18945:12;18938:36;19000:2;18995:3;18991:12;18984:19;;18779:230;;;:::o;19015:329::-;;19178:67;19242:2;19237:3;19178:67;:::i;:::-;19171:74;;19275:33;19271:1;19266:3;19262:11;19255:54;19335:2;19330:3;19326:12;19319:19;;19161:183;;;:::o;19350:118::-;19437:24;19455:5;19437:24;:::i;:::-;19432:3;19425:37;19415:53;;:::o;19474:387::-;;19625:73;19694:3;19685:6;19625:73;:::i;:::-;19723:1;19718:3;19714:11;19707:18;;19735:73;19804:3;19795:6;19735:73;:::i;:::-;19833:1;19828:3;19824:11;19817:18;;19852:3;19845:10;;19614:247;;;;;:::o;19867:275::-;;20021:95;20112:3;20103:6;20021:95;:::i;:::-;20014:102;;20133:3;20126:10;;20003:139;;;;:::o;20148:435::-;;20350:95;20441:3;20432:6;20350:95;:::i;:::-;20343:102;;20462:95;20553:3;20544:6;20462:95;:::i;:::-;20455:102;;20574:3;20567:10;;20332:251;;;;;:::o;20589:1555::-;;21127:95;21218:3;21209:6;21127:95;:::i;:::-;21120:102;;21239:95;21330:3;21321:6;21239:95;:::i;:::-;21232:102;;21351:95;21442:3;21433:6;21351:95;:::i;:::-;21344:102;;21463:95;21554:3;21545:6;21463:95;:::i;:::-;21456:102;;21575:95;21666:3;21657:6;21575:95;:::i;:::-;21568:102;;21687:95;21778:3;21769:6;21687:95;:::i;:::-;21680:102;;21799:95;21890:3;21881:6;21799:95;:::i;:::-;21792:102;;21911:95;22002:3;21993:6;21911:95;:::i;:::-;21904:102;;22023:95;22114:3;22105:6;22023:95;:::i;:::-;22016:102;;22135:3;22128:10;;21109:1035;;;;;;;;;;;;:::o;22150:2937::-;;23251:148;23395:3;23251:148;:::i;:::-;23244:155;;23416:95;23507:3;23498:6;23416:95;:::i;:::-;23409:102;;23528:148;23672:3;23528:148;:::i;:::-;23521:155;;23693:95;23784:3;23775:6;23693:95;:::i;:::-;23686:102;;23805:148;23949:3;23805:148;:::i;:::-;23798:155;;23970:95;24061:3;24052:6;23970:95;:::i;:::-;23963:102;;24082:148;24226:3;24082:148;:::i;:::-;24075:155;;24247:95;24338:3;24329:6;24247:95;:::i;:::-;24240:102;;24359:148;24503:3;24359:148;:::i;:::-;24352:155;;24524:95;24615:3;24606:6;24524:95;:::i;:::-;24517:102;;24636:148;24780:3;24636:148;:::i;:::-;24629:155;;24801:95;24892:3;24883:6;24801:95;:::i;:::-;24794:102;;24913:148;25057:3;24913:148;:::i;:::-;24906:155;;25078:3;25071:10;;23233:1854;;;;;;;;;:::o;25093:541::-;;25348:148;25492:3;25348:148;:::i;:::-;25341:155;;25513:95;25604:3;25595:6;25513:95;:::i;:::-;25506:102;;25625:3;25618:10;;25330:304;;;;:::o;25640:222::-;;25771:2;25760:9;25756:18;25748:26;;25784:71;25852:1;25841:9;25837:17;25828:6;25784:71;:::i;:::-;25738:124;;;;:::o;25868:640::-;;26101:3;26090:9;26086:19;26078:27;;26115:71;26183:1;26172:9;26168:17;26159:6;26115:71;:::i;:::-;26196:72;26264:2;26253:9;26249:18;26240:6;26196:72;:::i;:::-;26278;26346:2;26335:9;26331:18;26322:6;26278:72;:::i;:::-;26397:9;26391:4;26387:20;26382:2;26371:9;26367:18;26360:48;26425:76;26496:4;26487:6;26425:76;:::i;:::-;26417:84;;26068:440;;;;;;;:::o;26514:210::-;;26639:2;26628:9;26624:18;26616:26;;26652:65;26714:1;26703:9;26699:17;26690:6;26652:65;:::i;:::-;26606:118;;;;:::o;26730:313::-;;26881:2;26870:9;26866:18;26858:26;;26930:9;26924:4;26920:20;26916:1;26905:9;26901:17;26894:47;26958:78;27031:4;27022:6;26958:78;:::i;:::-;26950:86;;26848:195;;;;:::o;27049:419::-;;27253:2;27242:9;27238:18;27230:26;;27302:9;27296:4;27292:20;27288:1;27277:9;27273:17;27266:47;27330:131;27456:4;27330:131;:::i;:::-;27322:139;;27220:248;;;:::o;27474:419::-;;27678:2;27667:9;27663:18;27655:26;;27727:9;27721:4;27717:20;27713:1;27702:9;27698:17;27691:47;27755:131;27881:4;27755:131;:::i;:::-;27747:139;;27645:248;;;:::o;27899:419::-;;28103:2;28092:9;28088:18;28080:26;;28152:9;28146:4;28142:20;28138:1;28127:9;28123:17;28116:47;28180:131;28306:4;28180:131;:::i;:::-;28172:139;;28070:248;;;:::o;28324:419::-;;28528:2;28517:9;28513:18;28505:26;;28577:9;28571:4;28567:20;28563:1;28552:9;28548:17;28541:47;28605:131;28731:4;28605:131;:::i;:::-;28597:139;;28495:248;;;:::o;28749:419::-;;28953:2;28942:9;28938:18;28930:26;;29002:9;28996:4;28992:20;28988:1;28977:9;28973:17;28966:47;29030:131;29156:4;29030:131;:::i;:::-;29022:139;;28920:248;;;:::o;29174:419::-;;29378:2;29367:9;29363:18;29355:26;;29427:9;29421:4;29417:20;29413:1;29402:9;29398:17;29391:47;29455:131;29581:4;29455:131;:::i;:::-;29447:139;;29345:248;;;:::o;29599:419::-;;29803:2;29792:9;29788:18;29780:26;;29852:9;29846:4;29842:20;29838:1;29827:9;29823:17;29816:47;29880:131;30006:4;29880:131;:::i;:::-;29872:139;;29770:248;;;:::o;30024:419::-;;30228:2;30217:9;30213:18;30205:26;;30277:9;30271:4;30267:20;30263:1;30252:9;30248:17;30241:47;30305:131;30431:4;30305:131;:::i;:::-;30297:139;;30195:248;;;:::o;30449:419::-;;30653:2;30642:9;30638:18;30630:26;;30702:9;30696:4;30692:20;30688:1;30677:9;30673:17;30666:47;30730:131;30856:4;30730:131;:::i;:::-;30722:139;;30620:248;;;:::o;30874:419::-;;31078:2;31067:9;31063:18;31055:26;;31127:9;31121:4;31117:20;31113:1;31102:9;31098:17;31091:47;31155:131;31281:4;31155:131;:::i;:::-;31147:139;;31045:248;;;:::o;31299:419::-;;31503:2;31492:9;31488:18;31480:26;;31552:9;31546:4;31542:20;31538:1;31527:9;31523:17;31516:47;31580:131;31706:4;31580:131;:::i;:::-;31572:139;;31470:248;;;:::o;31724:419::-;;31928:2;31917:9;31913:18;31905:26;;31977:9;31971:4;31967:20;31963:1;31952:9;31948:17;31941:47;32005:131;32131:4;32005:131;:::i;:::-;31997:139;;31895:248;;;:::o;32149:419::-;;32353:2;32342:9;32338:18;32330:26;;32402:9;32396:4;32392:20;32388:1;32377:9;32373:17;32366:47;32430:131;32556:4;32430:131;:::i;:::-;32422:139;;32320:248;;;:::o;32574:419::-;;32778:2;32767:9;32763:18;32755:26;;32827:9;32821:4;32817:20;32813:1;32802:9;32798:17;32791:47;32855:131;32981:4;32855:131;:::i;:::-;32847:139;;32745:248;;;:::o;32999:419::-;;33203:2;33192:9;33188:18;33180:26;;33252:9;33246:4;33242:20;33238:1;33227:9;33223:17;33216:47;33280:131;33406:4;33280:131;:::i;:::-;33272:139;;33170:248;;;:::o;33424:419::-;;33628:2;33617:9;33613:18;33605:26;;33677:9;33671:4;33667:20;33663:1;33652:9;33648:17;33641:47;33705:131;33831:4;33705:131;:::i;:::-;33697:139;;33595:248;;;:::o;33849:419::-;;34053:2;34042:9;34038:18;34030:26;;34102:9;34096:4;34092:20;34088:1;34077:9;34073:17;34066:47;34130:131;34256:4;34130:131;:::i;:::-;34122:139;;34020:248;;;:::o;34274:419::-;;34478:2;34467:9;34463:18;34455:26;;34527:9;34521:4;34517:20;34513:1;34502:9;34498:17;34491:47;34555:131;34681:4;34555:131;:::i;:::-;34547:139;;34445:248;;;:::o;34699:419::-;;34903:2;34892:9;34888:18;34880:26;;34952:9;34946:4;34942:20;34938:1;34927:9;34923:17;34916:47;34980:131;35106:4;34980:131;:::i;:::-;34972:139;;34870:248;;;:::o;35124:419::-;;35328:2;35317:9;35313:18;35305:26;;35377:9;35371:4;35367:20;35363:1;35352:9;35348:17;35341:47;35405:131;35531:4;35405:131;:::i;:::-;35397:139;;35295:248;;;:::o;35549:222::-;;35680:2;35669:9;35665:18;35657:26;;35693:71;35761:1;35750:9;35746:17;35737:6;35693:71;:::i;:::-;35647:124;;;;:::o;35777:283::-;;35843:2;35837:9;35827:19;;35885:4;35877:6;35873:17;35992:6;35980:10;35977:22;35956:18;35944:10;35941:34;35938:62;35935:2;;;36003:18;;:::i;:::-;35935:2;36043:10;36039:2;36032:22;35817:243;;;;:::o;36066:331::-;;36217:18;36209:6;36206:30;36203:2;;;36239:18;;:::i;:::-;36203:2;36324:4;36320:9;36313:4;36305:6;36301:17;36297:33;36289:41;;36385:4;36379;36375:15;36367:23;;36132:265;;;:::o;36403:332::-;;36555:18;36547:6;36544:30;36541:2;;;36577:18;;:::i;:::-;36541:2;36662:4;36658:9;36651:4;36643:6;36639:17;36635:33;36627:41;;36723:4;36717;36713:15;36705:23;;36470:265;;;:::o;36741:98::-;;36826:5;36820:12;36810:22;;36799:40;;;:::o;36845:99::-;;36931:5;36925:12;36915:22;;36904:40;;;:::o;36950:168::-;;37067:6;37062:3;37055:19;37107:4;37102:3;37098:14;37083:29;;37045:73;;;;:::o;37124:169::-;;37242:6;37237:3;37230:19;37282:4;37277:3;37273:14;37258:29;;37220:73;;;;:::o;37299:148::-;;37438:3;37423:18;;37413:34;;;;:::o;37453:305::-;;37512:20;37530:1;37512:20;:::i;:::-;37507:25;;37546:20;37564:1;37546:20;:::i;:::-;37541:25;;37700:1;37632:66;37628:74;37625:1;37622:81;37619:2;;;37706:18;;:::i;:::-;37619:2;37750:1;37747;37743:9;37736:16;;37497:261;;;;:::o;37764:185::-;;37821:20;37839:1;37821:20;:::i;:::-;37816:25;;37855:20;37873:1;37855:20;:::i;:::-;37850:25;;37894:1;37884:2;;37899:18;;:::i;:::-;37884:2;37941:1;37938;37934:9;37929:14;;37806:143;;;;:::o;37955:348::-;;38018:20;38036:1;38018:20;:::i;:::-;38013:25;;38052:20;38070:1;38052:20;:::i;:::-;38047:25;;38240:1;38172:66;38168:74;38165:1;38162:81;38157:1;38150:9;38143:17;38139:105;38136:2;;;38247:18;;:::i;:::-;38136:2;38295:1;38292;38288:9;38277:20;;38003:300;;;;:::o;38309:191::-;;38369:20;38387:1;38369:20;:::i;:::-;38364:25;;38403:20;38421:1;38403:20;:::i;:::-;38398:25;;38442:1;38439;38436:8;38433:2;;;38447:18;;:::i;:::-;38433:2;38492:1;38489;38485:9;38477:17;;38354:146;;;;:::o;38506:96::-;;38572:24;38590:5;38572:24;:::i;:::-;38561:35;;38551:51;;;:::o;38608:90::-;;38685:5;38678:13;38671:21;38660:32;;38650:48;;;:::o;38704:149::-;;38780:66;38773:5;38769:78;38758:89;;38748:105;;;:::o;38859:149::-;;38935:66;38928:5;38924:78;38913:89;;38903:105;;;:::o;39014:126::-;;39091:42;39084:5;39080:54;39069:65;;39059:81;;;:::o;39146:77::-;;39212:5;39201:16;;39191:32;;;:::o;39229:154::-;39313:6;39308:3;39303;39290:30;39375:1;39366:6;39361:3;39357:16;39350:27;39280:103;;;:::o;39389:307::-;39457:1;39467:113;39481:6;39478:1;39475:13;39467:113;;;39566:1;39561:3;39557:11;39551:18;39547:1;39542:3;39538:11;39531:39;39503:2;39500:1;39496:10;39491:15;;39467:113;;;39598:6;39595:1;39592:13;39589:2;;;39678:1;39669:6;39664:3;39660:16;39653:27;39589:2;39438:258;;;;:::o;39702:171::-;;39764:24;39782:5;39764:24;:::i;:::-;39755:33;;39810:4;39803:5;39800:15;39797:2;;;39818:18;;:::i;:::-;39797:2;39865:1;39858:5;39854:13;39847:20;;39745:128;;;:::o;39879:320::-;;39960:1;39954:4;39950:12;39940:22;;40007:1;40001:4;39997:12;40028:18;40018:2;;40084:4;40076:6;40072:17;40062:27;;40018:2;40146;40138:6;40135:14;40115:18;40112:38;40109:2;;;40165:18;;:::i;:::-;40109:2;39930:269;;;;:::o;40205:233::-;;40267:24;40285:5;40267:24;:::i;:::-;40258:33;;40313:66;40306:5;40303:77;40300:2;;;40383:18;;:::i;:::-;40300:2;40430:1;40423:5;40419:13;40412:20;;40248:190;;;:::o;40444:78::-;;40511:5;40500:16;;40490:32;;;:::o;40528:176::-;;40577:20;40595:1;40577:20;:::i;:::-;40572:25;;40611:20;40629:1;40611:20;:::i;:::-;40606:25;;40650:1;40640:2;;40655:18;;:::i;:::-;40640:2;40696:1;40693;40689:9;40684:14;;40562:142;;;;:::o;40710:180::-;40758:77;40755:1;40748:88;40855:4;40852:1;40845:15;40879:4;40876:1;40869:15;40896:180;40944:77;40941:1;40934:88;41041:4;41038:1;41031:15;41065:4;41062:1;41055:15;41082:180;41130:77;41127:1;41120:88;41227:4;41224:1;41217:15;41251:4;41248:1;41241:15;41268:180;41316:77;41313:1;41306:88;41413:4;41410:1;41403:15;41437:4;41434:1;41427:15;41454:102;;41546:2;41542:7;41537:2;41530:5;41526:14;41522:28;41512:38;;41502:54;;;:::o;41562:122::-;41635:24;41653:5;41635:24;:::i;:::-;41628:5;41625:35;41615:2;;41674:1;41671;41664:12;41615:2;41605:79;:::o;41690:116::-;41760:21;41775:5;41760:21;:::i;:::-;41753:5;41750:32;41740:2;;41796:1;41793;41786:12;41740:2;41730:76;:::o;41812:120::-;41884:23;41901:5;41884:23;:::i;:::-;41877:5;41874:34;41864:2;;41922:1;41919;41912:12;41864:2;41854:78;:::o;41938:122::-;42011:24;42029:5;42011:24;:::i;:::-;42004:5;42001:35;41991:2;;42050:1;42047;42040:12;41991:2;41981:79;:::o

Swarm Source

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