ETH Price: $3,245.53 (+1.97%)
Gas: 2 Gwei

Token

Headscapes (HDSCP)
 

Overview

Max Total Supply

256 HDSCP

Holders

86

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
iheartart.eth
Balance
2 HDSCP
0x050EE024a0fFd8b9bd383271835b27Dd66c3feC3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Headscapes are fully on-chain generative banner SVGs meant to be used in Twitter header or as website banner image

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Headscapes

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-21
*/

// File: @openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;

/**
 * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
pragma solidity ^0.8.0;

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

// File: contracts/Base64.sol
pragma solidity ^0.8.9;

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

// File: contracts/HeadscapesStorage.sol
pragma solidity ^0.8.9;

contract HeadscapesStorage {
    constructor() {}

    function getPalettes(uint256 index) public pure returns (string memory) {
        return
            [
                "b: #281C2D; --s: #695E93; --a: #8155BA; --m: #BEAFC2",
                "b: #738FA7; --s: #0C4160; --a: #C3CEDA; --m: #071330",
                "b: #1A5653; --s: #107869; --a: #5CD85A; --m: #08313A",
                "b: #E95670; --s: #713770; --a: #B34270; --m: #432F70",
                "b: #E1A140; --s: #532200; --a: #EFCFA0; --m: #914110",
                "b: #0B0909; --s: #44444C; --a: #8C8C8C; --m: #D6D6D6",
                "b: #F1D26C; --s: #2B1200; --a: #CF5C00; --m: #8D1E00",
                "b: #8C9B88; --s: #F5E8DA; --a: #735E93; --m: #EFF1EF",
                "b: #676E7F; --s: #0F0D12; --a: #F9F6F0; --m: #B6737C"
            ][index];
    }

    function getPatterns(uint256 index) public pure returns (string memory) {
        return
            [
                'x="-7.25" y="142.5" patternUnits="userSpaceOnUse" width="126" height="200" viewBox="0 0 10 16"><g id="cube"><path fill="var(--a)" d="M0 0l5 3v5l-5 -3z"></path><path d="M10 0l-5 3v5l5 -3"></path></g><use x="5" y="8" href="#cube"></use><use x="-5" y="8" href="#cube"></use>',
                'x="12" y="-5" width="375" height="62.5" patternUnits="userSpaceOnUse"><linearGradient id="g1"><stop offset="5%" stop-color="var(--s)"/><stop offset="50%" stop-color="var(--m)"/><stop offset="95%" stop-color="var(--s)"/></linearGradient><radialGradient id="g2"><stop offset="10%" stop-color="var(--s)"/><stop offset="50%" stop-color="var(--a)"/></radialGradient><rect fill="url(#g1)" height="10" width="375" x="0" y="0"/><g fill-opacity="0.5" stroke="var(--s)" fill="url(#g2)"><circle cx="20" cy="40" r="5" stroke-width="1"/><circle cx="82.5" cy="40" r="7" stroke-width="3" /><circle cx="145" cy="40" r="4" stroke-width="3"/><circle cx="207.5" cy="40" r="8" stroke-width="2"/><circle cx="270" cy="40" r="2" stroke-width="3"/><circle cx="332.5" cy="40" r="3.5" stroke-width="1"/></g>',
                'x="-12.5" y="15.625" width="150" height="62.5" patternUnits="userSpaceOnUse" stroke-width="4"><path d="M0 0 L0 0 25 25 M25 0 L25 0 0 25" stroke="var(--a)"/><path d="M12.5 25 v50" stroke="var(--m)"/><path d="M25 12.5 h45" stroke="var(--m)"/><path d="M87 29.25 v30" stroke="var(--a)"/><circle cx="87" cy="13" r="11.5" fill="transparent" stroke="var(--s)" fill-opacity="0.5"/><path d="M103 12.5 h45" stroke="var(--m)"/>',
                'x="-12.5" y="15.625" width="150" height="62.5" patternUnits="userSpaceOnUse"><linearGradient id="g1" gradientTransform="rotate(90)"><stop offset="5%" stop-color="var(--m)"/><stop offset="95%" stop-color="var(--s)"/></linearGradient><path d="M0 0 v62.5 h150z" stroke="var(--a)" fill="url(#g1)" stroke-width="4"/>',
                'x="0" y="0" width="750" height="250" patternUnits="userSpaceOnUse"><radialGradient id="g1"><stop offset="10%" stop-color="var(--b)"/><stop offset="95%" stop-color="var(--m)"/></radialGradient><circle cx="0" cy="125" r="95" fill="transparent" stroke-width="2" stroke="var(--m)" /><circle cx="0" cy="125" r="45" fill="var(--s)"/><circle cx="750" cy="125" r="75" fill="var(--a)"/><circle cx="375" cy="250" r="80" fill="var(--s)"/><circle cx="375" cy="0" r="30" fill="transparent" stroke-width="2" stroke="var(--a)"/><circle cx="375" cy="250" r="30" fill="transparent" stroke-width="2" stroke="var(--a)"/><circle cx="375" cy="125" r="25" fill="var(--m)"/><circle cx="750" cy="250" r="31" fill="var(--s)"/><circle cx="750" cy="0" r="31" fill="var(--a)"/><circle cx="0" cy="0" r="22" fill="var(--m)"/><circle cx="750" cy="0" r="22" fill="var(--s)"/><circle cx="0" cy="250" r="22" fill="var(--a)"/><circle cx="750" cy="250" r="22" fill="url(#g1)"/>',
                'x="0" y="0" width="750" height="100" patternUnits="userSpaceOnUse" stroke-width="4"><radialGradient cx="10%" cy="10%" id="g1"><stop offset="5%" stop-color="var(--a)"/><stop offset="95%" stop-color="var(--m)"/></radialGradient><radialGradient cx="90%" cy="90%" id="g2"><stop offset="5%" stop-color="var(--m)"/><stop offset="95%" stop-color="var(--a)"/></radialGradient><path d="M0 0 v100 h375 z" stroke="var(--s)" fill="url(#g1)"/><path d="M375 100 h375 V0 z" stroke="var(--s)" fill="url(#g2)"/>',
                'x="0" y="0" width="300" height="125" patternUnits="userSpaceOnUse" stroke-width="4" fill="transparent"><path d="M20 0 Q-30 75, 100 20 T65 120 " stroke="var(--s)" /><path d="M 20 0 C -30 75, 65 10, 100 10 S -180 150, 280 20 S -100 200, -100 200" transform="scale(0.5) translate(200 10) rotate(180 150 75)" stroke="var(--a)" /><path d="M275 100 q-20 -30, -30 -40 t-20 30 t-20 -30 t20 -30" stroke="var(--m)" />',
                'x="-12.5" y="0" width="125" height="125" patternUnits="userSpaceOnUse" stroke-width="4" fill-opacity="0.75"><rect x="25" y="12.5" height="100" width="100" fill="var(--m)"/><rect x="50" y="37.5" height="50" width="50" fill="var(--m)"/><rect x="0" y="0" height="10" width="150" fill="var(--s)"/><rect x="0" y="115" height="10" width="150" fill="var(--s)"/><rect x="0" y="10" height="2.5" width="125" fill="var(--a)"/><rect x="0" y="112.5" height="2.5" width="125" fill="var(--a)"/><rect x="0" y="22.5" height="2.5" width="125" fill="var(--a)"/><rect x="0" y="100" height="2.5" width="125" fill="var(--a)"/><rect x="37.5" y="0" height="125" width="2.5" fill="var(--s)" /><rect x="110" y="0" height="125" width="2.5" fill="var(--s)"/><rect x="0" y="60" height="5" width="375" fill="var(--a)"/><rect x="72.5" y="0" height="375" width="5" fill="var(--a)"/>',
                ""
            ][index];
    }

    function getTurbs(uint256 index) public pure returns (string memory) {
        return
            [
                'type="fractalNoise" baseFrequency="0.0029, .0009" numOctaves="5"',
                'type="fractalNoise" baseFrequency="0.069, .0420" numOctaves="5"',
                'type="fractalNoise" baseFrequency="0.002, .029" numOctaves="50"',
                'type="fractalNoise" baseFrequency=".0420, .069" numOctaves="6.9"',
                'type="turbulence" baseFrequency="0.09, .06" numOctaves="1"',
                'type="fractalNoise" baseFrequency="0.2, .9" numOctaves="50"',
                'type="turbulence" baseFrequency=".00888, .0888" numOctaves="88"',
                'type="turbulence" baseFrequency="2, .029" numOctaves="10"',
                'type="fractalNoise" baseFrequency="0, 0" numOctaves="0"'
            ][index];
    }

    function getBlurs(uint256 index) public pure returns (string memory) {
        return
            ["0.0", "0.0", "0.0", "0.0", "0.04", "0.2", "0.7", "1.7", "7"][index];
    }

    function getGrads(uint256 index) public pure returns (string memory) {
        return
            [
                "var(--b)",
                "linear-gradient(var(--s), var(--b))",
                "radial-gradient(var(--s), var(--b))",
                "repeating-linear-gradient(var(--s), var(--b) 125px)",
                "repeating-radial-gradient(var(--s), var(--b) 1px)",
                "conic-gradient(var(--b), var(--s))",
                "repeating-linear-gradient(0.85turn, transparent, var(--s) 100px),repeating-linear-gradient(0.15turn, transparent, var(--b) 50px),repeating-linear-gradient(0.5turn, transparent, var(--a) 20px),repeating-linear-gradient(transparent, var(--m) 1px)",
                "repeating-conic-gradient(var(--b) 0 9deg, var(--s) 9deg 18deg)",
                "repeating-conic-gradient(from 0deg at 50% 50%, red, orange, yellow, green, blue, indigo, violet)"
            ][index];
    }

    function getLights(uint256 index) public pure returns (string memory) {
        return
            [
                "",
                "",
                "",
                "",
                "",
                'surfaceScale="100"><fePointLight x="750" y="250" z="200"/></feDiffuseLighting>',
                'surfaceScale="6"><feDistantLight azimuth="10" elevation="43"/></feDiffuseLighting>',
                'surfaceScale="10"><fePointLight x="750" y="250" z="200"/></feDiffuseLighting>',
                'surfaceScale="22"><feDistantLight azimuth="5" elevation="40"/></feDiffuseLighting>'
            ][index];
    }

    function getMaps(uint256 index) public pure returns (string memory) {
        return
            [
                'in="SourceGraphic" scale="10" xChannelSelector="A" yChannelSelector="B"',
                'in="SourceGraphic" scale="20" xChannelSelector="R" yChannelSelector="B"',
                'in="SourceGraphic" scale="100" xChannelSelector="B" yChannelSelector="G"',
                'in="SourceGraphic" scale="300" xChannelSelector="A" yChannelSelector="R"',
                'in="FillPaint" scale="600" xChannelSelector="R" yChannelSelector="R"',
                'in="SourceGraphic" scale="1000" xChannelSelector="G" yChannelSelector="R"',
                'in="SourceAlpha" scale="987" xChannelSelector="B" yChannelSelector="A"',
                'in="[redacted]" scale="69" xChannelSelector="A" yChannelSelector="R"',
                'in="[redacted]" scale="420" xChannelSelector="A" yChannelSelector="A"'
            ][index];
    }
}

// File: contracts/Headscapes.sol
pragma solidity ^0.8.9;

//  ▄▄   ▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄  ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄
// █  █ █  █       █      █      ██       █       █      █       █       █       █
// █  █▄█  █    ▄▄▄█  ▄   █  ▄    █  ▄▄▄▄▄█       █  ▄   █    ▄  █    ▄▄▄█  ▄▄▄▄▄█
// █       █   █▄▄▄█ █▄█  █ █ █   █ █▄▄▄▄▄█     ▄▄█ █▄█  █   █▄█ █   █▄▄▄█ █▄▄▄▄▄
// █   ▄   █    ▄▄▄█      █ █▄█   █▄▄▄▄▄  █    █  █      █    ▄▄▄█    ▄▄▄█▄▄▄▄▄  █
// █  █ █  █   █▄▄▄█  ▄   █       █▄▄▄▄▄█ █    █▄▄█  ▄   █   █   █   █▄▄▄ ▄▄▄▄▄█ █
// █▄▄█ █▄▄█▄▄▄▄▄▄▄█▄█ █▄▄█▄▄▄▄▄▄██▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄█ █▄▄█▄▄▄█   █▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█
// 
// On Chain generative banner art

contract Headscapes is ERC721Enumerable, ReentrancyGuard, Ownable {
    // TODO BEFORE DEPLOYING
    // * Update the HeadscapesStorage address to the actual mainnet deployed address
    uint256 private nonce = 0;

    HeadscapesStorage private store =
        HeadscapesStorage(0xa62DB8AF602B6D7888b701668Bc66440EAA2b1E2);

    mapping(string => bool) private hashToMinted;
    mapping(uint256 => string) private tokenIdToHash;
    mapping(uint256 => string) private tokenIdToTitle;
    mapping(bytes32 => bool) public titleToIsTaken;

    struct Headscape {
        uint8 blur;
        uint8 gradient;
        uint8 light;
        uint8 map;
        uint8 palette;
        uint8 pattern;
        uint8 turbulence;
    }

    constructor() ERC721("Headscapes", "HDSCP") {}

    function generateSvg(Headscape memory headscape, uint256 tokenId) internal view returns (string memory) {
        string memory header = getSvgHeader(headscape, tokenId);
        string memory rectTail = headscape.pattern == 8
            ? ' fill="var(--b)" />'
            : ' fill="url(#p0)" />';

        return
            string(
                abi.encodePacked(
                    header,
                    '<rect height="500" width="1500" filter="url(#f0)"',
                    rectTail,
                    "</svg>"
                )
            );
    }

    function getSvgHeader(Headscape memory headscape, uint256 tokenId) internal view returns (string memory) {
        string memory o = string(
            abi.encodePacked(
                '<svg width="1500" height="500" version="1.1" xmlns="http://www.w3.org/2000/svg" style="position: relative; background: ',
                store.getGrads(headscape.gradient),
                ';" class="c0">',
                "<style>.c0{--",
                store.getPalettes(headscape.palette),
                ";}</style>",
                "<defs>",
                headscape.pattern == 8
                    ? ""
                    : string(
                        abi.encodePacked(
                            '<pattern id="p0" ',
                            store.getPatterns(headscape.pattern),
                            "</pattern>"
                        )
                    ),
                getFilter(headscape, tokenId),
                "</defs>"
            )
        );
        return o;
    }

    function getFilter(Headscape memory headscape, uint256 tokenId) internal view returns (string memory) {
        // pattern == 8 means no pattern
        string memory r = headscape.pattern == 8
            ? 'in="r2" result="r3" '
            : 'in="r3" result="r4" ';
        string memory light = store.getLights(headscape.light);
        string memory l = compareStrings(light, "")
            ? ""
            : string(
                abi.encodePacked(
                    '<feDiffuseLighting lighting-color="var(--a)" ',
                    r,
                    store.getLights(headscape.light)
                )
            );
        // Every other token gets a merge node
        string memory f = tokenId % 2 == 0
            ? "</filter>"
            : '<feMerge><feMergeNode in="r4" /><feMergeNode in="r2" /></feMerge></filter>';
        string memory o;
        if (headscape.pattern == 8) {
            o = string(
                abi.encodePacked(
                    '<filter id="f0">',
                    "<feTurbulence ",
                    store.getTurbs(headscape.turbulence),
                    ' seed="',
                    toString(tokenId),
                    '" result="r1" />',
                    '<feGaussianBlur stdDeviation="',
                    store.getBlurs(headscape.blur),
                    '" in="r1" result="r2" />',
                    l,
                    "</filter>"
                )
            );
        } else {
            o = string(
                abi.encodePacked(
                    '<filter id="f0">',
                    "<feTurbulence ",
                    store.getTurbs(headscape.turbulence),
                    ' seed="',
                    toString(tokenId),
                    '" result="r1" />',
                    '<feDisplacementMap in2="r1" result="r2" ',
                    store.getMaps(headscape.map),
                    " />",
                    '<feGaussianBlur stdDeviation="',
                    store.getBlurs(headscape.blur),
                    '" in="r2" result="r3" />',
                    l,
                    f
                )
            );
        }
        return o;
    }

    function getAttributes(Headscape memory headscape) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '", "attributes": [{"trait_type": "Blur","value": "',
                    [
                        "None",
                        "None",
                        "None",
                        "None",
                        "Faint",
                        "Bleary",
                        "Fuzzy",
                        "Hazy",
                        "Myopia"
                    ][headscape.blur],
                    '"},{"trait_type": "Gradient","value": "',
                    [
                        "None",
                        "Linear",
                        "Radial",
                        "Repeating Linear",
                        "Repeating Radial",
                        "Conic",
                        "Pyramid Flannel",
                        "Rising Sun",
                        "Rainbow Wheel"
                    ][headscape.gradient],
                    '"},{"trait_type": "Light","value": "',
                    [
                        "None",
                        "None",
                        "None",
                        "None",
                        "None",
                        "High Point Light",
                        "Low Distance Light",
                        "Low Point Light",
                        "High Distance Light"
                    ][headscape.light],
                    '"},{"trait_type": "Displacement Map","value": "',
                    [
                        "10",
                        "20",
                        "100",
                        "300",
                        "Shapeshifter",
                        "1000",
                        "987 Alpha",
                        "[redacted] I",
                        "[redacted] II"
                    ][headscape.map],
                    '"},{"trait_type": "Palette","value": "',
                    [
                        "Purple Fabric",
                        "Mountain Haze",
                        "Northern Lights",
                        "Lava Sky",
                        "Autumn Crush",
                        "Dark Metal",
                        "Fall Fire",
                        "Secret Spring",
                        "Winter Musings"
                    ][headscape.palette],
                    '"},{"trait_type": "Pattern","value": "',
                    [
                        "Cubes",
                        "Dots & Lines",
                        "Xs and Os",
                        "Banners",
                        "Circles",
                        "Triangles",
                        "Squiggles",
                        "Plaid",
                        "None"
                    ][headscape.pattern],
                    '"},{"trait_type": "Turbulence","value": "',
                    [
                        "Fractal 1",
                        "Fractal 2",
                        "Fractal 3",
                        "Fractal 4",
                        "Turbulence 1",
                        "Fractal 5",
                        "Turbulence 2",
                        "Turbulence 3",
                        "None"
                    ][headscape.turbulence]
                )
            );
    }

    function getHeadscape(uint256 tokenId) internal view returns (Headscape memory) {
        // substring locations for each relevant index are alphabetical (blur, gradient, light, etc)
        // blur index is at tokenIdToHash[tokenId][0]
        // gradient index is at tokenIdToHash[tokenId][1]. etc
        Headscape memory headscape;
        headscape.blur = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 0, 1))
        );
        headscape.gradient = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 1, 2))
        );
        headscape.light = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 2, 3))
        );
        headscape.map = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 3, 4))
        );
        headscape.palette = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 4, 5))
        );
        headscape.pattern = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 5, 6))
        );
        headscape.turbulence = uint8(
            charToInt(substring(tokenIdToHash[tokenId], 6, 7))
        );
        return headscape;
    }

    function hash(uint256 tokenId) internal returns (string memory) {
        uint8 blur = usew(
            [240, 232, 180, 90, 80, 70, 60, 58, 55],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 1065
        );
        uint8 gradient = usew(
            [250, 240, 232, 180, 110, 90, 80, 70, 55],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 1307
        );
        uint8 light = usew(
            [240, 230, 220, 210, 200, 150, 140, 130, 120],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 1640
        );
        uint8 map = usew(
            [240, 232, 210, 188, 130, 100, 90, 78, 69],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 1337
        );
        uint8 palette = usew(
            [250, 245, 240, 235, 230, 225, 220, 215, 210],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 2070
        );
        uint8 pattern = usew(
            [240, 232, 200, 180, 170, 160, 140, 130, 120],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 1572
        );
        uint8 turbulence = usew(
            [240, 232, 180, 110, 90, 80, 70, 60, 55],
            random(
                string(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        tokenId,
                        nonce
                    )
                )
            ) % 1117
        );

        // Hack to get around the fact that blur and light have multiple 'None's and need
        // to be ranked the same using the same index
        blur = blur < 5 ? 0 : blur;
        light = light < 5 ? 0 : light;

        string memory h = string(
            abi.encodePacked(
                toString(blur),
                toString(gradient),
                toString(light),
                toString(map),
                toString(palette),
                toString(pattern),
                toString(turbulence)
            )
        );
        // no dupes
        if (hashToMinted[h]) {
            nonce++;
            return hash(tokenId);
        }
        return h;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        Headscape memory headscape = getHeadscape(tokenId);
        string memory name = bytes(tokenIdToTitle[tokenId]).length > 0
            ? string(tokenIdToTitle[tokenId])
            : string(abi.encodePacked("Headscape #", toString(tokenId)));
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        bytes(
                            string(
                                abi.encodePacked(
                                    '{"name": "',
                                    name,
                                    getAttributes(headscape),
                                    '"},{"trait_type": "Titled","value": "',
                                    compareStrings(tokenIdToTitle[tokenId], "")
                                        ? "false"
                                        : "true",
                                    '"}], "image": "data:image/svg+xml;base64,',
                                    Base64.encode(
                                        bytes(generateSvg(headscape, tokenId))
                                    ),
                                    '"}'
                                )
                            )
                        )
                    )
                )
            );
    }

    // Write Functions

    // Adds a user-defined title to a Headscape
    function addTitle(uint256 tokenId, string memory text) public nonReentrant {
        require(
            _msgSender() == ownerOf(tokenId),
            "You don't own this Headscape"
        );
        require(
            bytes(tokenIdToTitle[tokenId]).length == 0,
            "This Headscape already has a title!"
        );
        require(
            !titleToIsTaken[(keccak256(abi.encodePacked((text))))],
            "This title has already been taken"
        );
        require(
            bytes(text).length > 0 && bytes(text).length < 65,
            "Enter a title at least 1 and up to 64 chars long"
        );
        tokenIdToTitle[tokenId] = cleanString(text);
        titleToIsTaken[(keccak256(abi.encodePacked((text))))] = true;
    }

    // Claim from 1 and up to 10 at a time.
    // Unfortunately, this contract is not ERC1155 so batch minting is not possible.
    // Transfer event will be emitted for each call to _safeMint.
    function claim(uint256 num) public payable nonReentrant {
        require(
            num > 0 && num < 11,
            "Choose at least 1 and at most 10 to mint"
        );
        require(
            num + totalSupply() < 9500,
            "Enter a different quantity - there arent that many left to mint"
        );
        require(msg.value >= num * 15000000000000000, "Price is .015 per mint");
        uint256 numClaimed = totalSupply();
        for (uint256 i = 0; i < num; i++) {
            string memory h = hash(numClaimed);
            tokenIdToHash[numClaimed] = h;
            hashToMinted[h] = true;
            _safeMint(_msgSender(), numClaimed);
            numClaimed = totalSupply();
            nonce++;
        }
        // Send half to EFF!
        // Verify their address here: https://www.eff.org/pages/other-ways-give-and-donor-support#crypto
        // and here: https://etherscan.io/address/0x095f1fD53A56C01c76A2a56B7273995Ce915d8C4
        if (msg.value > 0) {
            payable(0x095f1fD53A56C01c76A2a56B7273995Ce915d8C4).transfer(
                msg.value / 2
            );
        }
    }

    // Owner can claim ids 9500 - 9999, one at a time
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(
            tokenId >= 9500 && tokenId < 10000,
            "Choose an unclaimed index between 9500 and 9999, inclusive"
        );
        string memory h = hash(tokenId);
        tokenIdToHash[tokenId] = h;
        hashToMinted[h] = true;
        _safeMint(owner(), tokenId);
        nonce++;
    }

    function withdraw() public payable nonReentrant onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    // Util functions

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

    function compareStrings(string memory a, string memory b)
        internal
        pure
        returns (bool)
    {
        return (keccak256(abi.encodePacked((a))) ==
            keccak256(abi.encodePacked((b))));
    }

    // This function sucks, don't use it. Really dumb way to turn the hashed
    // 'DNA' of each Headscape into useable integers.
    function charToInt(string memory c) internal pure returns (uint256) {
        if (compareStrings(c, "0")) return 0;
        if (compareStrings(c, "1")) return 1;
        if (compareStrings(c, "2")) return 2;
        if (compareStrings(c, "3")) return 3;
        if (compareStrings(c, "4")) return 4;
        if (compareStrings(c, "5")) return 5;
        if (compareStrings(c, "6")) return 6;
        if (compareStrings(c, "7")) return 7;
        if (compareStrings(c, "8")) return 8;
        return 0;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    // Weight function to get a weighted random number
    // Tweaked from OnChainMonkeys - thank you!
    function usew(uint8[9] memory w, uint256 i) internal pure returns (uint8) {
        uint8 ind = 0;
        uint256 j = uint256(w[0]);
        while (j <= i) {
            ind++;
            j += uint256(w[ind]);
        }
        return ind;
    }

    // Turns a double quote character into a single quote character
    function cleanString(string memory str) internal pure returns (string memory) {
        bytes memory bytesStr = bytes(str);
        for (uint256 i = 0; i < bytesStr.length; i++) {
            if (bytesStr[i] == 0x22) {
                bytesStr[i] = 0x27;
            }
        }
        return string(bytesStr);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

Contract Security Audit

Contract ABI

[{"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"text","type":"string"}],"name":"addTitle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"bytes32","name":"","type":"bytes32"}],"name":"titleToIsTaken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c55600d80546001600160a01b03191673a62db8af602b6d7888b701668bc66440eaa2b1e21790553480156200003c57600080fd5b50604080518082018252600a8152694865616473636170657360b01b602080830191825283518085019094526005845264048445343560dc1b9084015281519192916200008c916000916200010d565b508051620000a29060019060208401906200010d565b50506001600a5550620000b533620000bb565b620001f0565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b61526680620002006000396000f3fe60806040526004361061014b5760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610383578063b88d4fde146103a3578063c87b56dd146103c3578063e985e9c5146103e3578063edc6d4351461042c578063f2fde38b1461045c57600080fd5b80634f6ccce7146102db5780636352211e146102fb57806370a082311461031b578063715018a61461033b5780638da5cb5b1461035057806395d89b411461036e57600080fd5b80632a54e540116101085780632a54e540146102405780632f745c5914610260578063379607f5146102805780633ccfd60b1461029357806342842e0e1461029b578063434f48c4146102bb57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610220575b600080fd5b34801561015c57600080fd5b5061017061016b3660046141e4565b61047c565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a6104a7565b60405161017c9190614260565b3480156101b357600080fd5b506101c76101c2366004614273565b610539565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa3660046142a8565b6105d3565b005b34801561020d57600080fd5b506008545b60405190815260200161017c565b34801561022c57600080fd5b506101ff61023b3660046142d2565b6106e9565b34801561024c57600080fd5b506101ff61025b3660046143bb565b61071a565b34801561026c57600080fd5b5061021261027b3660046142a8565b6109ac565b6101ff61028e366004614273565b610a42565b6101ff610ccd565b3480156102a757600080fd5b506101ff6102b63660046142d2565b610d53565b3480156102c757600080fd5b506101ff6102d6366004614273565b610d6e565b3480156102e757600080fd5b506102126102f6366004614273565b610ee0565b34801561030757600080fd5b506101c7610316366004614273565b610f73565b34801561032757600080fd5b50610212610336366004614416565b610fea565b34801561034757600080fd5b506101ff611071565b34801561035c57600080fd5b50600b546001600160a01b03166101c7565b34801561037a57600080fd5b5061019a6110a7565b34801561038f57600080fd5b506101ff61039e366004614431565b6110b6565b3480156103af57600080fd5b506101ff6103be36600461446d565b61117b565b3480156103cf57600080fd5b5061019a6103de366004614273565b6111b3565b3480156103ef57600080fd5b506101706103fe3660046144e9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561043857600080fd5b50610170610447366004614273565b60116020526000908152604090205460ff1681565b34801561046857600080fd5b506101ff610477366004614416565b611492565b60006001600160e01b0319821663780e9d6360e01b14806104a157506104a18261152d565b92915050565b6060600080546104b69061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546104e29061451c565b801561052f5780601f106105045761010080835404028352916020019161052f565b820191906000526020600020905b81548152906001019060200180831161051257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105de82610f73565b9050806001600160a01b0316836001600160a01b0316141561064c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ae565b336001600160a01b0382161480610668575061066881336103fe565b6106da5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105ae565b6106e4838361157d565b505050565b6106f333826115eb565b61070f5760405162461bcd60e51b81526004016105ae90614557565b6106e48383836116e2565b6002600a54141561073d5760405162461bcd60e51b81526004016105ae906145a8565b6002600a5561074b82610f73565b6001600160a01b0316336001600160a01b0316146107ab5760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f6e2774206f776e2074686973204865616473636170650000000060448201526064016105ae565b600082815260106020526040902080546107c49061451c565b15905061081f5760405162461bcd60e51b815260206004820152602360248201527f546869732048656164736361706520616c7265616479206861732061207469746044820152626c652160e81b60648201526084016105ae565b601160008260405160200161083491906145fb565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16156108b45760405162461bcd60e51b815260206004820152602160248201527f54686973207469746c652068617320616c7265616479206265656e2074616b656044820152603760f91b60648201526084016105ae565b600081511180156108c6575060418151105b61092b5760405162461bcd60e51b815260206004820152603060248201527f456e7465722061207469746c65206174206c65617374203120616e642075702060448201526f746f203634206368617273206c6f6e6760801b60648201526084016105ae565b6109348161188d565b600083815260106020908152604090912082516109579391929190910190614135565b506001601160008360405160200161096f91906145fb565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550506001600a55565b60006109b783610fea565b8210610a195760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105ae565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610a655760405162461bcd60e51b81526004016105ae906145a8565b6002600a558015801590610a795750600b81105b610ad65760405162461bcd60e51b815260206004820152602860248201527f43686f6f7365206174206c65617374203120616e64206174206d6f7374203130604482015267081d1bc81b5a5b9d60c21b60648201526084016105ae565b61251c610ae260085490565b610aec908361462d565b10610b5f5760405162461bcd60e51b815260206004820152603f60248201527f456e746572206120646966666572656e74207175616e74697479202d2074686560448201527f7265206172656e742074686174206d616e79206c65667420746f206d696e740060648201526084016105ae565b610b708166354a6ba7a18000614645565b341015610bb85760405162461bcd60e51b8152602060048201526016602482015275141c9a58d9481a5cc80b8c0c4d481c195c881b5a5b9d60521b60448201526064016105ae565b6000610bc360085490565b905060005b82811015610c70576000610bdb83611911565b6000848152600f602090815260409091208251929350610bff929091840190614135565b506001600e82604051610c1291906145fb565b908152604051908190036020019020805491151560ff19909216919091179055610c42610c3c3390565b84611e35565b600854600c80549194506000610c5783614664565b9190505550508080610c6890614664565b915050610bc8565b503415610cc45773095f1fd53a56c01c76a2a56b7273995ce915d8c46108fc610c9a600234614695565b6040518115909202916000818181858888f19350505050158015610cc2573d6000803e3d6000fd5b505b50506001600a55565b6002600a541415610cf05760405162461bcd60e51b81526004016105ae906145a8565b6002600a55600b546001600160a01b03163314610d1f5760405162461bcd60e51b81526004016105ae906146a9565b60405133904780156108fc02916000818181858888f19350505050158015610d4b573d6000803e3d6000fd5b506001600a55565b6106e48383836040518060200160405280600081525061117b565b6002600a541415610d915760405162461bcd60e51b81526004016105ae906145a8565b6002600a55600b546001600160a01b03163314610dc05760405162461bcd60e51b81526004016105ae906146a9565b61251c8110158015610dd3575061271081105b610e455760405162461bcd60e51b815260206004820152603a60248201527f43686f6f736520616e20756e636c61696d656420696e6465782062657477656560448201527f6e203935303020616e6420393939392c20696e636c757369766500000000000060648201526084016105ae565b6000610e5082611911565b6000838152600f602090815260409091208251929350610e74929091840190614135565b506001600e82604051610e8791906145fb565b908152604051908190036020019020805491151560ff19909216919091179055610ec2610ebc600b546001600160a01b031690565b83611e35565b600c8054906000610ed283614664565b90915550506001600a555050565b6000610eeb60085490565b8210610f4e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105ae565b60088281548110610f6157610f616146de565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ae565b60006001600160a01b0382166110555760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ae565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461109b5760405162461bcd60e51b81526004016105ae906146a9565b6110a56000611e53565b565b6060600180546104b69061451c565b6001600160a01b03821633141561110f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105ae565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61118533836115eb565b6111a15760405162461bcd60e51b81526004016105ae90614557565b6111ad84848484611ea5565b50505050565b6000818152600260205260409020546060906001600160a01b03166112325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ae565b600061123d83611ed8565b90506000806010600086815260200190815260200160002080546112609061451c565b9050116112945761127084612427565b60405160200161128091906146f4565b60405160208183030381529060405261132c565b600084815260106020526040902080546112ad9061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546112d99061451c565b80156113265780601f106112fb57610100808354040283529160200191611326565b820191906000526020600020905b81548152906001019060200180831161130957829003601f168201915b50505050505b905061146a8161133b84612525565b600087815260106020526040902080546113ec91906113599061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546113859061451c565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b505050505060405180602001604052806000815250612f74565b61141257604051806040016040528060048152602001637472756560e01b815250611431565b6040518060400160405280600581526020016466616c736560d81b8152505b61144361143e878a612fcd565b61307a565b6040516020016114569493929190614727565b60405160208183030381529060405261307a565b60405160200161147a919061481d565b60405160208183030381529060405292505050919050565b600b546001600160a01b031633146114bc5760405162461bcd60e51b81526004016105ae906146a9565b6001600160a01b0381166115215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ae565b61152a81611e53565b50565b60006001600160e01b031982166380ac58cd60e01b148061155e57506001600160e01b03198216635b5e139f60e01b145b806104a157506301ffc9a760e01b6001600160e01b03198316146104a1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115b282610f73565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ae565b600061166f83610f73565b9050806001600160a01b0316846001600160a01b031614806116aa5750836001600160a01b031661169f84610539565b6001600160a01b0316145b806116da57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166116f582610f73565b6001600160a01b03161461175d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105ae565b6001600160a01b0382166117bf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ae565b6117ca8383836131e0565b6117d560008261157d565b6001600160a01b03831660009081526003602052604081208054600192906117fe908490614862565b90915550506001600160a01b038216600090815260036020526040812080546001929061182c90849061462d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60608160005b815181101561190a578181815181106118ae576118ae6146de565b6020910101516001600160f81b031916601160f91b14156118f857602760f81b8282815181106118e0576118e06146de565b60200101906001600160f81b031916908160001a9053505b8061190281614664565b915050611893565b5092915050565b604080516101208101825260f0815260e860208083019190915260b482840152605a60608381019190915260506080840152604660a0840152603c60c0840152603a60e08401526037610100840152600c54935190936000936119c1939092610429926119b29261199e92449242928c920193845260208401929092526040830152606082015260800190565b604051602081830303815290604052613298565b6119bc9190614879565b6132c9565b604080516101208101825260fa815260f060208083019190915260e88284015260b46060830152606e6080830152605a60a0830152605060c0830152604660e08301526037610100830152600c549251939450600093611a4a9361051b926119b29261199e92449242928d92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e660208083019190915260dc8284015260d2606083015260c86080830152609660a0830152608c60c0830152608260e08301526078610100830152600c549251939450600093611ad393610668926119b29261199e92449242928e92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260d28284015260bc606083015260826080830152606460a0830152605a60c0830152604e60e08301526045610100830152600c549251939450600093611b5c93610539926119b29261199e92449242928f92910193845260208401929092526040830152606082015260800190565b90506000611bfc60405180610120016040528060fa60ff16815260200160f560ff16815260200160f060ff16815260200160eb60ff16815260200160e660ff16815260200160e160ff16815260200160dc60ff16815260200160d760ff16815260200160d260ff168152506108166119b244428c600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260c88284015260b460608084019190915260aa60808085019190915260a0808501819052608c60c0860152608260e08601526078610100860152600c548651449581019590955242968501969096529183018d9052820193909352929350600092611c8992610624916119b2910161199e565b90506000611d2960405180610120016040528060f060ff16815260200160e860ff16815260200160b460ff168152602001606e60ff168152602001605a60ff168152602001605060ff168152602001604660ff168152602001603c60ff168152602001603760ff1681525061045d6119b244428e600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b905060058760ff1610611d3c5786611d3f565b60005b965060058560ff1610611d525784611d55565b60005b94506000611d658860ff16612427565b611d718860ff16612427565b611d7d8860ff16612427565b611d898860ff16612427565b611d958860ff16612427565b611da18860ff16612427565b611dad8860ff16612427565b604051602001611dc3979695949392919061488d565b6040516020818303038152906040529050600e81604051611de491906145fb565b9081526040519081900360200190205460ff1615611e2857600c8054906000611e0c83614664565b9190505550611e1a8a611911565b9a9950505050505050505050565b9998505050505050505050565b611e4f82826040518060200160405280600081525061331e565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611eb08484846116e2565b611ebc84848484613351565b6111ad5760405162461bcd60e51b81526004016105ae9061491f565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526000838152600f602052604090208054611ff791611ff291611f6b9061451c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f979061451c565b8015611fe45780601f10611fb957610100808354040283529160200191611fe4565b820191906000526020600020905b815481529060010190602001808311611fc757829003601f168201915b50505050506000600161345e565b61352b565b60ff1681526000838152600f6020526040902080546120a491611ff29161201d9061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546120499061451c565b80156120965780601f1061206b57610100808354040283529160200191612096565b820191906000526020600020905b81548152906001019060200180831161207957829003601f168201915b50505050506001600261345e565b60ff166020808301919091526000848152600f90915260409020805461215891611ff2916120d19061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546120fd9061451c565b801561214a5780601f1061211f5761010080835404028352916020019161214a565b820191906000526020600020905b81548152906001019060200180831161212d57829003601f168201915b50505050506002600361345e565b60ff166040808301919091526000848152600f60205220805461220991611ff2916121829061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae9061451c565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b50505050506003600461345e565b60ff1660608201526000838152600f6020526040902080546122b991611ff2916122329061451c565b80601f016020809104026020016040519081016040528092919081815260200182805461225e9061451c565b80156122ab5780601f10612280576101008083540402835291602001916122ab565b820191906000526020600020905b81548152906001019060200180831161228e57829003601f168201915b50505050506004600561345e565b60ff1660808201526000838152600f60205260409020805461236991611ff2916122e29061451c565b80601f016020809104026020016040519081016040528092919081815260200182805461230e9061451c565b801561235b5780601f106123305761010080835404028352916020019161235b565b820191906000526020600020905b81548152906001019060200180831161233e57829003601f168201915b50505050506005600661345e565b60ff1660a08201526000838152600f60205260409020805461241991611ff2916123929061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546123be9061451c565b801561240b5780601f106123e05761010080835404028352916020019161240b565b820191906000526020600020905b8154815290600101906020018083116123ee57829003601f168201915b50505050506006600761345e565b60ff1660c082015292915050565b60608161244b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612475578061245f81614664565b915061246e9050600a83614695565b915061244f565b60008167ffffffffffffffff8111156124905761249061430e565b6040519080825280601f01601f1916602001820160405280156124ba576020820181803683370190505b5090505b84156116da576124cf600183614862565b91506124dc600a86614879565b6124e790603061462d565b60f81b8183815181106124fc576124fc6146de565b60200101906001600160f81b031916908160001a90535061251e600a86614695565b94506124be565b6060604051806101200160405280604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b81525081526020016040518060400160405280600581526020016411985a5b9d60da1b815250815260200160405180604001604052806006815260200165426c6561727960d01b81525081526020016040518060400160405280600581526020016446757a7a7960d81b81525081526020016040518060400160405280600481526020016348617a7960e01b8152508152602001604051806040016040528060068152602001654d796f70696160d01b815250815250826000015160ff1660098110612681576126816146de565b60209081029190910151604080516101608101825260046101208201908152634e6f6e6560e01b6101408301528152815180830183526006808252652634b732b0b960d11b828701528286019190915282518084018452908152651498591a585b60d21b81860152818301528151808301835260108082526f2932b832b0ba34b733902634b732b0b960811b828701526060830191909152825180840184529081526f14995c19585d1a5b99c81498591a585b60821b818601526080820152815180830183526005815264436f6e696360d81b8186015260a082015281518083018352600f81526e141e5c985b5a5908119b185b9b995b608a1b8186015260c082015281518083018352600a8152692934b9b4b7339029bab760b11b8186015260e08201528151808301909252600d82526c14985a5b989bddc815da19595b609a1b828501526101008101919091529184015190919060ff16600981106127ea576127ea6146de565b60209081029190910151604080516101608101825260046101208201818152634e6f6e6560e01b6101408401819052908352835180850185528281528087018290528387015283518085018552828152808701829052838501528351808501855282815280870182905260608401528351808501855291825281860152608082015281518083018352601081526f121a59da08141bda5b9d08131a59da1d60821b8186015260a0820152815180830183526012815271131bddc8111a5cdd185b98d948131a59da1d60721b8186015260c082015281518083018352600f81526e131bddc8141bda5b9d08131a59da1d608a1b8186015260e0820152815180830183526013815272121a59da08111a5cdd185b98d948131a59da1d606a1b9481019490945261010081019390935285015190919060ff1660098110612930576129306146de565b602002015160405180610120016040528060405180604001604052806002815260200161031360f41b815250815260200160405180604001604052806002815260200161032360f41b81525081526020016040518060400160405280600381526020016203130360ec1b81525081526020016040518060400160405280600381526020016203330360ec1b81525081526020016040518060400160405280600c81526020016b29b430b832b9b434b33a32b960a11b8152508152602001604051806040016040528060048152602001630313030360e41b81525081526020016040518060400160405280600981526020016839383720416c70686160b81b81525081526020016040518060400160405280600c81526020016b5b72656461637465645d204960a01b81525081526020016040518060400160405280600d81526020016c5b72656461637465645d20494960981b815250815250856060015160ff1660098110612aa157612aa16146de565b60200201516040518061012001604052806040518060400160405280600d81526020016c507572706c652046616272696360981b81525081526020016040518060400160405280600d81526020016c4d6f756e7461696e2048617a6560981b81525081526020016040518060400160405280600f81526020016e4e6f72746865726e204c696768747360881b8152508152602001604051806040016040528060088152602001674c61766120536b7960c01b81525081526020016040518060400160405280600c81526020016b082eae8eadadc4086e4eae6d60a31b81525081526020016040518060400160405280600a81526020016911185c9ac813595d185b60b21b81525081526020016040518060400160405280600981526020016846616c6c204669726560b81b81525081526020016040518060400160405280600d81526020016c53656372657420537072696e6760981b81525081526020016040518060400160405280600e81526020016d57696e746572204d7573696e677360901b815250815250866080015160ff1660098110612c4157612c416146de565b602002015160405180610120016040528060405180604001604052806005815260200164437562657360d81b81525081526020016040518060400160405280600c81526020016b446f74732026204c696e657360a01b815250815260200160405180604001604052806009815260200168587320616e64204f7360b81b81525081526020016040518060400160405280600781526020016642616e6e65727360c81b815250815260200160405180604001604052806007815260200166436972636c657360c81b815250815260200160405180604001604052806009815260200168547269616e676c657360b81b8152508152602001604051806040016040528060098152602001685371756967676c657360b81b815250815260200160405180604001604052806005815260200164141b185a5960da1b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508760a0015160ff1660098110612db957612db96146de565b6020020151604051806101200160405280604051806040016040528060098152602001684672616374616c203160b81b815250815260200160405180604001604052806009815260200168233930b1ba30b6101960b91b8152508152602001604051806040016040528060098152602001684672616374616c203360b81b815250815260200160405180604001604052806009815260200168119c9858dd185b080d60ba1b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203160a01b8152508152602001604051806040016040528060098152602001684672616374616c203560b81b81525081526020016040518060400160405280600c81526020016b2a3ab9313ab632b731b2901960a11b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203360a01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508860c0015160ff1660098110612f4357612f436146de565b6020020151604051602001612f5e9796959493929190614971565b6040516020818303038152906040529050919050565b600081604051602001612f8791906145fb565b6040516020818303038152906040528051906020012083604051602001612fae91906145fb565b6040516020818303038152906040528051906020012014905092915050565b60606000612fdb84846136e5565b905060008460a0015160ff1660081461301f5760405180604001604052806013815260200172103334b6361e913ab9361411b818149110179f60691b81525061304c565b60405180604001604052806013815260200172103334b6361e913b30b9141696b1149110179f60691b8152505b90508181604051602001613061929190614b8d565b6040516020818303038152906040529250505092915050565b80516060908061309a575050604080516020810190915260008152919050565b600060036130a983600261462d565b6130b39190614695565b6130be906004614645565b905060006130cd82602061462d565b67ffffffffffffffff8111156130e5576130e561430e565b6040519080825280601f01601f19166020018201604052801561310f576020820181803683370190505b50905060006040518060600160405280604081526020016151a7604091399050600181016020830160005b8681101561319b576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161313a565b5060038606600181146131b557600281146131c6576131d2565b613d3d60f01b6001198301526131d2565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b03831661323b5761323681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61325e565b816001600160a01b0316836001600160a01b03161461325e5761325e83826138fc565b6001600160a01b038216613275576106e481613999565b826001600160a01b0316826001600160a01b0316146106e4576106e48282613a48565b6000816040516020016132ab91906145fb565b60408051601f19818403018152919052805160209091012092915050565b8151600090819060ff165b83811161331657816132e581614c13565b925050848260ff16600981106132fd576132fd6146de565b602002015161330f9060ff168261462d565b90506132d4565b509392505050565b6133288383613a8c565b6133356000848484613351565b6106e45760405162461bcd60e51b81526004016105ae9061491f565b60006001600160a01b0384163b1561345357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613395903390899088908890600401614c33565b602060405180830381600087803b1580156133af57600080fd5b505af19250505080156133df575060408051601f3d908101601f191682019092526133dc91810190614c70565b60015b613439573d80801561340d576040519150601f19603f3d011682016040523d82523d6000602084013e613412565b606091505b5080516134315760405162461bcd60e51b81526004016105ae9061491f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116da565b506001949350505050565b606083600061346d8585614862565b67ffffffffffffffff8111156134855761348561430e565b6040519080825280601f01601f1916602001820160405280156134af576020820181803683370190505b509050845b84811015613521578281815181106134ce576134ce6146de565b01602001516001600160f81b031916826134e88884614862565b815181106134f8576134f86146de565b60200101906001600160f81b031916908160001a9053508061351981614664565b9150506134b4565b5095945050505050565b600061355082604051806040016040528060018152602001600360fc1b815250612f74565b1561355d57506000919050565b61358082604051806040016040528060018152602001603160f81b815250612f74565b1561358d57506001919050565b6135b082604051806040016040528060018152602001601960f91b815250612f74565b156135bd57506002919050565b6135e082604051806040016040528060018152602001603360f81b815250612f74565b156135ed57506003919050565b61361082604051806040016040528060018152602001600d60fa1b815250612f74565b1561361d57506004919050565b61364082604051806040016040528060018152602001603560f81b815250612f74565b1561364d57506005919050565b61367082604051806040016040528060018152602001601b60f91b815250612f74565b1561367d57506006919050565b6136a082604051806040016040528060018152602001603760f81b815250612f74565b156136ad57506007919050565b6136d082604051806040016040528060018152602001600760fb1b815250612f74565b156136dd57506008919050565b506000919050565b600d5460208301516040516310853bd960e21b815260ff90911660048201526060916000916001600160a01b0390911690634214ef649060240160006040518083038186803b15801561373757600080fd5b505afa15801561374b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137739190810190614c8d565b600d546080860151604051630e9b3c1160e01b815260ff90911660048201526001600160a01b0390911690630e9b3c119060240160006040518083038186803b1580156137bf57600080fd5b505afa1580156137d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137fb9190810190614c8d565b8560a0015160ff166008146138b657600d5460a087015160405163cd36223960e01b815260ff90911660048201526001600160a01b039091169063cd3622399060240160006040518083038186803b15801561385657600080fd5b505afa15801561386a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138929190810190614c8d565b6040516020016138a29190614d04565b6040516020818303038152906040526138c7565b604051806020016040528060008152505b6138d18787613bda565b6040516020016138e49493929190614d52565b60408051808303601f19018152919052949350505050565b6000600161390984610fea565b6139139190614862565b600083815260076020526040902054909150808214613966576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139ab90600190614862565b600083815260096020526040812054600880549394509092849081106139d3576139d36146de565b9060005260206000200154905080600883815481106139f4576139f46146de565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a2c57613a2c614eab565b6001900381819060005260206000200160009055905550505050565b6000613a5383610fea565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613ae25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ae565b6000818152600260205260409020546001600160a01b031615613b475760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105ae565b613b53600083836131e0565b6001600160a01b0382166000908152600360205260408120805460019290613b7c90849061462d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060008360a0015160ff16600814613c1f5760405180604001604052806014815260200173034b71e91391991103932b9bab63a1e91391a11160651b815250613c4d565b60405180604001604052806014815260200173034b71e91391911103932b9bab63a1e91391991160651b8152505b600d5460408681015190516390dbf17560e01b815260ff90911660048201529192506000916001600160a01b03909116906390dbf1759060240160006040518083038186803b158015613c9f57600080fd5b505afa158015613cb3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cdb9190810190614c8d565b90506000613cf88260405180602001604052806000815250612f74565b613da957600d5460408781015190516390dbf17560e01b815260ff909116600482015284916001600160a01b0316906390dbf1759060240160006040518083038186803b158015613d4857600080fd5b505afa158015613d5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d849190810190614c8d565b604051602001613d95929190614ec1565b604051602081830303815290604052613dba565b604051806020016040528060008152505b90506000613dc9600287614879565b15613dec576040518060800160405280604a81526020016151e7604a9139613e0f565b604051806040016040528060098152602001681e17b334b63a32b91f60b91b8152505b905060608760a0015160ff1660081415613f6357600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613e6f57600080fd5b505afa158015613e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613eab9190810190614c8d565b613eb488612427565b600d548a51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b158015613efd57600080fd5b505afa158015613f11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f399190810190614c8d565b85604051602001613f4d9493929190614f32565b604051602081830303815290604052905061412a565b600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613faf57600080fd5b505afa158015613fc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613feb9190810190614c8d565b613ff488612427565b600d5460608b01516040516336a8813760e11b815260ff90911660048201526001600160a01b0390911690636d51026e9060240160006040518083038186803b15801561404057600080fd5b505afa158015614054573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261407c9190810190614c8d565b600d548b51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b1580156140c557600080fd5b505afa1580156140d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141019190810190614c8d565b86866040516020016141189695949392919061504f565b60405160208183030381529060405290505b979650505050505050565b8280546141419061451c565b90600052602060002090601f01602090048101928261416357600085556141a9565b82601f1061417c57805160ff19168380011785556141a9565b828001600101855582156141a9579182015b828111156141a957825182559160200191906001019061418e565b506141b59291506141b9565b5090565b5b808211156141b557600081556001016141ba565b6001600160e01b03198116811461152a57600080fd5b6000602082840312156141f657600080fd5b8135614201816141ce565b9392505050565b60005b8381101561422357818101518382015260200161420b565b838111156111ad5750506000910152565b6000815180845261424c816020860160208601614208565b601f01601f19169290920160200192915050565b6020815260006142016020830184614234565b60006020828403121561428557600080fd5b5035919050565b80356001600160a01b03811681146142a357600080fd5b919050565b600080604083850312156142bb57600080fd5b6142c48361428c565b946020939093013593505050565b6000806000606084860312156142e757600080fd5b6142f08461428c565b92506142fe6020850161428c565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561434d5761434d61430e565b604052919050565b600067ffffffffffffffff82111561436f5761436f61430e565b50601f01601f191660200190565b600061439061438b84614355565b614324565b90508281528383830111156143a457600080fd5b828260208301376000602084830101529392505050565b600080604083850312156143ce57600080fd5b82359150602083013567ffffffffffffffff8111156143ec57600080fd5b8301601f810185136143fd57600080fd5b61440c8582356020840161437d565b9150509250929050565b60006020828403121561442857600080fd5b6142018261428c565b6000806040838503121561444457600080fd5b61444d8361428c565b91506020830135801515811461446257600080fd5b809150509250929050565b6000806000806080858703121561448357600080fd5b61448c8561428c565b935061449a6020860161428c565b925060408501359150606085013567ffffffffffffffff8111156144bd57600080fd5b8501601f810187136144ce57600080fd5b6144dd8782356020840161437d565b91505092959194509250565b600080604083850312156144fc57600080fd5b6145058361428c565b91506145136020840161428c565b90509250929050565b600181811c9082168061453057607f821691505b6020821081141561455157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600081516145f1818560208601614208565b9290920192915050565b6000825161460d818460208701614208565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561464057614640614617565b500190565b600081600019048311821515161561465f5761465f614617565b500290565b600060001982141561467857614678614617565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826146a4576146a461467f565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6a486561647363617065202360a81b81526000825161471a81600b850160208701614208565b91909101600b0192915050565b693d913730b6b2911d101160b11b8152845160009061474d81600a850160208a01614208565b85519083019061476481600a840160208a01614208565b7f227d2c7b2274726169745f74797065223a20225469746c6564222c2276616c75600a92909101918201526432911d101160d91b602a82015284516147b081602f840160208901614208565b7f227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d602f9290910191820152681b0ed8985cd94d8d0b60ba1b604f8201528351614800816058840160208801614208565b61227d60f01b60589290910191820152605a019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161485581601d850160208701614208565b91909101601d0192915050565b60008282101561487457614874614617565b500390565b6000826148885761488861467f565b500690565b6000885160206148a08285838e01614208565b8951918401916148b38184848e01614208565b89519201916148c58184848d01614208565b88519201916148d78184848c01614208565b87519201916148e98184848b01614208565b86519201916148fb8184848a01614208565b855192019161490d8184848901614208565b919091019a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a815271101121363ab91116113b30b63ab2911d101160711b6020820152600088516149c4816032850160208d01614208565b7f227d2c7b2274726169745f74797065223a20224772616469656e74222c22766160329184019182015266363ab2911d101160c91b60528201528851614a11816059840160208d01614208565b7f227d2c7b2274726169745f74797065223a20224c69676874222c2276616c75656059929091019182015263111d101160e11b60798201528751614a5c81607d840160208c01614208565b614b7e614b78614b3d614b37614aff614af9614ac1614abb607d898b01017f227d2c7b2274726169745f74797065223a2022446973706c6163656d656e742081526e26b0b81116113b30b63ab2911d101160891b6020820152602f0190565b8f6145df565b7f227d2c7b2274726169745f74797065223a202250616c65747465222c2276616c8152653ab2911d101160d11b602082015260260190565b8c6145df565b7f227d2c7b2274726169745f74797065223a20225061747465726e222c2276616c8152653ab2911d101160d11b602082015260260190565b896145df565b7f227d2c7b2274726169745f74797065223a202254757262756c656e6365222c228152683b30b63ab2911d101160b91b602082015260290190565b866145df565b9b9a5050505050505050505050565b60008351614b9f818460208801614208565b80830190507f3c72656374206865696768743d22353030222077696474683d223135303022208152703334b63a32b91e913ab9361411b318149160791b60208201528351614bf4816031840160208801614208565b651e17b9bb339f60d11b60319290910191820152603701949350505050565b600060ff821660ff811415614c2a57614c2a614617565b60010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c6690830184614234565b9695505050505050565b600060208284031215614c8257600080fd5b8151614201816141ce565b600060208284031215614c9f57600080fd5b815167ffffffffffffffff811115614cb657600080fd5b8201601f81018413614cc757600080fd5b8051614cd561438b82614355565b818152856020838501011115614cea57600080fd5b614cfb826020830160208601614208565b95945050505050565b7001e3830ba3a32b9371034b21e913818111607d1b81528151600090614d31816011850160208701614208565b691e17b830ba3a32b9371f60b11b6011939091019283015250601b01919050565b7f3c7376672077696474683d223135303022206865696768743d2235303022207681527f657273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e7760208201527f332e6f72672f323030302f73766722207374796c653d22706f736974696f6e3a60408201527f2072656c61746976653b206261636b67726f756e643a20000000000000000000606082015260008551614dfc816077850160208a01614208565b6d1d911031b630b9b99e913198111f60911b6077918401918201526c3c7374796c653e2e63307b2d2d60981b60858201528551614e40816092840160208a01614208565b691dbe9e17b9ba3cb6329f60b11b60929290910191820152651e3232b3399f60d11b609c8201528451614e7a8160a2840160208901614208565b614e9f614e8c60a283850101876145df565b661e17b232b3399f60c91b815260070190565b98975050505050505050565b634e487b7160e01b600052603160045260246000fd5b7f3c6665446966667573654c69676874696e67206c69676874696e672d636f6c6f81526c0391e913b30b9141696b094911609d1b602082015260008351614f0f81602d850160208801614208565b835190830190614f2681602d840160208801614208565b01602d01949350505050565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b60108201528451600090614f7581601e850160208a01614208565b661039b2b2b21e9160c91b601e918401918201528551614f9c816025840160208a01614208565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665476175737369616e426c757220737464446576696174696f6e3d22000060358201528451614ff3816053840160208901614208565b7f2220696e3d2272312220726573756c743d22723222202f3e000000000000000060539290910191820152835161503181606b840160208801614208565b614e9f606b82840101681e17b334b63a32b91f60b91b815260090190565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b6010820152865160009061509281601e850160208c01614208565b661039b2b2b21e9160c91b601e9184019182015287516150b9816025840160208c01614208565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665446973706c6163656d656e744d617020696e323d2272312220726573756035820152670363a1e91391911160c51b6055820152865161512181605d840160208b01614208565b611e1a614b786151a0615177615171615148605d878901016210179f60e91b815260030190565b7f3c6665476175737369616e426c757220737464446576696174696f6e3d2200008152601e0190565b8b6145df565b7f2220696e3d2272322220726573756c743d22723322202f3e0000000000000000815260180190565b886145df56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c66654d657267653e3c66654d657267654e6f646520696e3d22723422202f3e3c66654d657267654e6f646520696e3d22723222202f3e3c2f66654d657267653e3c2f66696c7465723ea2646970667358221220239c643bdb346de1e042175d303437e5501dad9d3cca163cf27b813918e8681f64736f6c63430008090033

Deployed Bytecode

0x60806040526004361061014b5760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610383578063b88d4fde146103a3578063c87b56dd146103c3578063e985e9c5146103e3578063edc6d4351461042c578063f2fde38b1461045c57600080fd5b80634f6ccce7146102db5780636352211e146102fb57806370a082311461031b578063715018a61461033b5780638da5cb5b1461035057806395d89b411461036e57600080fd5b80632a54e540116101085780632a54e540146102405780632f745c5914610260578063379607f5146102805780633ccfd60b1461029357806342842e0e1461029b578063434f48c4146102bb57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610220575b600080fd5b34801561015c57600080fd5b5061017061016b3660046141e4565b61047c565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a6104a7565b60405161017c9190614260565b3480156101b357600080fd5b506101c76101c2366004614273565b610539565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa3660046142a8565b6105d3565b005b34801561020d57600080fd5b506008545b60405190815260200161017c565b34801561022c57600080fd5b506101ff61023b3660046142d2565b6106e9565b34801561024c57600080fd5b506101ff61025b3660046143bb565b61071a565b34801561026c57600080fd5b5061021261027b3660046142a8565b6109ac565b6101ff61028e366004614273565b610a42565b6101ff610ccd565b3480156102a757600080fd5b506101ff6102b63660046142d2565b610d53565b3480156102c757600080fd5b506101ff6102d6366004614273565b610d6e565b3480156102e757600080fd5b506102126102f6366004614273565b610ee0565b34801561030757600080fd5b506101c7610316366004614273565b610f73565b34801561032757600080fd5b50610212610336366004614416565b610fea565b34801561034757600080fd5b506101ff611071565b34801561035c57600080fd5b50600b546001600160a01b03166101c7565b34801561037a57600080fd5b5061019a6110a7565b34801561038f57600080fd5b506101ff61039e366004614431565b6110b6565b3480156103af57600080fd5b506101ff6103be36600461446d565b61117b565b3480156103cf57600080fd5b5061019a6103de366004614273565b6111b3565b3480156103ef57600080fd5b506101706103fe3660046144e9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561043857600080fd5b50610170610447366004614273565b60116020526000908152604090205460ff1681565b34801561046857600080fd5b506101ff610477366004614416565b611492565b60006001600160e01b0319821663780e9d6360e01b14806104a157506104a18261152d565b92915050565b6060600080546104b69061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546104e29061451c565b801561052f5780601f106105045761010080835404028352916020019161052f565b820191906000526020600020905b81548152906001019060200180831161051257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105de82610f73565b9050806001600160a01b0316836001600160a01b0316141561064c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ae565b336001600160a01b0382161480610668575061066881336103fe565b6106da5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105ae565b6106e4838361157d565b505050565b6106f333826115eb565b61070f5760405162461bcd60e51b81526004016105ae90614557565b6106e48383836116e2565b6002600a54141561073d5760405162461bcd60e51b81526004016105ae906145a8565b6002600a5561074b82610f73565b6001600160a01b0316336001600160a01b0316146107ab5760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f6e2774206f776e2074686973204865616473636170650000000060448201526064016105ae565b600082815260106020526040902080546107c49061451c565b15905061081f5760405162461bcd60e51b815260206004820152602360248201527f546869732048656164736361706520616c7265616479206861732061207469746044820152626c652160e81b60648201526084016105ae565b601160008260405160200161083491906145fb565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16156108b45760405162461bcd60e51b815260206004820152602160248201527f54686973207469746c652068617320616c7265616479206265656e2074616b656044820152603760f91b60648201526084016105ae565b600081511180156108c6575060418151105b61092b5760405162461bcd60e51b815260206004820152603060248201527f456e7465722061207469746c65206174206c65617374203120616e642075702060448201526f746f203634206368617273206c6f6e6760801b60648201526084016105ae565b6109348161188d565b600083815260106020908152604090912082516109579391929190910190614135565b506001601160008360405160200161096f91906145fb565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550506001600a55565b60006109b783610fea565b8210610a195760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105ae565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610a655760405162461bcd60e51b81526004016105ae906145a8565b6002600a558015801590610a795750600b81105b610ad65760405162461bcd60e51b815260206004820152602860248201527f43686f6f7365206174206c65617374203120616e64206174206d6f7374203130604482015267081d1bc81b5a5b9d60c21b60648201526084016105ae565b61251c610ae260085490565b610aec908361462d565b10610b5f5760405162461bcd60e51b815260206004820152603f60248201527f456e746572206120646966666572656e74207175616e74697479202d2074686560448201527f7265206172656e742074686174206d616e79206c65667420746f206d696e740060648201526084016105ae565b610b708166354a6ba7a18000614645565b341015610bb85760405162461bcd60e51b8152602060048201526016602482015275141c9a58d9481a5cc80b8c0c4d481c195c881b5a5b9d60521b60448201526064016105ae565b6000610bc360085490565b905060005b82811015610c70576000610bdb83611911565b6000848152600f602090815260409091208251929350610bff929091840190614135565b506001600e82604051610c1291906145fb565b908152604051908190036020019020805491151560ff19909216919091179055610c42610c3c3390565b84611e35565b600854600c80549194506000610c5783614664565b9190505550508080610c6890614664565b915050610bc8565b503415610cc45773095f1fd53a56c01c76a2a56b7273995ce915d8c46108fc610c9a600234614695565b6040518115909202916000818181858888f19350505050158015610cc2573d6000803e3d6000fd5b505b50506001600a55565b6002600a541415610cf05760405162461bcd60e51b81526004016105ae906145a8565b6002600a55600b546001600160a01b03163314610d1f5760405162461bcd60e51b81526004016105ae906146a9565b60405133904780156108fc02916000818181858888f19350505050158015610d4b573d6000803e3d6000fd5b506001600a55565b6106e48383836040518060200160405280600081525061117b565b6002600a541415610d915760405162461bcd60e51b81526004016105ae906145a8565b6002600a55600b546001600160a01b03163314610dc05760405162461bcd60e51b81526004016105ae906146a9565b61251c8110158015610dd3575061271081105b610e455760405162461bcd60e51b815260206004820152603a60248201527f43686f6f736520616e20756e636c61696d656420696e6465782062657477656560448201527f6e203935303020616e6420393939392c20696e636c757369766500000000000060648201526084016105ae565b6000610e5082611911565b6000838152600f602090815260409091208251929350610e74929091840190614135565b506001600e82604051610e8791906145fb565b908152604051908190036020019020805491151560ff19909216919091179055610ec2610ebc600b546001600160a01b031690565b83611e35565b600c8054906000610ed283614664565b90915550506001600a555050565b6000610eeb60085490565b8210610f4e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105ae565b60088281548110610f6157610f616146de565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ae565b60006001600160a01b0382166110555760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ae565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461109b5760405162461bcd60e51b81526004016105ae906146a9565b6110a56000611e53565b565b6060600180546104b69061451c565b6001600160a01b03821633141561110f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105ae565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61118533836115eb565b6111a15760405162461bcd60e51b81526004016105ae90614557565b6111ad84848484611ea5565b50505050565b6000818152600260205260409020546060906001600160a01b03166112325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ae565b600061123d83611ed8565b90506000806010600086815260200190815260200160002080546112609061451c565b9050116112945761127084612427565b60405160200161128091906146f4565b60405160208183030381529060405261132c565b600084815260106020526040902080546112ad9061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546112d99061451c565b80156113265780601f106112fb57610100808354040283529160200191611326565b820191906000526020600020905b81548152906001019060200180831161130957829003601f168201915b50505050505b905061146a8161133b84612525565b600087815260106020526040902080546113ec91906113599061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546113859061451c565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b505050505060405180602001604052806000815250612f74565b61141257604051806040016040528060048152602001637472756560e01b815250611431565b6040518060400160405280600581526020016466616c736560d81b8152505b61144361143e878a612fcd565b61307a565b6040516020016114569493929190614727565b60405160208183030381529060405261307a565b60405160200161147a919061481d565b60405160208183030381529060405292505050919050565b600b546001600160a01b031633146114bc5760405162461bcd60e51b81526004016105ae906146a9565b6001600160a01b0381166115215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ae565b61152a81611e53565b50565b60006001600160e01b031982166380ac58cd60e01b148061155e57506001600160e01b03198216635b5e139f60e01b145b806104a157506301ffc9a760e01b6001600160e01b03198316146104a1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115b282610f73565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ae565b600061166f83610f73565b9050806001600160a01b0316846001600160a01b031614806116aa5750836001600160a01b031661169f84610539565b6001600160a01b0316145b806116da57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166116f582610f73565b6001600160a01b03161461175d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105ae565b6001600160a01b0382166117bf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ae565b6117ca8383836131e0565b6117d560008261157d565b6001600160a01b03831660009081526003602052604081208054600192906117fe908490614862565b90915550506001600160a01b038216600090815260036020526040812080546001929061182c90849061462d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60608160005b815181101561190a578181815181106118ae576118ae6146de565b6020910101516001600160f81b031916601160f91b14156118f857602760f81b8282815181106118e0576118e06146de565b60200101906001600160f81b031916908160001a9053505b8061190281614664565b915050611893565b5092915050565b604080516101208101825260f0815260e860208083019190915260b482840152605a60608381019190915260506080840152604660a0840152603c60c0840152603a60e08401526037610100840152600c54935190936000936119c1939092610429926119b29261199e92449242928c920193845260208401929092526040830152606082015260800190565b604051602081830303815290604052613298565b6119bc9190614879565b6132c9565b604080516101208101825260fa815260f060208083019190915260e88284015260b46060830152606e6080830152605a60a0830152605060c0830152604660e08301526037610100830152600c549251939450600093611a4a9361051b926119b29261199e92449242928d92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e660208083019190915260dc8284015260d2606083015260c86080830152609660a0830152608c60c0830152608260e08301526078610100830152600c549251939450600093611ad393610668926119b29261199e92449242928e92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260d28284015260bc606083015260826080830152606460a0830152605a60c0830152604e60e08301526045610100830152600c549251939450600093611b5c93610539926119b29261199e92449242928f92910193845260208401929092526040830152606082015260800190565b90506000611bfc60405180610120016040528060fa60ff16815260200160f560ff16815260200160f060ff16815260200160eb60ff16815260200160e660ff16815260200160e160ff16815260200160dc60ff16815260200160d760ff16815260200160d260ff168152506108166119b244428c600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260c88284015260b460608084019190915260aa60808085019190915260a0808501819052608c60c0860152608260e08601526078610100860152600c548651449581019590955242968501969096529183018d9052820193909352929350600092611c8992610624916119b2910161199e565b90506000611d2960405180610120016040528060f060ff16815260200160e860ff16815260200160b460ff168152602001606e60ff168152602001605a60ff168152602001605060ff168152602001604660ff168152602001603c60ff168152602001603760ff1681525061045d6119b244428e600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b905060058760ff1610611d3c5786611d3f565b60005b965060058560ff1610611d525784611d55565b60005b94506000611d658860ff16612427565b611d718860ff16612427565b611d7d8860ff16612427565b611d898860ff16612427565b611d958860ff16612427565b611da18860ff16612427565b611dad8860ff16612427565b604051602001611dc3979695949392919061488d565b6040516020818303038152906040529050600e81604051611de491906145fb565b9081526040519081900360200190205460ff1615611e2857600c8054906000611e0c83614664565b9190505550611e1a8a611911565b9a9950505050505050505050565b9998505050505050505050565b611e4f82826040518060200160405280600081525061331e565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611eb08484846116e2565b611ebc84848484613351565b6111ad5760405162461bcd60e51b81526004016105ae9061491f565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526000838152600f602052604090208054611ff791611ff291611f6b9061451c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f979061451c565b8015611fe45780601f10611fb957610100808354040283529160200191611fe4565b820191906000526020600020905b815481529060010190602001808311611fc757829003601f168201915b50505050506000600161345e565b61352b565b60ff1681526000838152600f6020526040902080546120a491611ff29161201d9061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546120499061451c565b80156120965780601f1061206b57610100808354040283529160200191612096565b820191906000526020600020905b81548152906001019060200180831161207957829003601f168201915b50505050506001600261345e565b60ff166020808301919091526000848152600f90915260409020805461215891611ff2916120d19061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546120fd9061451c565b801561214a5780601f1061211f5761010080835404028352916020019161214a565b820191906000526020600020905b81548152906001019060200180831161212d57829003601f168201915b50505050506002600361345e565b60ff166040808301919091526000848152600f60205220805461220991611ff2916121829061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae9061451c565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b50505050506003600461345e565b60ff1660608201526000838152600f6020526040902080546122b991611ff2916122329061451c565b80601f016020809104026020016040519081016040528092919081815260200182805461225e9061451c565b80156122ab5780601f10612280576101008083540402835291602001916122ab565b820191906000526020600020905b81548152906001019060200180831161228e57829003601f168201915b50505050506004600561345e565b60ff1660808201526000838152600f60205260409020805461236991611ff2916122e29061451c565b80601f016020809104026020016040519081016040528092919081815260200182805461230e9061451c565b801561235b5780601f106123305761010080835404028352916020019161235b565b820191906000526020600020905b81548152906001019060200180831161233e57829003601f168201915b50505050506005600661345e565b60ff1660a08201526000838152600f60205260409020805461241991611ff2916123929061451c565b80601f01602080910402602001604051908101604052809291908181526020018280546123be9061451c565b801561240b5780601f106123e05761010080835404028352916020019161240b565b820191906000526020600020905b8154815290600101906020018083116123ee57829003601f168201915b50505050506006600761345e565b60ff1660c082015292915050565b60608161244b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612475578061245f81614664565b915061246e9050600a83614695565b915061244f565b60008167ffffffffffffffff8111156124905761249061430e565b6040519080825280601f01601f1916602001820160405280156124ba576020820181803683370190505b5090505b84156116da576124cf600183614862565b91506124dc600a86614879565b6124e790603061462d565b60f81b8183815181106124fc576124fc6146de565b60200101906001600160f81b031916908160001a90535061251e600a86614695565b94506124be565b6060604051806101200160405280604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b81525081526020016040518060400160405280600581526020016411985a5b9d60da1b815250815260200160405180604001604052806006815260200165426c6561727960d01b81525081526020016040518060400160405280600581526020016446757a7a7960d81b81525081526020016040518060400160405280600481526020016348617a7960e01b8152508152602001604051806040016040528060068152602001654d796f70696160d01b815250815250826000015160ff1660098110612681576126816146de565b60209081029190910151604080516101608101825260046101208201908152634e6f6e6560e01b6101408301528152815180830183526006808252652634b732b0b960d11b828701528286019190915282518084018452908152651498591a585b60d21b81860152818301528151808301835260108082526f2932b832b0ba34b733902634b732b0b960811b828701526060830191909152825180840184529081526f14995c19585d1a5b99c81498591a585b60821b818601526080820152815180830183526005815264436f6e696360d81b8186015260a082015281518083018352600f81526e141e5c985b5a5908119b185b9b995b608a1b8186015260c082015281518083018352600a8152692934b9b4b7339029bab760b11b8186015260e08201528151808301909252600d82526c14985a5b989bddc815da19595b609a1b828501526101008101919091529184015190919060ff16600981106127ea576127ea6146de565b60209081029190910151604080516101608101825260046101208201818152634e6f6e6560e01b6101408401819052908352835180850185528281528087018290528387015283518085018552828152808701829052838501528351808501855282815280870182905260608401528351808501855291825281860152608082015281518083018352601081526f121a59da08141bda5b9d08131a59da1d60821b8186015260a0820152815180830183526012815271131bddc8111a5cdd185b98d948131a59da1d60721b8186015260c082015281518083018352600f81526e131bddc8141bda5b9d08131a59da1d608a1b8186015260e0820152815180830183526013815272121a59da08111a5cdd185b98d948131a59da1d606a1b9481019490945261010081019390935285015190919060ff1660098110612930576129306146de565b602002015160405180610120016040528060405180604001604052806002815260200161031360f41b815250815260200160405180604001604052806002815260200161032360f41b81525081526020016040518060400160405280600381526020016203130360ec1b81525081526020016040518060400160405280600381526020016203330360ec1b81525081526020016040518060400160405280600c81526020016b29b430b832b9b434b33a32b960a11b8152508152602001604051806040016040528060048152602001630313030360e41b81525081526020016040518060400160405280600981526020016839383720416c70686160b81b81525081526020016040518060400160405280600c81526020016b5b72656461637465645d204960a01b81525081526020016040518060400160405280600d81526020016c5b72656461637465645d20494960981b815250815250856060015160ff1660098110612aa157612aa16146de565b60200201516040518061012001604052806040518060400160405280600d81526020016c507572706c652046616272696360981b81525081526020016040518060400160405280600d81526020016c4d6f756e7461696e2048617a6560981b81525081526020016040518060400160405280600f81526020016e4e6f72746865726e204c696768747360881b8152508152602001604051806040016040528060088152602001674c61766120536b7960c01b81525081526020016040518060400160405280600c81526020016b082eae8eadadc4086e4eae6d60a31b81525081526020016040518060400160405280600a81526020016911185c9ac813595d185b60b21b81525081526020016040518060400160405280600981526020016846616c6c204669726560b81b81525081526020016040518060400160405280600d81526020016c53656372657420537072696e6760981b81525081526020016040518060400160405280600e81526020016d57696e746572204d7573696e677360901b815250815250866080015160ff1660098110612c4157612c416146de565b602002015160405180610120016040528060405180604001604052806005815260200164437562657360d81b81525081526020016040518060400160405280600c81526020016b446f74732026204c696e657360a01b815250815260200160405180604001604052806009815260200168587320616e64204f7360b81b81525081526020016040518060400160405280600781526020016642616e6e65727360c81b815250815260200160405180604001604052806007815260200166436972636c657360c81b815250815260200160405180604001604052806009815260200168547269616e676c657360b81b8152508152602001604051806040016040528060098152602001685371756967676c657360b81b815250815260200160405180604001604052806005815260200164141b185a5960da1b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508760a0015160ff1660098110612db957612db96146de565b6020020151604051806101200160405280604051806040016040528060098152602001684672616374616c203160b81b815250815260200160405180604001604052806009815260200168233930b1ba30b6101960b91b8152508152602001604051806040016040528060098152602001684672616374616c203360b81b815250815260200160405180604001604052806009815260200168119c9858dd185b080d60ba1b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203160a01b8152508152602001604051806040016040528060098152602001684672616374616c203560b81b81525081526020016040518060400160405280600c81526020016b2a3ab9313ab632b731b2901960a11b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203360a01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508860c0015160ff1660098110612f4357612f436146de565b6020020151604051602001612f5e9796959493929190614971565b6040516020818303038152906040529050919050565b600081604051602001612f8791906145fb565b6040516020818303038152906040528051906020012083604051602001612fae91906145fb565b6040516020818303038152906040528051906020012014905092915050565b60606000612fdb84846136e5565b905060008460a0015160ff1660081461301f5760405180604001604052806013815260200172103334b6361e913ab9361411b818149110179f60691b81525061304c565b60405180604001604052806013815260200172103334b6361e913b30b9141696b1149110179f60691b8152505b90508181604051602001613061929190614b8d565b6040516020818303038152906040529250505092915050565b80516060908061309a575050604080516020810190915260008152919050565b600060036130a983600261462d565b6130b39190614695565b6130be906004614645565b905060006130cd82602061462d565b67ffffffffffffffff8111156130e5576130e561430e565b6040519080825280601f01601f19166020018201604052801561310f576020820181803683370190505b50905060006040518060600160405280604081526020016151a7604091399050600181016020830160005b8681101561319b576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161313a565b5060038606600181146131b557600281146131c6576131d2565b613d3d60f01b6001198301526131d2565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b03831661323b5761323681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61325e565b816001600160a01b0316836001600160a01b03161461325e5761325e83826138fc565b6001600160a01b038216613275576106e481613999565b826001600160a01b0316826001600160a01b0316146106e4576106e48282613a48565b6000816040516020016132ab91906145fb565b60408051601f19818403018152919052805160209091012092915050565b8151600090819060ff165b83811161331657816132e581614c13565b925050848260ff16600981106132fd576132fd6146de565b602002015161330f9060ff168261462d565b90506132d4565b509392505050565b6133288383613a8c565b6133356000848484613351565b6106e45760405162461bcd60e51b81526004016105ae9061491f565b60006001600160a01b0384163b1561345357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613395903390899088908890600401614c33565b602060405180830381600087803b1580156133af57600080fd5b505af19250505080156133df575060408051601f3d908101601f191682019092526133dc91810190614c70565b60015b613439573d80801561340d576040519150601f19603f3d011682016040523d82523d6000602084013e613412565b606091505b5080516134315760405162461bcd60e51b81526004016105ae9061491f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116da565b506001949350505050565b606083600061346d8585614862565b67ffffffffffffffff8111156134855761348561430e565b6040519080825280601f01601f1916602001820160405280156134af576020820181803683370190505b509050845b84811015613521578281815181106134ce576134ce6146de565b01602001516001600160f81b031916826134e88884614862565b815181106134f8576134f86146de565b60200101906001600160f81b031916908160001a9053508061351981614664565b9150506134b4565b5095945050505050565b600061355082604051806040016040528060018152602001600360fc1b815250612f74565b1561355d57506000919050565b61358082604051806040016040528060018152602001603160f81b815250612f74565b1561358d57506001919050565b6135b082604051806040016040528060018152602001601960f91b815250612f74565b156135bd57506002919050565b6135e082604051806040016040528060018152602001603360f81b815250612f74565b156135ed57506003919050565b61361082604051806040016040528060018152602001600d60fa1b815250612f74565b1561361d57506004919050565b61364082604051806040016040528060018152602001603560f81b815250612f74565b1561364d57506005919050565b61367082604051806040016040528060018152602001601b60f91b815250612f74565b1561367d57506006919050565b6136a082604051806040016040528060018152602001603760f81b815250612f74565b156136ad57506007919050565b6136d082604051806040016040528060018152602001600760fb1b815250612f74565b156136dd57506008919050565b506000919050565b600d5460208301516040516310853bd960e21b815260ff90911660048201526060916000916001600160a01b0390911690634214ef649060240160006040518083038186803b15801561373757600080fd5b505afa15801561374b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137739190810190614c8d565b600d546080860151604051630e9b3c1160e01b815260ff90911660048201526001600160a01b0390911690630e9b3c119060240160006040518083038186803b1580156137bf57600080fd5b505afa1580156137d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137fb9190810190614c8d565b8560a0015160ff166008146138b657600d5460a087015160405163cd36223960e01b815260ff90911660048201526001600160a01b039091169063cd3622399060240160006040518083038186803b15801561385657600080fd5b505afa15801561386a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138929190810190614c8d565b6040516020016138a29190614d04565b6040516020818303038152906040526138c7565b604051806020016040528060008152505b6138d18787613bda565b6040516020016138e49493929190614d52565b60408051808303601f19018152919052949350505050565b6000600161390984610fea565b6139139190614862565b600083815260076020526040902054909150808214613966576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139ab90600190614862565b600083815260096020526040812054600880549394509092849081106139d3576139d36146de565b9060005260206000200154905080600883815481106139f4576139f46146de565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a2c57613a2c614eab565b6001900381819060005260206000200160009055905550505050565b6000613a5383610fea565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613ae25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ae565b6000818152600260205260409020546001600160a01b031615613b475760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105ae565b613b53600083836131e0565b6001600160a01b0382166000908152600360205260408120805460019290613b7c90849061462d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060008360a0015160ff16600814613c1f5760405180604001604052806014815260200173034b71e91391991103932b9bab63a1e91391a11160651b815250613c4d565b60405180604001604052806014815260200173034b71e91391911103932b9bab63a1e91391991160651b8152505b600d5460408681015190516390dbf17560e01b815260ff90911660048201529192506000916001600160a01b03909116906390dbf1759060240160006040518083038186803b158015613c9f57600080fd5b505afa158015613cb3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cdb9190810190614c8d565b90506000613cf88260405180602001604052806000815250612f74565b613da957600d5460408781015190516390dbf17560e01b815260ff909116600482015284916001600160a01b0316906390dbf1759060240160006040518083038186803b158015613d4857600080fd5b505afa158015613d5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d849190810190614c8d565b604051602001613d95929190614ec1565b604051602081830303815290604052613dba565b604051806020016040528060008152505b90506000613dc9600287614879565b15613dec576040518060800160405280604a81526020016151e7604a9139613e0f565b604051806040016040528060098152602001681e17b334b63a32b91f60b91b8152505b905060608760a0015160ff1660081415613f6357600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613e6f57600080fd5b505afa158015613e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613eab9190810190614c8d565b613eb488612427565b600d548a51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b158015613efd57600080fd5b505afa158015613f11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f399190810190614c8d565b85604051602001613f4d9493929190614f32565b604051602081830303815290604052905061412a565b600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613faf57600080fd5b505afa158015613fc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613feb9190810190614c8d565b613ff488612427565b600d5460608b01516040516336a8813760e11b815260ff90911660048201526001600160a01b0390911690636d51026e9060240160006040518083038186803b15801561404057600080fd5b505afa158015614054573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261407c9190810190614c8d565b600d548b51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b1580156140c557600080fd5b505afa1580156140d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141019190810190614c8d565b86866040516020016141189695949392919061504f565b60405160208183030381529060405290505b979650505050505050565b8280546141419061451c565b90600052602060002090601f01602090048101928261416357600085556141a9565b82601f1061417c57805160ff19168380011785556141a9565b828001600101855582156141a9579182015b828111156141a957825182559160200191906001019061418e565b506141b59291506141b9565b5090565b5b808211156141b557600081556001016141ba565b6001600160e01b03198116811461152a57600080fd5b6000602082840312156141f657600080fd5b8135614201816141ce565b9392505050565b60005b8381101561422357818101518382015260200161420b565b838111156111ad5750506000910152565b6000815180845261424c816020860160208601614208565b601f01601f19169290920160200192915050565b6020815260006142016020830184614234565b60006020828403121561428557600080fd5b5035919050565b80356001600160a01b03811681146142a357600080fd5b919050565b600080604083850312156142bb57600080fd5b6142c48361428c565b946020939093013593505050565b6000806000606084860312156142e757600080fd5b6142f08461428c565b92506142fe6020850161428c565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561434d5761434d61430e565b604052919050565b600067ffffffffffffffff82111561436f5761436f61430e565b50601f01601f191660200190565b600061439061438b84614355565b614324565b90508281528383830111156143a457600080fd5b828260208301376000602084830101529392505050565b600080604083850312156143ce57600080fd5b82359150602083013567ffffffffffffffff8111156143ec57600080fd5b8301601f810185136143fd57600080fd5b61440c8582356020840161437d565b9150509250929050565b60006020828403121561442857600080fd5b6142018261428c565b6000806040838503121561444457600080fd5b61444d8361428c565b91506020830135801515811461446257600080fd5b809150509250929050565b6000806000806080858703121561448357600080fd5b61448c8561428c565b935061449a6020860161428c565b925060408501359150606085013567ffffffffffffffff8111156144bd57600080fd5b8501601f810187136144ce57600080fd5b6144dd8782356020840161437d565b91505092959194509250565b600080604083850312156144fc57600080fd5b6145058361428c565b91506145136020840161428c565b90509250929050565b600181811c9082168061453057607f821691505b6020821081141561455157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600081516145f1818560208601614208565b9290920192915050565b6000825161460d818460208701614208565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561464057614640614617565b500190565b600081600019048311821515161561465f5761465f614617565b500290565b600060001982141561467857614678614617565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826146a4576146a461467f565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6a486561647363617065202360a81b81526000825161471a81600b850160208701614208565b91909101600b0192915050565b693d913730b6b2911d101160b11b8152845160009061474d81600a850160208a01614208565b85519083019061476481600a840160208a01614208565b7f227d2c7b2274726169745f74797065223a20225469746c6564222c2276616c75600a92909101918201526432911d101160d91b602a82015284516147b081602f840160208901614208565b7f227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d602f9290910191820152681b0ed8985cd94d8d0b60ba1b604f8201528351614800816058840160208801614208565b61227d60f01b60589290910191820152605a019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161485581601d850160208701614208565b91909101601d0192915050565b60008282101561487457614874614617565b500390565b6000826148885761488861467f565b500690565b6000885160206148a08285838e01614208565b8951918401916148b38184848e01614208565b89519201916148c58184848d01614208565b88519201916148d78184848c01614208565b87519201916148e98184848b01614208565b86519201916148fb8184848a01614208565b855192019161490d8184848901614208565b919091019a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a815271101121363ab91116113b30b63ab2911d101160711b6020820152600088516149c4816032850160208d01614208565b7f227d2c7b2274726169745f74797065223a20224772616469656e74222c22766160329184019182015266363ab2911d101160c91b60528201528851614a11816059840160208d01614208565b7f227d2c7b2274726169745f74797065223a20224c69676874222c2276616c75656059929091019182015263111d101160e11b60798201528751614a5c81607d840160208c01614208565b614b7e614b78614b3d614b37614aff614af9614ac1614abb607d898b01017f227d2c7b2274726169745f74797065223a2022446973706c6163656d656e742081526e26b0b81116113b30b63ab2911d101160891b6020820152602f0190565b8f6145df565b7f227d2c7b2274726169745f74797065223a202250616c65747465222c2276616c8152653ab2911d101160d11b602082015260260190565b8c6145df565b7f227d2c7b2274726169745f74797065223a20225061747465726e222c2276616c8152653ab2911d101160d11b602082015260260190565b896145df565b7f227d2c7b2274726169745f74797065223a202254757262756c656e6365222c228152683b30b63ab2911d101160b91b602082015260290190565b866145df565b9b9a5050505050505050505050565b60008351614b9f818460208801614208565b80830190507f3c72656374206865696768743d22353030222077696474683d223135303022208152703334b63a32b91e913ab9361411b318149160791b60208201528351614bf4816031840160208801614208565b651e17b9bb339f60d11b60319290910191820152603701949350505050565b600060ff821660ff811415614c2a57614c2a614617565b60010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c6690830184614234565b9695505050505050565b600060208284031215614c8257600080fd5b8151614201816141ce565b600060208284031215614c9f57600080fd5b815167ffffffffffffffff811115614cb657600080fd5b8201601f81018413614cc757600080fd5b8051614cd561438b82614355565b818152856020838501011115614cea57600080fd5b614cfb826020830160208601614208565b95945050505050565b7001e3830ba3a32b9371034b21e913818111607d1b81528151600090614d31816011850160208701614208565b691e17b830ba3a32b9371f60b11b6011939091019283015250601b01919050565b7f3c7376672077696474683d223135303022206865696768743d2235303022207681527f657273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e7760208201527f332e6f72672f323030302f73766722207374796c653d22706f736974696f6e3a60408201527f2072656c61746976653b206261636b67726f756e643a20000000000000000000606082015260008551614dfc816077850160208a01614208565b6d1d911031b630b9b99e913198111f60911b6077918401918201526c3c7374796c653e2e63307b2d2d60981b60858201528551614e40816092840160208a01614208565b691dbe9e17b9ba3cb6329f60b11b60929290910191820152651e3232b3399f60d11b609c8201528451614e7a8160a2840160208901614208565b614e9f614e8c60a283850101876145df565b661e17b232b3399f60c91b815260070190565b98975050505050505050565b634e487b7160e01b600052603160045260246000fd5b7f3c6665446966667573654c69676874696e67206c69676874696e672d636f6c6f81526c0391e913b30b9141696b094911609d1b602082015260008351614f0f81602d850160208801614208565b835190830190614f2681602d840160208801614208565b01602d01949350505050565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b60108201528451600090614f7581601e850160208a01614208565b661039b2b2b21e9160c91b601e918401918201528551614f9c816025840160208a01614208565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665476175737369616e426c757220737464446576696174696f6e3d22000060358201528451614ff3816053840160208901614208565b7f2220696e3d2272312220726573756c743d22723222202f3e000000000000000060539290910191820152835161503181606b840160208801614208565b614e9f606b82840101681e17b334b63a32b91f60b91b815260090190565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b6010820152865160009061509281601e850160208c01614208565b661039b2b2b21e9160c91b601e9184019182015287516150b9816025840160208c01614208565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665446973706c6163656d656e744d617020696e323d2272312220726573756035820152670363a1e91391911160c51b6055820152865161512181605d840160208b01614208565b611e1a614b786151a0615177615171615148605d878901016210179f60e91b815260030190565b7f3c6665476175737369616e426c757220737464446576696174696f6e3d2200008152601e0190565b8b6145df565b7f2220696e3d2272322220726573756c743d22723322202f3e0000000000000000815260180190565b886145df56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c66654d657267653e3c66654d657267654e6f646520696e3d22723422202f3e3c66654d657267654e6f646520696e3d22723222202f3e3c2f66654d657267653e3c2f66696c7465723ea2646970667358221220239c643bdb346de1e042175d303437e5501dad9d3cca163cf27b813918e8681f64736f6c63430008090033

Deployed Bytecode Sourcemap

58409:20354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39596:224;;;;;;;;;;-1:-1:-1;39596:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39596:224:0;;;;;;;;26515:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28074:221::-;;;;;;;;;;-1:-1:-1;28074:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;28074:221:0;1550:203:1;27597:411:0;;;;;;;;;;-1:-1:-1;27597:411:0;;;;;:::i;:::-;;:::i;:::-;;40236:113;;;;;;;;;;-1:-1:-1;40324:10:0;:17;40236:113;;;2341:25:1;;;2329:2;2314:18;40236:113:0;2195:177:1;28964:339:0;;;;;;;;;;-1:-1:-1;28964:339:0;;;;;:::i;:::-;;:::i;73007:773::-;;;;;;;;;;-1:-1:-1;73007:773:0;;;;;:::i;:::-;;:::i;39904:256::-;;;;;;;;;;-1:-1:-1;39904:256:0;;;;;:::i;:::-;;:::i;73986:1153::-;;;;;;:::i;:::-;;:::i;75606:128::-;;;:::i;29374:185::-;;;;;;;;;;-1:-1:-1;29374:185:0;;;;;:::i;:::-;;:::i;75202:396::-;;;;;;;;;;-1:-1:-1;75202:396:0;;;;;:::i;:::-;;:::i;40426:233::-;;;;;;;;;;-1:-1:-1;40426:233:0;;;;;:::i;:::-;;:::i;26209:239::-;;;;;;;;;;-1:-1:-1;26209:239:0;;;;;:::i;:::-;;:::i;25939:208::-;;;;;;;;;;-1:-1:-1;25939:208:0;;;;;:::i;:::-;;:::i;2511:94::-;;;;;;;;;;;;;:::i;1860:87::-;;;;;;;;;;-1:-1:-1;1933:6:0;;-1:-1:-1;;;;;1933:6:0;1860:87;;26684:104;;;;;;;;;;;;;:::i;28367:295::-;;;;;;;;;;-1:-1:-1;28367:295:0;;;;;:::i;:::-;;:::i;29630:328::-;;;;;;;;;;-1:-1:-1;29630:328:0;;;;;:::i;:::-;;:::i;71310:1614::-;;;;;;;;;;-1:-1:-1;71310:1614:0;;;;;:::i;:::-;;:::i;28733:164::-;;;;;;;;;;-1:-1:-1;28733:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28854:25:0;;;28830:4;28854:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28733:164;58907:46;;;;;;;;;;-1:-1:-1;58907:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;2760:192;;;;;;;;;;-1:-1:-1;2760:192:0;;;;;:::i;:::-;;:::i;39596:224::-;39698:4;-1:-1:-1;;;;;;39722:50:0;;-1:-1:-1;;;39722:50:0;;:90;;;39776:36;39800:11;39776:23;:36::i;:::-;39715:97;39596:224;-1:-1:-1;;39596:224:0:o;26515:100::-;26569:13;26602:5;26595:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26515:100;:::o;28074:221::-;28150:7;31557:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31557:16:0;28170:73;;;;-1:-1:-1;;;28170:73:0;;6433:2:1;28170:73:0;;;6415:21:1;6472:2;6452:18;;;6445:30;6511:34;6491:18;;;6484:62;-1:-1:-1;;;6562:18:1;;;6555:42;6614:19;;28170:73:0;;;;;;;;;-1:-1:-1;28263:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28263:24:0;;28074:221::o;27597:411::-;27678:13;27694:23;27709:7;27694:14;:23::i;:::-;27678:39;;27742:5;-1:-1:-1;;;;;27736:11:0;:2;-1:-1:-1;;;;;27736:11:0;;;27728:57;;;;-1:-1:-1;;;27728:57:0;;6846:2:1;27728:57:0;;;6828:21:1;6885:2;6865:18;;;6858:30;6924:34;6904:18;;;6897:62;-1:-1:-1;;;6975:18:1;;;6968:31;7016:19;;27728:57:0;6644:397:1;27728:57:0;734:10;-1:-1:-1;;;;;27820:21:0;;;;:62;;-1:-1:-1;27845:37:0;27862:5;734:10;28733:164;:::i;27845:37::-;27798:168;;;;-1:-1:-1;;;27798:168:0;;7248:2:1;27798:168:0;;;7230:21:1;7287:2;7267:18;;;7260:30;7326:34;7306:18;;;7299:62;7397:26;7377:18;;;7370:54;7441:19;;27798:168:0;7046:420:1;27798:168:0;27979:21;27988:2;27992:7;27979:8;:21::i;:::-;27667:341;27597:411;;:::o;28964:339::-;29159:41;734:10;29192:7;29159:18;:41::i;:::-;29151:103;;;;-1:-1:-1;;;29151:103:0;;;;;;;:::i;:::-;29267:28;29277:4;29283:2;29287:7;29267:9;:28::i;73007:773::-;4881:1;5477:7;;:19;;5469:63;;;;-1:-1:-1;;;5469:63:0;;;;;;;:::i;:::-;4881:1;5610:7;:18;73131:16:::1;73139:7:::0;73131::::1;:16::i;:::-;-1:-1:-1::0;;;;;73115:32:0::1;734:10:::0;-1:-1:-1;;;;;73115:32:0::1;;73093:110;;;::::0;-1:-1:-1;;;73093:110:0;;8451:2:1;73093:110:0::1;::::0;::::1;8433:21:1::0;8490:2;8470:18;;;8463:30;8529;8509:18;;;8502:58;8577:18;;73093:110:0::1;8249:352:1::0;73093:110:0::1;73242:23;::::0;;;:14:::1;:23;::::0;;;;73236:37;;::::1;::::0;::::1;:::i;:::-;:42:::0;;-1:-1:-1;73214:127:0::1;;;::::0;-1:-1:-1;;;73214:127:0;;8808:2:1;73214:127:0::1;::::0;::::1;8790:21:1::0;8847:2;8827:18;;;8820:30;8886:34;8866:18;;;8859:62;-1:-1:-1;;;8937:18:1;;;8930:33;8980:19;;73214:127:0::1;8606:399:1::0;73214:127:0::1;73375:14;:53;73419:4;73401:24;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;73401:24:0;;::::1;::::0;;;;;;73391:35;;73401:24:::1;73391:35:::0;;::::1;::::0;73375:53;;;;::::1;::::0;;;;;-1:-1:-1;73375:53:0;;::::1;;73374:54;73352:137;;;::::0;-1:-1:-1;;;73352:137:0;;9683:2:1;73352:137:0::1;::::0;::::1;9665:21:1::0;9722:2;9702:18;;;9695:30;9761:34;9741:18;;;9734:62;-1:-1:-1;;;9812:18:1;;;9805:31;9853:19;;73352:137:0::1;9481:397:1::0;73352:137:0::1;73543:1;73528:4;73522:18;:22;:49;;;;;73569:2;73554:4;73548:18;:23;73522:49;73500:147;;;::::0;-1:-1:-1;;;73500:147:0;;10085:2:1;73500:147:0::1;::::0;::::1;10067:21:1::0;10124:2;10104:18;;;10097:30;10163:34;10143:18;;;10136:62;-1:-1:-1;;;10214:18:1;;;10207:46;10270:19;;73500:147:0::1;9883:412:1::0;73500:147:0::1;73684:17;73696:4;73684:11;:17::i;:::-;73658:23;::::0;;;:14:::1;:23;::::0;;;;;;;:43;;::::1;::::0;:23;;:43;;;::::1;::::0;::::1;:::i;:::-;;73768:4;73712:14;:53;73756:4;73738:24;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;73738:24:0;;;;;;73728:35;;73738:24:::1;73728:35:::0;;::::1;::::0;73712:53;;;;::::1;::::0;;;;;-1:-1:-1;73712:53:0;:60;;-1:-1:-1;;73712:60:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;;5789:7:0;:22;73007:773::o;39904:256::-;40001:7;40037:23;40054:5;40037:16;:23::i;:::-;40029:5;:31;40021:87;;;;-1:-1:-1;;;40021:87:0;;10502:2:1;40021:87:0;;;10484:21:1;10541:2;10521:18;;;10514:30;10580:34;10560:18;;;10553:62;-1:-1:-1;;;10631:18:1;;;10624:41;10682:19;;40021:87:0;10300:407:1;40021:87:0;-1:-1:-1;;;;;;40126:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39904:256::o;73986:1153::-;4881:1;5477:7;;:19;;5469:63;;;;-1:-1:-1;;;5469:63:0;;;;;;;:::i;:::-;4881:1;5610:7;:18;74075:7;;;;;:19:::1;;;74092:2;74086:3;:8;74075:19;74053:109;;;::::0;-1:-1:-1;;;74053:109:0;;10914:2:1;74053:109:0::1;::::0;::::1;10896:21:1::0;10953:2;10933:18;;;10926:30;10992:34;10972:18;;;10965:62;-1:-1:-1;;;11043:18:1;;;11036:38;11091:19;;74053:109:0::1;10712:404:1::0;74053:109:0::1;74217:4;74201:13;40324:10:::0;:17;;40236:113;74201:13:::1;74195:19;::::0;:3;:19:::1;:::i;:::-;:26;74173:139;;;::::0;-1:-1:-1;;;74173:139:0;;11588:2:1;74173:139:0::1;::::0;::::1;11570:21:1::0;11627:2;11607:18;;;11600:30;11666:34;11646:18;;;11639:62;11737:33;11717:18;;;11710:61;11788:19;;74173:139:0::1;11386:427:1::0;74173:139:0::1;74344:23;:3:::0;74350:17:::1;74344:23;:::i;:::-;74331:9;:36;;74323:71;;;::::0;-1:-1:-1;;;74323:71:0;;12193:2:1;74323:71:0::1;::::0;::::1;12175:21:1::0;12232:2;12212:18;;;12205:30;-1:-1:-1;;;12251:18:1;;;12244:52;12313:18;;74323:71:0::1;11991:346:1::0;74323:71:0::1;74405:18;74426:13;40324:10:::0;:17;;40236:113;74426:13:::1;74405:34;;74455:9;74450:289;74474:3;74470:1;:7;74450:289;;;74499:15;74517:16;74522:10;74517:4;:16::i;:::-;74548:25;::::0;;;:13:::1;:25;::::0;;;;;;;:29;;74499:34;;-1:-1:-1;74548:29:0::1;::::0;:25;;:29;::::1;::::0;::::1;:::i;:::-;;74610:4;74592:12;74605:1;74592:15;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:22;;;::::1;;-1:-1:-1::0;;74592:22:0;;::::1;::::0;;;::::1;::::0;;74629:35:::1;74639:12;734:10:::0;;654:98;74639:12:::1;74653:10;74629:9;:35::i;:::-;40324:10:::0;:17;74720:5:::1;:7:::0;;74679:26;;-1:-1:-1;74720:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;74484:255;74479:3;;;;;:::i;:::-;;;;74450:289;;;-1:-1:-1::0;74983:9:0::1;:13:::0;74979:153:::1;;75021:42;75013:107;75092:13;75104:1;75092:9;:13;:::i;:::-;75013:107;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;74979:153;-1:-1:-1::0;;4837:1:0;5789:7;:22;73986:1153::o;75606:128::-;4881:1;5477:7;;:19;;5469:63;;;;-1:-1:-1;;;5469:63:0;;;;;;;:::i;:::-;4881:1;5610:7;:18;1933:6;;-1:-1:-1;;;;;1933:6:0;734:10;2080:23:::1;2072:68;;;;-1:-1:-1::0;;;2072:68:0::1;;;;;;;:::i;:::-;75675:51:::2;::::0;75683:10:::2;::::0;75704:21:::2;75675:51:::0;::::2;;;::::0;::::2;::::0;;;75704:21;75683:10;75675:51;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;4837:1:0;5789:7;:22;75606:128::o;29374:185::-;29512:39;29529:4;29535:2;29539:7;29512:39;;;;;;;;;;;;:16;:39::i;75202:396::-;4881:1;5477:7;;:19;;5469:63;;;;-1:-1:-1;;;5469:63:0;;;;;;;:::i;:::-;4881:1;5610:7;:18;1933:6;;-1:-1:-1;;;;;1933:6:0;734:10;2080:23:::1;2072:68;;;;-1:-1:-1::0;;;2072:68:0::1;;;;;;;:::i;:::-;75313:4:::2;75302:7;:15;;:34;;;;;75331:5;75321:7;:15;75302:34;75280:142;;;::::0;-1:-1:-1;;;75280:142:0;;13302:2:1;75280:142:0::2;::::0;::::2;13284:21:1::0;13341:2;13321:18;;;13314:30;13380:34;13360:18;;;13353:62;13451:28;13431:18;;;13424:56;13497:19;;75280:142:0::2;13100:422:1::0;75280:142:0::2;75433:15;75451:13;75456:7;75451:4;:13::i;:::-;75475:22;::::0;;;:13:::2;:22;::::0;;;;;;;:26;;75433:31;;-1:-1:-1;75475:26:0::2;::::0;:22;;:26;::::2;::::0;::::2;:::i;:::-;;75530:4;75512:12;75525:1;75512:15;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:22;;;::::2;;-1:-1:-1::0;;75512:22:0;;::::2;::::0;;;::::2;::::0;;75545:27:::2;75555:7;1933:6:::0;;-1:-1:-1;;;;;1933:6:0;;1860:87;75555:7:::2;75564;75545:9;:27::i;:::-;75583:5;:7:::0;;;:5:::2;:7;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;4837:1:0;5789:7;:22;-1:-1:-1;;75202:396:0:o;40426:233::-;40501:7;40537:30;40324:10;:17;;40236:113;40537:30;40529:5;:38;40521:95;;;;-1:-1:-1;;;40521:95:0;;13729:2:1;40521:95:0;;;13711:21:1;13768:2;13748:18;;;13741:30;13807:34;13787:18;;;13780:62;-1:-1:-1;;;13858:18:1;;;13851:42;13910:19;;40521:95:0;13527:408:1;40521:95:0;40634:10;40645:5;40634:17;;;;;;;;:::i;:::-;;;;;;;;;40627:24;;40426:233;;;:::o;26209:239::-;26281:7;26317:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26317:16:0;26352:19;26344:73;;;;-1:-1:-1;;;26344:73:0;;14274:2:1;26344:73:0;;;14256:21:1;14313:2;14293:18;;;14286:30;14352:34;14332:18;;;14325:62;-1:-1:-1;;;14403:18:1;;;14396:39;14452:19;;26344:73:0;14072:405:1;25939:208:0;26011:7;-1:-1:-1;;;;;26039:19:0;;26031:74;;;;-1:-1:-1;;;26031:74:0;;14684:2:1;26031:74:0;;;14666:21:1;14723:2;14703:18;;;14696:30;14762:34;14742:18;;;14735:62;-1:-1:-1;;;14813:18:1;;;14806:40;14863:19;;26031:74:0;14482:406:1;26031:74:0;-1:-1:-1;;;;;;26123:16:0;;;;;:9;:16;;;;;;;25939:208::o;2511:94::-;1933:6;;-1:-1:-1;;;;;1933:6:0;734:10;2080:23;2072:68;;;;-1:-1:-1;;;2072:68:0;;;;;;;:::i;:::-;2576:21:::1;2594:1;2576:9;:21::i;:::-;2511:94::o:0;26684:104::-;26740:13;26773:7;26766:14;;;;;:::i;28367:295::-;-1:-1:-1;;;;;28470:24:0;;734:10;28470:24;;28462:62;;;;-1:-1:-1;;;28462:62:0;;15095:2:1;28462:62:0;;;15077:21:1;15134:2;15114:18;;;15107:30;15173:27;15153:18;;;15146:55;15218:18;;28462:62:0;14893:349:1;28462:62:0;734:10;28537:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28537:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28537:53:0;;;;;;;;;;28606:48;;540:41:1;;;28537:42:0;;734:10;28606:48;;513:18:1;28606:48:0;;;;;;;28367:295;;:::o;29630:328::-;29805:41;734:10;29838:7;29805:18;:41::i;:::-;29797:103;;;;-1:-1:-1;;;29797:103:0;;;;;;;:::i;:::-;29911:39;29925:4;29931:2;29935:7;29944:5;29911:13;:39::i;:::-;29630:328;;;;:::o;71310:1614::-;31533:4;31557:16;;;:7;:16;;;;;;71375:13;;-1:-1:-1;;;;;31557:16:0;71401:113;;;;-1:-1:-1;;;71401:113:0;;15449:2:1;71401:113:0;;;15431:21:1;15488:2;15468:18;;;15461:30;15527:34;15507:18;;;15500:62;-1:-1:-1;;;15578:18:1;;;15571:45;15633:19;;71401:113:0;15247:411:1;71401:113:0;71525:26;71554:21;71567:7;71554:12;:21::i;:::-;71525:50;;71586:18;71647:1;71613:14;:23;71628:7;71613:23;;;;;;;;;;;71607:37;;;;;:::i;:::-;;;:41;:162;;71750:17;71759:7;71750:8;:17::i;:::-;71718:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;71607:162;;;71671:23;;;;:14;:23;;;;;71607:162;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71586:183;;71918:964;72141:4;72184:24;72198:9;72184:13;:24::i;:::-;72340:23;;;;:14;:23;;;;;72325:43;;;;72340:23;72325:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:43::i;:::-;:144;;;;;;;;;;;;;;;-1:-1:-1;;;72325:144:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72325:144:0;;;;72590:133;72652:31;72664:9;72675:7;72652:11;:31::i;:::-;72590:13;:133::i;:::-;72035:766;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71918:13;:964::i;:::-;71825:1076;;;;;;;;:::i;:::-;;;;;;;;;;;;;71780:1136;;;;71310:1614;;;:::o;2760:192::-;1933:6;;-1:-1:-1;;;;;1933:6:0;734:10;2080:23;2072:68;;;;-1:-1:-1;;;2072:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2849:22:0;::::1;2841:73;;;::::0;-1:-1:-1;;;2841:73:0;;18442:2:1;2841:73:0::1;::::0;::::1;18424:21:1::0;18481:2;18461:18;;;18454:30;18520:34;18500:18;;;18493:62;-1:-1:-1;;;18571:18:1;;;18564:36;18617:19;;2841:73:0::1;18240:402:1::0;2841:73:0::1;2925:19;2935:8;2925:9;:19::i;:::-;2760:192:::0;:::o;25570:305::-;25672:4;-1:-1:-1;;;;;;25709:40:0;;-1:-1:-1;;;25709:40:0;;:105;;-1:-1:-1;;;;;;;25766:48:0;;-1:-1:-1;;;25766:48:0;25709:105;:158;;;-1:-1:-1;;;;;;;;;;24203:40:0;;;25831:36;24094:157;35450:174;35525:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35525:29:0;-1:-1:-1;;;;;35525:29:0;;;;;;;;:24;;35579:23;35525:24;35579:14;:23::i;:::-;-1:-1:-1;;;;;35570:46:0;;;;;;;;;;;35450:174;;:::o;31762:348::-;31855:4;31557:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31557:16:0;31872:73;;;;-1:-1:-1;;;31872:73:0;;18849:2:1;31872:73:0;;;18831:21:1;18888:2;18868:18;;;18861:30;18927:34;18907:18;;;18900:62;-1:-1:-1;;;18978:18:1;;;18971:42;19030:19;;31872:73:0;18647:408:1;31872:73:0;31956:13;31972:23;31987:7;31972:14;:23::i;:::-;31956:39;;32025:5;-1:-1:-1;;;;;32014:16:0;:7;-1:-1:-1;;;;;32014:16:0;;:51;;;;32058:7;-1:-1:-1;;;;;32034:31:0;:20;32046:7;32034:11;:20::i;:::-;-1:-1:-1;;;;;32034:31:0;;32014:51;:87;;;-1:-1:-1;;;;;;28854:25:0;;;28830:4;28854:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32069:32;32006:96;31762:348;-1:-1:-1;;;;31762:348:0:o;34754:578::-;34913:4;-1:-1:-1;;;;;34886:31:0;:23;34901:7;34886:14;:23::i;:::-;-1:-1:-1;;;;;34886:31:0;;34878:85;;;;-1:-1:-1;;;34878:85:0;;19262:2:1;34878:85:0;;;19244:21:1;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;-1:-1:-1;;;19391:18:1;;;19384:39;19440:19;;34878:85:0;19060:405:1;34878:85:0;-1:-1:-1;;;;;34982:16:0;;34974:65;;;;-1:-1:-1;;;34974:65:0;;19672:2:1;34974:65:0;;;19654:21:1;19711:2;19691:18;;;19684:30;19750:34;19730:18;;;19723:62;-1:-1:-1;;;19801:18:1;;;19794:34;19845:19;;34974:65:0;19470:400:1;34974:65:0;35052:39;35073:4;35079:2;35083:7;35052:20;:39::i;:::-;35156:29;35173:1;35177:7;35156:8;:29::i;:::-;-1:-1:-1;;;;;35198:15:0;;;;;;:9;:15;;;;;:20;;35217:1;;35198:15;:20;;35217:1;;35198:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35229:13:0;;;;;;:9;:13;;;;;:18;;35246:1;;35229:13;:18;;35246:1;;35229:18;:::i;:::-;;;;-1:-1:-1;;35258:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35258:21:0;-1:-1:-1;;;;;35258:21:0;;;;;;;;;35297:27;;35258:16;;35297:27;;;;;;;34754:578;;;:::o;77704:325::-;77767:13;77823:3;77793:21;77838:150;77862:8;:15;77858:1;:19;77838:150;;;77903:8;77912:1;77903:11;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;77903:11:0;-1:-1:-1;;;77903:19:0;77899:78;;;77957:4;77943:18;;:8;77952:1;77943:11;;;;;;;;:::i;:::-;;;;:18;-1:-1:-1;;;;;77943:18:0;;;;;;;;;77899:78;77879:3;;;;:::i;:::-;;;;77838:150;;;-1:-1:-1;78012:8:0;77704:325;-1:-1:-1;;77704:325:0:o;67733:3569::-;67821:369;;;;;;;;67841:3;67821:369;;67846:3;67821:369;;;;;;;;67851:3;67821:369;;;;67856:2;67782:13;67821:369;;;;;;;67860:2;67821:369;;;;67864:2;67821:369;;;;67868:2;67821:369;;;;67872:2;67821:369;;;;67876:2;67821:369;;;;68110:5;;67948:190;;67782:13;;67808:10;;67821:369;;;;68175:4;;67894:278;;67948:190;;67991:16;;68034:15;;68076:7;;67948:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;67948:190:0;;;;;;;;;;;;;67894:6;:278::i;:::-;:285;;;;:::i;:::-;67821:4;:369::i;:::-;68218:371;;;;;;;;68238:3;68218:371;;68243:3;68218:371;;;;;;;;68248:3;68218:371;;;;68253:3;68218:371;;;;68258:3;68218:371;;;;68263:2;68218:371;;;;68267:2;68218:371;;;;68271:2;68218:371;;;;68275:2;68218:371;;;;68509:5;;68347:190;;67808:382;;-1:-1:-1;68201:14:0;;68218:371;;68574:4;;68293:278;;68347:190;;68390:16;;68433:15;;68475:7;;68509:5;68347:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;68218:371:0;68614:375;;;;;;;;68634:3;68614:375;;68639:3;68614:375;;;;;;;;68644:3;68614:375;;;;68649:3;68614:375;;;;68654:3;68614:375;;;;68659:3;68614:375;;;;68664:3;68614:375;;;;68669:3;68614:375;;;;68674:3;68614:375;;;;68909:5;;68747:190;;68201:388;;-1:-1:-1;68600:11:0;;68614:375;;68974:4;;68693:278;;68747:190;;68790:16;;68833:15;;68875:7;;68909:5;68747:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;68614:375:0;69012:372;;;;;;;;69032:3;69012:372;;69037:3;69012:372;;;;;;;;69042:3;69012:372;;;;69047:3;69012:372;;;;69052:3;69012:372;;;;69057:3;69012:372;;;;69062:2;69012:372;;;;69066:2;69012:372;;;;69070:2;69012:372;;;;69304:5;;69142:190;;68600:389;;-1:-1:-1;69000:9:0;;69012:372;;69369:4;;69088:278;;69142:190;;69185:16;;69228:15;;69270:7;;69304:5;69142:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;69012:372:0;69000:384;;69395:13;69411:375;;;;;;;;;69431:3;69411:375;;;;;;69436:3;69411:375;;;;;;69441:3;69411:375;;;;;;69446:3;69411:375;;;;;;69451:3;69411:375;;;;;;69456:3;69411:375;;;;;;69461:3;69411:375;;;;;;69466:3;69411:375;;;;;;69471:3;69411:375;;;;;69771:4;69490:278;69587:16;69630:15;69672:7;69706:5;;69544:190;;;;;;;;;;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;69411:375:0;69813;;;;;;;;69833:3;69813:375;;69838:3;69813:375;;;;;;;;69843:3;69813:375;;;;69848:3;69813:375;;;;;;;;69853:3;69813:375;;;;;;;;;;;;;;;69863:3;69813:375;;;;69868:3;69813:375;;;;69873:3;69813:375;;;;70108:5;;69946:190;;69989:16;69946:190;;;20218:19:1;;;;70032:15:0;20253:12:1;;;20246:28;;;;20290:12;;;20283:28;;;20327:12;;20320:28;;;;69395:391:0;;-1:-1:-1;69797:13:0;;69813:375;;70173:4;;69892:278;;20364:13:1;69946:190:0;20005:378:1;69813:375:0;69797:391;;70199:16;70218:370;;;;;;;;;70238:3;70218:370;;;;;;70243:3;70218:370;;;;;;70248:3;70218:370;;;;;;70253:3;70218:370;;;;;;70258:2;70218:370;;;;;;70262:2;70218:370;;;;;;70266:2;70218:370;;;;;;70270:2;70218:370;;;;;;70274:2;70218:370;;;;;70573:4;70292:278;70389:16;70432:15;70474:7;70508:5;;70346:190;;;;;;;;;;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;70218:370:0;70199:389;;70761:1;70754:4;:8;;;:19;;70769:4;70754:19;;;70765:1;70754:19;70747:26;;70800:1;70792:5;:9;;;:21;;70808:5;70792:21;;;70804:1;70792:21;70784:29;;70826:15;70900:14;70909:4;70900:14;;:8;:14::i;:::-;70933:18;70942:8;70933:18;;:8;:18::i;:::-;70970:15;70979:5;70970:15;;:8;:15::i;:::-;71004:13;71013:3;71004:13;;:8;:13::i;:::-;71036:17;71045:7;71036:17;;:8;:17::i;:::-;71072;71081:7;71072:17;;:8;:17::i;:::-;71108:20;71117:10;71108:20;;:8;:20::i;:::-;70865:278;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70826:328;;71190:12;71203:1;71190:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;71186:90;;;71222:5;:7;;;:5;:7;;;:::i;:::-;;;;;;71251:13;71256:7;71251:4;:13::i;:::-;71244:20;67733:3569;-1:-1:-1;;;;;;;;;;67733:3569:0:o;71186:90::-;71293:1;67733:3569;-1:-1:-1;;;;;;;;;67733:3569:0:o;32452:110::-;32528:26;32538:2;32542:7;32528:26;;;;;;;;;;;;:9;:26::i;:::-;32452:110;;:::o;2960:173::-;3035:6;;;-1:-1:-1;;;;;3052:17:0;;;-1:-1:-1;;;;;;3052:17:0;;;;;;;3085:40;;3035:6;;;3052:17;3035:6;;3085:40;;3016:16;;3085:40;3005:128;2960:173;:::o;30840:315::-;30997:28;31007:4;31013:2;31017:7;30997:9;:28::i;:::-;31044:48;31067:4;31073:2;31077:7;31086:5;31044:22;:48::i;:::-;31036:111;;;;-1:-1:-1;;;31036:111:0;;;;;;;:::i;66573:1152::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66979:22:0;;;;:13;:22;;;;;66969:39;;66959:50;;66969:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67003:1;67006;66969:9;:39::i;:::-;66959:9;:50::i;:::-;66922:98;;;;:14;67092:22;;;:13;:22;;;;;67082:39;;67072:50;;67082:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67116:1;67119;67082:9;:39::i;67072:50::-;67031:102;;:18;;;;:102;;;;67202:22;;;;:13;:22;;;;;;67192:39;;67182:50;;67192:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67226:1;67229;67192:9;:39::i;67182:50::-;67144:99;;:15;;;;:99;;;;67310:22;;;;:13;:22;;;67300:39;;67290:50;;67300:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67334:1;67337;67300:9;:39::i;67290:50::-;67254:97;;:13;;;:97;67422:22;;;;:13;:22;;;;;67412:39;;67402:50;;67412:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67446:1;67449;67412:9;:39::i;67402:50::-;67362:101;;:17;;;:101;67534:22;;;;:13;:22;;;;;67524:39;;67514:50;;67524:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67558:1;67561;67524:9;:39::i;67514:50::-;67474:101;;:17;;;:101;67649:22;;;;:13;:22;;;;;67639:39;;67629:50;;67639:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67673:1;67676;67639:9;:39::i;67629:50::-;67586:104;;:20;;;:104;:9;66573:1152;-1:-1:-1;;66573:1152:0:o;78037:723::-;78093:13;78314:10;78310:53;;-1:-1:-1;;78341:10:0;;;;;;;;;;;;-1:-1:-1;;;78341:10:0;;;;;78037:723::o;78310:53::-;78388:5;78373:12;78429:78;78436:9;;78429:78;;78462:8;;;;:::i;:::-;;-1:-1:-1;78485:10:0;;-1:-1:-1;78493:2:0;78485:10;;:::i;:::-;;;78429:78;;;78517:19;78549:6;78539:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78539:17:0;;78517:39;;78567:154;78574:10;;78567:154;;78601:11;78611:1;78601:11;;:::i;:::-;;-1:-1:-1;78670:10:0;78678:2;78670:5;:10;:::i;:::-;78657:24;;:2;:24;:::i;:::-;78644:39;;78627:6;78634;78627:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;78627:56:0;;;;;;;;-1:-1:-1;78698:11:0;78707:2;78698:11;;:::i;:::-;;;78567:154;;63081:3484;63155:13;63340:342;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63340:342:0;;;;;;63667:9;:14;;;63340:342;;;;;;;;;:::i;:::-;;;;;;;;;;63769:395;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;-1:-1:-1;;;63769:395:0;;;;;;;;;;;;-1:-1:-1;;;63769:395:0;;;;-1:-1:-1;;;63769:395:0;;;;64145:18;;;;63340:342;;63769:395;;;;;;;;;;:::i;:::-;;;;;;;;;;64248:389;;;;;;;;;;;;;;;-1:-1:-1;;;64248:389:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64248:389:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64248:389:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64248:389:0;;;;-1:-1:-1;;;64248:389:0;;;;;;;;;;;-1:-1:-1;;;64248:389:0;;;;;;;-1:-1:-1;;;64248:389:0;;;;64621:15;;;63769:395;;64248:389;;;;;;;;;;:::i;:::-;;;;;64732:359;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64732:359:0;;;;;;65077:9;:13;;;64732:359;;;;;;;;;:::i;:::-;;;;;65177:410;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65177:410:0;;;;;;65569:9;:17;;;65177:410;;;;;;;;;:::i;:::-;;;;;65673:370;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65673:370:0;;;;;;66025:9;:17;;;65673:370;;;;;;;;;:::i;:::-;;;;;66132:391;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66132:391:0;;;;;;66502:9;:20;;;66132:391;;;;;;;;;:::i;:::-;;;;;63226:3316;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63181:3376;;63081:3484;;;:::o;75945:228::-;76053:4;76160:1;76142:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;76132:32;;;;;;76111:1;76093:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;76083:32;;;;;;:81;76075:90;;75945:228;;;;:::o;59212:583::-;59301:13;59327:20;59350:32;59363:9;59374:7;59350:12;:32::i;:::-;59327:55;;59393:22;59418:9;:17;;;:22;;59439:1;59418:22;:96;;;;;;;;;;;;;;;-1:-1:-1;;;59418:96:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59418:96:0;;;;59393:121;;59611:6;59714:8;59572:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59527:260;;;;59212:583;;;;:::o;46005:1774::-;46103:11;;46063:13;;46129:8;46125:23;;-1:-1:-1;;46139:9:0;;;;;;;;;-1:-1:-1;46139:9:0;;;46005:1774;-1:-1:-1;46005:1774:0:o;46125:23::-;46200:18;46238:1;46227:7;:3;46233:1;46227:7;:::i;:::-;46226:13;;;;:::i;:::-;46221:19;;:1;:19;:::i;:::-;46200:40;-1:-1:-1;46298:19:0;46330:15;46200:40;46343:2;46330:15;:::i;:::-;46320:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46320:26:0;;46298:48;;46357:18;46378:5;;;;;;;;;;;;;;;;;46357:26;;46447:1;46440:5;46436:13;46492:2;46484:6;46480:15;46541:1;46509:954;46564:3;46561:1;46558:10;46509:954;;;46619:1;46662:12;;;;;46656:19;46755:4;46743:2;46739:14;;;;;46721:40;;46715:47;46907:2;46903:14;;;46899:25;;46885:40;;46879:47;47097:1;47093:13;;;47089:24;;47075:39;;47069:46;47278:16;;;;47264:31;;47258:38;46791:1;46787:11;;;46928:4;46875:58;;;46823:129;46977:11;;47065:57;;;47013:128;;;;47166:11;;47254:49;;47202:120;47351:3;47347:13;47378:22;;47446:1;47431:17;;;;46612:9;46509:954;;;46513:44;47493:1;47488:3;47484:11;47514:1;47509:84;;;;47612:1;47607:82;;;;47477:212;;47509:84;-1:-1:-1;;;;;47542:17:0;;47535:43;47509:84;;47607:82;-1:-1:-1;;;;;47640:17:0;;47633:41;47477:212;-1:-1:-1;;;47703:26:0;;;47710:6;46005:1774;-1:-1:-1;;;;46005:1774:0:o;41272:589::-;-1:-1:-1;;;;;41478:18:0;;41474:187;;41513:40;41545:7;42688:10;:17;;42661:24;;;;:15;:24;;;;;:44;;;42716:24;;;;;;;;;;;;42584:164;41513:40;41474:187;;;41583:2;-1:-1:-1;;;;;41575:10:0;:4;-1:-1:-1;;;;;41575:10:0;;41571:90;;41602:47;41635:4;41641:7;41602:32;:47::i;:::-;-1:-1:-1;;;;;41675:16:0;;41671:183;;41708:45;41745:7;41708:36;:45::i;41671:183::-;41781:4;-1:-1:-1;;;;;41775:10:0;:2;-1:-1:-1;;;;;41775:10:0;;41771:83;;41802:40;41830:2;41834:7;41802:27;:40::i;75799:138::-;75859:7;75921:5;75904:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;75904:23:0;;;;;;;;;75894:34;;75904:23;75894:34;;;;;75799:138;-1:-1:-1;;75799:138:0:o;77372:255::-;77501:4;;77439:5;;;;77493:13;;77517:82;77529:1;77524;:6;77517:82;;77547:5;;;;:::i;:::-;;;;77580:1;77582:3;77580:6;;;;;;;;;:::i;:::-;;;;;77567:20;;77572:15;;77567:20;;:::i;:::-;;;77517:82;;;-1:-1:-1;77616:3:0;77372:255;-1:-1:-1;;;77372:255:0:o;32789:321::-;32919:18;32925:2;32929:7;32919:5;:18::i;:::-;32970:54;33001:1;33005:2;33009:7;33018:5;32970:22;:54::i;:::-;32948:154;;;;-1:-1:-1;;;32948:154:0;;;;;;;:::i;36189:799::-;36344:4;-1:-1:-1;;;;;36365:13:0;;14230:20;14278:8;36361:620;;36401:72;;-1:-1:-1;;;36401:72:0;;-1:-1:-1;;;;;36401:36:0;;;;;:72;;734:10;;36452:4;;36458:7;;36467:5;;36401:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36401:72:0;;;;;;;;-1:-1:-1;;36401:72:0;;;;;;;;;;;;:::i;:::-;;;36397:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36643:13:0;;36639:272;;36686:60;;-1:-1:-1;;;36686:60:0;;;;;;;:::i;36639:272::-;36861:6;36855:13;36846:6;36842:2;36838:15;36831:38;36397:529;-1:-1:-1;;;;;;36524:51:0;-1:-1:-1;;;36524:51:0;;-1:-1:-1;36517:58:0;;36361:620;-1:-1:-1;36965:4:0;36189:799;;;;;;:::o;76840:419::-;76973:13;77029:3;76999:21;77076;77087:10;77076:8;:21;:::i;:::-;77066:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77066:32:0;-1:-1:-1;77044:54:0;-1:-1:-1;77126:10:0;77109:111;77142:8;77138:1;:12;77109:111;;;77197:8;77206:1;77197:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;77197:11:0;77172:6;77179:14;77183:10;77179:1;:14;:::i;:::-;77172:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;77172:36:0;;;;;;;;-1:-1:-1;77152:3:0;;;;:::i;:::-;;;;77109:111;;;-1:-1:-1;77244:6:0;76840:419;-1:-1:-1;;;;;76840:419:0:o;76314:518::-;76373:7;76397:22;76412:1;76397:22;;;;;;;;;;;;;-1:-1:-1;;;76397:22:0;;;:14;:22::i;:::-;76393:36;;;-1:-1:-1;76428:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76393:36::-;76444:22;76459:1;76444:22;;;;;;;;;;;;;-1:-1:-1;;;76444:22:0;;;:14;:22::i;:::-;76440:36;;;-1:-1:-1;76475:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76440:36::-;76491:22;76506:1;76491:22;;;;;;;;;;;;;-1:-1:-1;;;76491:22:0;;;:14;:22::i;:::-;76487:36;;;-1:-1:-1;76522:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76487:36::-;76538:22;76553:1;76538:22;;;;;;;;;;;;;-1:-1:-1;;;76538:22:0;;;:14;:22::i;:::-;76534:36;;;-1:-1:-1;76569:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76534:36::-;76585:22;76600:1;76585:22;;;;;;;;;;;;;-1:-1:-1;;;76585:22:0;;;:14;:22::i;:::-;76581:36;;;-1:-1:-1;76616:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76581:36::-;76632:22;76647:1;76632:22;;;;;;;;;;;;;-1:-1:-1;;;76632:22:0;;;:14;:22::i;:::-;76628:36;;;-1:-1:-1;76663:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76628:36::-;76679:22;76694:1;76679:22;;;;;;;;;;;;;-1:-1:-1;;;76679:22:0;;;:14;:22::i;:::-;76675:36;;;-1:-1:-1;76710:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76675:36::-;76726:22;76741:1;76726:22;;;;;;;;;;;;;-1:-1:-1;;;76726:22:0;;;:14;:22::i;:::-;76722:36;;;-1:-1:-1;76757:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76722:36::-;76773:22;76788:1;76773:22;;;;;;;;;;;;;-1:-1:-1;;;76773:22:0;;;:14;:22::i;:::-;76769:36;;;-1:-1:-1;76804:1:0;;76314:518;-1:-1:-1;76314:518:0:o;76769:36::-;-1:-1:-1;76823:1:0;;76314:518;-1:-1:-1;76314:518:0:o;59803:1025::-;60133:5;;60148:18;;;;60133:34;;-1:-1:-1;;;60133:34:0;;27672:4:1;27660:17;;;60133:34:0;;;27642:36:1;59893:13:0;;59919:15;;-1:-1:-1;;;;;60133:5:0;;;;:14;;27615:18:1;;60133:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60133:34:0;;;;;;;;;;;;:::i;:::-;60255:5;;60273:17;;;;60255:36;;-1:-1:-1;;;60255:36:0;;27672:4:1;27660:17;;;60255:36:0;;;27642::1;-1:-1:-1;;;;;60255:5:0;;;;:17;;27615:18:1;;60255:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60255:36:0;;;;;;;;;;;;:::i;:::-;60368:9;:17;;;:22;;60389:1;60368:22;:331;;60570:5;;60588:17;;;;60570:36;;-1:-1:-1;;;60570:36:0;;27672:4:1;27660:17;;;60570:36:0;;;27642::1;-1:-1:-1;;;;;60570:5:0;;;;:17;;27615:18:1;;60570:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60570:36:0;;;;;;;;;;;;:::i;:::-;60473:203;;;;;;;;:::i;:::-;;;;;;;;;;;;;60368:331;;;;;;;;;;;;;;;;60718:29;60728:9;60739:7;60718:9;:29::i;:::-;59958:832;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;59958:832:0;;;;;;;59803:1025;-1:-1:-1;;;;59803:1025:0:o;43375:988::-;43641:22;43691:1;43666:22;43683:4;43666:16;:22::i;:::-;:26;;;;:::i;:::-;43703:18;43724:26;;;:17;:26;;;;;;43641:51;;-1:-1:-1;43857:28:0;;;43853:328;;-1:-1:-1;;;;;43924:18:0;;43902:19;43924:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43975:30;;;;;;:44;;;44092:30;;:17;:30;;;;;:43;;;43853:328;-1:-1:-1;44277:26:0;;;;:17;:26;;;;;;;;44270:33;;;-1:-1:-1;;;;;44321:18:0;;;;;:12;:18;;;;;:34;;;;;;;44314:41;43375:988::o;44658:1079::-;44936:10;:17;44911:22;;44936:21;;44956:1;;44936:21;:::i;:::-;44968:18;44989:24;;;:15;:24;;;;;;45362:10;:26;;44911:46;;-1:-1:-1;44989:24:0;;44911:46;;45362:26;;;;;;:::i;:::-;;;;;;;;;45340:48;;45426:11;45401:10;45412;45401:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45506:28;;;:15;:28;;;;;;;:41;;;45678:24;;;;;45671:31;45713:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44729:1008;;;44658:1079;:::o;42162:221::-;42247:14;42264:20;42281:2;42264:16;:20::i;:::-;-1:-1:-1;;;;;42295:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42340:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42162:221:0:o;33446:382::-;-1:-1:-1;;;;;33526:16:0;;33518:61;;;;-1:-1:-1;;;33518:61:0;;31355:2:1;33518:61:0;;;31337:21:1;;;31374:18;;;31367:30;31433:34;31413:18;;;31406:62;31485:18;;33518:61:0;31153:356:1;33518:61:0;31533:4;31557:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31557:16:0;:30;33590:58;;;;-1:-1:-1;;;33590:58:0;;31716:2:1;33590:58:0;;;31698:21:1;31755:2;31735:18;;;31728:30;31794;31774:18;;;31767:58;31842:18;;33590:58:0;31514:352:1;33590:58:0;33661:45;33690:1;33694:2;33698:7;33661:20;:45::i;:::-;-1:-1:-1;;;;;33719:13:0;;;;;;:9;:13;;;;;:18;;33736:1;;33719:13;:18;;33736:1;;33719:18;:::i;:::-;;;;-1:-1:-1;;33748:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33748:21:0;-1:-1:-1;;;;;33748:21:0;;;;;;;;33787:33;;33748:16;;;33787:33;;33748:16;;33787:33;33446:382;;:::o;60836:2237::-;60923:13;60991:15;61009:9;:17;;;:22;;61030:1;61009:22;:98;;;;;;;;;;;;;;;-1:-1:-1;;;61009:98:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61009:98:0;;;;61140:5;;61156:15;;;;;61140:32;;-1:-1:-1;;;61140:32:0;;27672:4:1;27660:17;;;61140:32:0;;;27642:36:1;60991:116:0;;-1:-1:-1;61118:19:0;;-1:-1:-1;;;;;61140:5:0;;;;:15;;27615:18:1;;61140:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61140:32:0;;;;;;;;;;;;:::i;:::-;61118:54;;61183:15;61201:25;61216:5;61201:25;;;;;;;;;;;;:14;:25::i;:::-;:283;;61418:5;;61434:15;;;;;61418:32;;-1:-1:-1;;;61418:32:0;;27672:4:1;27660:17;;;61418:32:0;;;27642:36:1;61394:1:0;;-1:-1:-1;;;;;61418:5:0;;:15;;27615:18:1;;61418:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61418:32:0;;;;;;;;;;;;:::i;:::-;61285:184;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61201:283;;;;;;;;;;;;;;;;61183:301;-1:-1:-1;61543:15:0;61561:11;61571:1;61561:7;:11;:::i;:::-;:16;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61561:135:0;;;;61543:153;;61707:15;61737:9;:17;;;:22;;61758:1;61737:22;61733:1314;;;61924:5;;61939:20;;;;61924:36;;-1:-1:-1;;;61924:36:0;;27672:4:1;27660:17;;;61924:36:0;;;27642::1;-1:-1:-1;;;;;61924:5:0;;;;:14;;27615:18:1;;61924:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61924:36:0;;;;;;;;;;;;:::i;:::-;62015:17;62024:7;62015:8;:17::i;:::-;62151:5;;62166:14;;62151:30;;-1:-1:-1;;;62151:30:0;;27672:4:1;27660:17;;;62151:30:0;;;27642:36:1;-1:-1:-1;;;;;62151:5:0;;;;:14;;27615:18:1;;62151:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62151:30:0;;;;;;;;;;;;:::i;:::-;62253:1;61805:502;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61776:546;;61733:1314;;;62503:5;;62518:20;;;;62503:36;;-1:-1:-1;;;62503:36:0;;27672:4:1;27660:17;;;62503:36:0;;;27642::1;-1:-1:-1;;;;;62503:5:0;;;;:14;;27615:18:1;;62503:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62503:36:0;;;;;;;;;;;;:::i;:::-;62594:17;62603:7;62594:8;:17::i;:::-;62740:5;;62754:13;;;;62740:28;;-1:-1:-1;;;62740:28:0;;27672:4:1;27660:17;;;62740:28:0;;;27642:36:1;-1:-1:-1;;;;;62740:5:0;;;;:13;;27615:18:1;;62740:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62740:28:0;;;;;;;;;;;;:::i;:::-;62874:5;;62889:14;;62874:30;;-1:-1:-1;;;62874:30:0;;27672:4:1;27660:17;;;62874:30:0;;;27642:36:1;-1:-1:-1;;;;;62874:5:0;;;;:14;;27615:18:1;;62874:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62874:30:0;;;;;;;;;;;;:::i;:::-;62976:1;63000;62384:636;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62355:680;;61733:1314;63064:1;60836:2237;-1:-1:-1;;;;;;;60836:2237:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;2710:127::-;2771:10;2766:3;2762:20;2759:1;2752:31;2802:4;2799:1;2792:15;2826:4;2823:1;2816:15;2842:275;2913:2;2907:9;2978:2;2959:13;;-1:-1:-1;;2955:27:1;2943:40;;3013:18;2998:34;;3034:22;;;2995:62;2992:88;;;3060:18;;:::i;:::-;3096:2;3089:22;2842:275;;-1:-1:-1;2842:275:1:o;3122:187::-;3171:4;3204:18;3196:6;3193:30;3190:56;;;3226:18;;:::i;:::-;-1:-1:-1;3292:2:1;3271:15;-1:-1:-1;;3267:29:1;3298:4;3263:40;;3122:187::o;3314:338::-;3379:5;3408:53;3424:36;3453:6;3424:36;:::i;:::-;3408:53;:::i;:::-;3399:62;;3484:6;3477:5;3470:21;3524:3;3515:6;3510:3;3506:16;3503:25;3500:45;;;3541:1;3538;3531:12;3500:45;3590:6;3585:3;3578:4;3571:5;3567:16;3554:43;3644:1;3637:4;3628:6;3621:5;3617:18;3613:29;3606:40;3314:338;;;;;:::o;3657:519::-;3735:6;3743;3796:2;3784:9;3775:7;3771:23;3767:32;3764:52;;;3812:1;3809;3802:12;3764:52;3848:9;3835:23;3825:33;;3909:2;3898:9;3894:18;3881:32;3936:18;3928:6;3925:30;3922:50;;;3968:1;3965;3958:12;3922:50;3991:22;;4044:4;4036:13;;4032:27;-1:-1:-1;4022:55:1;;4073:1;4070;4063:12;4022:55;4096:74;4162:7;4157:2;4144:16;4139:2;4135;4131:11;4096:74;:::i;:::-;4086:84;;;3657:519;;;;;:::o;4181:186::-;4240:6;4293:2;4281:9;4272:7;4268:23;4264:32;4261:52;;;4309:1;4306;4299:12;4261:52;4332:29;4351:9;4332:29;:::i;4372:347::-;4437:6;4445;4498:2;4486:9;4477:7;4473:23;4469:32;4466:52;;;4514:1;4511;4504:12;4466:52;4537:29;4556:9;4537:29;:::i;:::-;4527:39;;4616:2;4605:9;4601:18;4588:32;4663:5;4656:13;4649:21;4642:5;4639:32;4629:60;;4685:1;4682;4675:12;4629:60;4708:5;4698:15;;;4372:347;;;;;:::o;4724:667::-;4819:6;4827;4835;4843;4896:3;4884:9;4875:7;4871:23;4867:33;4864:53;;;4913:1;4910;4903:12;4864:53;4936:29;4955:9;4936:29;:::i;:::-;4926:39;;4984:38;5018:2;5007:9;5003:18;4984:38;:::i;:::-;4974:48;;5069:2;5058:9;5054:18;5041:32;5031:42;;5124:2;5113:9;5109:18;5096:32;5151:18;5143:6;5140:30;5137:50;;;5183:1;5180;5173:12;5137:50;5206:22;;5259:4;5251:13;;5247:27;-1:-1:-1;5237:55:1;;5288:1;5285;5278:12;5237:55;5311:74;5377:7;5372:2;5359:16;5354:2;5350;5346:11;5311:74;:::i;:::-;5301:84;;;4724:667;;;;;;;:::o;5396:260::-;5464:6;5472;5525:2;5513:9;5504:7;5500:23;5496:32;5493:52;;;5541:1;5538;5531:12;5493:52;5564:29;5583:9;5564:29;:::i;:::-;5554:39;;5612:38;5646:2;5635:9;5631:18;5612:38;:::i;:::-;5602:48;;5396:260;;;;;:::o;5846:380::-;5925:1;5921:12;;;;5968;;;5989:61;;6043:4;6035:6;6031:17;6021:27;;5989:61;6096:2;6088:6;6085:14;6065:18;6062:38;6059:161;;;6142:10;6137:3;6133:20;6130:1;6123:31;6177:4;6174:1;6167:15;6205:4;6202:1;6195:15;6059:161;;5846:380;;;:::o;7471:413::-;7673:2;7655:21;;;7712:2;7692:18;;;7685:30;7751:34;7746:2;7731:18;;7724:62;-1:-1:-1;;;7817:2:1;7802:18;;7795:47;7874:3;7859:19;;7471:413::o;7889:355::-;8091:2;8073:21;;;8130:2;8110:18;;;8103:30;8169:33;8164:2;8149:18;;8142:61;8235:2;8220:18;;7889:355::o;9010:185::-;9052:3;9090:5;9084:12;9105:52;9150:6;9145:3;9138:4;9131:5;9127:16;9105:52;:::i;:::-;9173:16;;;;;9010:185;-1:-1:-1;;9010:185:1:o;9200:276::-;9331:3;9369:6;9363:13;9385:53;9431:6;9426:3;9419:4;9411:6;9407:17;9385:53;:::i;:::-;9454:16;;;;;9200:276;-1:-1:-1;;9200:276:1:o;11121:127::-;11182:10;11177:3;11173:20;11170:1;11163:31;11213:4;11210:1;11203:15;11237:4;11234:1;11227:15;11253:128;11293:3;11324:1;11320:6;11317:1;11314:13;11311:39;;;11330:18;;:::i;:::-;-1:-1:-1;11366:9:1;;11253:128::o;11818:168::-;11858:7;11924:1;11920;11916:6;11912:14;11909:1;11906:21;11901:1;11894:9;11887:17;11883:45;11880:71;;;11931:18;;:::i;:::-;-1:-1:-1;11971:9:1;;11818:168::o;12342:135::-;12381:3;-1:-1:-1;;12402:17:1;;12399:43;;;12422:18;;:::i;:::-;-1:-1:-1;12469:1:1;12458:13;;12342:135::o;12482:127::-;12543:10;12538:3;12534:20;12531:1;12524:31;12574:4;12571:1;12564:15;12598:4;12595:1;12588:15;12614:120;12654:1;12680;12670:35;;12685:18;;:::i;:::-;-1:-1:-1;12719:9:1;;12614:120::o;12739:356::-;12941:2;12923:21;;;12960:18;;;12953:30;13019:34;13014:2;12999:18;;12992:62;13086:2;13071:18;;12739:356::o;13940:127::-;14001:10;13996:3;13992:20;13989:1;13982:31;14032:4;14029:1;14022:15;14056:4;14053:1;14046:15;15663:430;-1:-1:-1;;;15920:3:1;15913:26;15895:3;15968:6;15962:13;15984:62;16039:6;16034:2;16029:3;16025:12;16018:4;16010:6;16006:17;15984:62;:::i;:::-;16066:16;;;;16084:2;16062:25;;15663:430;-1:-1:-1;;15663:430:1:o;16098:1684::-;-1:-1:-1;;;16795:45:1;;16863:13;;16777:3;;16885:62;16863:13;16935:2;16926:12;;16919:4;16907:17;;16885:62;:::i;:::-;17007:13;;16966:16;;;;17029:63;17007:13;17078:2;17070:11;;17063:4;17051:17;;17029:63;:::i;:::-;17157:66;17152:2;17111:17;;;;17144:11;;;17137:87;-1:-1:-1;;;17248:2:1;17240:11;;17233:43;17301:13;;17323:63;17301:13;17372:2;17364:11;;17357:4;17345:17;;17323:63;:::i;:::-;17451:66;17446:2;17405:17;;;;17438:11;;;17431:87;-1:-1:-1;;;17542:2:1;17534:11;;17527:32;17584:13;;17606:63;17584:13;17655:2;17647:11;;17640:4;17628:17;;17606:63;:::i;:::-;-1:-1:-1;;;17729:2:1;17688:17;;;;17721:11;;;17714:35;17773:2;17765:11;;16098:1684;-1:-1:-1;;;;;;16098:1684:1:o;17787:448::-;18049:31;18044:3;18037:44;18019:3;18110:6;18104:13;18126:62;18181:6;18176:2;18171:3;18167:12;18160:4;18152:6;18148:17;18126:62;:::i;:::-;18208:16;;;;18226:2;18204:25;;17787:448;-1:-1:-1;;17787:448:1:o;19875:125::-;19915:4;19943:1;19940;19937:8;19934:34;;;19948:18;;:::i;:::-;-1:-1:-1;19985:9:1;;19875:125::o;20388:112::-;20420:1;20446;20436:35;;20451:18;;:::i;:::-;-1:-1:-1;20485:9:1;;20388:112::o;20505:1449::-;20924:3;20962:6;20956:13;20988:4;21001:51;21045:6;21040:3;21035:2;21027:6;21023:15;21001:51;:::i;:::-;21115:13;;21074:16;;;;21137:55;21115:13;21074:16;21159:15;;;21137:55;:::i;:::-;21259:13;;21214:20;;;21281:55;21259:13;21214:20;21303:15;;;21281:55;:::i;:::-;21403:13;;21358:20;;;21425:55;21403:13;21358:20;21447:15;;;21425:55;:::i;:::-;21547:13;;21502:20;;;21569:55;21547:13;21502:20;21591:15;;;21569:55;:::i;:::-;21691:13;;21646:20;;;21713:55;21691:13;21646:20;21735:15;;;21713:55;:::i;:::-;21835:13;;21790:20;;;21857:55;21835:13;21790:20;21879:15;;;21857:55;:::i;:::-;21928:20;;;;;20505:1449;-1:-1:-1;;;;;;;;;;20505:1449:1:o;21959:414::-;22161:2;22143:21;;;22200:2;22180:18;;;22173:30;22239:34;22234:2;22219:18;;22212:62;-1:-1:-1;;;22305:2:1;22290:18;;22283:48;22363:3;22348:19;;21959:414::o;23354:2275::-;24510:66;24505:3;24498:79;24616:38;24611:3;24607:48;24602:2;24597:3;24593:12;24586:70;24480:3;24685:6;24679:13;24701:60;24754:6;24749:2;24744:3;24740:12;24735:2;24727:6;24723:15;24701:60;:::i;:::-;24825:66;24820:2;24780:16;;;24812:11;;;24805:87;-1:-1:-1;;;24916:2:1;24908:11;;24901:47;24973:13;;24995:61;24973:13;25042:2;25034:11;;25029:2;25017:15;;24995:61;:::i;:::-;25121:66;25116:2;25075:17;;;;25108:11;;;25101:87;-1:-1:-1;;;25212:3:1;25204:12;;25197:42;25264:13;;25286:62;25264:13;25333:3;25325:12;;25320:2;25308:15;;25286:62;:::i;:::-;25364:259;25390:232;25420:201;25446:174;25476:143;25502:116;25532:85;25558:58;25611:3;25600:8;25596:2;25592:17;25588:27;22455:66;22443:79;;-1:-1:-1;;;22547:2:1;22538:12;;22531:64;22620:2;22611:12;;22378:251;25558:58;25550:6;25532:85;:::i;:::-;22711:66;22699:79;;-1:-1:-1;;;22803:2:1;22794:12;;22787:46;22858:2;22849:12;;22634:233;25502:116;25494:6;25476:143;:::i;:::-;22949:66;22937:79;;-1:-1:-1;;;23041:2:1;23032:12;;23025:46;23096:2;23087:12;;22872:233;25446:174;25438:6;25420:201;:::i;:::-;23187:66;23175:79;;-1:-1:-1;;;23279:2:1;23270:12;;23263:52;23340:2;23331:12;;23110:239;25390:232;25382:6;25364:259;:::i;:::-;25357:266;23354:2275;-1:-1:-1;;;;;;;;;;;23354:2275:1:o;25634:920::-;26015:3;26053:6;26047:13;26069:53;26115:6;26110:3;26103:4;26095:6;26091:17;26069:53;:::i;:::-;26153:6;26148:3;26144:16;26131:29;;26183:66;26176:5;26169:81;26293:36;26288:3;26284:46;26277:4;26270:5;26266:16;26259:72;26362:6;26356:13;26378:66;26435:8;26430:2;26423:5;26419:14;26412:4;26404:6;26400:17;26378:66;:::i;:::-;-1:-1:-1;;;26507:2:1;26463:20;;;;26499:11;;;26492:29;26545:2;26537:11;;25634:920;-1:-1:-1;;;;25634:920:1:o;26559:175::-;26596:3;26640:4;26633:5;26629:16;26669:4;26660:7;26657:17;26654:43;;;26677:18;;:::i;:::-;26726:1;26713:15;;26559:175;-1:-1:-1;;26559:175:1:o;26739:500::-;-1:-1:-1;;;;;27008:15:1;;;26990:34;;27060:15;;27055:2;27040:18;;27033:43;27107:2;27092:18;;27085:34;;;27155:3;27150:2;27135:18;;27128:31;;;26933:4;;27176:57;;27213:19;;27205:6;27176:57;:::i;:::-;27168:65;26739:500;-1:-1:-1;;;;;;26739:500:1:o;27244:249::-;27313:6;27366:2;27354:9;27345:7;27341:23;27337:32;27334:52;;;27382:1;27379;27372:12;27334:52;27414:9;27408:16;27433:30;27457:5;27433:30;:::i;27689:636::-;27769:6;27822:2;27810:9;27801:7;27797:23;27793:32;27790:52;;;27838:1;27835;27828:12;27790:52;27871:9;27865:16;27904:18;27896:6;27893:30;27890:50;;;27936:1;27933;27926:12;27890:50;27959:22;;28012:4;28004:13;;28000:27;-1:-1:-1;27990:55:1;;28041:1;28038;28031:12;27990:55;28070:2;28064:9;28095:49;28111:32;28140:2;28111:32;:::i;28095:49::-;28167:2;28160:5;28153:17;28207:7;28202:2;28197;28193;28189:11;28185:20;28182:33;28179:53;;;28228:1;28225;28218:12;28179:53;28241:54;28292:2;28287;28280:5;28276:14;28271:2;28267;28263:11;28241:54;:::i;:::-;28314:5;27689:636;-1:-1:-1;;;;;27689:636:1:o;28330:627::-;-1:-1:-1;;;28681:59:1;;28763:13;;28663:3;;28785:62;28763:13;28835:2;28826:12;;28819:4;28807:17;;28785:62;:::i;:::-;-1:-1:-1;;;28906:2:1;28866:16;;;;28898:11;;;28891:33;-1:-1:-1;28948:2:1;28940:11;;28330:627;-1:-1:-1;28330:627:1:o;29087:1929::-;29998:66;29993:3;29986:79;30095:66;30090:2;30085:3;30081:12;30074:88;30192:66;30187:2;30182:3;30178:12;30171:88;30289:25;30284:2;30279:3;30275:12;30268:47;29968:3;30344:6;30338:13;30360:61;30414:6;30408:3;30403;30399:13;30394:2;30386:6;30382:15;30360:61;:::i;:::-;-1:-1:-1;;;30480:3:1;30440:16;;;30472:12;;;30465:62;-1:-1:-1;;;30551:3:1;30543:12;;30536:37;30598:13;;30620:62;30598:13;30667:3;30659:12;;30654:2;30642:15;;30620:62;:::i;:::-;-1:-1:-1;;;30742:3:1;30701:17;;;;30734:12;;;30727:34;-1:-1:-1;;;30785:3:1;30777:12;;30770:30;30825:13;;30847:62;30825:13;30894:3;30886:12;;30881:2;30869:15;;30847:62;:::i;:::-;30925:85;30955:54;31004:3;30993:8;30989:2;30985:17;30981:27;30973:6;30955:54;:::i;:::-;-1:-1:-1;;;29027:22:1;;29074:1;29065:11;;28962:120;30925:85;30918:92;29087:1929;-1:-1:-1;;;;;;;;29087:1929:1:o;31021:127::-;31082:10;31077:3;31073:20;31070:1;31063:31;31113:4;31110:1;31103:15;31137:4;31134:1;31127:15;31871:710;32181:34;32176:3;32169:47;32255:28;32250:3;32246:38;32241:2;32236:3;32232:12;32225:60;32151:3;32314:6;32308:13;32330:60;32383:6;32378:2;32373:3;32369:12;32364:2;32356:6;32352:15;32330:60;:::i;:::-;32450:13;;32409:16;;;;32472:61;32450:13;32519:2;32511:11;;32506:2;32494:15;;32472:61;:::i;:::-;32553:17;32572:2;32549:26;;31871:710;-1:-1:-1;;;;31871:710:1:o;32891:2051::-;-1:-1:-1;;;33891:57:1;;-1:-1:-1;;;33973:2:1;33964:12;;33957:38;34018:13;;-1:-1:-1;;34040:62:1;34018:13;34090:2;34081:12;;34074:4;34062:17;;34040:62;:::i;:::-;-1:-1:-1;;;34161:2:1;34121:16;;;34153:11;;;34146:47;34218:13;;34240:63;34218:13;34289:2;34281:11;;34274:4;34262:17;;34240:63;:::i;:::-;-1:-1:-1;;;34363:2:1;34322:17;;;;34355:11;;;34348:65;34442:66;34437:2;34429:11;;34422:87;34534:13;;34556:63;34534:13;34605:2;34597:11;;34590:4;34578:17;;34556:63;:::i;:::-;34684:66;34679:2;34638:17;;;;34671:11;;;34664:87;34776:13;;34798:64;34776:13;34847:3;34839:12;;34832:4;34820:17;;34798:64;:::i;:::-;34878:58;34931:3;34920:8;34916:2;34912:17;34908:27;-1:-1:-1;;;32829:24:1;;32878:1;32869:11;;32764:122;35251:2200;-1:-1:-1;;;36448:57:1;;-1:-1:-1;;;36530:2:1;36521:12;;36514:38;36575:13;;-1:-1:-1;;36597:62:1;36575:13;36647:2;36638:12;;36631:4;36619:17;;36597:62;:::i;:::-;-1:-1:-1;;;36718:2:1;36678:16;;;36710:11;;;36703:47;36775:13;;36797:63;36775:13;36846:2;36838:11;;36831:4;36819:17;;36797:63;:::i;:::-;-1:-1:-1;;;36920:2:1;36879:17;;;;36912:11;;;36905:65;36999:66;36994:2;36986:11;;36979:87;-1:-1:-1;;;37090:2:1;37082:11;;37075:49;37149:13;;37171:63;37149:13;37220:2;37212:11;;37205:4;37193:17;;37171:63;:::i;:::-;37250:195;37276:168;37302:141;37332:110;37358:83;37383:57;37436:2;37425:8;37421:2;37417:17;37413:26;-1:-1:-1;;;35012:18:1;;35055:1;35046:11;;34947:116;37383:57;32658:66;32646:79;;32750:2;32741:12;;32586:173;37358:83;37350:6;37332:110;:::i;:::-;35145:66;35133:79;;35237:2;35228:12;;35068:178;37302:141;37294:6;37276:168;:::i

Swarm Source

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