ETH Price: $2,476.84 (-7.83%)

Token

Poseidon (FISH)
 

Overview

Max Total Supply

27 FISH

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
offthechain.eth
Balance
1 FISH
0xd2b21d61b4944e4dbc8ae4fef20c91e40bb00e21
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Poseidon

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-18
*/

// SPDX-License-Identifier: MIT
//
//  :::::::::   ::::::::   ::::::::  :::::::::: ::::::::::: :::::::::   ::::::::  ::::    :::
//  :+:    :+: :+:    :+: :+:    :+: :+:            :+:     :+:    :+: :+:    :+: :+:+:   :+:
//  +:+    +:+ +:+    +:+ +:+        +:+            +:+     +:+    +:+ +:+    +:+ :+:+:+  +:+
//  +#++:++#+  +#+    +:+ +#++:++#++ +#++:++#       +#+     +#+    +:+ +#+    +:+ +#+ +:+ +#+
//  +#+        +#+    +#+        +#+ +#+            +#+     +#+    +#+ +#+    +#+ +#+  +#+#+#
//  #+#        #+#    #+# #+#    #+# #+#            #+#     #+#    #+# #+#    #+# #+#   #+#+#
//  ###         ########   ########  ########## ########### #########   ########  ###    ####
//                                                                               by Amperlabs

pragma solidity 0.8.6;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * Poseidon is an ERC721 contract in which each token has a starting level of 1,
 * and each token can increase its own level by hunting another token.
 *
 * An owner of at least two tokens can decide to hunt, by choosing one token to
 * become the predator and another token to become the prey. When hunting, the
 * predator token level becomes the sum of the level of both tokens and the prey
 * token is burned.
 *
 * Each token art evolves when its level increases to certain thresholds.
 */
