ETH Price: $3,265.14 (+2.27%)
Gas: 2 Gwei

Token

EthernaalFlaNFT (flaNFT)
 

Overview

Max Total Supply

30 flaNFT

Holders

18

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
woosmak.eth
Balance
2 flaNFT
0x2843c552fB9e56343F993b6ee3dC465Dce4f71Cb
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:
EthernaalFlaNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED
// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: EthernaalFlaNFT.sol



pragma solidity 0.8.4;

/**  
* @title An NFT Marketplace contract for Ethernaal Flash NFTs
* @author Gnana Lakshmi T C
* @notice This is the Ethernaal Marketplace contract for Minting NFTs and Direct Sale only.
* @dev Most function calls are currently implemented with access control
*/





/** 
* This is the Ethernaal Marketplace contract for Minting NFTs and Direct Sale only.
*/
contract EthernaalFlaNFT is ERC721URIStorage {

    using SafeMath for uint256;
    mapping(uint256 => uint256) private salePrice;
    mapping(address => bool) public creatorWhitelist;
    mapping(uint256 => address) private tokenOwner;
    mapping(uint256 => address) private tokenCreator;
    mapping(address => uint[]) private creatorTokens;
    //This is to determine the platform royalty for the first sale made by the creator
    mapping(uint => bool) private tokenFirstSale;

    event SalePriceSet(uint256 indexed _tokenId, uint256 indexed _price);
    event Sold(address indexed _buyer, address indexed _seller, uint256 _amount, uint256 indexed _tokenId);
    event WhitelistCreator(address indexed _creator);
    event DelistCreator(address indexed _creator);
    event OwnershipGranted(address indexed newOwner);
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
    event Mint(address indexed creator,uint indexed tokenId, string indexed tokenURI);

    uint constant FLOAT_HANDLER_TEN_4 = 10000;

    address owner;
    address _grantedOwner;
    address admin;
    address blackUni_org;
    uint256 sellerFee;
    uint256 orgFee;
    uint256 creatorFee;
    uint256 blackUniFee;
    uint256 sellerFeeInitial;
    uint256 orgFeeInitial;
    uint256 blackUniFeeInital;
    address payable ethernaal_org;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    struct NFTData {
        uint tokenId;
        string title;
        string description;
        string artistName;
        address creator;
    }

    NFTData[] mintedNfts;

    /**
    * Modifier to allow only minters to mint
    */
    modifier onlyMinter() virtual {
        require(creatorWhitelist[msg.sender] == true);
        _;
    }

    /**
    * Modifier to allow only owners of a token to perform certain actions 
    */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender);
        _;
    }

    /**
    * Modifier to allow only owner of the contract to perform certain actions 
    */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
    /**
    * Modifier to allow only admin of the organization to perform certain actions 
    */
    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }

    constructor(string memory _name,
        string memory _symbol,
        address payable org,
        address payable blackUnicornOrg,
        address payable _admin
        )
        ERC721(_name, _symbol)
    {
        owner = msg.sender;
        admin = _admin;
        ethernaal_org = org;
        blackUni_org = blackUnicornOrg;
        //Creator royalty Fee is fixed to be 1% of sales, org fee to be 1% and black unicorn to 0.5%
        //Multiply all the three % variables by 100, to kepe it uniform
        orgFee = 100;
        creatorFee = 100;
        blackUniFee = 50;
        sellerFee = 10000 - orgFee - creatorFee - blackUniFee;
        //Fees for first sale only
        orgFeeInitial = 200;
        blackUniFeeInital = 50;
        sellerFeeInitial = 10000-orgFeeInitial-blackUniFeeInital;
    }

    /**
    * @dev Owner can transfer the ownership of the contract to a new account (`_grantedOwner`).
    * Can only be called by the current owner.
    */
    function grantContractOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "New owner cannot be zero address");
        emit OwnershipGranted(newOwner);
        _grantedOwner = newOwner;
    }

    /**
    * @dev Claims granted ownership of the contract for a new account (`_grantedOwner`).
    * Can only be called by the currently granted owner.
    */
    function claimContractOwnership() public virtual {
        require(_grantedOwner == msg.sender, "Ownable: caller is not the granted owner");
        emit OwnershipTransferred(owner, _grantedOwner);
        owner = _grantedOwner;
        _grantedOwner = address(0);
    }

    /**
    * @dev Organisation address can be updated to another address in case of attack or compromise(`newOrg`)
    * Can be done only by the contract owner.
    */
    function changeOrgAddress(address _newOrg) public onlyOwner {
        require(_newOrg != address(0), "New organization cannot be zero address");
        ethernaal_org = payable(_newOrg);
    }

    /**
    * @dev Black Unicorn organisation address can be updated to another address in case of attack or compromise(`newOrg`)
    * Can be done only by the contract owner.
    */
    function changeBlackUniAddress(address _blakcUniOrg) public onlyOwner {
        require(_blakcUniOrg != address(0), "New organization cannot be zero address");
        blackUni_org = payable(_blakcUniOrg);
    }

    /**
    * @dev This function is used to get the seller percentage. 
    * This refers to the amount of money that would be distributed to the seller 
    * after the reduction of royalty and platform fees.
    * The values are multiplied by 100, in order to work easily 
    * with floating point percentages.
    */
    function getSellerFee() public view returns (uint256) {
        //Returning % multiplied by 100 to keep it uniform across contract
        return sellerFee;
    }


    /** @dev Calculate the royalty distribution for organisation/platform and the
    * creator/artist.
    * Each of the organisation, creator royalty and the parent organsation fees
    * are set in this function.
    * The 'sellerFee' indicates the final amount to be sent to the seller.
    */
    function setRoyaltyPercentage(uint256 _orgFee, uint _creatorFee, uint _blackUnicornFee) public onlyOwner returns (bool) {
        //Sum of org fee and creator fee should be 100%
        require(10000 > _orgFee+_creatorFee+_blackUnicornFee, "Sum of creator fee and org fee should be 100%");
        orgFee = _orgFee;
        creatorFee = _creatorFee;
        blackUniFee = _blackUnicornFee;
        sellerFee = 10000 - orgFee - creatorFee - blackUniFee;
        return true; 
    }

    /** @dev Calculate the royalty distribution for organisation/platform and the
    * creator/artist(who would be the seller) on the first sale.
    * The first iteration of whitepaper has the following stats:
    * orgFee = 2%
    * blackUnicornFee = 0.5%
    * artist royalty/creator fee = 0%
    * The above numbers can be updated later by the DAO
    * @notice _creatorFeeInitial should be sellerFeeInitial - seller fees on first sale
    */
    function setRoyaltyPercentageFirstSale(uint256 _orgFeeInitial, uint _creatorFeeInitial, uint _blackUnicornFeeInitial) public onlyOwner returns (bool) {
        orgFeeInitial = _orgFeeInitial;
        sellerFeeInitial = _creatorFeeInitial;
        _blackUnicornFeeInitial = _blackUnicornFeeInitial;
        return true;
    }

    /** @dev Return all the royalties including first sale and subsequent sale values
    * orgFee - % of fees that would go to the org from the total royalty
    * blackUniFee - % of fees for Black Unicorn
    * creatorRoyalty - % of fees that would go to the artist/creator
    * orgInitialRoyalty - % of fees that would go to the organisation on first sale
    * sellerFeeInitial - % of fees for seller on the first sale
    * blackUniFeeInitial - % of fees that would go to Black Unicorn on first sale
    */
    function getRoyalties() public view returns (uint _orgFee, uint _blackUniFee, uint256 _creatorRoyalty, 
    uint256 _orgInitialRoyalty, uint256 _sellerFeeInitial, uint _blakcUniFeeInitial) {
        
        return (orgFee, creatorFee, blackUniFee, orgFeeInitial, sellerFeeInitial, blackUniFeeInital);
    }

    /**
    * This function is used to set the price of a token
    * @notice Only admin is allowed to set the price of a token
    */
    function setPrice(uint256 tokenId, uint256 price) public onlyAdmin {
        salePrice[tokenId] = price;
    }

    /**
    * This function is used to change the price of a token
    * @notice Only token owner is allowed to change the price of a token
    */
    function changePrice(uint256 _tokenId, uint256 price) public onlyOwnerOf(_tokenId) {
        require(price > 0, "changePrice: Price cannot be changed to less than 0");
        salePrice[_tokenId] = price;
    }

    /**
    * This function is used to check if it is the first sale of a token
    * on the Ethernaal marketplace.
     */
    function isTokenFirstSale(uint tokenId) external view returns(bool){
        return tokenFirstSale[tokenId];
    }

    /**
    * This function is used to mint an NFT for the Ethernaal marketplace.
    * @dev The basic information related to the NFT needs to be passeed to this function,
    * in order to store it on chain to avoid disputes in future.
    */
    function mintWithIndex(address _creator, string memory _tokenURI, string memory title,
    string memory description, string memory artistName) public virtual onlyMinter returns (uint256 _tokenId) {
        _tokenIds.increment();
        uint256 tokenId = _tokenIds.current();
        tokenOwner[tokenId] = _creator;

       
        _mint(_creator, tokenId);
        _setTokenURI(tokenId, _tokenURI);

        tokenCreator[tokenId] = _creator;
        
        NFTData memory nftNew = NFTData(tokenId, title, description, artistName, _creator);
        mintedNfts.push(nftNew);
        
        creatorTokens[_creator].push(tokenId);
        emit Mint(_creator,tokenId, _tokenURI);
        return tokenId;
    }
    
    /**
    * This function is used to set an NFT on sale. 
    * @dev The sale price set in this function will be used to perform the sale transaction
    * once the buyer wants to buy an NFT.
    */
    function setSale(uint256 _tokenId, uint256 price) public virtual onlyOwnerOf(_tokenId) {
        address tOwner = ownerOf(_tokenId);
        require(tOwner != address(0), "setSale: nonexistent token");
        require(price != 0, "setSale: Price cannot be set to zero");
        salePrice[_tokenId] = price;
        emit SalePriceSet(_tokenId, price);
    }

    /**
    * This function is used to buy an NFT which is on sale.
    */
    function buyTokenOnSale(uint256 tokenId, address _nftAddress)
        public
        payable
    {
        ERC721 nftAddress = ERC721(_nftAddress);

        uint256 price = salePrice[tokenId];
        uint256 sellerFees = getSellerFee();
        uint256 creatorRoyalty = creatorFee;
        uint256 platformFees = orgFee;
        uint256 blackUnicornFee = blackUniFee;

        require(price != 0, "buyToken: price equals 0");
        require(
            msg.value == price,
            "buyToken: price doesn't equal salePrice[tokenId]"
        );
        address tOwner = nftAddress.ownerOf(tokenId);

        nftAddress.safeTransferFrom(tOwner, msg.sender, tokenId);
        salePrice[tokenId] = 0;

        if(tokenFirstSale[tokenId] == false) {
            /* Platform takes 2.5% on each artist's first sale
            *  All values are multiplied by 100 to deal with floating points
            */
            platformFees = orgFeeInitial;
            sellerFees = sellerFeeInitial;
            blackUnicornFee = blackUniFeeInital;
            //No creator royalty/royalties when artist is minting for the first time
            creatorRoyalty = 0;

            tokenFirstSale[tokenId] = true;
        }   
        
        //Dividing by 100*100 as all values are multiplied by 100
        uint256 toSeller = (msg.value * sellerFees) / FLOAT_HANDLER_TEN_4;
        
        //Dividing by 100*100 as all values are multiplied by 100
        uint256 toCreator = (msg.value*creatorRoyalty) / FLOAT_HANDLER_TEN_4;
        uint256 toPlatform = (msg.value*platformFees) / FLOAT_HANDLER_TEN_4;
        uint256 toBlackUnicorn = (msg.value*blackUnicornFee) / FLOAT_HANDLER_TEN_4;
        
        address tokenCreatorAddress = tokenCreator[tokenId];
        
        payable(tOwner).transfer(toSeller);
        if(toCreator != 0) {
            payable(tokenCreatorAddress).transfer(toCreator);
        }
        
        ethernaal_org.transfer(toPlatform);
        payable(blackUni_org).transfer(toBlackUnicorn);
        
        emit Sold(msg.sender, tOwner, msg.value,tokenId);
    }


    /**
    * This function is used to return all the tokens created by a specific creator
    */
    function tokenCreators(address _creator) external view onlyOwner returns(uint[] memory) {
            return creatorTokens[_creator];
    }

    /**
    * This function is used to whitelist a creator/ an artist on the platform
    */
    function whitelistCreator(address[] memory _creators) public onlyOwner {
        for(uint i = 0; i < _creators.length; i++){
            if(creatorWhitelist[_creators[i]]){
                //Do nothing if address is already whitelisted
            }
            else {
                creatorWhitelist[_creators[i]] = true;
                emit WhitelistCreator(_creators[i]);
            }
        }
        
    }

    /**
    * This function is used to unlist/delist a creator from the platform
    */
    function delistCreator(address[] memory _creators) public onlyOwner {
        for(uint i = 0; i < _creators.length; i++){
            if (creatorWhitelist[_creators[i]] == true){
                creatorWhitelist[_creators[i]] = false;
                emit DelistCreator(_creators[i]);
            }
        }
        
    }

    /**
    * This is a getter function to get the current price of an NFT.
    */
    function getSalePrice(uint256 tokenId) public view returns (uint256) {
        return salePrice[tokenId];
    }

    /**
    * This function returns if a creator is whitelisted on the platform or no
    */
    function isWhitelisted(address _creator) external view returns (bool) {
        return creatorWhitelist[_creator];
    }

    /**
    * This returns the total number of NFTs minted on the platform
    */
    function totalSupply() public view virtual returns (uint256) {
        return _tokenIds.current();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address payable","name":"org","type":"address"},{"internalType":"address payable","name":"blackUnicornOrg","type":"address"},{"internalType":"address payable","name":"_admin","type":"address"}],"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":"_creator","type":"address"}],"name":"DelistCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"tokenURI","type":"string"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"SalePriceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":true,"internalType":"address","name":"_seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Sold","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"}],"name":"WhitelistCreator","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"_nftAddress","type":"address"}],"name":"buyTokenOnSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_blakcUniOrg","type":"address"}],"name":"changeBlackUniAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOrg","type":"address"}],"name":"changeOrgAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimContractOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creatorWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_creators","type":"address[]"}],"name":"delistCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoyalties","outputs":[{"internalType":"uint256","name":"_orgFee","type":"uint256"},{"internalType":"uint256","name":"_blackUniFee","type":"uint256"},{"internalType":"uint256","name":"_creatorRoyalty","type":"uint256"},{"internalType":"uint256","name":"_orgInitialRoyalty","type":"uint256"},{"internalType":"uint256","name":"_sellerFeeInitial","type":"uint256"},{"internalType":"uint256","name":"_blakcUniFeeInitial","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"grantContractOwnership","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":"isTokenFirstSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"artistName","type":"string"}],"name":"mintWithIndex","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orgFee","type":"uint256"},{"internalType":"uint256","name":"_creatorFee","type":"uint256"},{"internalType":"uint256","name":"_blackUnicornFee","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orgFeeInitial","type":"uint256"},{"internalType":"uint256","name":"_creatorFeeInitial","type":"uint256"},{"internalType":"uint256","name":"_blackUnicornFeeInitial","type":"uint256"}],"name":"setRoyaltyPercentageFirstSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"}],"name":"tokenCreators","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_creators","type":"address[]"}],"name":"whitelistCreator","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200575c3803806200575c83398181016040528101906200003791906200033a565b848481600090805190602001906200005192919062000201565b5080600190805190602001906200006a92919062000201565b50505033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606460128190555060646013819055506032601481905550601454601354601254612710620001a191906200044d565b620001ad91906200044d565b620001b991906200044d565b60118190555060c86016819055506032601781905550601754601654612710620001e491906200044d565b620001f091906200044d565b601581905550505050505062000620565b8280546200020f90620004fc565b90600052602060002090601f0160209004810192826200023357600085556200027f565b82601f106200024e57805160ff19168380011785556200027f565b828001600101855582156200027f579182015b828111156200027e57825182559160200191906001019062000261565b5b5090506200028e919062000292565b5090565b5b80821115620002ad57600081600090555060010162000293565b5090565b6000620002c8620002c28462000417565b620003ee565b905082815260208101848484011115620002e157600080fd5b620002ee848285620004c6565b509392505050565b600081519050620003078162000606565b92915050565b600082601f8301126200031f57600080fd5b815162000331848260208601620002b1565b91505092915050565b600080600080600060a086880312156200035357600080fd5b600086015167ffffffffffffffff8111156200036e57600080fd5b6200037c888289016200030d565b955050602086015167ffffffffffffffff8111156200039a57600080fd5b620003a8888289016200030d565b9450506040620003bb88828901620002f6565b9350506060620003ce88828901620002f6565b9250506080620003e188828901620002f6565b9150509295509295909350565b6000620003fa6200040d565b905062000408828262000532565b919050565b6000604051905090565b600067ffffffffffffffff821115620004355762000434620005c6565b5b6200044082620005f5565b9050602081019050919050565b60006200045a82620004bc565b91506200046783620004bc565b9250828210156200047d576200047c62000568565b5b828203905092915050565b600062000495826200049c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620004e6578082015181840152602081019050620004c9565b83811115620004f6576000848401525b50505050565b600060028204905060018216806200051557607f821691505b602082108114156200052c576200052b62000597565b5b50919050565b6200053d82620005f5565b810181811067ffffffffffffffff821117156200055f576200055e620005c6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620006118162000488565b81146200061d57600080fd5b50565b61512c80620006306000396000f3fe6080604052600436106101f95760003560e01c80638e73a11e1161010d578063b88d4fde116100a0578063e59963a01161006f578063e59963a014610783578063e985e9c5146107ac578063f7d97577146107e9578063f8eb5fc514610812578063f901a18f1461084f576101f9565b8063b88d4fde146106b5578063bc073e10146106de578063c87b56dd14610709578063ce7e8de814610746576101f9565b80639ba4fd8c116100dc5780639ba4fd8c1461060a578063a22cb46514610647578063b3de019c14610670578063b58b98e414610699576101f9565b80638e73a11e1461053c57806395d89b411461057957806398f478d1146105a45780639b525665146105e1576101f9565b80633af32abf116101905780634e5dbd881161015f5780634e5dbd88146104335780635ef895fd1461045c5780636352211e1461049957806370a08231146104d6578063845b446d14610513576101f9565b80633af32abf146103795780633f2921ec146103b657806342842e0e146103f35780634592cd1d1461041c576101f9565b80630e3801bb116101cc5780630e3801bb146102cc57806318160ddd146102f557806323b872dd1461032057806333df048e14610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613a4d565b610878565b604051610232919061414a565b60405180910390f35b34801561024757600080fd5b5061025061095a565b60405161025d9190614165565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613a9f565b6109ec565b60405161029a919061408a565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906139d0565b610a71565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613765565b610b89565b005b34801561030157600080fd5b5061030a610c97565b60405161031791906144a7565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906137f3565b610ca8565b005b34801561035557600080fd5b5061035e610d08565b604051610370969594939291906144c2565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190613765565b610d37565b6040516103ad919061414a565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906138f9565b610d8d565b6040516103ea91906144a7565b60405180910390f35b3480156103ff57600080fd5b5061041a600480360381019061041591906137f3565b6110a1565b005b34801561042857600080fd5b506104316110c1565b005b34801561043f57600080fd5b5061045a60048036038101906104559190613765565b611296565b005b34801561046857600080fd5b50610483600480360381019061047e9190613a9f565b6113e7565b604051610490919061414a565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613a9f565b611411565b6040516104cd919061408a565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613765565b6114c3565b60405161050a91906144a7565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613765565b61157b565b005b34801561054857600080fd5b50610563600480360381019061055e9190613b40565b611689565b604051610570919061414a565b60405180910390f35b34801561058557600080fd5b5061058e61178f565b60405161059b9190614165565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613b40565b611821565b6040516105d8919061414a565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190613a0c565b611896565b005b34801561061657600080fd5b50610631600480360381019061062c9190613765565b611ac6565b60405161063e919061414a565b60405180910390f35b34801561065357600080fd5b5061066e600480360381019061066991906138bd565b611ae6565b005b34801561067c57600080fd5b5061069760048036038101906106929190613b04565b611afc565b005b6106b360048036038101906106ae9190613ac8565b611b9d565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190613842565b61206e565b005b3480156106ea57600080fd5b506106f36120d0565b60405161070091906144a7565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190613a9f565b6120da565b60405161073d9190614165565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613765565b61222c565b60405161077a9190614128565b60405180910390f35b34801561078f57600080fd5b506107aa60048036038101906107a59190613a0c565b61231d565b005b3480156107b857600080fd5b506107d360048036038101906107ce91906137b7565b61254f565b6040516107e0919061414a565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613b04565b6125e3565b005b34801561081e57600080fd5b5061083960048036038101906108349190613a9f565b612659565b60405161084691906144a7565b60405180910390f35b34801561085b57600080fd5b5061087660048036038101906108719190613b04565b612676565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109535750610952826127c4565b5b9050919050565b6060600080546109699061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546109959061481d565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b5050505050905090565b60006109f78261282e565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90614387565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7c82611411565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae4906143e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0c61289a565b73ffffffffffffffffffffffffffffffffffffffff161480610b3b5750610b3a81610b3561289a565b61254f565b5b610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906142a7565b60405180910390fd5b610b8483836128a2565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610be357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a90614247565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610ca3601961295b565b905090565b610cb9610cb361289a565b82612969565b610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90614407565b60405180910390fd5b610d03838383612a47565b505050565b600080600080600080601254601354601454601654601554601754955095509550955095509550909192939495565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600060011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610dec57600080fd5b610df66019612ca3565b6000610e02601961295b565b9050866009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e608782612cb9565b610e6a8187612e87565b86600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006040518060a001604052808381526020018781526020018681526020018581526020018973ffffffffffffffffffffffffffffffffffffffff168152509050601a819080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001556020820151816001019080519060200190610f4f9291906134de565b506040820151816002019080519060200190610f6c9291906134de565b506060820151816003019080519060200190610f899291906134de565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505586604051611047919061404f565b6040518091039020828973ffffffffffffffffffffffffffffffffffffffff167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a60405160405180910390a4819250505095945050505050565b6110bc8383836040518060200160405280600081525061206e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114890614427565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790614467565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f24fef68333a009942a0d4864d8fdf2266e208a96399f135b05c1dc92c3c31f9260405160405180910390a280600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b1906142e7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906142c7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c90614247565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e557600080fd5b8183856116f29190614652565b6116fc9190614652565b6127101161173f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611736906141c7565b60405180910390fd5b83601281905550826013819055508160148190555060145460135460125461271061176a9190614733565b6117749190614733565b61177e9190614733565b601181905550600190509392505050565b60606001805461179e9061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546117ca9061481d565b80156118175780601f106117ec57610100808354040283529160200191611817565b820191906000526020600020905b8154815290600101906020018083116117fa57829003601f168201915b5050505050905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461187d57600080fd5b8360168190555082601581905550600190509392505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f057600080fd5b60005b8151811015611ac25760086000838381518110611939577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561199357611aaf565b6001600860008484815181106119d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110611a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f55eed0aed3ec6e015b9ad5e984675fe36c0ce3aebdcb70f467670773f19f7f8d60405160405180910390a25b8080611aba90614880565b9150506118f3565b5050565b60086020528060005260406000206000915054906101000a900460ff1681565b611af8611af161289a565b8383612efb565b5050565b813373ffffffffffffffffffffffffffffffffffffffff16611b1d82611411565b73ffffffffffffffffffffffffffffffffffffffff1614611b3d57600080fd5b60008211611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790614327565b60405180910390fd5b816007600085815260200190815260200160002081905550505050565b60008190506000600760008581526020019081526020016000205490506000611bc46120d0565b90506000601354905060006012549050600060145490506000851415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690614487565b60405180910390fd5b843414611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c58906141e7565b60405180910390fd5b60008673ffffffffffffffffffffffffffffffffffffffff16636352211e8a6040518263ffffffff1660e01b8152600401611c9c91906144a7565b60206040518083038186803b158015611cb457600080fd5b505afa158015611cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cec919061378e565b90508673ffffffffffffffffffffffffffffffffffffffff166342842e0e82338c6040518463ffffffff1660e01b8152600401611d2b939291906140a5565b600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b505050506000600760008b81526020019081526020016000208190555060001515600c60008b815260200190815260200160002060009054906101000a900460ff1615151415611de357601654925060155494506017549150600093506001600c60008b815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60006127108634611df491906146d9565b611dfe91906146a8565b905060006127108634611e1191906146d9565b611e1b91906146a8565b905060006127108634611e2e91906146d9565b611e3891906146a8565b905060006127108634611e4b91906146d9565b611e5591906146a8565b90506000600a60008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015611ed5573d6000803e3d6000fd5b5060008414611f26578073ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611f24573d6000803e3d6000fd5b505b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611f8e573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611ff7573d6000803e3d6000fd5b508d8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f16dd16959a056953a63cf14bf427881e762e54f03d86b864efea8238dd3b822f3460405161205691906144a7565b60405180910390a45050505050505050505050505050565b61207f61207961289a565b83612969565b6120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b590614407565b60405180910390fd5b6120ca84848484613068565b50505050565b6000601154905090565b60606120e58261282e565b612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b90614367565b60405180910390fd5b60006006600084815260200190815260200160002080546121449061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546121709061481d565b80156121bd5780601f10612192576101008083540402835291602001916121bd565b820191906000526020600020905b8154815290600101906020018083116121a057829003601f168201915b5050505050905060006121ce6130c4565b90506000815114156121e4578192505050612227565b600082511115612219578082604051602001612201929190614066565b60405160208183030381529060405292505050612227565b612222846130db565b925050505b919050565b6060600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461228857600080fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561231157602002820191906000526020600020905b8154815260200190600101908083116122fd575b50505050509050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461237757600080fd5b60005b815181101561254b5760011515600860008484815181106123c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156125385760006008600084848151811061245b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508181815181106124ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f6cf070d2f10c217d5a08be5e12920a2019956160f831e8cd524ac95f84768df360405160405180910390a25b808061254390614880565b91505061237a565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461263d57600080fd5b8060076000848152602001908152602001600020819055505050565b600060076000838152602001908152602001600020549050919050565b813373ffffffffffffffffffffffffffffffffffffffff1661269782611411565b73ffffffffffffffffffffffffffffffffffffffff16146126b757600080fd5b60006126c284611411565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272b90614287565b60405180910390fd5b6000831415612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90614447565b60405180910390fd5b82600760008681526020019081526020016000208190555082847fe23ea816dce6d7f5c0b85cbd597e7c3b97b2453791152c0b94e5e5c5f314d2f060405160405180910390a350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661291583611411565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006129748261282e565b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614267565b60405180910390fd5b60006129be83611411565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a2d57508373ffffffffffffffffffffffffffffffffffffffff16612a15846109ec565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a3e5750612a3d818561254f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a6782611411565b73ffffffffffffffffffffffffffffffffffffffff1614612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab4906143a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2490614207565b60405180910390fd5b612b38838383613182565b612b436000826128a2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b939190614733565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bea9190614652565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2090614347565b60405180910390fd5b612d328161282e565b15612d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d69906141a7565b60405180910390fd5b612d7e60008383613182565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dce9190614652565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612e908261282e565b612ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec690614307565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612ef69291906134de565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614227565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161305b919061414a565b60405180910390a3505050565b613073848484612a47565b61307f84848484613187565b6130be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b590614187565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606130e68261282e565b613125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311c906143c7565b60405180910390fd5b600061312f6130c4565b9050600081511161314f576040518060200160405280600081525061317a565b806131598461331e565b60405160200161316a929190614066565b6040516020818303038152906040525b915050919050565b505050565b60006131a88473ffffffffffffffffffffffffffffffffffffffff166134cb565b15613311578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131d161289a565b8786866040518563ffffffff1660e01b81526004016131f394939291906140dc565b602060405180830381600087803b15801561320d57600080fd5b505af192505050801561323e57506040513d601f19601f8201168201806040525081019061323b9190613a76565b60015b6132c1573d806000811461326e576040519150601f19603f3d011682016040523d82523d6000602084013e613273565b606091505b506000815114156132b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b090614187565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613316565b600190505b949350505050565b60606000821415613366576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134c6565b600082905060005b6000821461339857808061338190614880565b915050600a8261339191906146a8565b915061336e565b60008167ffffffffffffffff8111156133da577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561340c5781602001600182028036833780820191505090505b5090505b600085146134bf576001826134259190614733565b9150600a8561343491906148c9565b60306134409190614652565b60f81b81838151811061347c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134b891906146a8565b9450613410565b8093505050505b919050565b600080823b905060008111915050919050565b8280546134ea9061481d565b90600052602060002090601f01602090048101928261350c5760008555613553565b82601f1061352557805160ff1916838001178555613553565b82800160010185558215613553579182015b82811115613552578251825591602001919060010190613537565b5b5090506135609190613564565b5090565b5b8082111561357d576000816000905550600101613565565b5090565b600061359461358f84614548565b614523565b905080838252602082019050828560208602820111156135b357600080fd5b60005b858110156135e357816135c98882613669565b8452602084019350602083019250506001810190506135b6565b5050509392505050565b60006136006135fb84614574565b614523565b90508281526020810184848401111561361857600080fd5b6136238482856147db565b509392505050565b600061363e613639846145a5565b614523565b90508281526020810184848401111561365657600080fd5b6136618482856147db565b509392505050565b6000813590506136788161509a565b92915050565b60008151905061368d8161509a565b92915050565b600082601f8301126136a457600080fd5b81356136b4848260208601613581565b91505092915050565b6000813590506136cc816150b1565b92915050565b6000813590506136e1816150c8565b92915050565b6000815190506136f6816150c8565b92915050565b600082601f83011261370d57600080fd5b813561371d8482602086016135ed565b91505092915050565b600082601f83011261373757600080fd5b813561374784826020860161362b565b91505092915050565b60008135905061375f816150df565b92915050565b60006020828403121561377757600080fd5b600061378584828501613669565b91505092915050565b6000602082840312156137a057600080fd5b60006137ae8482850161367e565b91505092915050565b600080604083850312156137ca57600080fd5b60006137d885828601613669565b92505060206137e985828601613669565b9150509250929050565b60008060006060848603121561380857600080fd5b600061381686828701613669565b935050602061382786828701613669565b925050604061383886828701613750565b9150509250925092565b6000806000806080858703121561385857600080fd5b600061386687828801613669565b945050602061387787828801613669565b935050604061388887828801613750565b925050606085013567ffffffffffffffff8111156138a557600080fd5b6138b1878288016136fc565b91505092959194509250565b600080604083850312156138d057600080fd5b60006138de85828601613669565b92505060206138ef858286016136bd565b9150509250929050565b600080600080600060a0868803121561391157600080fd5b600061391f88828901613669565b955050602086013567ffffffffffffffff81111561393c57600080fd5b61394888828901613726565b945050604086013567ffffffffffffffff81111561396557600080fd5b61397188828901613726565b935050606086013567ffffffffffffffff81111561398e57600080fd5b61399a88828901613726565b925050608086013567ffffffffffffffff8111156139b757600080fd5b6139c388828901613726565b9150509295509295909350565b600080604083850312156139e357600080fd5b60006139f185828601613669565b9250506020613a0285828601613750565b9150509250929050565b600060208284031215613a1e57600080fd5b600082013567ffffffffffffffff811115613a3857600080fd5b613a4484828501613693565b91505092915050565b600060208284031215613a5f57600080fd5b6000613a6d848285016136d2565b91505092915050565b600060208284031215613a8857600080fd5b6000613a96848285016136e7565b91505092915050565b600060208284031215613ab157600080fd5b6000613abf84828501613750565b91505092915050565b60008060408385031215613adb57600080fd5b6000613ae985828601613750565b9250506020613afa85828601613669565b9150509250929050565b60008060408385031215613b1757600080fd5b6000613b2585828601613750565b9250506020613b3685828601613750565b9150509250929050565b600080600060608486031215613b5557600080fd5b6000613b6386828701613750565b9350506020613b7486828701613750565b9250506040613b8586828701613750565b9150509250925092565b6000613b9b8383614031565b60208301905092915050565b613bb081614767565b82525050565b6000613bc1826145e6565b613bcb8185614614565b9350613bd6836145d6565b8060005b83811015613c07578151613bee8882613b8f565b9750613bf983614607565b925050600181019050613bda565b5085935050505092915050565b613c1d81614779565b82525050565b6000613c2e826145f1565b613c388185614625565b9350613c488185602086016147ea565b613c51816149b6565b840191505092915050565b6000613c67826145fc565b613c718185614636565b9350613c818185602086016147ea565b613c8a816149b6565b840191505092915050565b6000613ca0826145fc565b613caa8185614647565b9350613cba8185602086016147ea565b80840191505092915050565b6000613cd3603283614636565b9150613cde826149c7565b604082019050919050565b6000613cf6601c83614636565b9150613d0182614a16565b602082019050919050565b6000613d19602d83614636565b9150613d2482614a3f565b604082019050919050565b6000613d3c603083614636565b9150613d4782614a8e565b604082019050919050565b6000613d5f602483614636565b9150613d6a82614add565b604082019050919050565b6000613d82601983614636565b9150613d8d82614b2c565b602082019050919050565b6000613da5602783614636565b9150613db082614b55565b604082019050919050565b6000613dc8602c83614636565b9150613dd382614ba4565b604082019050919050565b6000613deb601a83614636565b9150613df682614bf3565b602082019050919050565b6000613e0e603883614636565b9150613e1982614c1c565b604082019050919050565b6000613e31602a83614636565b9150613e3c82614c6b565b604082019050919050565b6000613e54602983614636565b9150613e5f82614cba565b604082019050919050565b6000613e77602e83614636565b9150613e8282614d09565b604082019050919050565b6000613e9a603383614636565b9150613ea582614d58565b604082019050919050565b6000613ebd602083614636565b9150613ec882614da7565b602082019050919050565b6000613ee0603183614636565b9150613eeb82614dd0565b604082019050919050565b6000613f03602c83614636565b9150613f0e82614e1f565b604082019050919050565b6000613f26602983614636565b9150613f3182614e6e565b604082019050919050565b6000613f49602f83614636565b9150613f5482614ebd565b604082019050919050565b6000613f6c602183614636565b9150613f7782614f0c565b604082019050919050565b6000613f8f603183614636565b9150613f9a82614f5b565b604082019050919050565b6000613fb2602883614636565b9150613fbd82614faa565b604082019050919050565b6000613fd5602483614636565b9150613fe082614ff9565b604082019050919050565b6000613ff8602083614636565b915061400382615048565b602082019050919050565b600061401b601883614636565b915061402682615071565b602082019050919050565b61403a816147d1565b82525050565b614049816147d1565b82525050565b600061405b8284613c95565b915081905092915050565b60006140728285613c95565b915061407e8284613c95565b91508190509392505050565b600060208201905061409f6000830184613ba7565b92915050565b60006060820190506140ba6000830186613ba7565b6140c76020830185613ba7565b6140d46040830184614040565b949350505050565b60006080820190506140f16000830187613ba7565b6140fe6020830186613ba7565b61410b6040830185614040565b818103606083015261411d8184613c23565b905095945050505050565b600060208201905081810360008301526141428184613bb6565b905092915050565b600060208201905061415f6000830184613c14565b92915050565b6000602082019050818103600083015261417f8184613c5c565b905092915050565b600060208201905081810360008301526141a081613cc6565b9050919050565b600060208201905081810360008301526141c081613ce9565b9050919050565b600060208201905081810360008301526141e081613d0c565b9050919050565b6000602082019050818103600083015261420081613d2f565b9050919050565b6000602082019050818103600083015261422081613d52565b9050919050565b6000602082019050818103600083015261424081613d75565b9050919050565b6000602082019050818103600083015261426081613d98565b9050919050565b6000602082019050818103600083015261428081613dbb565b9050919050565b600060208201905081810360008301526142a081613dde565b9050919050565b600060208201905081810360008301526142c081613e01565b9050919050565b600060208201905081810360008301526142e081613e24565b9050919050565b6000602082019050818103600083015261430081613e47565b9050919050565b6000602082019050818103600083015261432081613e6a565b9050919050565b6000602082019050818103600083015261434081613e8d565b9050919050565b6000602082019050818103600083015261436081613eb0565b9050919050565b6000602082019050818103600083015261438081613ed3565b9050919050565b600060208201905081810360008301526143a081613ef6565b9050919050565b600060208201905081810360008301526143c081613f19565b9050919050565b600060208201905081810360008301526143e081613f3c565b9050919050565b6000602082019050818103600083015261440081613f5f565b9050919050565b6000602082019050818103600083015261442081613f82565b9050919050565b6000602082019050818103600083015261444081613fa5565b9050919050565b6000602082019050818103600083015261446081613fc8565b9050919050565b6000602082019050818103600083015261448081613feb565b9050919050565b600060208201905081810360008301526144a08161400e565b9050919050565b60006020820190506144bc6000830184614040565b92915050565b600060c0820190506144d76000830189614040565b6144e46020830188614040565b6144f16040830187614040565b6144fe6060830186614040565b61450b6080830185614040565b61451860a0830184614040565b979650505050505050565b600061452d61453e565b9050614539828261484f565b919050565b6000604051905090565b600067ffffffffffffffff82111561456357614562614987565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561458f5761458e614987565b5b614598826149b6565b9050602081019050919050565b600067ffffffffffffffff8211156145c0576145bf614987565b5b6145c9826149b6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061465d826147d1565b9150614668836147d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561469d5761469c6148fa565b5b828201905092915050565b60006146b3826147d1565b91506146be836147d1565b9250826146ce576146cd614929565b5b828204905092915050565b60006146e4826147d1565b91506146ef836147d1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614728576147276148fa565b5b828202905092915050565b600061473e826147d1565b9150614749836147d1565b92508282101561475c5761475b6148fa565b5b828203905092915050565b6000614772826147b1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148085780820151818401526020810190506147ed565b83811115614817576000848401525b50505050565b6000600282049050600182168061483557607f821691505b6020821081141561484957614848614958565b5b50919050565b614858826149b6565b810181811067ffffffffffffffff8211171561487757614876614987565b5b80604052505050565b600061488b826147d1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148be576148bd6148fa565b5b600182019050919050565b60006148d4826147d1565b91506148df836147d1565b9250826148ef576148ee614929565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53756d206f662063726561746f722066656520616e64206f726720666565207360008201527f686f756c64206265203130302500000000000000000000000000000000000000602082015250565b7f627579546f6b656e3a20707269636520646f65736e277420657175616c20736160008201527f6c6550726963655b746f6b656e49645d00000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6577206f7267616e697a6174696f6e2063616e6e6f74206265207a65726f2060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f73657453616c653a206e6f6e6578697374656e7420746f6b656e000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f6368616e676550726963653a2050726963652063616e6e6f742062652063686160008201527f6e67656420746f206c657373207468616e203000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206772616e7460008201527f6564206f776e6572000000000000000000000000000000000000000000000000602082015250565b7f73657453616c653a2050726963652063616e6e6f742062652073657420746f2060008201527f7a65726f00000000000000000000000000000000000000000000000000000000602082015250565b7f4e6577206f776e65722063616e6e6f74206265207a65726f2061646472657373600082015250565b7f627579546f6b656e3a20707269636520657175616c7320300000000000000000600082015250565b6150a381614767565b81146150ae57600080fd5b50565b6150ba81614779565b81146150c557600080fd5b50565b6150d181614785565b81146150dc57600080fd5b50565b6150e8816147d1565b81146150f357600080fd5b5056fea2646970667358221220f0dd9dfaeb0e251e60842ca9155890276e0e2d724e532221027fac81d7174db164736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000a11cba1e8ccdf11be6865c32ddc0f4028c10c54000000000000000000000000e3b2abb5307fa5722ed19293f2eb362fc44a16fa000000000000000000000000585511695eb36bc7eee59019f4c52f4a70f2ee77000000000000000000000000000000000000000000000000000000000000000f45746865726e61616c466c614e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666c614e46540000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80638e73a11e1161010d578063b88d4fde116100a0578063e59963a01161006f578063e59963a014610783578063e985e9c5146107ac578063f7d97577146107e9578063f8eb5fc514610812578063f901a18f1461084f576101f9565b8063b88d4fde146106b5578063bc073e10146106de578063c87b56dd14610709578063ce7e8de814610746576101f9565b80639ba4fd8c116100dc5780639ba4fd8c1461060a578063a22cb46514610647578063b3de019c14610670578063b58b98e414610699576101f9565b80638e73a11e1461053c57806395d89b411461057957806398f478d1146105a45780639b525665146105e1576101f9565b80633af32abf116101905780634e5dbd881161015f5780634e5dbd88146104335780635ef895fd1461045c5780636352211e1461049957806370a08231146104d6578063845b446d14610513576101f9565b80633af32abf146103795780633f2921ec146103b657806342842e0e146103f35780634592cd1d1461041c576101f9565b80630e3801bb116101cc5780630e3801bb146102cc57806318160ddd146102f557806323b872dd1461032057806333df048e14610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613a4d565b610878565b604051610232919061414a565b60405180910390f35b34801561024757600080fd5b5061025061095a565b60405161025d9190614165565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613a9f565b6109ec565b60405161029a919061408a565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906139d0565b610a71565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613765565b610b89565b005b34801561030157600080fd5b5061030a610c97565b60405161031791906144a7565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906137f3565b610ca8565b005b34801561035557600080fd5b5061035e610d08565b604051610370969594939291906144c2565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190613765565b610d37565b6040516103ad919061414a565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906138f9565b610d8d565b6040516103ea91906144a7565b60405180910390f35b3480156103ff57600080fd5b5061041a600480360381019061041591906137f3565b6110a1565b005b34801561042857600080fd5b506104316110c1565b005b34801561043f57600080fd5b5061045a60048036038101906104559190613765565b611296565b005b34801561046857600080fd5b50610483600480360381019061047e9190613a9f565b6113e7565b604051610490919061414a565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613a9f565b611411565b6040516104cd919061408a565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613765565b6114c3565b60405161050a91906144a7565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613765565b61157b565b005b34801561054857600080fd5b50610563600480360381019061055e9190613b40565b611689565b604051610570919061414a565b60405180910390f35b34801561058557600080fd5b5061058e61178f565b60405161059b9190614165565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613b40565b611821565b6040516105d8919061414a565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190613a0c565b611896565b005b34801561061657600080fd5b50610631600480360381019061062c9190613765565b611ac6565b60405161063e919061414a565b60405180910390f35b34801561065357600080fd5b5061066e600480360381019061066991906138bd565b611ae6565b005b34801561067c57600080fd5b5061069760048036038101906106929190613b04565b611afc565b005b6106b360048036038101906106ae9190613ac8565b611b9d565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190613842565b61206e565b005b3480156106ea57600080fd5b506106f36120d0565b60405161070091906144a7565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190613a9f565b6120da565b60405161073d9190614165565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613765565b61222c565b60405161077a9190614128565b60405180910390f35b34801561078f57600080fd5b506107aa60048036038101906107a59190613a0c565b61231d565b005b3480156107b857600080fd5b506107d360048036038101906107ce91906137b7565b61254f565b6040516107e0919061414a565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613b04565b6125e3565b005b34801561081e57600080fd5b5061083960048036038101906108349190613a9f565b612659565b60405161084691906144a7565b60405180910390f35b34801561085b57600080fd5b5061087660048036038101906108719190613b04565b612676565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109535750610952826127c4565b5b9050919050565b6060600080546109699061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546109959061481d565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b5050505050905090565b60006109f78261282e565b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90614387565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7c82611411565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae4906143e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0c61289a565b73ffffffffffffffffffffffffffffffffffffffff161480610b3b5750610b3a81610b3561289a565b61254f565b5b610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906142a7565b60405180910390fd5b610b8483836128a2565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610be357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a90614247565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610ca3601961295b565b905090565b610cb9610cb361289a565b82612969565b610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90614407565b60405180910390fd5b610d03838383612a47565b505050565b600080600080600080601254601354601454601654601554601754955095509550955095509550909192939495565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600060011515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610dec57600080fd5b610df66019612ca3565b6000610e02601961295b565b9050866009600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e608782612cb9565b610e6a8187612e87565b86600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006040518060a001604052808381526020018781526020018681526020018581526020018973ffffffffffffffffffffffffffffffffffffffff168152509050601a819080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001556020820151816001019080519060200190610f4f9291906134de565b506040820151816002019080519060200190610f6c9291906134de565b506060820151816003019080519060200190610f899291906134de565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505586604051611047919061404f565b6040518091039020828973ffffffffffffffffffffffffffffffffffffffff167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a60405160405180910390a4819250505095945050505050565b6110bc8383836040518060200160405280600081525061206e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114890614427565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790614467565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f24fef68333a009942a0d4864d8fdf2266e208a96399f135b05c1dc92c3c31f9260405160405180910390a280600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600c600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b1906142e7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906142c7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c90614247565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e557600080fd5b8183856116f29190614652565b6116fc9190614652565b6127101161173f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611736906141c7565b60405180910390fd5b83601281905550826013819055508160148190555060145460135460125461271061176a9190614733565b6117749190614733565b61177e9190614733565b601181905550600190509392505050565b60606001805461179e9061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546117ca9061481d565b80156118175780601f106117ec57610100808354040283529160200191611817565b820191906000526020600020905b8154815290600101906020018083116117fa57829003601f168201915b5050505050905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461187d57600080fd5b8360168190555082601581905550600190509392505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f057600080fd5b60005b8151811015611ac25760086000838381518110611939577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561199357611aaf565b6001600860008484815181106119d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550818181518110611a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f55eed0aed3ec6e015b9ad5e984675fe36c0ce3aebdcb70f467670773f19f7f8d60405160405180910390a25b8080611aba90614880565b9150506118f3565b5050565b60086020528060005260406000206000915054906101000a900460ff1681565b611af8611af161289a565b8383612efb565b5050565b813373ffffffffffffffffffffffffffffffffffffffff16611b1d82611411565b73ffffffffffffffffffffffffffffffffffffffff1614611b3d57600080fd5b60008211611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790614327565b60405180910390fd5b816007600085815260200190815260200160002081905550505050565b60008190506000600760008581526020019081526020016000205490506000611bc46120d0565b90506000601354905060006012549050600060145490506000851415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690614487565b60405180910390fd5b843414611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c58906141e7565b60405180910390fd5b60008673ffffffffffffffffffffffffffffffffffffffff16636352211e8a6040518263ffffffff1660e01b8152600401611c9c91906144a7565b60206040518083038186803b158015611cb457600080fd5b505afa158015611cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cec919061378e565b90508673ffffffffffffffffffffffffffffffffffffffff166342842e0e82338c6040518463ffffffff1660e01b8152600401611d2b939291906140a5565b600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b505050506000600760008b81526020019081526020016000208190555060001515600c60008b815260200190815260200160002060009054906101000a900460ff1615151415611de357601654925060155494506017549150600093506001600c60008b815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60006127108634611df491906146d9565b611dfe91906146a8565b905060006127108634611e1191906146d9565b611e1b91906146a8565b905060006127108634611e2e91906146d9565b611e3891906146a8565b905060006127108634611e4b91906146d9565b611e5591906146a8565b90506000600a60008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015611ed5573d6000803e3d6000fd5b5060008414611f26578073ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611f24573d6000803e3d6000fd5b505b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611f8e573d6000803e3d6000fd5b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611ff7573d6000803e3d6000fd5b508d8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f16dd16959a056953a63cf14bf427881e762e54f03d86b864efea8238dd3b822f3460405161205691906144a7565b60405180910390a45050505050505050505050505050565b61207f61207961289a565b83612969565b6120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b590614407565b60405180910390fd5b6120ca84848484613068565b50505050565b6000601154905090565b60606120e58261282e565b612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b90614367565b60405180910390fd5b60006006600084815260200190815260200160002080546121449061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546121709061481d565b80156121bd5780601f10612192576101008083540402835291602001916121bd565b820191906000526020600020905b8154815290600101906020018083116121a057829003601f168201915b5050505050905060006121ce6130c4565b90506000815114156121e4578192505050612227565b600082511115612219578082604051602001612201929190614066565b60405160208183030381529060405292505050612227565b612222846130db565b925050505b919050565b6060600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461228857600080fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561231157602002820191906000526020600020905b8154815260200190600101908083116122fd575b50505050509050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461237757600080fd5b60005b815181101561254b5760011515600860008484815181106123c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156125385760006008600084848151811061245b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508181815181106124ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f6cf070d2f10c217d5a08be5e12920a2019956160f831e8cd524ac95f84768df360405160405180910390a25b808061254390614880565b91505061237a565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461263d57600080fd5b8060076000848152602001908152602001600020819055505050565b600060076000838152602001908152602001600020549050919050565b813373ffffffffffffffffffffffffffffffffffffffff1661269782611411565b73ffffffffffffffffffffffffffffffffffffffff16146126b757600080fd5b60006126c284611411565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272b90614287565b60405180910390fd5b6000831415612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90614447565b60405180910390fd5b82600760008681526020019081526020016000208190555082847fe23ea816dce6d7f5c0b85cbd597e7c3b97b2453791152c0b94e5e5c5f314d2f060405160405180910390a350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661291583611411565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006129748261282e565b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614267565b60405180910390fd5b60006129be83611411565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a2d57508373ffffffffffffffffffffffffffffffffffffffff16612a15846109ec565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a3e5750612a3d818561254f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a6782611411565b73ffffffffffffffffffffffffffffffffffffffff1614612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab4906143a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2490614207565b60405180910390fd5b612b38838383613182565b612b436000826128a2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b939190614733565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bea9190614652565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2090614347565b60405180910390fd5b612d328161282e565b15612d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d69906141a7565b60405180910390fd5b612d7e60008383613182565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dce9190614652565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612e908261282e565b612ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec690614307565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612ef69291906134de565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6190614227565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161305b919061414a565b60405180910390a3505050565b613073848484612a47565b61307f84848484613187565b6130be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b590614187565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606130e68261282e565b613125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311c906143c7565b60405180910390fd5b600061312f6130c4565b9050600081511161314f576040518060200160405280600081525061317a565b806131598461331e565b60405160200161316a929190614066565b6040516020818303038152906040525b915050919050565b505050565b60006131a88473ffffffffffffffffffffffffffffffffffffffff166134cb565b15613311578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131d161289a565b8786866040518563ffffffff1660e01b81526004016131f394939291906140dc565b602060405180830381600087803b15801561320d57600080fd5b505af192505050801561323e57506040513d601f19601f8201168201806040525081019061323b9190613a76565b60015b6132c1573d806000811461326e576040519150601f19603f3d011682016040523d82523d6000602084013e613273565b606091505b506000815114156132b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b090614187565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613316565b600190505b949350505050565b60606000821415613366576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134c6565b600082905060005b6000821461339857808061338190614880565b915050600a8261339191906146a8565b915061336e565b60008167ffffffffffffffff8111156133da577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561340c5781602001600182028036833780820191505090505b5090505b600085146134bf576001826134259190614733565b9150600a8561343491906148c9565b60306134409190614652565b60f81b81838151811061347c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134b891906146a8565b9450613410565b8093505050505b919050565b600080823b905060008111915050919050565b8280546134ea9061481d565b90600052602060002090601f01602090048101928261350c5760008555613553565b82601f1061352557805160ff1916838001178555613553565b82800160010185558215613553579182015b82811115613552578251825591602001919060010190613537565b5b5090506135609190613564565b5090565b5b8082111561357d576000816000905550600101613565565b5090565b600061359461358f84614548565b614523565b905080838252602082019050828560208602820111156135b357600080fd5b60005b858110156135e357816135c98882613669565b8452602084019350602083019250506001810190506135b6565b5050509392505050565b60006136006135fb84614574565b614523565b90508281526020810184848401111561361857600080fd5b6136238482856147db565b509392505050565b600061363e613639846145a5565b614523565b90508281526020810184848401111561365657600080fd5b6136618482856147db565b509392505050565b6000813590506136788161509a565b92915050565b60008151905061368d8161509a565b92915050565b600082601f8301126136a457600080fd5b81356136b4848260208601613581565b91505092915050565b6000813590506136cc816150b1565b92915050565b6000813590506136e1816150c8565b92915050565b6000815190506136f6816150c8565b92915050565b600082601f83011261370d57600080fd5b813561371d8482602086016135ed565b91505092915050565b600082601f83011261373757600080fd5b813561374784826020860161362b565b91505092915050565b60008135905061375f816150df565b92915050565b60006020828403121561377757600080fd5b600061378584828501613669565b91505092915050565b6000602082840312156137a057600080fd5b60006137ae8482850161367e565b91505092915050565b600080604083850312156137ca57600080fd5b60006137d885828601613669565b92505060206137e985828601613669565b9150509250929050565b60008060006060848603121561380857600080fd5b600061381686828701613669565b935050602061382786828701613669565b925050604061383886828701613750565b9150509250925092565b6000806000806080858703121561385857600080fd5b600061386687828801613669565b945050602061387787828801613669565b935050604061388887828801613750565b925050606085013567ffffffffffffffff8111156138a557600080fd5b6138b1878288016136fc565b91505092959194509250565b600080604083850312156138d057600080fd5b60006138de85828601613669565b92505060206138ef858286016136bd565b9150509250929050565b600080600080600060a0868803121561391157600080fd5b600061391f88828901613669565b955050602086013567ffffffffffffffff81111561393c57600080fd5b61394888828901613726565b945050604086013567ffffffffffffffff81111561396557600080fd5b61397188828901613726565b935050606086013567ffffffffffffffff81111561398e57600080fd5b61399a88828901613726565b925050608086013567ffffffffffffffff8111156139b757600080fd5b6139c388828901613726565b9150509295509295909350565b600080604083850312156139e357600080fd5b60006139f185828601613669565b9250506020613a0285828601613750565b9150509250929050565b600060208284031215613a1e57600080fd5b600082013567ffffffffffffffff811115613a3857600080fd5b613a4484828501613693565b91505092915050565b600060208284031215613a5f57600080fd5b6000613a6d848285016136d2565b91505092915050565b600060208284031215613a8857600080fd5b6000613a96848285016136e7565b91505092915050565b600060208284031215613ab157600080fd5b6000613abf84828501613750565b91505092915050565b60008060408385031215613adb57600080fd5b6000613ae985828601613750565b9250506020613afa85828601613669565b9150509250929050565b60008060408385031215613b1757600080fd5b6000613b2585828601613750565b9250506020613b3685828601613750565b9150509250929050565b600080600060608486031215613b5557600080fd5b6000613b6386828701613750565b9350506020613b7486828701613750565b9250506040613b8586828701613750565b9150509250925092565b6000613b9b8383614031565b60208301905092915050565b613bb081614767565b82525050565b6000613bc1826145e6565b613bcb8185614614565b9350613bd6836145d6565b8060005b83811015613c07578151613bee8882613b8f565b9750613bf983614607565b925050600181019050613bda565b5085935050505092915050565b613c1d81614779565b82525050565b6000613c2e826145f1565b613c388185614625565b9350613c488185602086016147ea565b613c51816149b6565b840191505092915050565b6000613c67826145fc565b613c718185614636565b9350613c818185602086016147ea565b613c8a816149b6565b840191505092915050565b6000613ca0826145fc565b613caa8185614647565b9350613cba8185602086016147ea565b80840191505092915050565b6000613cd3603283614636565b9150613cde826149c7565b604082019050919050565b6000613cf6601c83614636565b9150613d0182614a16565b602082019050919050565b6000613d19602d83614636565b9150613d2482614a3f565b604082019050919050565b6000613d3c603083614636565b9150613d4782614a8e565b604082019050919050565b6000613d5f602483614636565b9150613d6a82614add565b604082019050919050565b6000613d82601983614636565b9150613d8d82614b2c565b602082019050919050565b6000613da5602783614636565b9150613db082614b55565b604082019050919050565b6000613dc8602c83614636565b9150613dd382614ba4565b604082019050919050565b6000613deb601a83614636565b9150613df682614bf3565b602082019050919050565b6000613e0e603883614636565b9150613e1982614c1c565b604082019050919050565b6000613e31602a83614636565b9150613e3c82614c6b565b604082019050919050565b6000613e54602983614636565b9150613e5f82614cba565b604082019050919050565b6000613e77602e83614636565b9150613e8282614d09565b604082019050919050565b6000613e9a603383614636565b9150613ea582614d58565b604082019050919050565b6000613ebd602083614636565b9150613ec882614da7565b602082019050919050565b6000613ee0603183614636565b9150613eeb82614dd0565b604082019050919050565b6000613f03602c83614636565b9150613f0e82614e1f565b604082019050919050565b6000613f26602983614636565b9150613f3182614e6e565b604082019050919050565b6000613f49602f83614636565b9150613f5482614ebd565b604082019050919050565b6000613f6c602183614636565b9150613f7782614f0c565b604082019050919050565b6000613f8f603183614636565b9150613f9a82614f5b565b604082019050919050565b6000613fb2602883614636565b9150613fbd82614faa565b604082019050919050565b6000613fd5602483614636565b9150613fe082614ff9565b604082019050919050565b6000613ff8602083614636565b915061400382615048565b602082019050919050565b600061401b601883614636565b915061402682615071565b602082019050919050565b61403a816147d1565b82525050565b614049816147d1565b82525050565b600061405b8284613c95565b915081905092915050565b60006140728285613c95565b915061407e8284613c95565b91508190509392505050565b600060208201905061409f6000830184613ba7565b92915050565b60006060820190506140ba6000830186613ba7565b6140c76020830185613ba7565b6140d46040830184614040565b949350505050565b60006080820190506140f16000830187613ba7565b6140fe6020830186613ba7565b61410b6040830185614040565b818103606083015261411d8184613c23565b905095945050505050565b600060208201905081810360008301526141428184613bb6565b905092915050565b600060208201905061415f6000830184613c14565b92915050565b6000602082019050818103600083015261417f8184613c5c565b905092915050565b600060208201905081810360008301526141a081613cc6565b9050919050565b600060208201905081810360008301526141c081613ce9565b9050919050565b600060208201905081810360008301526141e081613d0c565b9050919050565b6000602082019050818103600083015261420081613d2f565b9050919050565b6000602082019050818103600083015261422081613d52565b9050919050565b6000602082019050818103600083015261424081613d75565b9050919050565b6000602082019050818103600083015261426081613d98565b9050919050565b6000602082019050818103600083015261428081613dbb565b9050919050565b600060208201905081810360008301526142a081613dde565b9050919050565b600060208201905081810360008301526142c081613e01565b9050919050565b600060208201905081810360008301526142e081613e24565b9050919050565b6000602082019050818103600083015261430081613e47565b9050919050565b6000602082019050818103600083015261432081613e6a565b9050919050565b6000602082019050818103600083015261434081613e8d565b9050919050565b6000602082019050818103600083015261436081613eb0565b9050919050565b6000602082019050818103600083015261438081613ed3565b9050919050565b600060208201905081810360008301526143a081613ef6565b9050919050565b600060208201905081810360008301526143c081613f19565b9050919050565b600060208201905081810360008301526143e081613f3c565b9050919050565b6000602082019050818103600083015261440081613f5f565b9050919050565b6000602082019050818103600083015261442081613f82565b9050919050565b6000602082019050818103600083015261444081613fa5565b9050919050565b6000602082019050818103600083015261446081613fc8565b9050919050565b6000602082019050818103600083015261448081613feb565b9050919050565b600060208201905081810360008301526144a08161400e565b9050919050565b60006020820190506144bc6000830184614040565b92915050565b600060c0820190506144d76000830189614040565b6144e46020830188614040565b6144f16040830187614040565b6144fe6060830186614040565b61450b6080830185614040565b61451860a0830184614040565b979650505050505050565b600061452d61453e565b9050614539828261484f565b919050565b6000604051905090565b600067ffffffffffffffff82111561456357614562614987565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561458f5761458e614987565b5b614598826149b6565b9050602081019050919050565b600067ffffffffffffffff8211156145c0576145bf614987565b5b6145c9826149b6565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061465d826147d1565b9150614668836147d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561469d5761469c6148fa565b5b828201905092915050565b60006146b3826147d1565b91506146be836147d1565b9250826146ce576146cd614929565b5b828204905092915050565b60006146e4826147d1565b91506146ef836147d1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614728576147276148fa565b5b828202905092915050565b600061473e826147d1565b9150614749836147d1565b92508282101561475c5761475b6148fa565b5b828203905092915050565b6000614772826147b1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148085780820151818401526020810190506147ed565b83811115614817576000848401525b50505050565b6000600282049050600182168061483557607f821691505b6020821081141561484957614848614958565b5b50919050565b614858826149b6565b810181811067ffffffffffffffff8211171561487757614876614987565b5b80604052505050565b600061488b826147d1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148be576148bd6148fa565b5b600182019050919050565b60006148d4826147d1565b91506148df836147d1565b9250826148ef576148ee614929565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53756d206f662063726561746f722066656520616e64206f726720666565207360008201527f686f756c64206265203130302500000000000000000000000000000000000000602082015250565b7f627579546f6b656e3a20707269636520646f65736e277420657175616c20736160008201527f6c6550726963655b746f6b656e49645d00000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6577206f7267616e697a6174696f6e2063616e6e6f74206265207a65726f2060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f73657453616c653a206e6f6e6578697374656e7420746f6b656e000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f6368616e676550726963653a2050726963652063616e6e6f742062652063686160008201527f6e67656420746f206c657373207468616e203000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206772616e7460008201527f6564206f776e6572000000000000000000000000000000000000000000000000602082015250565b7f73657453616c653a2050726963652063616e6e6f742062652073657420746f2060008201527f7a65726f00000000000000000000000000000000000000000000000000000000602082015250565b7f4e6577206f776e65722063616e6e6f74206265207a65726f2061646472657373600082015250565b7f627579546f6b656e3a20707269636520657175616c7320300000000000000000600082015250565b6150a381614767565b81146150ae57600080fd5b50565b6150ba81614779565b81146150c557600080fd5b50565b6150d181614785565b81146150dc57600080fd5b50565b6150e8816147d1565b81146150f357600080fd5b5056fea2646970667358221220f0dd9dfaeb0e251e60842ca9155890276e0e2d724e532221027fac81d7174db164736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000a11cba1e8ccdf11be6865c32ddc0f4028c10c54000000000000000000000000e3b2abb5307fa5722ed19293f2eb362fc44a16fa000000000000000000000000585511695eb36bc7eee59019f4c52f4a70f2ee77000000000000000000000000000000000000000000000000000000000000000f45746865726e61616c466c614e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666c614e46540000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): EthernaalFlaNFT