contract Poseidon is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public constant MINT_PUBLIC = 9500;
    uint256 public constant MINT_PRIVATE = 500;
    uint256 public constant MINT_PRICE = 0.08 ether;
    // md5(md5fish1.md5shark1.md5whale1.md5kraken1.md5fish2.md5shark2.md5whale2.md5kraken2...)
    string public provenance = "";

    string private _contractURI = "";
    string private _tokenBaseURI = "";
    bool private _ipfs = false;

    uint256 private _startingBlock = 999999999;
    uint256 private _currentTokenId = 0;
    uint256 private _publicMinted = 0;
    uint256 private _privateMinted = 0;

    mapping(uint256 => uint256) private _level;
    event Hunt(address indexed from, uint256 indexed predator, uint256 indexed prey, uint256 level);

    constructor() ERC721("Poseidon", "FISH") {}

    // Public sale
    function mint() external payable {
        require(block.number >= _startingBlock, "SALE_NOT_STARTED");
        require(_publicMinted < MINT_PUBLIC, "WOULD_EXCEED_SUPPLY");
        require(msg.value == MINT_PRICE, "NOT_MINT_PRICE");
        require(msg.sender == tx.origin, "CONTRACTS_CANNOT_MINT");
        _publicMinted += 1;
        _currentTokenId++;
        _safeMint(msg.sender, _currentTokenId);
        _level[_currentTokenId] = 1;
    }

    // Minting for the devs, gifts, giveaways, derivatives and marketing
    function mintPrivate(address[] memory _to) external onlyOwner {
        require(_privateMinted + _to.length <= MINT_PRIVATE, "WOULD_EXCEED_SUPPLY");
        _privateMinted += _to.length;
        for (uint256 i = 0; i < _to.length; i++) {
            _currentTokenId++;
            _safeMint(_to[i], _currentTokenId);
            _level[_currentTokenId] = 1;
        }
    }

    // Hunt burns a token and adds it's level to another token
    function hunt(uint256 _predator, uint256 _prey) external {
        require(_predator != _prey, "MUST_BE_DIFFERENT");
        require(ownerOf(_predator) == _msgSender(), "MUST_OWN_PREDATOR");
        require(ownerOf(_prey) == _msgSender(), "MUST_OWN_PREY");
        require(_level[_predator] >= _level[_prey], "PREY_MORE_LEVEL_THAN_PREDATOR");
        _burn(_prey);
        _level[_predator] += _level[_prey];
        _level[_prey] = 0;
        emit Hunt(_msgSender(), _predator, _prey, _level[_predator]);
    }

    // View the level of a token
    function level(uint256 _tokenId) public view returns (uint256) {
        require(_exists(_tokenId), "NONEXISTENT_TOKEN");
        return _level[_tokenId];
    }

    // Returns the type based on it's level, which can be fish, shark, whale or kraken
    function tokenType(uint256 _tokenId) public view returns (string memory) {
        uint256 level_ = level(_tokenId);
        if (level_ >= 1000) {
            return "kraken";
        }
        if (level_ >= 100) {
            return "whale";
        }
        if (level_ >= 10) {
            return "shark";
        }
        return "fish";
    }

    // Override tokenURI to add the type
    function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns (string memory) {
        string memory baseURI = _baseURI();

        if (_ipfs) {
            string memory type_ = tokenType(tokenId);
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), "/", type_)) : "";
        }
        uint256 level_ = level(tokenId);
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), "/", level_.toString())) : "";
    }

    // Set starting block for the sale
    function setStartingBlock(uint256 startingBlock_) external onlyOwner {
        _startingBlock = startingBlock_;
    }

    // Transfer all the balance to the owner
    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    // View Contract-level URI
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    // Set Contract-level URI
    function setContractURI(string memory contractURI_) external onlyOwner {
        _contractURI = contractURI_;
    }

    // Set Contract-level URI. IPFS URI allows completely decentralized metadata without the level attribute
    function setBaseURI(string memory baseURI_, bool ipfs_) external onlyOwner {
        _tokenBaseURI = baseURI_;
        _ipfs = ipfs_;
    }

    // Overrides _baseURI to be a custom URI
    function _baseURI() internal view override(ERC721) returns (string memory) {
        return _tokenBaseURI;
    }

    // View starting block
    function startingBlock() public view returns (uint256) {
        return _startingBlock;
    }

    // View public minted amount
    function publicMinted() public view returns (uint256) {
        return _publicMinted;
    }

    // View account max level
    function addressMaxLevel(address _address) public view returns (uint256) {
        uint256 _maxLevel = 0;
        uint256 _balanceOfAddress = balanceOf(_address);
        for (uint256 i = 0; i < _balanceOfAddress; i++) {
            uint256 _tokenId = tokenOfOwnerByIndex(_address, i);
            uint256 level_ = level(_tokenId);
            if (level_ > _maxLevel) {
                _maxLevel = level_;
            }
        }
        return _maxLevel;
    }

    // Provenance
    function setProvenance(string memory _provenance) external onlyOwner {
        require(bytes(provenance).length == 0, "Provenance already set!");
        provenance = _provenance;
    }
}

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":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"predator","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"prey","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"}],"name":"Hunt","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":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addressMaxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_predator","type":"uint256"},{"internalType":"uint256","name":"_prey","type":"uint256"}],"name":"hunt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"level","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"mintPrivate","outputs":[],"stateMutability":"nonpayable","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":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"baseURI_","type":"string"},{"internalType":"bool","name":"ipfs_","type":"bool"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingBlock_","type":"uint256"}],"name":"setStartingBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenType","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b92919062000250565b5060405180602001604052806000815250600c90805190602001906200005392919062000250565b5060405180602001604052806000815250600d90805190602001906200007b92919062000250565b506000600e60006101000a81548160ff021916908315150217905550633b9ac9ff600f55600060105560006011556000601255348015620000bb57600080fd5b506040518060400160405280600881526020017f506f736569646f6e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f464953480000000000000000000000000000000000000000000000000000000081525081600090805190602001906200014092919062000250565b5080600190805190602001906200015992919062000250565b5050506200017c620001706200018260201b60201c565b6200018a60201b60201c565b62000365565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025e9062000300565b90600052602060002090601f016020900481019282620002825760008555620002ce565b82601f106200029d57805160ff1916838001178555620002ce565b82800160010185558215620002ce579182015b82811115620002cd578251825591602001919060010190620002b0565b5b509050620002dd9190620002e1565b5090565b5b80821115620002fc576000816000905550600101620002e2565b5090565b600060028204905060018216806200031957607f821691505b6020821081141562000330576200032f62000336565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ca980620003756000396000f3fe60806040526004361061021a5760003560e01c80638249fdf211610123578063bcb05948116100ab578063e8a3d4851161006f578063e8a3d485146107d8578063e985e9c514610803578063ec17b20e14610840578063f2fde38b14610869578063ffe630b5146108925761021a565b8063bcb05948146106df578063c002d23d14610708578063c87b56dd14610733578063d91c98d314610770578063e6c3b1f61461079b5761021a565b806395d89b41116100f257806395d89b411461060e578063a22cb46514610639578063a4f4f8af14610662578063b64b21ca1461068d578063b88d4fde146106b65761021a565b80638249fdf214610552578063892f1d131461057d5780638da5cb5b146105ba578063938e3d7b146105e55761021a565b806323b872dd116101a65780634f6ccce7116101755780634f6ccce7146104595780636352211e1461049657806363610e7a146104d357806370a08231146104fe578063715018a61461053b5761021a565b806323b872dd146103b35780632f745c59146103dc5780633ccfd60b1461041957806342842e0e146104305761021a565b8063095ea7b3116101ed578063095ea7b3146103015780630f7309e81461032a5780631249c58b14610355578063165e0dc61461035f57806318160ddd146103885761021a565b806301ffc9a71461021f57806305c58df21461025c57806306fdde0314610299578063081812fc146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906136ba565b6108bb565b6040516102539190613d6d565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906137b9565b610935565b604051610290919061410a565b60405180910390f35b3480156102a557600080fd5b506102ae61099a565b6040516102bb9190613d88565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906137b9565b610a2c565b6040516102f89190613d06565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613631565b610ab1565b005b34801561033657600080fd5b5061033f610bc9565b60405161034c9190613d88565b60405180910390f35b61035d610c57565b005b34801561036b57600080fd5b50610386600480360381019061038191906137e6565b610df5565b005b34801561039457600080fd5b5061039d611068565b6040516103aa919061410a565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d5919061351b565b611075565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613631565b6110d5565b604051610410919061410a565b60405180910390f35b34801561042557600080fd5b5061042e61117a565b005b34801561043c57600080fd5b506104576004803603810190610452919061351b565b61123f565b005b34801561046557600080fd5b50610480600480360381019061047b91906137b9565b61125f565b60405161048d919061410a565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906137b9565b6112d0565b6040516104ca9190613d06565b60405180910390f35b3480156104df57600080fd5b506104e8611382565b6040516104f5919061410a565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906134ae565b611388565b604051610532919061410a565b60405180910390f35b34801561054757600080fd5b50610550611440565b005b34801561055e57600080fd5b506105676114c8565b604051610574919061410a565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906134ae565b6114ce565b6040516105b1919061410a565b60405180910390f35b3480156105c657600080fd5b506105cf611534565b6040516105dc9190613d06565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190613714565b61155e565b005b34801561061a57600080fd5b506106236115f4565b6040516106309190613d88565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906135f1565b611686565b005b34801561066e57600080fd5b5061067761169c565b604051610684919061410a565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af919061375d565b6116a6565b005b3480156106c257600080fd5b506106dd60048036038101906106d8919061356e565b611757565b005b3480156106eb57600080fd5b5061070660048036038101906107019190613671565b6117b9565b005b34801561071457600080fd5b5061071d61191e565b60405161072a919061410a565b60405180910390f35b34801561073f57600080fd5b5061075a600480360381019061075591906137b9565b61192a565b6040516107679190613d88565b60405180910390f35b34801561077c57600080fd5b50610785611a18565b604051610792919061410a565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd91906137b9565b611a22565b6040516107cf9190613d88565b60405180910390f35b3480156107e457600080fd5b506107ed611b43565b6040516107fa9190613d88565b60405180910390f35b34801561080f57600080fd5b5061082a600480360381019061082591906134db565b611bd5565b6040516108379190613d6d565b60405180910390f35b34801561084c57600080fd5b50610867600480360381019061086291906137b9565b611c69565b005b34801561087557600080fd5b50610890600480360381019061088b91906134ae565b611cef565b005b34801561089e57600080fd5b506108b960048036038101906108b49190613714565b611de7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092e575061092d82611ece565b5b9050919050565b600061094082611fb0565b61097f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097690613f0a565b60405180910390fd5b60136000838152602001908152602001600020549050919050565b6060600080546109a99061438c565b80601f01602080910402602001604051908101604052809291908181526020018280546109d59061438c565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b6000610a3782611fb0565b610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90613fca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abc826112d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b249061404a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4c61201c565b73ffffffffffffffffffffffffffffffffffffffff161480610b7b5750610b7a81610b7561201c565b611bd5565b5b610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190613f2a565b60405180910390fd5b610bc48383612024565b505050565b600b8054610bd69061438c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c029061438c565b8015610c4f5780601f10610c2457610100808354040283529160200191610c4f565b820191906000526020600020905b815481529060010190602001808311610c3257829003601f168201915b505050505081565b600f54431015610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390613e2a565b60405180910390fd5b61251c60115410610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613fea565b60405180910390fd5b67011c37937e0800003414610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2390613e6a565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190613f8a565b60405180910390fd5b600160116000828254610dad919061421b565b9250508190555060106000815480929190610dc7906143ef565b9190505550610dd8336010546120dd565b600160136000601054815260200190815260200160002081905550565b80821415610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061406a565b60405180910390fd5b610e4061201c565b73ffffffffffffffffffffffffffffffffffffffff16610e5f836112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90613dea565b60405180910390fd5b610ebd61201c565b73ffffffffffffffffffffffffffffffffffffffff16610edc826112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f29906140ea565b60405180910390fd5b601360008281526020019081526020016000205460136000848152602001908152602001600020541015610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f92906140aa565b60405180910390fd5b610fa4816120fb565b6013600082815260200190815260200160002054601360008481526020019081526020016000206000828254610fda919061421b565b9250508190555060006013600083815260200190815260200160002081905550808261100461201c565b73ffffffffffffffffffffffffffffffffffffffff167f16624d84ec04ca9f43e298b22580617d260f918ff3eede3e717653a3c28f3845601360008781526020019081526020016000205460405161105c919061410a565b60405180910390a45050565b6000600880549050905090565b61108661108061201c565b8261220c565b6110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc9061408a565b60405180910390fd5b6110d08383836122ea565b505050565b60006110e083611388565b8210611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890613daa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61118261201c565b73ffffffffffffffffffffffffffffffffffffffff166111a0611534565b73ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed9061400a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561123c573d6000803e3d6000fd5b50565b61125a83838360405180602001604052806000815250611757565b505050565b6000611269611068565b82106112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906140ca565b60405180910390fd5b600882815481106112be576112bd614525565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090613f6a565b60405180910390fd5b80915050919050565b61251c81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090613f4a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144861201c565b73ffffffffffffffffffffffffffffffffffffffff16611466611534565b73ffffffffffffffffffffffffffffffffffffffff16146114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061400a565b60405180910390fd5b6114c66000612546565b565b6101f481565b6000806000905060006114e084611388565b905060005b818110156115295760006114f986836110d5565b9050600061150682610935565b905084811115611514578094505b50508080611521906143ef565b9150506114e5565b508192505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61156661201c565b73ffffffffffffffffffffffffffffffffffffffff16611584611534565b73ffffffffffffffffffffffffffffffffffffffff16146115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d19061400a565b60405180910390fd5b80600c90805190602001906115f0929190613224565b5050565b6060600180546116039061438c565b80601f016020809104026020016040519081016040528092919081815260200182805461162f9061438c565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b5050505050905090565b61169861169161201c565b838361260c565b5050565b6000601154905090565b6116ae61201c565b73ffffffffffffffffffffffffffffffffffffffff166116cc611534565b73ffffffffffffffffffffffffffffffffffffffff1614611722576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117199061400a565b60405180910390fd5b81600d9080519060200190611738929190613224565b5080600e60006101000a81548160ff0219169083151502179055505050565b61176861176261201c565b8361220c565b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e9061408a565b60405180910390fd5b6117b384848484612779565b50505050565b6117c161201c565b73ffffffffffffffffffffffffffffffffffffffff166117df611534565b73ffffffffffffffffffffffffffffffffffffffff1614611835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182c9061400a565b60405180910390fd5b6101f48151601254611847919061421b565b1115611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90613fea565b60405180910390fd5b80516012600082825461189b919061421b565b9250508190555060005b815181101561191a57601060008154809291906118c1906143ef565b91905055506118ec8282815181106118dc576118db614525565b5b60200260200101516010546120dd565b6001601360006010548152602001908152602001600020819055508080611912906143ef565b9150506118a5565b5050565b67011c37937e08000081565b606060006119366127d5565b9050600e60009054906101000a900460ff16156119ae57600061195884611a22565b9050600082511161197857604051806020016040528060008152506119a5565b8161198285612867565b8260405160200161199593929190613cca565b6040516020818303038152906040525b92505050611a13565b60006119b984610935565b905060008251116119d95760405180602001604052806000815250611a0e565b816119e385612867565b6119ec83612867565b6040516020016119fe93929190613cca565b6040516020818303038152906040525b925050505b919050565b6000600f54905090565b60606000611a2f83610935565b90506103e88110611a78576040518060400160405280600681526020017f6b72616b656e0000000000000000000000000000000000000000000000000000815250915050611b3e565b60648110611abe576040518060400160405280600581526020017f7768616c65000000000000000000000000000000000000000000000000000000815250915050611b3e565b600a8110611b04576040518060400160405280600581526020017f736861726b000000000000000000000000000000000000000000000000000000815250915050611b3e565b6040518060400160405280600481526020017f66697368000000000000000000000000000000000000000000000000000000008152509150505b919050565b6060600c8054611b529061438c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7e9061438c565b8015611bcb5780601f10611ba057610100808354040283529160200191611bcb565b820191906000526020600020905b815481529060010190602001808311611bae57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7161201c565b73ffffffffffffffffffffffffffffffffffffffff16611c8f611534565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc9061400a565b60405180910390fd5b80600f8190555050565b611cf761201c565b73ffffffffffffffffffffffffffffffffffffffff16611d15611534565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061400a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290613e0a565b60405180910390fd5b611de481612546565b50565b611def61201c565b73ffffffffffffffffffffffffffffffffffffffff16611e0d611534565b73ffffffffffffffffffffffffffffffffffffffff1614611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a9061400a565b60405180910390fd5b6000600b8054611e729061438c565b905014611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90613eca565b60405180910390fd5b80600b9080519060200190611eca929190613224565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f9957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fa95750611fa8826129c8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612097836112d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6120f7828260405180602001604052806000815250612a32565b5050565b6000612106826112d0565b905061211481600084612a8d565b61211f600083612024565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461216f91906142a2565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061221782611fb0565b612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d90613eea565b60405180910390fd5b6000612261836112d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122d057508373ffffffffffffffffffffffffffffffffffffffff166122b884610a2c565b73ffffffffffffffffffffffffffffffffffffffff16145b806122e157506122e08185611bd5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661230a826112d0565b73ffffffffffffffffffffffffffffffffffffffff1614612360576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123579061402a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c790613e8a565b60405180910390fd5b6123db838383612a8d565b6123e6600082612024565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243691906142a2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248d919061421b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267290613eaa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161276c9190613d6d565b60405180910390a3505050565b6127848484846122ea565b61279084848484612ba1565b6127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690613dca565b60405180910390fd5b50505050565b6060600d80546127e49061438c565b80601f01602080910402602001604051908101604052809291908181526020018280546128109061438c565b801561285d5780601f106128325761010080835404028352916020019161285d565b820191906000526020600020905b81548152906001019060200180831161284057829003601f168201915b5050505050905090565b606060008214156128af576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129c3565b600082905060005b600082146128e15780806128ca906143ef565b915050600a826128da9190614271565b91506128b7565b60008167ffffffffffffffff8111156128fd576128fc614554565b5b6040519080825280601f01601f19166020018201604052801561292f5781602001600182028036833780820191505090505b5090505b600085146129bc5760018261294891906142a2565b9150600a856129579190614438565b6030612963919061421b565b60f81b81838151811061297957612978614525565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129b59190614271565b9450612933565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a3c8383612d38565b612a496000848484612ba1565b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90613dca565b60405180910390fd5b505050565b612a98838383612f06565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612adb57612ad681612f0b565b612b1a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b1957612b188382612f54565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5d57612b58816130c1565b612b9c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b9b57612b9a8282613192565b5b5b505050565b6000612bc28473ffffffffffffffffffffffffffffffffffffffff16613211565b15612d2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612beb61201c565b8786866040518563ffffffff1660e01b8152600401612c0d9493929190613d21565b602060405180830381600087803b158015612c2757600080fd5b505af1925050508015612c5857506040513d601f19601f82011682018060405250810190612c5591906136e7565b60015b612cdb573d8060008114612c88576040519150601f19603f3d011682016040523d82523d6000602084013e612c8d565b606091505b50600081511415612cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca90613dca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d30565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f90613faa565b60405180910390fd5b612db181611fb0565b15612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de890613e4a565b60405180910390fd5b612dfd60008383612a8d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e4d919061421b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f6184611388565b612f6b91906142a2565b9050600060076000848152602001908152602001600020549050818114613050576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130d591906142a2565b905060006009600084815260200190815260200160002054905060006008838154811061310557613104614525565b5b90600052602060002001549050806008838154811061312757613126614525565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613176576131756144f6565b5b6001900381819060005260206000200160009055905550505050565b600061319d83611388565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546132309061438c565b90600052602060002090601f0160209004810192826132525760008555613299565b82601f1061326b57805160ff1916838001178555613299565b82800160010185558215613299579182015b8281111561329857825182559160200191906001019061327d565b5b5090506132a691906132aa565b5090565b5b808211156132c35760008160009055506001016132ab565b5090565b60006132da6132d58461414a565b614125565b905080838252602082019050828560208602820111156132fd576132fc614588565b5b60005b8581101561332d578161331388826133bb565b845260208401935060208301925050600181019050613300565b5050509392505050565b600061334a61334584614176565b614125565b9050828152602081018484840111156133665761336561458d565b5b61337184828561434a565b509392505050565b600061338c613387846141a7565b614125565b9050828152602081018484840111156133a8576133a761458d565b5b6133b384828561434a565b509392505050565b6000813590506133ca81614c17565b92915050565b600082601f8301126133e5576133e4614583565b5b81356133f58482602086016132c7565b91505092915050565b60008135905061340d81614c2e565b92915050565b60008135905061342281614c45565b92915050565b60008151905061343781614c45565b92915050565b600082601f83011261345257613451614583565b5b8135613462848260208601613337565b91505092915050565b600082601f8301126134805761347f614583565b5b8135613490848260208601613379565b91505092915050565b6000813590506134a881614c5c565b92915050565b6000602082840312156134c4576134c3614597565b5b60006134d2848285016133bb565b91505092915050565b600080604083850312156134f2576134f1614597565b5b6000613500858286016133bb565b9250506020613511858286016133bb565b9150509250929050565b60008060006060848603121561353457613533614597565b5b6000613542868287016133bb565b9350506020613553868287016133bb565b925050604061356486828701613499565b9150509250925092565b6000806000806080858703121561358857613587614597565b5b6000613596878288016133bb565b94505060206135a7878288016133bb565b93505060406135b887828801613499565b925050606085013567ffffffffffffffff8111156135d9576135d8614592565b5b6135e58782880161343d565b91505092959194509250565b6000806040838503121561360857613607614597565b5b6000613616858286016133bb565b9250506020613627858286016133fe565b9150509250929050565b6000806040838503121561364857613647614597565b5b6000613656858286016133bb565b925050602061366785828601613499565b9150509250929050565b60006020828403121561368757613686614597565b5b600082013567ffffffffffffffff8111156136a5576136a4614592565b5b6136b1848285016133d0565b91505092915050565b6000602082840312156136d0576136cf614597565b5b60006136de84828501613413565b91505092915050565b6000602082840312156136fd576136fc614597565b5b600061370b84828501613428565b91505092915050565b60006020828403121561372a57613729614597565b5b600082013567ffffffffffffffff81111561374857613747614592565b5b6137548482850161346b565b91505092915050565b6000806040838503121561377457613773614597565b5b600083013567ffffffffffffffff81111561379257613791614592565b5b61379e8582860161346b565b92505060206137af858286016133fe565b9150509250929050565b6000602082840312156137cf576137ce614597565b5b60006137dd84828501613499565b91505092915050565b600080604083850312156137fd576137fc614597565b5b600061380b85828601613499565b925050602061381c85828601613499565b9150509250929050565b61382f816142d6565b82525050565b61383e816142e8565b82525050565b600061384f826141d8565b61385981856141ee565b9350613869818560208601614359565b6138728161459c565b840191505092915050565b6000613888826141e3565b61389281856141ff565b93506138a2818560208601614359565b6138ab8161459c565b840191505092915050565b60006138c1826141e3565b6138cb8185614210565b93506138db818560208601614359565b80840191505092915050565b60006138f4602b836141ff565b91506138ff826145ad565b604082019050919050565b60006139176032836141ff565b9150613922826145fc565b604082019050919050565b600061393a6011836141ff565b91506139458261464b565b602082019050919050565b600061395d6026836141ff565b915061396882614674565b604082019050919050565b60006139806010836141ff565b915061398b826146c3565b602082019050919050565b60006139a3601c836141ff565b91506139ae826146ec565b602082019050919050565b60006139c6600e836141ff565b91506139d182614715565b602082019050919050565b60006139e96024836141ff565b91506139f48261473e565b604082019050919050565b6000613a0c6019836141ff565b9150613a178261478d565b602082019050919050565b6000613a2f6017836141ff565b9150613a3a826147b6565b602082019050919050565b6000613a52602c836141ff565b9150613a5d826147df565b604082019050919050565b6000613a756011836141ff565b9150613a808261482e565b602082019050919050565b6000613a986038836141ff565b9150613aa382614857565b604082019050919050565b6000613abb602a836141ff565b9150613ac6826148a6565b604082019050919050565b6000613ade6029836141ff565b9150613ae9826148f5565b604082019050919050565b6000613b016015836141ff565b9150613b0c82614944565b602082019050919050565b6000613b246020836141ff565b9150613b2f8261496d565b602082019050919050565b6000613b47602c836141ff565b9150613b5282614996565b604082019050919050565b6000613b6a6013836141ff565b9150613b75826149e5565b602082019050919050565b6000613b8d6020836141ff565b9150613b9882614a0e565b602082019050919050565b6000613bb06029836141ff565b9150613bbb82614a37565b604082019050919050565b6000613bd36021836141ff565b9150613bde82614a86565b604082019050919050565b6000613bf66011836141ff565b9150613c0182614ad5565b602082019050919050565b6000613c196031836141ff565b9150613c2482614afe565b604082019050919050565b6000613c3c601d836141ff565b9150613c4782614b4d565b602082019050919050565b6000613c5f602c836141ff565b9150613c6a82614b76565b604082019050919050565b6000613c82600d836141ff565b9150613c8d82614bc5565b602082019050919050565b6000613ca5600183614210565b9150613cb082614bee565b600182019050919050565b613cc481614340565b82525050565b6000613cd682866138b6565b9150613ce282856138b6565b9150613ced82613c98565b9150613cf982846138b6565b9150819050949350505050565b6000602082019050613d1b6000830184613826565b92915050565b6000608082019050613d366000830187613826565b613d436020830186613826565b613d506040830185613cbb565b8181036060830152613d628184613844565b905095945050505050565b6000602082019050613d826000830184613835565b92915050565b60006020820190508181036000830152613da2818461387d565b905092915050565b60006020820190508181036000830152613dc3816138e7565b9050919050565b60006020820190508181036000830152613de38161390a565b9050919050565b60006020820190508181036000830152613e038161392d565b9050919050565b60006020820190508181036000830152613e2381613950565b9050919050565b60006020820190508181036000830152613e4381613973565b9050919050565b60006020820190508181036000830152613e6381613996565b9050919050565b60006020820190508181036000830152613e83816139b9565b9050919050565b60006020820190508181036000830152613ea3816139dc565b9050919050565b60006020820190508181036000830152613ec3816139ff565b9050919050565b60006020820190508181036000830152613ee381613a22565b9050919050565b60006020820190508181036000830152613f0381613a45565b9050919050565b60006020820190508181036000830152613f2381613a68565b9050919050565b60006020820190508181036000830152613f4381613a8b565b9050919050565b60006020820190508181036000830152613f6381613aae565b9050919050565b60006020820190508181036000830152613f8381613ad1565b9050919050565b60006020820190508181036000830152613fa381613af4565b9050919050565b60006020820190508181036000830152613fc381613b17565b9050919050565b60006020820190508181036000830152613fe381613b3a565b9050919050565b6000602082019050818103600083015261400381613b5d565b9050919050565b6000602082019050818103600083015261402381613b80565b9050919050565b6000602082019050818103600083015261404381613ba3565b9050919050565b6000602082019050818103600083015261406381613bc6565b9050919050565b6000602082019050818103600083015261408381613be9565b9050919050565b600060208201905081810360008301526140a381613c0c565b9050919050565b600060208201905081810360008301526140c381613c2f565b9050919050565b600060208201905081810360008301526140e381613c52565b9050919050565b6000602082019050818103600083015261410381613c75565b9050919050565b600060208201905061411f6000830184613cbb565b92915050565b600061412f614140565b905061413b82826143be565b919050565b6000604051905090565b600067ffffffffffffffff82111561416557614164614554565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561419157614190614554565b5b61419a8261459c565b9050602081019050919050565b600067ffffffffffffffff8211156141c2576141c1614554565b5b6141cb8261459c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061422682614340565b915061423183614340565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561426657614265614469565b5b828201905092915050565b600061427c82614340565b915061428783614340565b92508261429757614296614498565b5b828204905092915050565b60006142ad82614340565b91506142b883614340565b9250828210156142cb576142ca614469565b5b828203905092915050565b60006142e182614320565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561437757808201518184015260208101905061435c565b83811115614386576000848401525b50505050565b600060028204905060018216806143a457607f821691505b602082108114156143b8576143b76144c7565b5b50919050565b6143c78261459c565b810181811067ffffffffffffffff821117156143e6576143e5614554565b5b80604052505050565b60006143fa82614340565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561442d5761442c614469565b5b600182019050919050565b600061444382614340565b915061444e83614340565b92508261445e5761445d614498565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d5553545f4f574e5f5052454441544f52000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f4e4f545f5354415254454400000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e4f545f4d494e545f5052494345000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726f76656e616e636520616c72656164792073657421000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e4f4e4558495354454e545f544f4b454e000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f434f4e5452414354535f43414e4e4f545f4d494e540000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f574f554c445f4558434545445f535550504c5900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d5553545f42455f444946464552454e54000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f505245595f4d4f52455f4c4556454c5f5448414e5f5052454441544f52000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d5553545f4f574e5f5052455900000000000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614c20816142d6565b8114614c2b57600080fd5b50565b614c37816142e8565b8114614c4257600080fd5b50565b614c4e816142f4565b8114614c5957600080fd5b50565b614c6581614340565b8114614c7057600080fd5b5056fea26469706673582212203429ff6bd8b6791fea1f57294eee168213982b70d14f3ee7e3e0b7470275c14c64736f6c63430008060033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80638249fdf211610123578063bcb05948116100ab578063e8a3d4851161006f578063e8a3d485146107d8578063e985e9c514610803578063ec17b20e14610840578063f2fde38b14610869578063ffe630b5146108925761021a565b8063bcb05948146106df578063c002d23d14610708578063c87b56dd14610733578063d91c98d314610770578063e6c3b1f61461079b5761021a565b806395d89b41116100f257806395d89b411461060e578063a22cb46514610639578063a4f4f8af14610662578063b64b21ca1461068d578063b88d4fde146106b65761021a565b80638249fdf214610552578063892f1d131461057d5780638da5cb5b146105ba578063938e3d7b146105e55761021a565b806323b872dd116101a65780634f6ccce7116101755780634f6ccce7146104595780636352211e1461049657806363610e7a146104d357806370a08231146104fe578063715018a61461053b5761021a565b806323b872dd146103b35780632f745c59146103dc5780633ccfd60b1461041957806342842e0e146104305761021a565b8063095ea7b3116101ed578063095ea7b3146103015780630f7309e81461032a5780631249c58b14610355578063165e0dc61461035f57806318160ddd146103885761021a565b806301ffc9a71461021f57806305c58df21461025c57806306fdde0314610299578063081812fc146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906136ba565b6108bb565b6040516102539190613d6d565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906137b9565b610935565b604051610290919061410a565b60405180910390f35b3480156102a557600080fd5b506102ae61099a565b6040516102bb9190613d88565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906137b9565b610a2c565b6040516102f89190613d06565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613631565b610ab1565b005b34801561033657600080fd5b5061033f610bc9565b60405161034c9190613d88565b60405180910390f35b61035d610c57565b005b34801561036b57600080fd5b50610386600480360381019061038191906137e6565b610df5565b005b34801561039457600080fd5b5061039d611068565b6040516103aa919061410a565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d5919061351b565b611075565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613631565b6110d5565b604051610410919061410a565b60405180910390f35b34801561042557600080fd5b5061042e61117a565b005b34801561043c57600080fd5b506104576004803603810190610452919061351b565b61123f565b005b34801561046557600080fd5b50610480600480360381019061047b91906137b9565b61125f565b60405161048d919061410a565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906137b9565b6112d0565b6040516104ca9190613d06565b60405180910390f35b3480156104df57600080fd5b506104e8611382565b6040516104f5919061410a565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906134ae565b611388565b604051610532919061410a565b60405180910390f35b34801561054757600080fd5b50610550611440565b005b34801561055e57600080fd5b506105676114c8565b604051610574919061410a565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906134ae565b6114ce565b6040516105b1919061410a565b60405180910390f35b3480156105c657600080fd5b506105cf611534565b6040516105dc9190613d06565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190613714565b61155e565b005b34801561061a57600080fd5b506106236115f4565b6040516106309190613d88565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906135f1565b611686565b005b34801561066e57600080fd5b5061067761169c565b604051610684919061410a565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af919061375d565b6116a6565b005b3480156106c257600080fd5b506106dd60048036038101906106d8919061356e565b611757565b005b3480156106eb57600080fd5b5061070660048036038101906107019190613671565b6117b9565b005b34801561071457600080fd5b5061071d61191e565b60405161072a919061410a565b60405180910390f35b34801561073f57600080fd5b5061075a600480360381019061075591906137b9565b61192a565b6040516107679190613d88565b60405180910390f35b34801561077c57600080fd5b50610785611a18565b604051610792919061410a565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd91906137b9565b611a22565b6040516107cf9190613d88565b60405180910390f35b3480156107e457600080fd5b506107ed611b43565b6040516107fa9190613d88565b60405180910390f35b34801561080f57600080fd5b5061082a600480360381019061082591906134db565b611bd5565b6040516108379190613d6d565b60405180910390f35b34801561084c57600080fd5b50610867600480360381019061086291906137b9565b611c69565b005b34801561087557600080fd5b50610890600480360381019061088b91906134ae565b611cef565b005b34801561089e57600080fd5b506108b960048036038101906108b49190613714565b611de7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092e575061092d82611ece565b5b9050919050565b600061094082611fb0565b61097f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097690613f0a565b60405180910390fd5b60136000838152602001908152602001600020549050919050565b6060600080546109a99061438c565b80601f01602080910402602001604051908101604052809291908181526020018280546109d59061438c565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b6000610a3782611fb0565b610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90613fca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abc826112d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b249061404a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4c61201c565b73ffffffffffffffffffffffffffffffffffffffff161480610b7b5750610b7a81610b7561201c565b611bd5565b5b610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190613f2a565b60405180910390fd5b610bc48383612024565b505050565b600b8054610bd69061438c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c029061438c565b8015610c4f5780601f10610c2457610100808354040283529160200191610c4f565b820191906000526020600020905b815481529060010190602001808311610c3257829003601f168201915b505050505081565b600f54431015610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390613e2a565b60405180910390fd5b61251c60115410610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613fea565b60405180910390fd5b67011c37937e0800003414610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2390613e6a565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190613f8a565b60405180910390fd5b600160116000828254610dad919061421b565b9250508190555060106000815480929190610dc7906143ef565b9190505550610dd8336010546120dd565b600160136000601054815260200190815260200160002081905550565b80821415610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061406a565b60405180910390fd5b610e4061201c565b73ffffffffffffffffffffffffffffffffffffffff16610e5f836112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90613dea565b60405180910390fd5b610ebd61201c565b73ffffffffffffffffffffffffffffffffffffffff16610edc826112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f29906140ea565b60405180910390fd5b601360008281526020019081526020016000205460136000848152602001908152602001600020541015610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f92906140aa565b60405180910390fd5b610fa4816120fb565b6013600082815260200190815260200160002054601360008481526020019081526020016000206000828254610fda919061421b565b9250508190555060006013600083815260200190815260200160002081905550808261100461201c565b73ffffffffffffffffffffffffffffffffffffffff167f16624d84ec04ca9f43e298b22580617d260f918ff3eede3e717653a3c28f3845601360008781526020019081526020016000205460405161105c919061410a565b60405180910390a45050565b6000600880549050905090565b61108661108061201c565b8261220c565b6110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc9061408a565b60405180910390fd5b6110d08383836122ea565b505050565b60006110e083611388565b8210611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890613daa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61118261201c565b73ffffffffffffffffffffffffffffffffffffffff166111a0611534565b73ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed9061400a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561123c573d6000803e3d6000fd5b50565b61125a83838360405180602001604052806000815250611757565b505050565b6000611269611068565b82106112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906140ca565b60405180910390fd5b600882815481106112be576112bd614525565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090613f6a565b60405180910390fd5b80915050919050565b61251c81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090613f4a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144861201c565b73ffffffffffffffffffffffffffffffffffffffff16611466611534565b73ffffffffffffffffffffffffffffffffffffffff16146114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061400a565b60405180910390fd5b6114c66000612546565b565b6101f481565b6000806000905060006114e084611388565b905060005b818110156115295760006114f986836110d5565b9050600061150682610935565b905084811115611514578094505b50508080611521906143ef565b9150506114e5565b508192505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61156661201c565b73ffffffffffffffffffffffffffffffffffffffff16611584611534565b73ffffffffffffffffffffffffffffffffffffffff16146115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d19061400a565b60405180910390fd5b80600c90805190602001906115f0929190613224565b5050565b6060600180546116039061438c565b80601f016020809104026020016040519081016040528092919081815260200182805461162f9061438c565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b5050505050905090565b61169861169161201c565b838361260c565b5050565b6000601154905090565b6116ae61201c565b73ffffffffffffffffffffffffffffffffffffffff166116cc611534565b73ffffffffffffffffffffffffffffffffffffffff1614611722576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117199061400a565b60405180910390fd5b81600d9080519060200190611738929190613224565b5080600e60006101000a81548160ff0219169083151502179055505050565b61176861176261201c565b8361220c565b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e9061408a565b60405180910390fd5b6117b384848484612779565b50505050565b6117c161201c565b73ffffffffffffffffffffffffffffffffffffffff166117df611534565b73ffffffffffffffffffffffffffffffffffffffff1614611835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182c9061400a565b60405180910390fd5b6101f48151601254611847919061421b565b1115611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90613fea565b60405180910390fd5b80516012600082825461189b919061421b565b9250508190555060005b815181101561191a57601060008154809291906118c1906143ef565b91905055506118ec8282815181106118dc576118db614525565b5b60200260200101516010546120dd565b6001601360006010548152602001908152602001600020819055508080611912906143ef565b9150506118a5565b5050565b67011c37937e08000081565b606060006119366127d5565b9050600e60009054906101000a900460ff16156119ae57600061195884611a22565b9050600082511161197857604051806020016040528060008152506119a5565b8161198285612867565b8260405160200161199593929190613cca565b6040516020818303038152906040525b92505050611a13565b60006119b984610935565b905060008251116119d95760405180602001604052806000815250611a0e565b816119e385612867565b6119ec83612867565b6040516020016119fe93929190613cca565b6040516020818303038152906040525b925050505b919050565b6000600f54905090565b60606000611a2f83610935565b90506103e88110611a78576040518060400160405280600681526020017f6b72616b656e0000000000000000000000000000000000000000000000000000815250915050611b3e565b60648110611abe576040518060400160405280600581526020017f7768616c65000000000000000000000000000000000000000000000000000000815250915050611b3e565b600a8110611b04576040518060400160405280600581526020017f736861726b000000000000000000000000000000000000000000000000000000815250915050611b3e565b6040518060400160405280600481526020017f66697368000000000000000000000000000000000000000000000000000000008152509150505b919050565b6060600c8054611b529061438c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7e9061438c565b8015611bcb5780601f10611ba057610100808354040283529160200191611bcb565b820191906000526020600020905b815481529060010190602001808311611bae57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7161201c565b73ffffffffffffffffffffffffffffffffffffffff16611c8f611534565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc9061400a565b60405180910390fd5b80600f8190555050565b611cf761201c565b73ffffffffffffffffffffffffffffffffffffffff16611d15611534565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061400a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290613e0a565b60405180910390fd5b611de481612546565b50565b611def61201c565b73ffffffffffffffffffffffffffffffffffffffff16611e0d611534565b73ffffffffffffffffffffffffffffffffffffffff1614611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a9061400a565b60405180910390fd5b6000600b8054611e729061438c565b905014611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90613eca565b60405180910390fd5b80600b9080519060200190611eca929190613224565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f9957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fa95750611fa8826129c8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612097836112d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6120f7828260405180602001604052806000815250612a32565b5050565b6000612106826112d0565b905061211481600084612a8d565b61211f600083612024565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461216f91906142a2565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061221782611fb0565b612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d90613eea565b60405180910390fd5b6000612261836112d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122d057508373ffffffffffffffffffffffffffffffffffffffff166122b884610a2c565b73ffffffffffffffffffffffffffffffffffffffff16145b806122e157506122e08185611bd5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661230a826112d0565b73ffffffffffffffffffffffffffffffffffffffff1614612360576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123579061402a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c790613e8a565b60405180910390fd5b6123db838383612a8d565b6123e6600082612024565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243691906142a2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248d919061421b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267290613eaa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161276c9190613d6d565b60405180910390a3505050565b6127848484846122ea565b61279084848484612ba1565b6127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690613dca565b60405180910390fd5b50505050565b6060600d80546127e49061438c565b80601f01602080910402602001604051908101604052809291908181526020018280546128109061438c565b801561285d5780601f106128325761010080835404028352916020019161285d565b820191906000526020600020905b81548152906001019060200180831161284057829003601f168201915b5050505050905090565b606060008214156128af576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129c3565b600082905060005b600082146128e15780806128ca906143ef565b915050600a826128da9190614271565b91506128b7565b60008167ffffffffffffffff8111156128fd576128fc614554565b5b6040519080825280601f01601f19166020018201604052801561292f5781602001600182028036833780820191505090505b5090505b600085146129bc5760018261294891906142a2565b9150600a856129579190614438565b6030612963919061421b565b60f81b81838151811061297957612978614525565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129b59190614271565b9450612933565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a3c8383612d38565b612a496000848484612ba1565b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90613dca565b60405180910390fd5b505050565b612a98838383612f06565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612adb57612ad681612f0b565b612b1a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b1957612b188382612f54565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5d57612b58816130c1565b612b9c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b9b57612b9a8282613192565b5b5b505050565b6000612bc28473ffffffffffffffffffffffffffffffffffffffff16613211565b15612d2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612beb61201c565b8786866040518563ffffffff1660e01b8152600401612c0d9493929190613d21565b602060405180830381600087803b158015612c2757600080fd5b505af1925050508015612c5857506040513d601f19601f82011682018060405250810190612c5591906136e7565b60015b612cdb573d8060008114612c88576040519150601f19603f3d011682016040523d82523d6000602084013e612c8d565b606091505b50600081511415612cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca90613dca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d30565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f90613faa565b60405180910390fd5b612db181611fb0565b15612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de890613e4a565b60405180910390fd5b612dfd60008383612a8d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e4d919061421b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f6184611388565b612f6b91906142a2565b9050600060076000848152602001908152602001600020549050818114613050576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130d591906142a2565b905060006009600084815260200190815260200160002054905060006008838154811061310557613104614525565b5b90600052602060002001549050806008838154811061312757613126614525565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613176576131756144f6565b5b6001900381819060005260206000200160009055905550505050565b600061319d83611388565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546132309061438c565b90600052602060002090601f0160209004810192826132525760008555613299565b82601f1061326b57805160ff1916838001178555613299565b82800160010185558215613299579182015b8281111561329857825182559160200191906001019061327d565b5b5090506132a691906132aa565b5090565b5b808211156132c35760008160009055506001016132ab565b5090565b60006132da6132d58461414a565b614125565b905080838252602082019050828560208602820111156132fd576132fc614588565b5b60005b8581101561332d578161331388826133bb565b845260208401935060208301925050600181019050613300565b5050509392505050565b600061334a61334584614176565b614125565b9050828152602081018484840111156133665761336561458d565b5b61337184828561434a565b509392505050565b600061338c613387846141a7565b614125565b9050828152602081018484840111156133a8576133a761458d565b5b6133b384828561434a565b509392505050565b6000813590506133ca81614c17565b92915050565b600082601f8301126133e5576133e4614583565b5b81356133f58482602086016132c7565b91505092915050565b60008135905061340d81614c2e565b92915050565b60008135905061342281614c45565b92915050565b60008151905061343781614c45565b92915050565b600082601f83011261345257613451614583565b5b8135613462848260208601613337565b91505092915050565b600082601f8301126134805761347f614583565b5b8135613490848260208601613379565b91505092915050565b6000813590506134a881614c5c565b92915050565b6000602082840312156134c4576134c3614597565b5b60006134d2848285016133bb565b91505092915050565b600080604083850312156134f2576134f1614597565b5b6000613500858286016133bb565b9250506020613511858286016133bb565b9150509250929050565b60008060006060848603121561353457613533614597565b5b6000613542868287016133bb565b9350506020613553868287016133bb565b925050604061356486828701613499565b9150509250925092565b6000806000806080858703121561358857613587614597565b5b6000613596878288016133bb565b94505060206135a7878288016133bb565b93505060406135b887828801613499565b925050606085013567ffffffffffffffff8111156135d9576135d8614592565b5b6135e58782880161343d565b91505092959194509250565b6000806040838503121561360857613607614597565b5b6000613616858286016133bb565b9250506020613627858286016133fe565b9150509250929050565b6000806040838503121561364857613647614597565b5b6000613656858286016133bb565b925050602061366785828601613499565b9150509250929050565b60006020828403121561368757613686614597565b5b600082013567ffffffffffffffff8111156136a5576136a4614592565b5b6136b1848285016133d0565b91505092915050565b6000602082840312156136d0576136cf614597565b5b60006136de84828501613413565b91505092915050565b6000602082840312156136fd576136fc614597565b5b600061370b84828501613428565b91505092915050565b60006020828403121561372a57613729614597565b5b600082013567ffffffffffffffff81111561374857613747614592565b5b6137548482850161346b565b91505092915050565b6000806040838503121561377457613773614597565b5b600083013567ffffffffffffffff81111561379257613791614592565b5b61379e8582860161346b565b92505060206137af858286016133fe565b9150509250929050565b6000602082840312156137cf576137ce614597565b5b60006137dd84828501613499565b91505092915050565b600080604083850312156137fd576137fc614597565b5b600061380b85828601613499565b925050602061381c85828601613499565b9150509250929050565b61382f816142d6565b82525050565b61383e816142e8565b82525050565b600061384f826141d8565b61385981856141ee565b9350613869818560208601614359565b6138728161459c565b840191505092915050565b6000613888826141e3565b61389281856141ff565b93506138a2818560208601614359565b6138ab8161459c565b840191505092915050565b60006138c1826141e3565b6138cb8185614210565b93506138db818560208601614359565b80840191505092915050565b60006138f4602b836141ff565b91506138ff826145ad565b604082019050919050565b60006139176032836141ff565b9150613922826145fc565b604082019050919050565b600061393a6011836141ff565b91506139458261464b565b602082019050919050565b600061395d6026836141ff565b915061396882614674565b604082019050919050565b60006139806010836141ff565b915061398b826146c3565b602082019050919050565b60006139a3601c836141ff565b91506139ae826146ec565b602082019050919050565b60006139c6600e836141ff565b91506139d182614715565b602082019050919050565b60006139e96024836141ff565b91506139f48261473e565b604082019050919050565b6000613a0c6019836141ff565b9150613a178261478d565b602082019050919050565b6000613a2f6017836141ff565b9150613a3a826147b6565b602082019050919050565b6000613a52602c836141ff565b9150613a5d826147df565b604082019050919050565b6000613a756011836141ff565b9150613a808261482e565b602082019050919050565b6000613a986038836141ff565b9150613aa382614857565b604082019050919050565b6000613abb602a836141ff565b9150613ac6826148a6565b604082019050919050565b6000613ade6029836141ff565b9150613ae9826148f5565b604082019050919050565b6000613b016015836141ff565b9150613b0c82614944565b602082019050919050565b6000613b246020836141ff565b9150613b2f8261496d565b602082019050919050565b6000613b47602c836141ff565b9150613b5282614996565b604082019050919050565b6000613b6a6013836141ff565b9150613b75826149e5565b602082019050919050565b6000613b8d6020836141ff565b9150613b9882614a0e565b602082019050919050565b6000613bb06029836141ff565b9150613bbb82614a37565b604082019050919050565b6000613bd36021836141ff565b9150613bde82614a86565b604082019050919050565b6000613bf66011836141ff565b9150613c0182614ad5565b602082019050919050565b6000613c196031836141ff565b9150613c2482614afe565b604082019050919050565b6000613c3c601d836141ff565b9150613c4782614b4d565b602082019050919050565b6000613c5f602c836141ff565b9150613c6a82614b76565b604082019050919050565b6000613c82600d836141ff565b9150613c8d82614bc5565b602082019050919050565b6000613ca5600183614210565b9150613cb082614bee565b600182019050919050565b613cc481614340565b82525050565b6000613cd682866138b6565b9150613ce282856138b6565b9150613ced82613c98565b9150613cf982846138b6565b9150819050949350505050565b6000602082019050613d1b6000830184613826565b92915050565b6000608082019050613d366000830187613826565b613d436020830186613826565b613d506040830185613cbb565b8181036060830152613d628184613844565b905095945050505050565b6000602082019050613d826000830184613835565b92915050565b60006020820190508181036000830152613da2818461387d565b905092915050565b60006020820190508181036000830152613dc3816138e7565b9050919050565b60006020820190508181036000830152613de38161390a565b9050919050565b60006020820190508181036000830152613e038161392d565b9050919050565b60006020820190508181036000830152613e2381613950565b9050919050565b60006020820190508181036000830152613e4381613973565b9050919050565b60006020820190508181036000830152613e6381613996565b9050919050565b60006020820190508181036000830152613e83816139b9565b9050919050565b60006020820190508181036000830152613ea3816139dc565b9050919050565b60006020820190508181036000830152613ec3816139ff565b9050919050565b60006020820190508181036000830152613ee381613a22565b9050919050565b60006020820190508181036000830152613f0381613a45565b9050919050565b60006020820190508181036000830152613f2381613a68565b9050919050565b60006020820190508181036000830152613f4381613a8b565b9050919050565b60006020820190508181036000830152613f6381613aae565b9050919050565b60006020820190508181036000830152613f8381613ad1565b9050919050565b60006020820190508181036000830152613fa381613af4565b9050919050565b60006020820190508181036000830152613fc381613b17565b9050919050565b60006020820190508181036000830152613fe381613b3a565b9050919050565b6000602082019050818103600083015261400381613b5d565b9050919050565b6000602082019050818103600083015261402381613b80565b9050919050565b6000602082019050818103600083015261404381613ba3565b9050919050565b6000602082019050818103600083015261406381613bc6565b9050919050565b6000602082019050818103600083015261408381613be9565b9050919050565b600060208201905081810360008301526140a381613c0c565b9050919050565b600060208201905081810360008301526140c381613c2f565b9050919050565b600060208201905081810360008301526140e381613c52565b9050919050565b6000602082019050818103600083015261410381613c75565b9050919050565b600060208201905061411f6000830184613cbb565b92915050565b600061412f614140565b905061413b82826143be565b919050565b6000604051905090565b600067ffffffffffffffff82111561416557614164614554565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561419157614190614554565b5b61419a8261459c565b9050602081019050919050565b600067ffffffffffffffff8211156141c2576141c1614554565b5b6141cb8261459c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061422682614340565b915061423183614340565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561426657614265614469565b5b828201905092915050565b600061427c82614340565b915061428783614340565b92508261429757614296614498565b5b828204905092915050565b60006142ad82614340565b91506142b883614340565b9250828210156142cb576142ca614469565b5b828203905092915050565b60006142e182614320565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561437757808201518184015260208101905061435c565b83811115614386576000848401525b50505050565b600060028204905060018216806143a457607f821691505b602082108114156143b8576143b76144c7565b5b50919050565b6143c78261459c565b810181811067ffffffffffffffff821117156143e6576143e5614554565b5b80604052505050565b60006143fa82614340565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561442d5761442c614469565b5b600182019050919050565b600061444382614340565b915061444e83614340565b92508261445e5761445d614498565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d5553545f4f574e5f5052454441544f52000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f4e4f545f5354415254454400000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e4f545f4d494e545f5052494345000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726f76656e616e636520616c72656164792073657421000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e4f4e4558495354454e545f544f4b454e000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f434f4e5452414354535f43414e4e4f545f4d494e540000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f574f554c445f4558434545445f535550504c5900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d5553545f42455f444946464552454e54000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f505245595f4d4f52455f4c4556454c5f5448414e5f5052454441544f52000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d5553545f4f574e5f5052455900000000000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614c20816142d6565b8114614c2b57600080fd5b50565b614c37816142e8565b8114614c4257600080fd5b50565b614c4e816142f4565b8114614c5957600080fd5b50565b614c6581614340565b8114614c7057600080fd5b5056fea26469706673582212203429ff6bd8b6791fea1f57294eee168213982b70d14f3ee7e3e0b7470275c14c64736f6c63430008060033

Deployed Bytecode Sourcemap

43780:5680:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34734:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46217:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21549:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23108:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22631:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44116:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44666:454;;;:::i;:::-;;45655:520;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35374:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23858:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35042:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47635:109;;;;;;;;;;;;;:::i;:::-;;24268:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35564:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21243:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43868:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20973:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42452:103;;;;;;;;;;;;;:::i;:::-;;43917:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48770:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41801:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47920:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21718:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23401:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48638:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48155:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24524:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45202:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43966:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46885:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48501:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46476:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47784:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23627:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47462:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42710:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49269:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34734:224;34836:4;34875:35;34860:50;;;:11;:50;;;;:90;;;;34914:36;34938:11;34914:23;:36::i;:::-;34860:90;34853:97;;34734:224;;;:::o;46217:163::-;46271:7;46299:17;46307:8;46299:7;:17::i;:::-;46291:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;46356:6;:16;46363:8;46356:16;;;;;;;;;;;;46349:23;;46217:163;;;:::o;21549:100::-;21603:13;21636:5;21629:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21549:100;:::o;23108:221::-;23184:7;23212:16;23220:7;23212;:16::i;:::-;23204:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23297:15;:24;23313:7;23297:24;;;;;;;;;;;;;;;;;;;;;23290:31;;23108:221;;;:::o;22631:411::-;22712:13;22728:23;22743:7;22728:14;:23::i;:::-;22712:39;;22776:5;22770:11;;:2;:11;;;;22762:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22870:5;22854:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22879:37;22896:5;22903:12;:10;:12::i;:::-;22879:16;:37::i;:::-;22854:62;22832:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23013:21;23022:2;23026:7;23013:8;:21::i;:::-;22701:341;22631:411;;:::o;44116:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44666:454::-;44734:14;;44718:12;:30;;44710:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43906:4;44788:13;;:27;44780:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;44003:10;44858:9;:23;44850:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;44933:9;44919:23;;:10;:23;;;44911:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44996:1;44979:13;;:18;;;;;;;:::i;:::-;;;;;;;;45008:15;;:17;;;;;;;;;:::i;:::-;;;;;;45036:38;45046:10;45058:15;;45036:9;:38::i;:::-;45111:1;45085:6;:23;45092:15;;45085:23;;;;;;;;;;;:27;;;;44666:454::o;45655:520::-;45744:5;45731:9;:18;;45723:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;45812:12;:10;:12::i;:::-;45790:34;;:18;45798:9;45790:7;:18::i;:::-;:34;;;45782:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45883:12;:10;:12::i;:::-;45865:30;;:14;45873:5;45865:7;:14::i;:::-;:30;;;45857:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45953:6;:13;45960:5;45953:13;;;;;;;;;;;;45932:6;:17;45939:9;45932:17;;;;;;;;;;;;:34;;45924:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46011:12;46017:5;46011;:12::i;:::-;46055:6;:13;46062:5;46055:13;;;;;;;;;;;;46034:6;:17;46041:9;46034:17;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;46095:1;46079:6;:13;46086:5;46079:13;;;;;;;;;;;:17;;;;46142:5;46131:9;46117:12;:10;:12::i;:::-;46112:55;;;46149:6;:17;46156:9;46149:17;;;;;;;;;;;;46112:55;;;;;;:::i;:::-;;;;;;;;45655:520;;:::o;35374:113::-;35435:7;35462:10;:17;;;;35455:24;;35374:113;:::o;23858:339::-;24053:41;24072:12;:10;:12::i;:::-;24086:7;24053:18;:41::i;:::-;24045:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24161:28;24171:4;24177:2;24181:7;24161:9;:28::i;:::-;23858:339;;;:::o;35042:256::-;35139:7;35175:23;35192:5;35175:16;:23::i;:::-;35167:5;:31;35159:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35264:12;:19;35277:5;35264:19;;;;;;;;;;;;;;;:26;35284:5;35264:26;;;;;;;;;;;;35257:33;;35042:256;;;;:::o;47635:109::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47693:10:::1;47685:28;;:51;47714:21;47685:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47635:109::o:0;24268:185::-;24406:39;24423:4;24429:2;24433:7;24406:39;;;;;;;;;;;;:16;:39::i;:::-;24268:185;;;:::o;35564:233::-;35639:7;35675:30;:28;:30::i;:::-;35667:5;:38;35659:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35772:10;35783:5;35772:17;;;;;;;;:::i;:::-;;;;;;;;;;35765:24;;35564:233;;;:::o;21243:239::-;21315:7;21335:13;21351:7;:16;21359:7;21351:16;;;;;;;;;;;;;;;;;;;;;21335:32;;21403:1;21386:19;;:5;:19;;;;21378:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21469:5;21462:12;;;21243:239;;;:::o;43868:42::-;43906:4;43868:42;:::o;20973:208::-;21045:7;21090:1;21073:19;;:5;:19;;;;21065:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21157:9;:16;21167:5;21157:16;;;;;;;;;;;;;;;;21150:23;;20973:208;;;:::o;42452:103::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42517:30:::1;42544:1;42517:18;:30::i;:::-;42452:103::o:0;43917:42::-;43956:3;43917:42;:::o;48770:472::-;48834:7;48854:17;48874:1;48854:21;;48886:25;48914:19;48924:8;48914:9;:19::i;:::-;48886:47;;48949:9;48944:264;48968:17;48964:1;:21;48944:264;;;49007:16;49026:32;49046:8;49056:1;49026:19;:32::i;:::-;49007:51;;49073:14;49090:15;49096:8;49090:5;:15::i;:::-;49073:32;;49133:9;49124:6;:18;49120:77;;;49175:6;49163:18;;49120:77;48992:216;;48987:3;;;;;:::i;:::-;;;;48944:264;;;;49225:9;49218:16;;;;48770:472;;;:::o;41801:87::-;41847:7;41874:6;;;;;;;;;;;41867:13;;41801:87;:::o;47920:117::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48017:12:::1;48002;:27;;;;;;;;;;;;:::i;:::-;;47920:117:::0;:::o;21718:104::-;21774:13;21807:7;21800:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21718:104;:::o;23401:155::-;23496:52;23515:12;:10;:12::i;:::-;23529:8;23539;23496:18;:52::i;:::-;23401:155;;:::o;48638:93::-;48683:7;48710:13;;48703:20;;48638:93;:::o;48155:142::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48257:8:::1;48241:13;:24;;;;;;;;;;;;:::i;:::-;;48284:5;48276;;:13;;;;;;;;;;;;;;;;;;48155:142:::0;;:::o;24524:328::-;24699:41;24718:12;:10;:12::i;:::-;24732:7;24699:18;:41::i;:::-;24691:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24805:39;24819:4;24825:2;24829:7;24838:5;24805:13;:39::i;:::-;24524:328;;;;:::o;45202:381::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43956:3:::1;45300;:10;45283:14;;:27;;;;:::i;:::-;:43;;45275:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45379:3;:10;45361:14;;:28;;;;;;;:::i;:::-;;;;;;;;45405:9;45400:176;45424:3;:10;45420:1;:14;45400:176;;;45456:15;;:17;;;;;;;;;:::i;:::-;;;;;;45488:34;45498:3;45502:1;45498:6;;;;;;;;:::i;:::-;;;;;;;;45506:15;;45488:9;:34::i;:::-;45563:1;45537:6;:23;45544:15;;45537:23;;;;;;;;;;;:27;;;;45436:3;;;;;:::i;:::-;;;;45400:176;;;;45202:381:::0;:::o;43966:47::-;44003:10;43966:47;:::o;46885:529::-;46966:13;46992:21;47016:10;:8;:10::i;:::-;46992:34;;47043:5;;;;;;;;;;;47039:198;;;47065:19;47087:18;47097:7;47087:9;:18::i;:::-;47065:40;;47151:1;47133:7;47127:21;:25;:98;;;;;;;;;;;;;;;;;47179:7;47188:18;:7;:16;:18::i;:::-;47213:5;47162:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47127:98;47120:105;;;;;;47039:198;47247:14;47264;47270:7;47264:5;:14::i;:::-;47247:31;;47320:1;47302:7;47296:21;:25;:110;;;;;;;;;;;;;;;;;47348:7;47357:18;:7;:16;:18::i;:::-;47382:17;:6;:15;:17::i;:::-;47331:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47296:110;47289:117;;;;46885:529;;;;:::o;48501:95::-;48547:7;48574:14;;48567:21;;48501:95;:::o;46476:359::-;46534:13;46560:14;46577:15;46583:8;46577:5;:15::i;:::-;46560:32;;46617:4;46607:6;:14;46603:62;;46638:15;;;;;;;;;;;;;;;;;;;;;;46603:62;46689:3;46679:6;:13;46675:60;;46709:14;;;;;;;;;;;;;;;;;;;;;;46675:60;46759:2;46749:6;:12;46745:59;;46778:14;;;;;;;;;;;;;;;;;;;;;;46745:59;46814:13;;;;;;;;;;;;;;;;;;;;46476:359;;;;:::o;47784:97::-;47828:13;47861:12;47854:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47784:97;:::o;23627:164::-;23724:4;23748:18;:25;23767:5;23748:25;;;;;;;;;;;;;;;:35;23774:8;23748:35;;;;;;;;;;;;;;;;;;;;;;;;;23741:42;;23627:164;;;;:::o;47462:119::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47559:14:::1;47542;:31;;;;47462:119:::0;:::o;42710:201::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42819:1:::1;42799:22;;:8;:22;;;;42791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42875:28;42894:8;42875:18;:28::i;:::-;42710:201:::0;:::o;49269:188::-;42032:12;:10;:12::i;:::-;42021:23;;:7;:5;:7::i;:::-;:23;;;42013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49385:1:::1;49363:10;49357:24;;;;;:::i;:::-;;;:29;49349:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49438:11;49425:10;:24;;;;;;;;;;;;:::i;:::-;;49269:188:::0;:::o;20604:305::-;20706:4;20758:25;20743:40;;;:11;:40;;;;:105;;;;20815:33;20800:48;;;:11;:48;;;;20743:105;:158;;;;20865:36;20889:11;20865:23;:36::i;:::-;20743:158;20723:178;;20604:305;;;:::o;26362:127::-;26427:4;26479:1;26451:30;;:7;:16;26459:7;26451:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26444:37;;26362:127;;;:::o;16316:98::-;16369:7;16396:10;16389:17;;16316:98;:::o;30344:174::-;30446:2;30419:15;:24;30435:7;30419:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30502:7;30498:2;30464:46;;30473:23;30488:7;30473:14;:23::i;:::-;30464:46;;;;;;;;;;;;30344:174;;:::o;27346:110::-;27422:26;27432:2;27436:7;27422:26;;;;;;;;;;;;:9;:26::i;:::-;27346:110;;:::o;28951:360::-;29011:13;29027:23;29042:7;29027:14;:23::i;:::-;29011:39;;29063:48;29084:5;29099:1;29103:7;29063:20;:48::i;:::-;29152:29;29169:1;29173:7;29152:8;:29::i;:::-;29214:1;29194:9;:16;29204:5;29194:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29233:7;:16;29241:7;29233:16;;;;;;;;;;;;29226:23;;;;;;;;;;;29295:7;29291:1;29267:36;;29276:5;29267:36;;;;;;;;;;;;29000:311;28951:360;:::o;26656:348::-;26749:4;26774:16;26782:7;26774;:16::i;:::-;26766:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26850:13;26866:23;26881:7;26866:14;:23::i;:::-;26850:39;;26919:5;26908:16;;:7;:16;;;:51;;;;26952:7;26928:31;;:20;26940:7;26928:11;:20::i;:::-;:31;;;26908:51;:87;;;;26963:32;26980:5;26987:7;26963:16;:32::i;:::-;26908:87;26900:96;;;26656:348;;;;:::o;29648:578::-;29807:4;29780:31;;:23;29795:7;29780:14;:23::i;:::-;:31;;;29772:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29890:1;29876:16;;:2;:16;;;;29868:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29946:39;29967:4;29973:2;29977:7;29946:20;:39::i;:::-;30050:29;30067:1;30071:7;30050:8;:29::i;:::-;30111:1;30092:9;:15;30102:4;30092:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30140:1;30123:9;:13;30133:2;30123:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30171:2;30152:7;:16;30160:7;30152:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30210:7;30206:2;30191:27;;30200:4;30191:27;;;;;;;;;;;;29648:578;;;:::o;43071:191::-;43145:16;43164:6;;;;;;;;;;;43145:25;;43190:8;43181:6;;:17;;;;;;;;;;;;;;;;;;43245:8;43214:40;;43235:8;43214:40;;;;;;;;;;;;43134:128;43071:191;:::o;30660:315::-;30815:8;30806:17;;:5;:17;;;;30798:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30902:8;30864:18;:25;30883:5;30864:25;;;;;;;;;;;;;;;:35;30890:8;30864:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30948:8;30926:41;;30941:5;30926:41;;;30958:8;30926:41;;;;;;:::i;:::-;;;;;;;;30660:315;;;:::o;25734:::-;25891:28;25901:4;25907:2;25911:7;25891:9;:28::i;:::-;25938:48;25961:4;25967:2;25971:7;25980:5;25938:22;:48::i;:::-;25930:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25734:315;;;;:::o;48351:114::-;48411:13;48444;48437:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48351:114;:::o;16756:723::-;16812:13;17042:1;17033:5;:10;17029:53;;;17060:10;;;;;;;;;;;;;;;;;;;;;17029:53;17092:12;17107:5;17092:20;;17123:14;17148:78;17163:1;17155:4;:9;17148:78;;17181:8;;;;;:::i;:::-;;;;17212:2;17204:10;;;;;:::i;:::-;;;17148:78;;;17236:19;17268:6;17258:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17236:39;;17286:154;17302:1;17293:5;:10;17286:154;;17330:1;17320:11;;;;;:::i;:::-;;;17397:2;17389:5;:10;;;;:::i;:::-;17376:2;:24;;;;:::i;:::-;17363:39;;17346:6;17353;17346:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17426:2;17417:11;;;;;:::i;:::-;;;17286:154;;;17464:6;17450:21;;;;;16756:723;;;;:::o;19213:157::-;19298:4;19337:25;19322:40;;;:11;:40;;;;19315:47;;19213:157;;;:::o;27683:321::-;27813:18;27819:2;27823:7;27813:5;:18::i;:::-;27864:54;27895:1;27899:2;27903:7;27912:5;27864:22;:54::i;:::-;27842:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27683:321;;;:::o;36410:589::-;36554:45;36581:4;36587:2;36591:7;36554:26;:45::i;:::-;36632:1;36616:18;;:4;:18;;;36612:187;;;36651:40;36683:7;36651:31;:40::i;:::-;36612:187;;;36721:2;36713:10;;:4;:10;;;36709:90;;36740:47;36773:4;36779:7;36740:32;:47::i;:::-;36709:90;36612:187;36827:1;36813:16;;:2;:16;;;36809:183;;;36846:45;36883:7;36846:36;:45::i;:::-;36809:183;;;36919:4;36913:10;;:2;:10;;;36909:83;;36940:40;36968:2;36972:7;36940:27;:40::i;:::-;36909:83;36809:183;36410:589;;;:::o;31540:799::-;31695:4;31716:15;:2;:13;;;:15::i;:::-;31712:620;;;31768:2;31752:36;;;31789:12;:10;:12::i;:::-;31803:4;31809:7;31818:5;31752:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31748:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32011:1;31994:6;:13;:18;31990:272;;;32037:60;;;;;;;;;;:::i;:::-;;;;;;;;31990:272;32212:6;32206:13;32197:6;32193:2;32189:15;32182:38;31748:529;31885:41;;;31875:51;;;:6;:51;;;;31868:58;;;;;31712:620;32316:4;32309:11;;31540:799;;;;;;;:::o;28340:382::-;28434:1;28420:16;;:2;:16;;;;28412:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28493:16;28501:7;28493;:16::i;:::-;28492:17;28484:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28555:45;28584:1;28588:2;28592:7;28555:20;:45::i;:::-;28630:1;28613:9;:13;28623:2;28613:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28661:2;28642:7;:16;28650:7;28642:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28706:7;28702:2;28681:33;;28698:1;28681:33;;;;;;;;;;;;28340:382;;:::o;32911:126::-;;;;:::o;37722:164::-;37826:10;:17;;;;37799:15;:24;37815:7;37799:24;;;;;;;;;;;:44;;;;37854:10;37870:7;37854:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37722:164;:::o;38513:988::-;38779:22;38829:1;38804:22;38821:4;38804:16;:22::i;:::-;:26;;;;:::i;:::-;38779:51;;38841:18;38862:17;:26;38880:7;38862:26;;;;;;;;;;;;38841:47;;39009:14;38995:10;:28;38991:328;;39040:19;39062:12;:18;39075:4;39062:18;;;;;;;;;;;;;;;:34;39081:14;39062:34;;;;;;;;;;;;39040:56;;39146:11;39113:12;:18;39126:4;39113:18;;;;;;;;;;;;;;;:30;39132:10;39113:30;;;;;;;;;;;:44;;;;39263:10;39230:17;:30;39248:11;39230:30;;;;;;;;;;;:43;;;;39025:294;38991:328;39415:17;:26;39433:7;39415:26;;;;;;;;;;;39408:33;;;39459:12;:18;39472:4;39459:18;;;;;;;;;;;;;;;:34;39478:14;39459:34;;;;;;;;;;;39452:41;;;38594:907;;38513:988;;:::o;39796:1079::-;40049:22;40094:1;40074:10;:17;;;;:21;;;;:::i;:::-;40049:46;;40106:18;40127:15;:24;40143:7;40127:24;;;;;;;;;;;;40106:45;;40478:19;40500:10;40511:14;40500:26;;;;;;;;:::i;:::-;;;;;;;;;;40478:48;;40564:11;40539:10;40550;40539:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40675:10;40644:15;:28;40660:11;40644:28;;;;;;;;;;;:41;;;;40816:15;:24;40832:7;40816:24;;;;;;;;;;;40809:31;;;40851:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39867:1008;;;39796:1079;:::o;37300:221::-;37385:14;37402:20;37419:2;37402:16;:20::i;:::-;37385:37;;37460:7;37433:12;:16;37446:2;37433:16;;;;;;;;;;;;;;;:24;37450:6;37433:24;;;;;;;;;;;:34;;;;37507:6;37478:17;:26;37496:7;37478:26;;;;;;;;;;;:35;;;;37374:147;37300:221;;:::o;8445:387::-;8505:4;8713:12;8780:7;8768:20;8760:28;;8823:1;8816:4;:8;8809:15;;;8445:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:2;;;1025:79;;:::i;:::-;994:2;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:2;;;1443:79;;:::i;:::-;1412:2;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1638:87;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:2;;1876:79;;:::i;:::-;1835:2;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2173:84;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2314:86;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2468:79;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:2;;2678:79;;:::i;:::-;2637:2;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:2;;3037:79;;:::i;:::-;2996:2;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3322:87;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:2;;;3529:79;;:::i;:::-;3491:2;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3481:263;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:2;;;3881:79;;:::i;:::-;3843:2;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3833:391;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:2;;;4378:79;;:::i;:::-;4340:2;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4330:519;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:2;;;5030:79;;:::i;:::-;4991:2;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:2;;;5614:79;;:::i;:::-;5578:2;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4981:817;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5932:79;;:::i;:::-;5894:2;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5884:388;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:2;;;6409:79;;:::i;:::-;6371:2;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6361:391;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:2;;;6897:79;;:::i;:::-;6859:2;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:2;;;7097:79;;:::i;:::-;7061:2;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6849:448;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:2;;;7416:79;;:::i;:::-;7378:2;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7368:262;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:2;;;7760:79;;:::i;:::-;7722:2;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7712:273;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:2;;;8115:79;;:::i;:::-;8077:2;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:2;;;8315:79;;:::i;:::-;8279:2;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;8067:433;;;;:::o;8506:648::-;8581:6;8589;8638:2;8626:9;8617:7;8613:23;8609:32;8606:2;;;8644:79;;:::i;:::-;8606:2;8792:1;8781:9;8777:17;8764:31;8822:18;8814:6;8811:30;8808:2;;;8844:79;;:::i;:::-;8808:2;8949:63;9004:7;8995:6;8984:9;8980:22;8949:63;:::i;:::-;8939:73;;8735:287;9061:2;9087:50;9129:7;9120:6;9109:9;9105:22;9087:50;:::i;:::-;9077:60;;9032:115;8596:558;;;;;:::o;9160:329::-;9219:6;9268:2;9256:9;9247:7;9243:23;9239:32;9236:2;;;9274:79;;:::i;:::-;9236:2;9394:1;9419:53;9464:7;9455:6;9444:9;9440:22;9419:53;:::i;:::-;9409:63;;9365:117;9226:263;;;;:::o;9495:474::-;9563:6;9571;9620:2;9608:9;9599:7;9595:23;9591:32;9588:2;;;9626:79;;:::i;:::-;9588:2;9746:1;9771:53;9816:7;9807:6;9796:9;9792:22;9771:53;:::i;:::-;9761:63;;9717:117;9873:2;9899:53;9944:7;9935:6;9924:9;9920:22;9899:53;:::i;:::-;9889:63;;9844:118;9578:391;;;;;:::o;9975:118::-;10062:24;10080:5;10062:24;:::i;:::-;10057:3;10050:37;10040:53;;:::o;10099:109::-;10180:21;10195:5;10180:21;:::i;:::-;10175:3;10168:34;10158:50;;:::o;10214:360::-;10300:3;10328:38;10360:5;10328:38;:::i;:::-;10382:70;10445:6;10440:3;10382:70;:::i;:::-;10375:77;;10461:52;10506:6;10501:3;10494:4;10487:5;10483:16;10461:52;:::i;:::-;10538:29;10560:6;10538:29;:::i;:::-;10533:3;10529:39;10522:46;;10304:270;;;;;:::o;10580:364::-;10668:3;10696:39;10729:5;10696:39;:::i;:::-;10751:71;10815:6;10810:3;10751:71;:::i;:::-;10744:78;;10831:52;10876:6;10871:3;10864:4;10857:5;10853:16;10831:52;:::i;:::-;10908:29;10930:6;10908:29;:::i;:::-;10903:3;10899:39;10892:46;;10672:272;;;;;:::o;10950:377::-;11056:3;11084:39;11117:5;11084:39;:::i;:::-;11139:89;11221:6;11216:3;11139:89;:::i;:::-;11132:96;;11237:52;11282:6;11277:3;11270:4;11263:5;11259:16;11237:52;:::i;:::-;11314:6;11309:3;11305:16;11298:23;;11060:267;;;;;:::o;11333:366::-;11475:3;11496:67;11560:2;11555:3;11496:67;:::i;:::-;11489:74;;11572:93;11661:3;11572:93;:::i;:::-;11690:2;11685:3;11681:12;11674:19;;11479:220;;;:::o;11705:366::-;11847:3;11868:67;11932:2;11927:3;11868:67;:::i;:::-;11861:74;;11944:93;12033:3;11944:93;:::i;:::-;12062:2;12057:3;12053:12;12046:19;;11851:220;;;:::o;12077:366::-;12219:3;12240:67;12304:2;12299:3;12240:67;:::i;:::-;12233:74;;12316:93;12405:3;12316:93;:::i;:::-;12434:2;12429:3;12425:12;12418:19;;12223:220;;;:::o;12449:366::-;12591:3;12612:67;12676:2;12671:3;12612:67;:::i;:::-;12605:74;;12688:93;12777:3;12688:93;:::i;:::-;12806:2;12801:3;12797:12;12790:19;;12595:220;;;:::o;12821:366::-;12963:3;12984:67;13048:2;13043:3;12984:67;:::i;:::-;12977:74;;13060:93;13149:3;13060:93;:::i;:::-;13178:2;13173:3;13169:12;13162:19;;12967:220;;;:::o;13193:366::-;13335:3;13356:67;13420:2;13415:3;13356:67;:::i;:::-;13349:74;;13432:93;13521:3;13432:93;:::i;:::-;13550:2;13545:3;13541:12;13534:19;;13339:220;;;:::o;13565:366::-;13707:3;13728:67;13792:2;13787:3;13728:67;:::i;:::-;13721:74;;13804:93;13893:3;13804:93;:::i;:::-;13922:2;13917:3;13913:12;13906:19;;13711:220;;;:::o;13937:366::-;14079:3;14100:67;14164:2;14159:3;14100:67;:::i;:::-;14093:74;;14176:93;14265:3;14176:93;:::i;:::-;14294:2;14289:3;14285:12;14278:19;;14083:220;;;:::o;14309:366::-;14451:3;14472:67;14536:2;14531:3;14472:67;:::i;:::-;14465:74;;14548:93;14637:3;14548:93;:::i;:::-;14666:2;14661:3;14657:12;14650:19;;14455:220;;;:::o;14681:366::-;14823:3;14844:67;14908:2;14903:3;14844:67;:::i;:::-;14837:74;;14920:93;15009:3;14920:93;:::i;:::-;15038:2;15033:3;15029:12;15022:19;;14827:220;;;:::o;15053:366::-;15195:3;15216:67;15280:2;15275:3;15216:67;:::i;:::-;15209:74;;15292:93;15381:3;15292:93;:::i;:::-;15410:2;15405:3;15401:12;15394:19;;15199:220;;;:::o;15425:366::-;15567:3;15588:67;15652:2;15647:3;15588:67;:::i;:::-;15581:74;;15664:93;15753:3;15664:93;:::i;:::-;15782:2;15777:3;15773:12;15766:19;;15571:220;;;:::o;15797:366::-;15939:3;15960:67;16024:2;16019:3;15960:67;:::i;:::-;15953:74;;16036:93;16125:3;16036:93;:::i;:::-;16154:2;16149:3;16145:12;16138:19;;15943:220;;;:::o;16169:366::-;16311:3;16332:67;16396:2;16391:3;16332:67;:::i;:::-;16325:74;;16408:93;16497:3;16408:93;:::i;:::-;16526:2;16521:3;16517:12;16510:19;;16315:220;;;:::o;16541:366::-;16683:3;16704:67;16768:2;16763:3;16704:67;:::i;:::-;16697:74;;16780:93;16869:3;16780:93;:::i;:::-;16898:2;16893:3;16889:12;16882:19;;16687:220;;;:::o;16913:366::-;17055:3;17076:67;17140:2;17135:3;17076:67;:::i;:::-;17069:74;;17152:93;17241:3;17152:93;:::i;:::-;17270:2;17265:3;17261:12;17254:19;;17059:220;;;:::o;17285:366::-;17427:3;17448:67;17512:2;17507:3;17448:67;:::i;:::-;17441:74;;17524:93;17613:3;17524:93;:::i;:::-;17642:2;17637:3;17633:12;17626:19;;17431:220;;;:::o;17657:366::-;17799:3;17820:67;17884:2;17879:3;17820:67;:::i;:::-;17813:74;;17896:93;17985:3;17896:93;:::i;:::-;18014:2;18009:3;18005:12;17998:19;;17803:220;;;:::o;18029:366::-;18171:3;18192:67;18256:2;18251:3;18192:67;:::i;:::-;18185:74;;18268:93;18357:3;18268:93;:::i;:::-;18386:2;18381:3;18377:12;18370:19;;18175:220;;;:::o;18401:366::-;18543:3;18564:67;18628:2;18623:3;18564:67;:::i;:::-;18557:74;;18640:93;18729:3;18640:93;:::i;:::-;18758:2;18753:3;18749:12;18742:19;;18547:220;;;:::o;18773:366::-;18915:3;18936:67;19000:2;18995:3;18936:67;:::i;:::-;18929:74;;19012:93;19101:3;19012:93;:::i;:::-;19130:2;19125:3;19121:12;19114:19;;18919:220;;;:::o;19145:366::-;19287:3;19308:67;19372:2;19367:3;19308:67;:::i;:::-;19301:74;;19384:93;19473:3;19384:93;:::i;:::-;19502:2;19497:3;19493:12;19486:19;;19291:220;;;:::o;19517:366::-;19659:3;19680:67;19744:2;19739:3;19680:67;:::i;:::-;19673:74;;19756:93;19845:3;19756:93;:::i;:::-;19874:2;19869:3;19865:12;19858:19;;19663:220;;;:::o;19889:366::-;20031:3;20052:67;20116:2;20111:3;20052:67;:::i;:::-;20045:74;;20128:93;20217:3;20128:93;:::i;:::-;20246:2;20241:3;20237:12;20230:19;;20035:220;;;:::o;20261:366::-;20403:3;20424:67;20488:2;20483:3;20424:67;:::i;:::-;20417:74;;20500:93;20589:3;20500:93;:::i;:::-;20618:2;20613:3;20609:12;20602:19;;20407:220;;;:::o;20633:366::-;20775:3;20796:67;20860:2;20855:3;20796:67;:::i;:::-;20789:74;;20872:93;20961:3;20872:93;:::i;:::-;20990:2;20985:3;20981:12;20974:19;;20779:220;;;:::o;21005:366::-;21147:3;21168:67;21232:2;21227:3;21168:67;:::i;:::-;21161:74;;21244:93;21333:3;21244:93;:::i;:::-;21362:2;21357:3;21353:12;21346:19;;21151:220;;;:::o;21377:400::-;21537:3;21558:84;21640:1;21635:3;21558:84;:::i;:::-;21551:91;;21651:93;21740:3;21651:93;:::i;:::-;21769:1;21764:3;21760:11;21753:18;;21541:236;;;:::o;21783:118::-;21870:24;21888:5;21870:24;:::i;:::-;21865:3;21858:37;21848:53;;:::o;21907:861::-;22236:3;22258:95;22349:3;22340:6;22258:95;:::i;:::-;22251:102;;22370:95;22461:3;22452:6;22370:95;:::i;:::-;22363:102;;22482:148;22626:3;22482:148;:::i;:::-;22475:155;;22647:95;22738:3;22729:6;22647:95;:::i;:::-;22640:102;;22759:3;22752:10;;22240:528;;;;;;:::o;22774:222::-;22867:4;22905:2;22894:9;22890:18;22882:26;;22918:71;22986:1;22975:9;22971:17;22962:6;22918:71;:::i;:::-;22872:124;;;;:::o;23002:640::-;23197:4;23235:3;23224:9;23220:19;23212:27;;23249:71;23317:1;23306:9;23302:17;23293:6;23249:71;:::i;:::-;23330:72;23398:2;23387:9;23383:18;23374:6;23330:72;:::i;:::-;23412;23480:2;23469:9;23465:18;23456:6;23412:72;:::i;:::-;23531:9;23525:4;23521:20;23516:2;23505:9;23501:18;23494:48;23559:76;23630:4;23621:6;23559:76;:::i;:::-;23551:84;;23202:440;;;;;;;:::o;23648:210::-;23735:4;23773:2;23762:9;23758:18;23750:26;;23786:65;23848:1;23837:9;23833:17;23824:6;23786:65;:::i;:::-;23740:118;;;;:::o;23864:313::-;23977:4;24015:2;24004:9;24000:18;23992:26;;24064:9;24058:4;24054:20;24050:1;24039:9;24035:17;24028:47;24092:78;24165:4;24156:6;24092:78;:::i;:::-;24084:86;;23982:195;;;;:::o;24183:419::-;24349:4;24387:2;24376:9;24372:18;24364:26;;24436:9;24430:4;24426:20;24422:1;24411:9;24407:17;24400:47;24464:131;24590:4;24464:131;:::i;:::-;24456:139;;24354:248;;;:::o;24608:419::-;24774:4;24812:2;24801:9;24797:18;24789:26;;24861:9;24855:4;24851:20;24847:1;24836:9;24832:17;24825:47;24889:131;25015:4;24889:131;:::i;:::-;24881:139;;24779:248;;;:::o;25033:419::-;25199:4;25237:2;25226:9;25222:18;25214:26;;25286:9;25280:4;25276:20;25272:1;25261:9;25257:17;25250:47;25314:131;25440:4;25314:131;:::i;:::-;25306:139;;25204:248;;;:::o;25458:419::-;25624:4;25662:2;25651:9;25647:18;25639:26;;25711:9;25705:4;25701:20;25697:1;25686:9;25682:17;25675:47;25739:131;25865:4;25739:131;:::i;:::-;25731:139;;25629:248;;;:::o;25883:419::-;26049:4;26087:2;26076:9;26072:18;26064:26;;26136:9;26130:4;26126:20;26122:1;26111:9;26107:17;26100:47;26164:131;26290:4;26164:131;:::i;:::-;26156:139;;26054:248;;;:::o;26308:419::-;26474:4;26512:2;26501:9;26497:18;26489:26;;26561:9;26555:4;26551:20;26547:1;26536:9;26532:17;26525:47;26589:131;26715:4;26589:131;:::i;:::-;26581:139;;26479:248;;;:::o;26733:419::-;26899:4;26937:2;26926:9;26922:18;26914:26;;26986:9;26980:4;26976:20;26972:1;26961:9;26957:17;26950:47;27014:131;27140:4;27014:131;:::i;:::-;27006:139;;26904:248;;;:::o;27158:419::-;27324:4;27362:2;27351:9;27347:18;27339:26;;27411:9;27405:4;27401:20;27397:1;27386:9;27382:17;27375:47;27439:131;27565:4;27439:131;:::i;:::-;27431:139;;27329:248;;;:::o;27583:419::-;27749:4;27787:2;27776:9;27772:18;27764:26;;27836:9;27830:4;27826:20;27822:1;27811:9;27807:17;27800:47;27864:131;27990:4;27864:131;:::i;:::-;27856:139;;27754:248;;;:::o;28008:419::-;28174:4;28212:2;28201:9;28197:18;28189:26;;28261:9;28255:4;28251:20;28247:1;28236:9;28232:17;28225:47;28289:131;28415:4;28289:131;:::i;:::-;28281:139;;28179:248;;;:::o;28433:419::-;28599:4;28637:2;28626:9;28622:18;28614:26;;28686:9;28680:4;28676:20;28672:1;28661:9;28657:17;28650:47;28714:131;28840:4;28714:131;:::i;:::-;28706:139;;28604:248;;;:::o;28858:419::-;29024:4;29062:2;29051:9;29047:18;29039:26;;29111:9;29105:4;29101:20;29097:1;29086:9;29082:17;29075:47;29139:131;29265:4;29139:131;:::i;:::-;29131:139;;29029:248;;;:::o;29283:419::-;29449:4;29487:2;29476:9;29472:18;29464:26;;29536:9;29530:4;29526:20;29522:1;29511:9;29507:17;29500:47;29564:131;29690:4;29564:131;:::i;:::-;29556:139;;29454:248;;;:::o;29708:419::-;29874:4;29912:2;29901:9;29897:18;29889:26;;29961:9;29955:4;29951:20;29947:1;29936:9;29932:17;29925:47;29989:131;30115:4;29989:131;:::i;:::-;29981:139;;29879:248;;;:::o;30133:419::-;30299:4;30337:2;30326:9;30322:18;30314:26;;30386:9;30380:4;30376:20;30372:1;30361:9;30357:17;30350:47;30414:131;30540:4;30414:131;:::i;:::-;30406:139;;30304:248;;;:::o;30558:419::-;30724:4;30762:2;30751:9;30747:18;30739:26;;30811:9;30805:4;30801:20;30797:1;30786:9;30782:17;30775:47;30839:131;30965:4;30839:131;:::i;:::-;30831:139;;30729:248;;;:::o;30983:419::-;31149:4;31187:2;31176:9;31172:18;31164:26;;31236:9;31230:4;31226:20;31222:1;31211:9;31207:17;31200:47;31264:131;31390:4;31264:131;:::i;:::-;31256:139;;31154:248;;;:::o;31408:419::-;31574:4;31612:2;31601:9;31597:18;31589:26;;31661:9;31655:4;31651:20;31647:1;31636:9;31632:17;31625:47;31689:131;31815:4;31689:131;:::i;:::-;31681:139;;31579:248;;;:::o;31833:419::-;31999:4;32037:2;32026:9;32022:18;32014:26;;32086:9;32080:4;32076:20;32072:1;32061:9;32057:17;32050:47;32114:131;32240:4;32114:131;:::i;:::-;32106:139;;32004:248;;;:::o;32258:419::-;32424:4;32462:2;32451:9;32447:18;32439:26;;32511:9;32505:4;32501:20;32497:1;32486:9;32482:17;32475:47;32539:131;32665:4;32539:131;:::i;:::-;32531:139;;32429:248;;;:::o;32683:419::-;32849:4;32887:2;32876:9;32872:18;32864:26;;32936:9;32930:4;32926:20;32922:1;32911:9;32907:17;32900:47;32964:131;33090:4;32964:131;:::i;:::-;32956:139;;32854:248;;;:::o;33108:419::-;33274:4;33312:2;33301:9;33297:18;33289:26;;33361:9;33355:4;33351:20;33347:1;33336:9;33332:17;33325:47;33389:131;33515:4;33389:131;:::i;:::-;33381:139;;33279:248;;;:::o;33533:419::-;33699:4;33737:2;33726:9;33722:18;33714:26;;33786:9;33780:4;33776:20;33772:1;33761:9;33757:17;33750:47;33814:131;33940:4;33814:131;:::i;:::-;33806:139;;33704:248;;;:::o;33958:419::-;34124:4;34162:2;34151:9;34147:18;34139:26;;34211:9;34205:4;34201:20;34197:1;34186:9;34182:17;34175:47;34239:131;34365:4;34239:131;:::i;:::-;34231:139;;34129:248;;;:::o;34383:419::-;34549:4;34587:2;34576:9;34572:18;34564:26;;34636:9;34630:4;34626:20;34622:1;34611:9;34607:17;34600:47;34664:131;34790:4;34664:131;:::i;:::-;34656:139;;34554:248;;;:::o;34808:419::-;34974:4;35012:2;35001:9;34997:18;34989:26;;35061:9;35055:4;35051:20;35047:1;35036:9;35032:17;35025:47;35089:131;35215:4;35089:131;:::i;:::-;35081:139;;34979:248;;;:::o;35233:419::-;35399:4;35437:2;35426:9;35422:18;35414:26;;35486:9;35480:4;35476:20;35472:1;35461:9;35457:17;35450:47;35514:131;35640:4;35514:131;:::i;:::-;35506:139;;35404:248;;;:::o;35658:222::-;35751:4;35789:2;35778:9;35774:18;35766:26;;35802:71;35870:1;35859:9;35855:17;35846:6;35802:71;:::i;:::-;35756:124;;;;:::o;35886:129::-;35920:6;35947:20;;:::i;:::-;35937:30;;35976:33;36004:4;35996:6;35976:33;:::i;:::-;35927:88;;;:::o;36021:75::-;36054:6;36087:2;36081:9;36071:19;;36061:35;:::o;36102:311::-;36179:4;36269:18;36261:6;36258:30;36255:2;;;36291:18;;:::i;:::-;36255:2;36341:4;36333:6;36329:17;36321:25;;36401:4;36395;36391:15;36383:23;;36184:229;;;:::o;36419:307::-;36480:4;36570:18;36562:6;36559:30;36556:2;;;36592:18;;:::i;:::-;36556:2;36630:29;36652:6;36630:29;:::i;:::-;36622:37;;36714:4;36708;36704:15;36696:23;;36485:241;;;:::o;36732:308::-;36794:4;36884:18;36876:6;36873:30;36870:2;;;36906:18;;:::i;:::-;36870:2;36944:29;36966:6;36944:29;:::i;:::-;36936:37;;37028:4;37022;37018:15;37010:23;;36799:241;;;:::o;37046:98::-;37097:6;37131:5;37125:12;37115:22;;37104:40;;;:::o;37150:99::-;37202:6;37236:5;37230:12;37220:22;;37209:40;;;:::o;37255:168::-;37338:11;37372:6;37367:3;37360:19;37412:4;37407:3;37403:14;37388:29;;37350:73;;;;:::o;37429:169::-;37513:11;37547:6;37542:3;37535:19;37587:4;37582:3;37578:14;37563:29;;37525:73;;;;:::o;37604:148::-;37706:11;37743:3;37728:18;;37718:34;;;;:::o;37758:305::-;37798:3;37817:20;37835:1;37817:20;:::i;:::-;37812:25;;37851:20;37869:1;37851:20;:::i;:::-;37846:25;;38005:1;37937:66;37933:74;37930:1;37927:81;37924:2;;;38011:18;;:::i;:::-;37924:2;38055:1;38052;38048:9;38041:16;;37802:261;;;;:::o;38069:185::-;38109:1;38126:20;38144:1;38126:20;:::i;:::-;38121:25;;38160:20;38178:1;38160:20;:::i;:::-;38155:25;;38199:1;38189:2;;38204:18;;:::i;:::-;38189:2;38246:1;38243;38239:9;38234:14;;38111:143;;;;:::o;38260:191::-;38300:4;38320:20;38338:1;38320:20;:::i;:::-;38315:25;;38354:20;38372:1;38354:20;:::i;:::-;38349:25;;38393:1;38390;38387:8;38384:2;;;38398:18;;:::i;:::-;38384:2;38443:1;38440;38436:9;38428:17;;38305:146;;;;:::o;38457:96::-;38494:7;38523:24;38541:5;38523:24;:::i;:::-;38512:35;;38502:51;;;:::o;38559:90::-;38593:7;38636:5;38629:13;38622:21;38611:32;;38601:48;;;:::o;38655:149::-;38691:7;38731:66;38724:5;38720:78;38709:89;;38699:105;;;:::o;38810:126::-;38847:7;38887:42;38880:5;38876:54;38865:65;;38855:81;;;:::o;38942:77::-;38979:7;39008:5;38997:16;;38987:32;;;:::o;39025:154::-;39109:6;39104:3;39099;39086:30;39171:1;39162:6;39157:3;39153:16;39146:27;39076:103;;;:::o;39185:307::-;39253:1;39263:113;39277:6;39274:1;39271:13;39263:113;;;39362:1;39357:3;39353:11;39347:18;39343:1;39338:3;39334:11;39327:39;39299:2;39296:1;39292:10;39287:15;;39263:113;;;39394:6;39391:1;39388:13;39385:2;;;39474:1;39465:6;39460:3;39456:16;39449:27;39385:2;39234:258;;;;:::o;39498:320::-;39542:6;39579:1;39573:4;39569:12;39559:22;;39626:1;39620:4;39616:12;39647:18;39637:2;;39703:4;39695:6;39691:17;39681:27;;39637:2;39765;39757:6;39754:14;39734:18;39731:38;39728:2;;;39784:18;;:::i;:::-;39728:2;39549:269;;;;:::o;39824:281::-;39907:27;39929:4;39907:27;:::i;:::-;39899:6;39895:40;40037:6;40025:10;40022:22;40001:18;39989:10;39986:34;39983:62;39980:2;;;40048:18;;:::i;:::-;39980:2;40088:10;40084:2;40077:22;39867:238;;;:::o;40111:233::-;40150:3;40173:24;40191:5;40173:24;:::i;:::-;40164:33;;40219:66;40212:5;40209:77;40206:2;;;40289:18;;:::i;:::-;40206:2;40336:1;40329:5;40325:13;40318:20;;40154:190;;;:::o;40350:176::-;40382:1;40399:20;40417:1;40399:20;:::i;:::-;40394:25;;40433:20;40451:1;40433:20;:::i;:::-;40428:25;;40472:1;40462:2;;40477:18;;:::i;:::-;40462:2;40518:1;40515;40511:9;40506:14;;40384:142;;;;:::o;40532:180::-;40580:77;40577:1;40570:88;40677:4;40674:1;40667:15;40701:4;40698:1;40691:15;40718:180;40766:77;40763:1;40756:88;40863:4;40860:1;40853:15;40887:4;40884:1;40877:15;40904:180;40952:77;40949:1;40942:88;41049:4;41046:1;41039:15;41073:4;41070:1;41063:15;41090:180;41138:77;41135:1;41128:88;41235:4;41232:1;41225:15;41259:4;41256:1;41249:15;41276:180;41324:77;41321:1;41314:88;41421:4;41418:1;41411:15;41445:4;41442:1;41435:15;41462:180;41510:77;41507:1;41500:88;41607:4;41604:1;41597:15;41631:4;41628:1;41621:15;41648:117;41757:1;41754;41747:12;41771:117;41880:1;41877;41870:12;41894:117;42003:1;42000;41993:12;42017:117;42126:1;42123;42116:12;42140:117;42249:1;42246;42239:12;42263:102;42304:6;42355:2;42351:7;42346:2;42339:5;42335:14;42331:28;42321:38;;42311:54;;;:::o;42371:230::-;42511:34;42507:1;42499:6;42495:14;42488:58;42580:13;42575:2;42567:6;42563:15;42556:38;42477:124;:::o;42607:237::-;42747:34;42743:1;42735:6;42731:14;42724:58;42816:20;42811:2;42803:6;42799:15;42792:45;42713:131;:::o;42850:167::-;42990:19;42986:1;42978:6;42974:14;42967:43;42956:61;:::o;43023:225::-;43163:34;43159:1;43151:6;43147:14;43140:58;43232:8;43227:2;43219:6;43215:15;43208:33;43129:119;:::o;43254:166::-;43394:18;43390:1;43382:6;43378:14;43371:42;43360:60;:::o;43426:178::-;43566:30;43562:1;43554:6;43550:14;43543:54;43532:72;:::o;43610:164::-;43750:16;43746:1;43738:6;43734:14;43727:40;43716:58;:::o;43780:223::-;43920:34;43916:1;43908:6;43904:14;43897:58;43989:6;43984:2;43976:6;43972:15;43965:31;43886:117;:::o;44009:175::-;44149:27;44145:1;44137:6;44133:14;44126:51;44115:69;:::o;44190:173::-;44330:25;44326:1;44318:6;44314:14;44307:49;44296:67;:::o;44369:231::-;44509:34;44505:1;44497:6;44493:14;44486:58;44578:14;44573:2;44565:6;44561:15;44554:39;44475:125;:::o;44606:167::-;44746:19;44742:1;44734:6;44730:14;44723:43;44712:61;:::o;44779:243::-;44919:34;44915:1;44907:6;44903:14;44896:58;44988:26;44983:2;44975:6;44971:15;44964:51;44885:137;:::o;45028:229::-;45168:34;45164:1;45156:6;45152:14;45145:58;45237:12;45232:2;45224:6;45220:15;45213:37;45134:123;:::o;45263:228::-;45403:34;45399:1;45391:6;45387:14;45380:58;45472:11;45467:2;45459:6;45455:15;45448:36;45369:122;:::o;45497:171::-;45637:23;45633:1;45625:6;45621:14;45614:47;45603:65;:::o;45674:182::-;45814:34;45810:1;45802:6;45798:14;45791:58;45780:76;:::o;45862:231::-;46002:34;45998:1;45990:6;45986:14;45979:58;46071:14;46066:2;46058:6;46054:15;46047:39;45968:125;:::o;46099:169::-;46239:21;46235:1;46227:6;46223:14;46216:45;46205:63;:::o;46274:182::-;46414:34;46410:1;46402:6;46398:14;46391:58;46380:76;:::o;46462:228::-;46602:34;46598:1;46590:6;46586:14;46579:58;46671:11;46666:2;46658:6;46654:15;46647:36;46568:122;:::o;46696:220::-;46836:34;46832:1;46824:6;46820:14;46813:58;46905:3;46900:2;46892:6;46888:15;46881:28;46802:114;:::o;46922:167::-;47062:19;47058:1;47050:6;47046:14;47039:43;47028:61;:::o;47095:236::-;47235:34;47231:1;47223:6;47219:14;47212:58;47304:19;47299:2;47291:6;47287:15;47280:44;47201:130;:::o;47337:179::-;47477:31;47473:1;47465:6;47461:14;47454:55;47443:73;:::o;47522:231::-;47662:34;47658:1;47650:6;47646:14;47639:58;47731:14;47726:2;47718:6;47714:15;47707:39;47628:125;:::o;47759:163::-;47899:15;47895:1;47887:6;47883:14;47876:39;47865:57;:::o;47928:151::-;48068:3;48064:1;48056:6;48052:14;48045:27;48034:45;:::o;48085:122::-;48158:24;48176:5;48158:24;:::i;:::-;48151:5;48148:35;48138:2;;48197:1;48194;48187:12;48138:2;48128:79;:::o;48213:116::-;48283:21;48298:5;48283:21;:::i;:::-;48276:5;48273:32;48263:2;;48319:1;48316;48309:12;48263:2;48253:76;:::o;48335:120::-;48407:23;48424:5;48407:23;:::i;:::-;48400:5;48397:34;48387:2;;48445:1;48442;48435:12;48387:2;48377:78;:::o;48461:122::-;48534:24;48552:5;48534:24;:::i;:::-;48527:5;48524:35;48514:2;;48573:1;48570;48563:12;48514:2;48504:79;:::o

Swarm Source

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