Arg [1] : _symbol (string): flaNFT
Arg [2] : org (address): 0x0a11cBA1E8CcdF11be6865C32ddC0f4028C10C54
Arg [3] : blackUnicornOrg (address): 0xE3b2abb5307fa5722ed19293F2eb362fc44a16Fa
Arg [4] : _admin (address): 0x585511695EB36bC7eEe59019f4c52F4a70F2EE77

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000a11cba1e8ccdf11be6865c32ddc0f4028c10c54
Arg [3] : 000000000000000000000000e3b2abb5307fa5722ed19293f2eb362fc44a16fa
Arg [4] : 000000000000000000000000585511695eb36bc7eee59019f4c52f4a70f2ee77
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [6] : 45746865726e61616c466c614e46540000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 666c614e46540000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

44626:14359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29744:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32248:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31771:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49312:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58876:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32998:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52152:311;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;58661:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53603:730;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33408:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48466:275;;;;;;;;;;;;;:::i;:::-;;48055:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53230:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30383:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30113:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48922:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50341:488;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30858:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51294:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57494:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44765:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32541:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52881:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55000:2138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33664:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49862:165;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42695:679;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57249:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58019:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32767:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52610:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58444:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54551:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29744:305;29846:4;29898:25;29883:40;;;:11;:40;;;;:105;;;;29955:33;29940:48;;;:11;:48;;;;29883:105;:158;;;;30005:36;30029:11;30005:23;:36::i;:::-;29883:158;29863:178;;29744:305;;;:::o;30689:100::-;30743:13;30776:5;30769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30689:100;:::o;32248:221::-;32324:7;32352:16;32360:7;32352;:16::i;:::-;32344:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32437:15;:24;32453:7;32437:24;;;;;;;;;;;;;;;;;;;;;32430:31;;32248:221;;;:::o;31771:411::-;31852:13;31868:23;31883:7;31868:14;:23::i;:::-;31852:39;;31916:5;31910:11;;:2;:11;;;;31902:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32010:5;31994:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32019:37;32036:5;32043:12;:10;:12::i;:::-;32019:16;:37::i;:::-;31994:62;31972:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32153:21;32162:2;32166:7;32153:8;:21::i;:::-;31771:411;;;:::o;49312:214::-;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;49425:1:::1;49401:26;;:12;:26;;;;49393:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;49505:12;49482;;:36;;;;;;;;;;;;;;;;;;49312:214:::0;:::o;58876:106::-;58928:7;58955:19;:9;:17;:19::i;:::-;58948:26;;58876:106;:::o;32998:339::-;33193:41;33212:12;:10;:12::i;:::-;33226:7;33193:18;:41::i;:::-;33185:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33301:28;33311:4;33317:2;33321:7;33301:9;:28::i;:::-;32998:339;;;:::o;52152:311::-;52197:12;52211:17;52230:23;52261:26;52289:25;52316:24;52371:6;;52379:10;;52391:11;;52404:13;;52419:16;;52437:17;;52363:92;;;;;;;;;;;;52152:311;;;;;;:::o;58661:122::-;58725:4;58749:16;:26;58766:8;58749:26;;;;;;;;;;;;;;;;;;;;;;;;;58742:33;;58661:122;;;:::o;53603:730::-;53783:16;46431:4;46399:36;;:16;:28;46416:10;46399:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;46391:45;;;;;;53812:21:::1;:9;:19;:21::i;:::-;53844:15;53862:19;:9;:17;:19::i;:::-;53844:37;;53914:8;53892:10;:19;53903:7;53892:19;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;53944:24;53950:8;53960:7;53944:5;:24::i;:::-;53979:32;53992:7;54001:9;53979:12;:32::i;:::-;54048:8;54024:12;:21;54037:7;54024:21;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;54077:21;54101:58;;;;;;;;54109:7;54101:58;;;;54118:5;54101:58;;;;54125:11;54101:58;;;;54138:10;54101:58;;;;54150:8;54101:58;;;;::::0;54077:82:::1;;54170:10;54186:6;54170:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54214:13;:23;54228:8;54214:23;;;;;;;;;;;;;;;54243:7;54214:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54290:9;54267:33;;;;;;:::i;:::-;;;;;;;;54281:7;54272:8;54267:33;;;;;;;;;;;;54318:7;54311:14;;;;53603:730:::0;;;;;;;:::o;33408:185::-;33546:39;33563:4;33569:2;33573:7;33546:39;;;;;;;;;;;;:16;:39::i;:::-;33408:185;;;:::o;48466:275::-;48551:10;48534:27;;:13;;;;;;;;;;;:27;;;48526:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;48650:13;;;;;;;;;;;48622:42;;48643:5;;;;;;;;;;;48622:42;;;;;;;;;;;;48683:13;;;;;;;;;;;48675:5;;:21;;;;;;;;;;;;;;;;;;48731:1;48707:13;;:26;;;;;;;;;;;;;;;;;;48466:275::o;48055:238::-;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;48169:1:::1;48149:22;;:8;:22;;;;48141:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48241:8;48224:26;;;;;;;;;;;;48277:8;48261:13;;:24;;;;;;;;;;;;;;;;;;48055:238:::0;:::o;53230:116::-;53292:4;53315:14;:23;53330:7;53315:23;;;;;;;;;;;;;;;;;;;;;53308:30;;53230:116;;;:::o;30383:239::-;30455:7;30475:13;30491:7;:16;30499:7;30491:16;;;;;;;;;;;;;;;;;;;;;30475:32;;30543:1;30526:19;;:5;:19;;;;30518:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30609:5;30602:12;;;30383:239;;;:::o;30113:208::-;30185:7;30230:1;30213:19;;:5;:19;;;;30205:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30297:9;:16;30307:5;30297:16;;;;;;;;;;;;;;;;30290:23;;30113:208;;;:::o;48922:195::-;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;49020:1:::1;49001:21;;:7;:21;;;;48993:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49101:7;49077:13;;:32;;;;;;;;;;;;;;;;;;48922:195:::0;:::o;50341:488::-;50455:4;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;50565:16:::1;50553:11;50545:7;:19;;;;:::i;:::-;:36;;;;:::i;:::-;50537:5;:44;50529:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;50651:7;50642:6;:16;;;;50682:11;50669:10;:24;;;;50718:16;50704:11;:30;;;;50787:11;;50774:10;;50765:6;;50757:5;:14;;;;:::i;:::-;:27;;;;:::i;:::-;:41;;;;:::i;:::-;50745:9;:53;;;;50816:4;50809:11;;50341:488:::0;;;;;:::o;30858:104::-;30914:13;30947:7;30940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30858:104;:::o;51294:329::-;51438:4;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;51471:14:::1;51455:13;:30;;;;51515:18;51496:16;:37;;;;51611:4;51604:11;;51294:329:::0;;;;;:::o;57494:426::-;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;57580:6:::1;57576:327;57596:9;:16;57592:1;:20;57576:327;;;57636:16;:30;57653:9;57663:1;57653:12;;;;;;;;;;;;;;;;;;;;;;57636:30;;;;;;;;;;;;;;;;;;;;;;;;;57633:259;;;;;;57818:4;57785:16;:30;57802:9;57812:1;57802:12;;;;;;;;;;;;;;;;;;;;;;57785:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;57863:9;57873:1;57863:12;;;;;;;;;;;;;;;;;;;;;;57846:30;;;;;;;;;;;;57633:259;57614:3;;;;;:::i;:::-;;;;57576:327;;;;57494:426:::0;:::o;44765:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;32541:155::-;32636:52;32655:12;:10;:12::i;:::-;32669:8;32679;32636:18;:52::i;:::-;32541:155;;:::o;52881:213::-;52954:8;46636:10;46615:31;;:17;46623:8;46615:7;:17::i;:::-;:31;;;46607:40;;;;;;52991:1:::1;52983:5;:9;52975:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53081:5;53059:9;:19;53069:8;53059:19;;;;;;;;;;;:27;;;;52881:213:::0;;;:::o;55000:2138::-;55111:17;55138:11;55111:39;;55163:13;55179:9;:18;55189:7;55179:18;;;;;;;;;;;;55163:34;;55208:18;55229:14;:12;:14::i;:::-;55208:35;;55254:22;55279:10;;55254:35;;55300:20;55323:6;;55300:29;;55340:23;55366:11;;55340:37;;55407:1;55398:5;:10;;55390:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;55483:5;55470:9;:18;55448:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;55575:14;55592:10;:18;;;55611:7;55592:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55575:44;;55632:10;:27;;;55660:6;55668:10;55680:7;55632:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55720:1;55699:9;:18;55709:7;55699:18;;;;;;;;;;;:22;;;;55764:5;55737:32;;:14;:23;55752:7;55737:23;;;;;;;;;;;;;;;;;;;;;:32;;;55734:510;;;55959:13;;55944:28;;56000:16;;55987:29;;56049:17;;56031:35;;56184:1;56167:18;;56228:4;56202:14;:23;56217:7;56202:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;55734:510;56334:16;45681:5;56366:10;56354:9;:22;;;;:::i;:::-;56353:46;;;;:::i;:::-;56334:65;;56487:17;45681:5;56518:14;56508:9;:24;;;;:::i;:::-;56507:48;;;;:::i;:::-;56487:68;;56566:18;45681:5;56598:12;56588:9;:22;;;;:::i;:::-;56587:46;;;;:::i;:::-;56566:67;;56644:22;45681:5;56680:15;56670:9;:25;;;;:::i;:::-;56669:49;;;;:::i;:::-;56644:74;;56739:27;56769:12;:21;56782:7;56769:21;;;;;;;;;;;;;;;;;;;;;56739:51;;56819:6;56811:24;;:34;56836:8;56811:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56872:1;56859:9;:14;56856:94;;56898:19;56890:37;;:48;56928:9;56890:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56856:94;56970:13;;;;;;;;;;;:22;;:34;56993:10;56970:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57023:12;;;;;;;;;;;57015:30;;:46;57046:14;57015:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57122:7;57104:6;57087:43;;57092:10;57087:43;;;57112:9;57087:43;;;;;;:::i;:::-;;;;;;;;55000:2138;;;;;;;;;;;;;;:::o;33664:328::-;33839:41;33858:12;:10;:12::i;:::-;33872:7;33839:18;:41::i;:::-;33831:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33945:39;33959:4;33965:2;33969:7;33978:5;33945:13;:39::i;:::-;33664:328;;;;:::o;49862:165::-;49907:7;50010:9;;50003:16;;49862:165;:::o;42695:679::-;42768:13;42802:16;42810:7;42802;:16::i;:::-;42794:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;42885:23;42911:10;:19;42922:7;42911:19;;;;;;;;;;;42885:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42941:18;42962:10;:8;:10::i;:::-;42941:31;;43070:1;43054:4;43048:18;:23;43044:72;;;43095:9;43088:16;;;;;;43044:72;43246:1;43226:9;43220:23;:27;43216:108;;;43295:4;43301:9;43278:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43264:48;;;;;;43216:108;43343:23;43358:7;43343:14;:23::i;:::-;43336:30;;;;42695:679;;;;:::o;57249:141::-;57322:13;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;57359:13:::1;:23;57373:8;57359:23;;;;;;;;;;;;;;;57352:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57249:141:::0;;;:::o;58019:331::-;46826:5;;;;;;;;;;;46812:19;;:10;:19;;;46804:28;;;;;;58102:6:::1;58098:235;58118:9;:16;58114:1;:20;58098:235;;;58193:4;58159:38;;:16;:30;58176:9;58186:1;58176:12;;;;;;;;;;;;;;;;;;;;;;58159:30;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;58155:167;;;58250:5;58217:16;:30;58234:9;58244:1;58234:12;;;;;;;;;;;;;;;;;;;;;;58217:30;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;58293:9;58303:1;58293:12;;;;;;;;;;;;;;;;;;;;;;58279:27;;;;;;;;;;;;58155:167;58136:3;;;;;:::i;:::-;;;;58098:235;;;;58019:331:::0;:::o;32767:164::-;32864:4;32888:18;:25;32907:5;32888:25;;;;;;;;;;;;;;;:35;32914:8;32888:35;;;;;;;;;;;;;;;;;;;;;;;;;32881:42;;32767:164;;;;:::o;52610:112::-;47019:5;;;;;;;;;;;47005:19;;:10;:19;;;46997:28;;;;;;52709:5:::1;52688:9;:18;52698:7;52688:18;;;;;;;;;;;:26;;;;52610:112:::0;;:::o;58444:113::-;58504:7;58531:9;:18;58541:7;58531:18;;;;;;;;;;;;58524:25;;58444:113;;;:::o;54551:363::-;54628:8;46636:10;46615:31;;:17;46623:8;46615:7;:17::i;:::-;:31;;;46607:40;;;;;;54649:14:::1;54666:17;54674:8;54666:7;:17::i;:::-;54649:34;;54720:1;54702:20;;:6;:20;;;;54694:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54781:1;54772:5;:10;;54764:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54856:5;54834:9;:19;54844:8;54834:19;;;;;;;;;;;:27;;;;54900:5;54890:8;54877:29;;;;;;;;;;46658:1;54551:363:::0;;;:::o;22513:157::-;22598:4;22637:25;22622:40;;;:11;:40;;;;22615:47;;22513:157;;;:::o;35502:127::-;35567:4;35619:1;35591:30;;:7;:16;35599:7;35591:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35584:37;;35502:127;;;:::o;11335:98::-;11388:7;11415:10;11408:17;;11335:98;:::o;39484:174::-;39586:2;39559:15;:24;39575:7;39559:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39642:7;39638:2;39604:46;;39613:23;39628:7;39613:14;:23::i;:::-;39604:46;;;;;;;;;;;;39484:174;;:::o;7939:114::-;8004:7;8031;:14;;;8024:21;;7939:114;;;:::o;35796:348::-;35889:4;35914:16;35922:7;35914;:16::i;:::-;35906:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35990:13;36006:23;36021:7;36006:14;:23::i;:::-;35990:39;;36059:5;36048:16;;:7;:16;;;:51;;;;36092:7;36068:31;;:20;36080:7;36068:11;:20::i;:::-;:31;;;36048:51;:87;;;;36103:32;36120:5;36127:7;36103:16;:32::i;:::-;36048:87;36040:96;;;35796:348;;;;:::o;38788:578::-;38947:4;38920:31;;:23;38935:7;38920:14;:23::i;:::-;:31;;;38912:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39030:1;39016:16;;:2;:16;;;;39008:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39086:39;39107:4;39113:2;39117:7;39086:20;:39::i;:::-;39190:29;39207:1;39211:7;39190:8;:29::i;:::-;39251:1;39232:9;:15;39242:4;39232:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39280:1;39263:9;:13;39273:2;39263:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39311:2;39292:7;:16;39300:7;39292:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39350:7;39346:2;39331:27;;39340:4;39331:27;;;;;;;;;;;;38788:578;;;:::o;8061:127::-;8168:1;8150:7;:14;;;:19;;;;;;;;;;;8061:127;:::o;37480:382::-;37574:1;37560:16;;:2;:16;;;;37552:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37633:16;37641:7;37633;:16::i;:::-;37632:17;37624:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37695:45;37724:1;37728:2;37732:7;37695:20;:45::i;:::-;37770:1;37753:9;:13;37763:2;37753:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37801:2;37782:7;:16;37790:7;37782:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37846:7;37842:2;37821:33;;37838:1;37821:33;;;;;;;;;;;;37480:382;;:::o;43530:217::-;43630:16;43638:7;43630;:16::i;:::-;43622:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43730:9;43708:10;:19;43719:7;43708:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;43530:217;;:::o;39800:315::-;39955:8;39946:17;;:5;:17;;;;39938:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40042:8;40004:18;:25;40023:5;40004:25;;;;;;;;;;;;;;;:35;40030:8;40004:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40088:8;40066:41;;40081:5;40066:41;;;40098:8;40066:41;;;;;;:::i;:::-;;;;;;;;39800:315;;;:::o;34874:::-;35031:28;35041:4;35047:2;35051:7;35031:9;:28::i;:::-;35078:48;35101:4;35107:2;35111:7;35120:5;35078:22;:48::i;:::-;35070:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34874:315;;;;:::o;31615:94::-;31666:13;31692:9;;;;;;;;;;;;;;31615:94;:::o;31033:334::-;31106:13;31140:16;31148:7;31140;:16::i;:::-;31132:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31221:21;31245:10;:8;:10::i;:::-;31221:34;;31297:1;31279:7;31273:21;:25;:86;;;;;;;;;;;;;;;;;31325:7;31334:18;:7;:16;:18::i;:::-;31308:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31273:86;31266:93;;;31033:334;;;:::o;42051:126::-;;;;:::o;40680:799::-;40835:4;40856:15;:2;:13;;;:15::i;:::-;40852:620;;;40908:2;40892:36;;;40929:12;:10;:12::i;:::-;40943:4;40949:7;40958:5;40892:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40888:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41151:1;41134:6;:13;:18;41130:272;;;41177:60;;;;;;;;;;:::i;:::-;;;;;;;;41130:272;41352:6;41346:13;41337:6;41333:2;41329:15;41322:38;40888:529;41025:41;;;41015:51;;;:6;:51;;;;41008:58;;;;;40852:620;41456:4;41449:11;;40680:799;;;;;;;:::o;8897:723::-;8953:13;9183:1;9174:5;:10;9170:53;;;9201:10;;;;;;;;;;;;;;;;;;;;;9170:53;9233:12;9248:5;9233:20;;9264:14;9289:78;9304:1;9296:4;:9;9289:78;;9322:8;;;;;:::i;:::-;;;;9353:2;9345:10;;;;;:::i;:::-;;;9289:78;;;9377:19;9409:6;9399:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9377:39;;9427:154;9443:1;9434:5;:10;9427:154;;9471:1;9461:11;;;;;:::i;:::-;;;9538:2;9530:5;:10;;;;:::i;:::-;9517:2;:24;;;;:::i;:::-;9504:39;;9487:6;9494;9487:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9567:2;9558:11;;;;;:::i;:::-;;;9427:154;;;9605:6;9591:21;;;;;8897:723;;;;:::o;12369:387::-;12429:4;12637:12;12704:7;12692:20;12684:28;;12747:1;12740:4;:8;12733:15;;;12369:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655: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;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1530:143::-;1587:5;1618:6;1612:13;1603:22;;1634:33;1661:5;1634:33;:::i;:::-;1593:80;;;;:::o;1696:303::-;1767:5;1816:3;1809:4;1801:6;1797:17;1793:27;1783:2;;1834:1;1831;1824:12;1783:2;1874:6;1861:20;1899:94;1989:3;1981:6;1974:4;1966:6;1962:17;1899:94;:::i;:::-;1890:103;;1773:226;;;;;:::o;2005:133::-;2048:5;2086:6;2073:20;2064:29;;2102:30;2126:5;2102:30;:::i;:::-;2054:84;;;;:::o;2144:137::-;2189:5;2227:6;2214:20;2205:29;;2243:32;2269:5;2243:32;:::i;:::-;2195:86;;;;:::o;2287:141::-;2343:5;2374:6;2368:13;2359:22;;2390:32;2416:5;2390:32;:::i;:::-;2349:79;;;;:::o;2447:271::-;2502:5;2551:3;2544:4;2536:6;2532:17;2528:27;2518:2;;2569:1;2566;2559:12;2518:2;2609:6;2596:20;2634:78;2708:3;2700:6;2693:4;2685:6;2681:17;2634:78;:::i;:::-;2625:87;;2508:210;;;;;:::o;2738:273::-;2794:5;2843:3;2836:4;2828:6;2824:17;2820:27;2810:2;;2861:1;2858;2851:12;2810:2;2901:6;2888:20;2926:79;3001:3;2993:6;2986:4;2978:6;2974:17;2926:79;:::i;:::-;2917:88;;2800:211;;;;;:::o;3017:139::-;3063:5;3101:6;3088:20;3079:29;;3117:33;3144:5;3117:33;:::i;:::-;3069:87;;;;:::o;3162:262::-;3221:6;3270:2;3258:9;3249:7;3245:23;3241:32;3238:2;;;3286:1;3283;3276:12;3238:2;3329:1;3354:53;3399:7;3390:6;3379:9;3375:22;3354:53;:::i;:::-;3344:63;;3300:117;3228:196;;;;:::o;3430:284::-;3500:6;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3565:1;3562;3555:12;3517:2;3608:1;3633:64;3689:7;3680:6;3669:9;3665:22;3633:64;:::i;:::-;3623:74;;3579:128;3507:207;;;;:::o;3720:407::-;3788:6;3796;3845:2;3833:9;3824:7;3820:23;3816:32;3813:2;;;3861:1;3858;3851:12;3813:2;3904:1;3929:53;3974:7;3965:6;3954:9;3950:22;3929:53;:::i;:::-;3919:63;;3875:117;4031:2;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4002:118;3803:324;;;;;:::o;4133:552::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:2;;;4291:1;4288;4281:12;4243:2;4334:1;4359:53;4404:7;4395:6;4384:9;4380:22;4359:53;:::i;:::-;4349:63;;4305:117;4461:2;4487:53;4532:7;4523:6;4512:9;4508:22;4487:53;:::i;:::-;4477:63;;4432:118;4589:2;4615:53;4660:7;4651:6;4640:9;4636:22;4615:53;:::i;:::-;4605:63;;4560:118;4233:452;;;;;:::o;4691:809::-;4786:6;4794;4802;4810;4859:3;4847:9;4838:7;4834:23;4830:33;4827:2;;;4876:1;4873;4866:12;4827:2;4919:1;4944:53;4989:7;4980:6;4969:9;4965:22;4944:53;:::i;:::-;4934:63;;4890:117;5046:2;5072:53;5117:7;5108:6;5097:9;5093:22;5072:53;:::i;:::-;5062:63;;5017:118;5174:2;5200:53;5245:7;5236:6;5225:9;5221:22;5200:53;:::i;:::-;5190:63;;5145:118;5330:2;5319:9;5315:18;5302:32;5361:18;5353:6;5350:30;5347:2;;;5393:1;5390;5383:12;5347:2;5421:62;5475:7;5466:6;5455:9;5451:22;5421:62;:::i;:::-;5411:72;;5273:220;4817:683;;;;;;;:::o;5506:401::-;5571:6;5579;5628:2;5616:9;5607:7;5603:23;5599:32;5596:2;;;5644:1;5641;5634:12;5596:2;5687:1;5712:53;5757:7;5748:6;5737:9;5733:22;5712:53;:::i;:::-;5702:63;;5658:117;5814:2;5840:50;5882:7;5873:6;5862:9;5858:22;5840:50;:::i;:::-;5830:60;;5785:115;5586:321;;;;;:::o;5913:1296::-;6048:6;6056;6064;6072;6080;6129:3;6117:9;6108:7;6104:23;6100:33;6097:2;;;6146:1;6143;6136:12;6097:2;6189:1;6214:53;6259:7;6250:6;6239:9;6235:22;6214:53;:::i;:::-;6204:63;;6160:117;6344:2;6333:9;6329:18;6316:32;6375:18;6367:6;6364:30;6361:2;;;6407:1;6404;6397:12;6361:2;6435:63;6490:7;6481:6;6470:9;6466:22;6435:63;:::i;:::-;6425:73;;6287:221;6575:2;6564:9;6560:18;6547:32;6606:18;6598:6;6595:30;6592:2;;;6638:1;6635;6628:12;6592:2;6666:63;6721:7;6712:6;6701:9;6697:22;6666:63;:::i;:::-;6656:73;;6518:221;6806:2;6795:9;6791:18;6778:32;6837:18;6829:6;6826:30;6823:2;;;6869:1;6866;6859:12;6823:2;6897:63;6952:7;6943:6;6932:9;6928:22;6897:63;:::i;:::-;6887:73;;6749:221;7037:3;7026:9;7022:19;7009:33;7069:18;7061:6;7058:30;7055:2;;;7101:1;7098;7091:12;7055:2;7129:63;7184:7;7175:6;7164:9;7160:22;7129:63;:::i;:::-;7119:73;;6980:222;6087:1122;;;;;;;;:::o;7215:407::-;7283:6;7291;7340:2;7328:9;7319:7;7315:23;7311:32;7308:2;;;7356:1;7353;7346:12;7308:2;7399:1;7424:53;7469:7;7460:6;7449:9;7445:22;7424:53;:::i;:::-;7414:63;;7370:117;7526:2;7552:53;7597:7;7588:6;7577:9;7573:22;7552:53;:::i;:::-;7542:63;;7497:118;7298:324;;;;;:::o;7628:405::-;7712:6;7761:2;7749:9;7740:7;7736:23;7732:32;7729:2;;;7777:1;7774;7767:12;7729:2;7848:1;7837:9;7833:17;7820:31;7878:18;7870:6;7867:30;7864:2;;;7910:1;7907;7900:12;7864:2;7938:78;8008:7;7999:6;7988:9;7984:22;7938:78;:::i;:::-;7928:88;;7791:235;7719:314;;;;:::o;8039:260::-;8097:6;8146:2;8134:9;8125:7;8121:23;8117:32;8114:2;;;8162:1;8159;8152:12;8114:2;8205:1;8230:52;8274:7;8265:6;8254:9;8250:22;8230:52;:::i;:::-;8220:62;;8176:116;8104:195;;;;:::o;8305:282::-;8374:6;8423:2;8411:9;8402:7;8398:23;8394:32;8391:2;;;8439:1;8436;8429:12;8391:2;8482:1;8507:63;8562:7;8553:6;8542:9;8538:22;8507:63;:::i;:::-;8497:73;;8453:127;8381:206;;;;:::o;8593:262::-;8652:6;8701:2;8689:9;8680:7;8676:23;8672:32;8669:2;;;8717:1;8714;8707:12;8669:2;8760:1;8785:53;8830:7;8821:6;8810:9;8806:22;8785:53;:::i;:::-;8775:63;;8731:117;8659:196;;;;:::o;8861:407::-;8929:6;8937;8986:2;8974:9;8965:7;8961:23;8957:32;8954:2;;;9002:1;8999;8992:12;8954:2;9045:1;9070:53;9115:7;9106:6;9095:9;9091:22;9070:53;:::i;:::-;9060:63;;9016:117;9172:2;9198:53;9243:7;9234:6;9223:9;9219:22;9198:53;:::i;:::-;9188:63;;9143:118;8944:324;;;;;:::o;9274:407::-;9342:6;9350;9399:2;9387:9;9378:7;9374:23;9370:32;9367:2;;;9415:1;9412;9405:12;9367:2;9458:1;9483:53;9528:7;9519:6;9508:9;9504:22;9483:53;:::i;:::-;9473:63;;9429:117;9585:2;9611:53;9656:7;9647:6;9636:9;9632:22;9611:53;:::i;:::-;9601:63;;9556:118;9357:324;;;;;:::o;9687:552::-;9764:6;9772;9780;9829:2;9817:9;9808:7;9804:23;9800:32;9797:2;;;9845:1;9842;9835:12;9797:2;9888:1;9913:53;9958:7;9949:6;9938:9;9934:22;9913:53;:::i;:::-;9903:63;;9859:117;10015:2;10041:53;10086:7;10077:6;10066:9;10062:22;10041:53;:::i;:::-;10031:63;;9986:118;10143:2;10169:53;10214:7;10205:6;10194:9;10190:22;10169:53;:::i;:::-;10159:63;;10114:118;9787:452;;;;;:::o;10245:179::-;10314:10;10335:46;10377:3;10369:6;10335:46;:::i;:::-;10413:4;10408:3;10404:14;10390:28;;10325:99;;;;:::o;10430:118::-;10517:24;10535:5;10517:24;:::i;:::-;10512:3;10505:37;10495:53;;:::o;10584:732::-;10703:3;10732:54;10780:5;10732:54;:::i;:::-;10802:86;10881:6;10876:3;10802:86;:::i;:::-;10795:93;;10912:56;10962:5;10912:56;:::i;:::-;10991:7;11022:1;11007:284;11032:6;11029:1;11026:13;11007:284;;;11108:6;11102:13;11135:63;11194:3;11179:13;11135:63;:::i;:::-;11128:70;;11221:60;11274:6;11221:60;:::i;:::-;11211:70;;11067:224;11054:1;11051;11047:9;11042:14;;11007:284;;;11011:14;11307:3;11300:10;;10708:608;;;;;;;:::o;11322:109::-;11403:21;11418:5;11403:21;:::i;:::-;11398:3;11391:34;11381:50;;:::o;11437:360::-;11523:3;11551:38;11583:5;11551:38;:::i;:::-;11605:70;11668:6;11663:3;11605:70;:::i;:::-;11598:77;;11684:52;11729:6;11724:3;11717:4;11710:5;11706:16;11684:52;:::i;:::-;11761:29;11783:6;11761:29;:::i;:::-;11756:3;11752:39;11745:46;;11527:270;;;;;:::o;11803:364::-;11891:3;11919:39;11952:5;11919:39;:::i;:::-;11974:71;12038:6;12033:3;11974:71;:::i;:::-;11967:78;;12054:52;12099:6;12094:3;12087:4;12080:5;12076:16;12054:52;:::i;:::-;12131:29;12153:6;12131:29;:::i;:::-;12126:3;12122:39;12115:46;;11895:272;;;;;:::o;12173:377::-;12279:3;12307:39;12340:5;12307:39;:::i;:::-;12362:89;12444:6;12439:3;12362:89;:::i;:::-;12355:96;;12460:52;12505:6;12500:3;12493:4;12486:5;12482:16;12460:52;:::i;:::-;12537:6;12532:3;12528:16;12521:23;;12283:267;;;;;:::o;12556:366::-;12698:3;12719:67;12783:2;12778:3;12719:67;:::i;:::-;12712:74;;12795:93;12884:3;12795:93;:::i;:::-;12913:2;12908:3;12904:12;12897:19;;12702:220;;;:::o;12928:366::-;13070:3;13091:67;13155:2;13150:3;13091:67;:::i;:::-;13084:74;;13167:93;13256:3;13167:93;:::i;:::-;13285:2;13280:3;13276:12;13269:19;;13074:220;;;:::o;13300:366::-;13442:3;13463:67;13527:2;13522:3;13463:67;:::i;:::-;13456:74;;13539:93;13628:3;13539:93;:::i;:::-;13657:2;13652:3;13648:12;13641:19;;13446:220;;;:::o;13672:366::-;13814:3;13835:67;13899:2;13894:3;13835:67;:::i;:::-;13828:74;;13911:93;14000:3;13911:93;:::i;:::-;14029:2;14024:3;14020:12;14013:19;;13818:220;;;:::o;14044:366::-;14186:3;14207:67;14271:2;14266:3;14207:67;:::i;:::-;14200:74;;14283:93;14372:3;14283:93;:::i;:::-;14401:2;14396:3;14392:12;14385:19;;14190:220;;;:::o;14416:366::-;14558:3;14579:67;14643:2;14638:3;14579:67;:::i;:::-;14572:74;;14655:93;14744:3;14655:93;:::i;:::-;14773:2;14768:3;14764:12;14757:19;;14562:220;;;:::o;14788:366::-;14930:3;14951:67;15015:2;15010:3;14951:67;:::i;:::-;14944:74;;15027:93;15116:3;15027:93;:::i;:::-;15145:2;15140:3;15136:12;15129:19;;14934:220;;;:::o;15160:366::-;15302:3;15323:67;15387:2;15382:3;15323:67;:::i;:::-;15316:74;;15399:93;15488:3;15399:93;:::i;:::-;15517:2;15512:3;15508:12;15501:19;;15306:220;;;:::o;15532:366::-;15674:3;15695:67;15759:2;15754:3;15695:67;:::i;:::-;15688:74;;15771:93;15860:3;15771:93;:::i;:::-;15889:2;15884:3;15880:12;15873:19;;15678:220;;;:::o;15904:366::-;16046:3;16067:67;16131:2;16126:3;16067:67;:::i;:::-;16060:74;;16143:93;16232:3;16143:93;:::i;:::-;16261:2;16256:3;16252:12;16245:19;;16050:220;;;:::o;16276:366::-;16418:3;16439:67;16503:2;16498:3;16439:67;:::i;:::-;16432:74;;16515:93;16604:3;16515:93;:::i;:::-;16633:2;16628:3;16624:12;16617:19;;16422:220;;;:::o;16648:366::-;16790:3;16811:67;16875:2;16870:3;16811:67;:::i;:::-;16804:74;;16887:93;16976:3;16887:93;:::i;:::-;17005:2;17000:3;16996:12;16989:19;;16794:220;;;:::o;17020:366::-;17162:3;17183:67;17247:2;17242:3;17183:67;:::i;:::-;17176:74;;17259:93;17348:3;17259:93;:::i;:::-;17377:2;17372:3;17368:12;17361:19;;17166:220;;;:::o;17392:366::-;17534:3;17555:67;17619:2;17614:3;17555:67;:::i;:::-;17548:74;;17631:93;17720:3;17631:93;:::i;:::-;17749:2;17744:3;17740:12;17733:19;;17538:220;;;:::o;17764:366::-;17906:3;17927:67;17991:2;17986:3;17927:67;:::i;:::-;17920:74;;18003:93;18092:3;18003:93;:::i;:::-;18121:2;18116:3;18112:12;18105:19;;17910:220;;;:::o;18136:366::-;18278:3;18299:67;18363:2;18358:3;18299:67;:::i;:::-;18292:74;;18375:93;18464:3;18375:93;:::i;:::-;18493:2;18488:3;18484:12;18477:19;;18282:220;;;:::o;18508:366::-;18650:3;18671:67;18735:2;18730:3;18671:67;:::i;:::-;18664:74;;18747:93;18836:3;18747:93;:::i;:::-;18865:2;18860:3;18856:12;18849:19;;18654:220;;;:::o;18880:366::-;19022:3;19043:67;19107:2;19102:3;19043:67;:::i;:::-;19036:74;;19119:93;19208:3;19119:93;:::i;:::-;19237:2;19232:3;19228:12;19221:19;;19026:220;;;:::o;19252:366::-;19394:3;19415:67;19479:2;19474:3;19415:67;:::i;:::-;19408:74;;19491:93;19580:3;19491:93;:::i;:::-;19609:2;19604:3;19600:12;19593:19;;19398:220;;;:::o;19624:366::-;19766:3;19787:67;19851:2;19846:3;19787:67;:::i;:::-;19780:74;;19863:93;19952:3;19863:93;:::i;:::-;19981:2;19976:3;19972:12;19965:19;;19770:220;;;:::o;19996:366::-;20138:3;20159:67;20223:2;20218:3;20159:67;:::i;:::-;20152:74;;20235:93;20324:3;20235:93;:::i;:::-;20353:2;20348:3;20344:12;20337:19;;20142:220;;;:::o;20368:366::-;20510:3;20531:67;20595:2;20590:3;20531:67;:::i;:::-;20524:74;;20607:93;20696:3;20607:93;:::i;:::-;20725:2;20720:3;20716:12;20709:19;;20514:220;;;:::o;20740:366::-;20882:3;20903:67;20967:2;20962:3;20903:67;:::i;:::-;20896:74;;20979:93;21068:3;20979:93;:::i;:::-;21097:2;21092:3;21088:12;21081:19;;20886:220;;;:::o;21112:366::-;21254:3;21275:67;21339:2;21334:3;21275:67;:::i;:::-;21268:74;;21351:93;21440:3;21351:93;:::i;:::-;21469:2;21464:3;21460:12;21453:19;;21258:220;;;:::o;21484:366::-;21626:3;21647:67;21711:2;21706:3;21647:67;:::i;:::-;21640:74;;21723:93;21812:3;21723:93;:::i;:::-;21841:2;21836:3;21832:12;21825:19;;21630:220;;;:::o;21856:108::-;21933:24;21951:5;21933:24;:::i;:::-;21928:3;21921:37;21911:53;;:::o;21970:118::-;22057:24;22075:5;22057:24;:::i;:::-;22052:3;22045:37;22035:53;;:::o;22094:275::-;22226:3;22248:95;22339:3;22330:6;22248:95;:::i;:::-;22241:102;;22360:3;22353:10;;22230:139;;;;:::o;22375:435::-;22555:3;22577:95;22668:3;22659:6;22577:95;:::i;:::-;22570:102;;22689:95;22780:3;22771:6;22689:95;:::i;:::-;22682:102;;22801:3;22794:10;;22559:251;;;;;:::o;22816:222::-;22909:4;22947:2;22936:9;22932:18;22924:26;;22960:71;23028:1;23017:9;23013:17;23004:6;22960:71;:::i;:::-;22914:124;;;;:::o;23044:442::-;23193:4;23231:2;23220:9;23216:18;23208:26;;23244:71;23312:1;23301:9;23297:17;23288:6;23244:71;:::i;:::-;23325:72;23393:2;23382:9;23378:18;23369:6;23325:72;:::i;:::-;23407;23475:2;23464:9;23460:18;23451:6;23407:72;:::i;:::-;23198:288;;;;;;:::o;23492:640::-;23687:4;23725:3;23714:9;23710:19;23702:27;;23739:71;23807:1;23796:9;23792:17;23783:6;23739:71;:::i;:::-;23820:72;23888:2;23877:9;23873:18;23864:6;23820:72;:::i;:::-;23902;23970:2;23959:9;23955:18;23946:6;23902:72;:::i;:::-;24021:9;24015:4;24011:20;24006:2;23995:9;23991:18;23984:48;24049:76;24120:4;24111:6;24049:76;:::i;:::-;24041:84;;23692:440;;;;;;;:::o;24138:373::-;24281:4;24319:2;24308:9;24304:18;24296:26;;24368:9;24362:4;24358:20;24354:1;24343:9;24339:17;24332:47;24396:108;24499:4;24490:6;24396:108;:::i;:::-;24388:116;;24286:225;;;;:::o;24517:210::-;24604:4;24642:2;24631:9;24627:18;24619:26;;24655:65;24717:1;24706:9;24702:17;24693:6;24655:65;:::i;:::-;24609:118;;;;:::o;24733:313::-;24846:4;24884:2;24873:9;24869:18;24861:26;;24933:9;24927:4;24923:20;24919:1;24908:9;24904:17;24897:47;24961:78;25034:4;25025:6;24961:78;:::i;:::-;24953:86;;24851:195;;;;:::o;25052:419::-;25218:4;25256:2;25245:9;25241:18;25233:26;;25305:9;25299:4;25295:20;25291:1;25280:9;25276:17;25269:47;25333:131;25459:4;25333:131;:::i;:::-;25325:139;;25223:248;;;:::o;25477:419::-;25643:4;25681:2;25670:9;25666:18;25658:26;;25730:9;25724:4;25720:20;25716:1;25705:9;25701:17;25694:47;25758:131;25884:4;25758:131;:::i;:::-;25750:139;;25648:248;;;:::o;25902:419::-;26068:4;26106:2;26095:9;26091:18;26083:26;;26155:9;26149:4;26145:20;26141:1;26130:9;26126:17;26119:47;26183:131;26309:4;26183:131;:::i;:::-;26175:139;;26073:248;;;:::o;26327:419::-;26493:4;26531:2;26520:9;26516:18;26508:26;;26580:9;26574:4;26570:20;26566:1;26555:9;26551:17;26544:47;26608:131;26734:4;26608:131;:::i;:::-;26600:139;;26498:248;;;:::o;26752:419::-;26918:4;26956:2;26945:9;26941:18;26933:26;;27005:9;26999:4;26995:20;26991:1;26980:9;26976:17;26969:47;27033:131;27159:4;27033:131;:::i;:::-;27025:139;;26923:248;;;:::o;27177:419::-;27343:4;27381:2;27370:9;27366:18;27358:26;;27430:9;27424:4;27420:20;27416:1;27405:9;27401:17;27394:47;27458:131;27584:4;27458:131;:::i;:::-;27450:139;;27348:248;;;:::o;27602:419::-;27768:4;27806:2;27795:9;27791:18;27783:26;;27855:9;27849:4;27845:20;27841:1;27830:9;27826:17;27819:47;27883:131;28009:4;27883:131;:::i;:::-;27875:139;;27773:248;;;:::o;28027:419::-;28193:4;28231:2;28220:9;28216:18;28208:26;;28280:9;28274:4;28270:20;28266:1;28255:9;28251:17;28244:47;28308:131;28434:4;28308:131;:::i;:::-;28300:139;;28198:248;;;:::o;28452:419::-;28618:4;28656:2;28645:9;28641:18;28633:26;;28705:9;28699:4;28695:20;28691:1;28680:9;28676:17;28669:47;28733:131;28859:4;28733:131;:::i;:::-;28725:139;;28623:248;;;:::o;28877:419::-;29043:4;29081:2;29070:9;29066:18;29058:26;;29130:9;29124:4;29120:20;29116:1;29105:9;29101:17;29094:47;29158:131;29284:4;29158:131;:::i;:::-;29150:139;;29048:248;;;:::o;29302:419::-;29468:4;29506:2;29495:9;29491:18;29483:26;;29555:9;29549:4;29545:20;29541:1;29530:9;29526:17;29519:47;29583:131;29709:4;29583:131;:::i;:::-;29575:139;;29473:248;;;:::o;29727:419::-;29893:4;29931:2;29920:9;29916:18;29908:26;;29980:9;29974:4;29970:20;29966:1;29955:9;29951:17;29944:47;30008:131;30134:4;30008:131;:::i;:::-;30000:139;;29898:248;;;:::o;30152:419::-;30318:4;30356:2;30345:9;30341:18;30333:26;;30405:9;30399:4;30395:20;30391:1;30380:9;30376:17;30369:47;30433:131;30559:4;30433:131;:::i;:::-;30425:139;;30323:248;;;:::o;30577:419::-;30743:4;30781:2;30770:9;30766:18;30758:26;;30830:9;30824:4;30820:20;30816:1;30805:9;30801:17;30794:47;30858:131;30984:4;30858:131;:::i;:::-;30850:139;;30748:248;;;:::o;31002:419::-;31168:4;31206:2;31195:9;31191:18;31183:26;;31255:9;31249:4;31245:20;31241:1;31230:9;31226:17;31219:47;31283:131;31409:4;31283:131;:::i;:::-;31275:139;;31173:248;;;:::o;31427:419::-;31593:4;31631:2;31620:9;31616:18;31608:26;;31680:9;31674:4;31670:20;31666:1;31655:9;31651:17;31644:47;31708:131;31834:4;31708:131;:::i;:::-;31700:139;;31598:248;;;:::o;31852:419::-;32018:4;32056:2;32045:9;32041:18;32033:26;;32105:9;32099:4;32095:20;32091:1;32080:9;32076:17;32069:47;32133:131;32259:4;32133:131;:::i;:::-;32125:139;;32023:248;;;:::o;32277:419::-;32443:4;32481:2;32470:9;32466:18;32458:26;;32530:9;32524:4;32520:20;32516:1;32505:9;32501:17;32494:47;32558:131;32684:4;32558:131;:::i;:::-;32550:139;;32448:248;;;:::o;32702:419::-;32868:4;32906:2;32895:9;32891:18;32883:26;;32955:9;32949:4;32945:20;32941:1;32930:9;32926:17;32919:47;32983:131;33109:4;32983:131;:::i;:::-;32975:139;;32873:248;;;:::o;33127:419::-;33293:4;33331:2;33320:9;33316:18;33308:26;;33380:9;33374:4;33370:20;33366:1;33355:9;33351:17;33344:47;33408:131;33534:4;33408:131;:::i;:::-;33400:139;;33298:248;;;:::o;33552:419::-;33718:4;33756:2;33745:9;33741:18;33733:26;;33805:9;33799:4;33795:20;33791:1;33780:9;33776:17;33769:47;33833:131;33959:4;33833:131;:::i;:::-;33825:139;;33723:248;;;:::o;33977:419::-;34143:4;34181:2;34170:9;34166:18;34158:26;;34230:9;34224:4;34220:20;34216:1;34205:9;34201:17;34194:47;34258:131;34384:4;34258:131;:::i;:::-;34250:139;;34148:248;;;:::o;34402:419::-;34568:4;34606:2;34595:9;34591:18;34583:26;;34655:9;34649:4;34645:20;34641:1;34630:9;34626:17;34619:47;34683:131;34809:4;34683:131;:::i;:::-;34675:139;;34573:248;;;:::o;34827:419::-;34993:4;35031:2;35020:9;35016:18;35008:26;;35080:9;35074:4;35070:20;35066:1;35055:9;35051:17;35044:47;35108:131;35234:4;35108:131;:::i;:::-;35100:139;;34998:248;;;:::o;35252:419::-;35418:4;35456:2;35445:9;35441:18;35433:26;;35505:9;35499:4;35495:20;35491:1;35480:9;35476:17;35469:47;35533:131;35659:4;35533:131;:::i;:::-;35525:139;;35423:248;;;:::o;35677:222::-;35770:4;35808:2;35797:9;35793:18;35785:26;;35821:71;35889:1;35878:9;35874:17;35865:6;35821:71;:::i;:::-;35775:124;;;;:::o;35905:775::-;36138:4;36176:3;36165:9;36161:19;36153:27;;36190:71;36258:1;36247:9;36243:17;36234:6;36190:71;:::i;:::-;36271:72;36339:2;36328:9;36324:18;36315:6;36271:72;:::i;:::-;36353;36421:2;36410:9;36406:18;36397:6;36353:72;:::i;:::-;36435;36503:2;36492:9;36488:18;36479:6;36435:72;:::i;:::-;36517:73;36585:3;36574:9;36570:19;36561:6;36517:73;:::i;:::-;36600;36668:3;36657:9;36653:19;36644:6;36600:73;:::i;:::-;36143:537;;;;;;;;;:::o;36686:129::-;36720:6;36747:20;;:::i;:::-;36737:30;;36776:33;36804:4;36796:6;36776:33;:::i;:::-;36727:88;;;:::o;36821:75::-;36854:6;36887:2;36881:9;36871:19;;36861:35;:::o;36902:311::-;36979:4;37069:18;37061:6;37058:30;37055:2;;;37091:18;;:::i;:::-;37055:2;37141:4;37133:6;37129:17;37121:25;;37201:4;37195;37191:15;37183:23;;36984:229;;;:::o;37219:307::-;37280:4;37370:18;37362:6;37359:30;37356:2;;;37392:18;;:::i;:::-;37356:2;37430:29;37452:6;37430:29;:::i;:::-;37422:37;;37514:4;37508;37504:15;37496:23;;37285:241;;;:::o;37532:308::-;37594:4;37684:18;37676:6;37673:30;37670:2;;;37706:18;;:::i;:::-;37670:2;37744:29;37766:6;37744:29;:::i;:::-;37736:37;;37828:4;37822;37818:15;37810:23;;37599:241;;;:::o;37846:132::-;37913:4;37936:3;37928:11;;37966:4;37961:3;37957:14;37949:22;;37918:60;;;:::o;37984:114::-;38051:6;38085:5;38079:12;38069:22;;38058:40;;;:::o;38104:98::-;38155:6;38189:5;38183:12;38173:22;;38162:40;;;:::o;38208:99::-;38260:6;38294:5;38288:12;38278:22;;38267:40;;;:::o;38313:113::-;38383:4;38415;38410:3;38406:14;38398:22;;38388:38;;;:::o;38432:184::-;38531:11;38565:6;38560:3;38553:19;38605:4;38600:3;38596:14;38581:29;;38543:73;;;;:::o;38622:168::-;38705:11;38739:6;38734:3;38727:19;38779:4;38774:3;38770:14;38755:29;;38717:73;;;;:::o;38796:169::-;38880:11;38914:6;38909:3;38902:19;38954:4;38949:3;38945:14;38930:29;;38892:73;;;;:::o;38971:148::-;39073:11;39110:3;39095:18;;39085:34;;;;:::o;39125:305::-;39165:3;39184:20;39202:1;39184:20;:::i;:::-;39179:25;;39218:20;39236:1;39218:20;:::i;:::-;39213:25;;39372:1;39304:66;39300:74;39297:1;39294:81;39291:2;;;39378:18;;:::i;:::-;39291:2;39422:1;39419;39415:9;39408:16;;39169:261;;;;:::o;39436:185::-;39476:1;39493:20;39511:1;39493:20;:::i;:::-;39488:25;;39527:20;39545:1;39527:20;:::i;:::-;39522:25;;39566:1;39556:2;;39571:18;;:::i;:::-;39556:2;39613:1;39610;39606:9;39601:14;;39478:143;;;;:::o;39627:348::-;39667:7;39690:20;39708:1;39690:20;:::i;:::-;39685:25;;39724:20;39742:1;39724:20;:::i;:::-;39719:25;;39912:1;39844:66;39840:74;39837:1;39834:81;39829:1;39822:9;39815:17;39811:105;39808:2;;;39919:18;;:::i;:::-;39808:2;39967:1;39964;39960:9;39949:20;;39675:300;;;;:::o;39981:191::-;40021:4;40041:20;40059:1;40041:20;:::i;:::-;40036:25;;40075:20;40093:1;40075:20;:::i;:::-;40070:25;;40114:1;40111;40108:8;40105:2;;;40119:18;;:::i;:::-;40105:2;40164:1;40161;40157:9;40149:17;;40026:146;;;;:::o;40178:96::-;40215:7;40244:24;40262:5;40244:24;:::i;:::-;40233:35;;40223:51;;;:::o;40280:90::-;40314:7;40357:5;40350:13;40343:21;40332:32;;40322:48;;;:::o;40376:149::-;40412:7;40452:66;40445:5;40441:78;40430:89;;40420:105;;;:::o;40531:126::-;40568:7;40608:42;40601:5;40597:54;40586:65;;40576:81;;;:::o;40663:77::-;40700:7;40729:5;40718:16;;40708:32;;;:::o;40746:154::-;40830:6;40825:3;40820;40807:30;40892:1;40883:6;40878:3;40874:16;40867:27;40797:103;;;:::o;40906:307::-;40974:1;40984:113;40998:6;40995:1;40992:13;40984:113;;;41083:1;41078:3;41074:11;41068:18;41064:1;41059:3;41055:11;41048:39;41020:2;41017:1;41013:10;41008:15;;40984:113;;;41115:6;41112:1;41109:13;41106:2;;;41195:1;41186:6;41181:3;41177:16;41170:27;41106:2;40955:258;;;;:::o;41219:320::-;41263:6;41300:1;41294:4;41290:12;41280:22;;41347:1;41341:4;41337:12;41368:18;41358:2;;41424:4;41416:6;41412:17;41402:27;;41358:2;41486;41478:6;41475:14;41455:18;41452:38;41449:2;;;41505:18;;:::i;:::-;41449:2;41270:269;;;;:::o;41545:281::-;41628:27;41650:4;41628:27;:::i;:::-;41620:6;41616:40;41758:6;41746:10;41743:22;41722:18;41710:10;41707:34;41704:62;41701:2;;;41769:18;;:::i;:::-;41701:2;41809:10;41805:2;41798:22;41588:238;;;:::o;41832:233::-;41871:3;41894:24;41912:5;41894:24;:::i;:::-;41885:33;;41940:66;41933:5;41930:77;41927:2;;;42010:18;;:::i;:::-;41927:2;42057:1;42050:5;42046:13;42039:20;;41875:190;;;:::o;42071:176::-;42103:1;42120:20;42138:1;42120:20;:::i;:::-;42115:25;;42154:20;42172:1;42154:20;:::i;:::-;42149:25;;42193:1;42183:2;;42198:18;;:::i;:::-;42183:2;42239:1;42236;42232:9;42227:14;;42105:142;;;;:::o;42253:180::-;42301:77;42298:1;42291:88;42398:4;42395:1;42388:15;42422:4;42419:1;42412:15;42439:180;42487:77;42484:1;42477:88;42584:4;42581:1;42574:15;42608:4;42605:1;42598:15;42625:180;42673:77;42670:1;42663:88;42770:4;42767:1;42760:15;42794:4;42791:1;42784:15;42811:180;42859:77;42856:1;42849:88;42956:4;42953:1;42946:15;42980:4;42977:1;42970:15;42997:102;43038:6;43089:2;43085:7;43080:2;43073:5;43069:14;43065:28;43055:38;;43045:54;;;:::o;43105:237::-;43245:34;43241:1;43233:6;43229:14;43222:58;43314:20;43309:2;43301:6;43297:15;43290:45;43211:131;:::o;43348:178::-;43488:30;43484:1;43476:6;43472:14;43465:54;43454:72;:::o;43532:232::-;43672:34;43668:1;43660:6;43656:14;43649:58;43741:15;43736:2;43728:6;43724:15;43717:40;43638:126;:::o;43770:235::-;43910:34;43906:1;43898:6;43894:14;43887:58;43979:18;43974:2;43966:6;43962:15;43955:43;43876:129;:::o;44011:223::-;44151:34;44147:1;44139:6;44135:14;44128:58;44220:6;44215:2;44207:6;44203:15;44196:31;44117:117;:::o;44240:175::-;44380:27;44376:1;44368:6;44364:14;44357:51;44346:69;:::o;44421:226::-;44561:34;44557:1;44549:6;44545:14;44538:58;44630:9;44625:2;44617:6;44613:15;44606:34;44527:120;:::o;44653:231::-;44793:34;44789:1;44781:6;44777:14;44770:58;44862:14;44857:2;44849:6;44845:15;44838:39;44759:125;:::o;44890:176::-;45030:28;45026:1;45018:6;45014:14;45007:52;44996:70;:::o;45072:243::-;45212:34;45208:1;45200:6;45196:14;45189:58;45281:26;45276:2;45268:6;45264:15;45257:51;45178:137;:::o;45321:229::-;45461:34;45457:1;45449:6;45445:14;45438:58;45530:12;45525:2;45517:6;45513:15;45506:37;45427:123;:::o;45556:228::-;45696:34;45692:1;45684:6;45680:14;45673:58;45765:11;45760:2;45752:6;45748:15;45741:36;45662:122;:::o;45790:233::-;45930:34;45926:1;45918:6;45914:14;45907:58;45999:16;45994:2;45986:6;45982:15;45975:41;45896:127;:::o;46029:238::-;46169:34;46165:1;46157:6;46153:14;46146:58;46238:21;46233:2;46225:6;46221:15;46214:46;46135:132;:::o;46273:182::-;46413:34;46409:1;46401:6;46397:14;46390:58;46379:76;:::o;46461:236::-;46601:34;46597:1;46589:6;46585:14;46578:58;46670:19;46665:2;46657:6;46653:15;46646:44;46567:130;:::o;46703:231::-;46843:34;46839:1;46831:6;46827:14;46820:58;46912:14;46907:2;46899:6;46895:15;46888:39;46809:125;:::o;46940:228::-;47080:34;47076:1;47068:6;47064:14;47057:58;47149:11;47144:2;47136:6;47132:15;47125:36;47046:122;:::o;47174:234::-;47314:34;47310:1;47302:6;47298:14;47291:58;47383:17;47378:2;47370:6;47366:15;47359:42;47280:128;:::o;47414:220::-;47554:34;47550:1;47542:6;47538:14;47531:58;47623:3;47618:2;47610:6;47606:15;47599:28;47520:114;:::o;47640:236::-;47780:34;47776:1;47768:6;47764:14;47757:58;47849:19;47844:2;47836:6;47832:15;47825:44;47746:130;:::o;47882:227::-;48022:34;48018:1;48010:6;48006:14;47999:58;48091:10;48086:2;48078:6;48074:15;48067:35;47988:121;:::o;48115:223::-;48255:34;48251:1;48243:6;48239:14;48232:58;48324:6;48319:2;48311:6;48307:15;48300:31;48221:117;:::o;48344:182::-;48484:34;48480:1;48472:6;48468:14;48461:58;48450:76;:::o;48532:174::-;48672:26;48668:1;48660:6;48656:14;48649:50;48638:68;:::o;48712:122::-;48785:24;48803:5;48785:24;:::i;:::-;48778:5;48775:35;48765:2;;48824:1;48821;48814:12;48765:2;48755:79;:::o;48840:116::-;48910:21;48925:5;48910:21;:::i;:::-;48903:5;48900:32;48890:2;;48946:1;48943;48936:12;48890:2;48880:76;:::o;48962:120::-;49034:23;49051:5;49034:23;:::i;:::-;49027:5;49024:34;49014:2;;49072:1;49069;49062:12;49014:2;49004:78;:::o;49088:122::-;49161:24;49179:5;49161:24;:::i;:::-;49154:5;49151:35;49141:2;;49200:1;49197;49190:12;49141:2;49131:79;:::o

Swarm Source

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