ETH Price: $3,936.61 (+7.27%)

Token

BANG BANG CLUB (BBCard)
 

Overview

Max Total Supply

176 BBCard

Holders

105

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
scilynt.eth
Balance
1 BBCard
0xacf36c7afecc6aae80de6151413f6fe1c778e0fd
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:
BBCard

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 _                         _                                __ _              _       _     
| |                       | |                              / _| |            | |     | |    
| |__   __ _ _ __   __ _  | |__   __ _ _ __   __ _   _ __ | |_| |_        ___| |_   _| |__  
| '_ \ / _` | '_ \ / _` | | '_ \ / _` | '_ \ / _` | | '_ \|  _| __|      / __| | | | | '_ \ 
| |_) | (_| | | | | (_| | | |_) | (_| | | | | (_| | | | | | | | |_   _  | (__| | |_| | |_) |
|_.__/ \__,_|_| |_|\__, | |_.__/ \__,_|_| |_|\__, | |_| |_|_|  \__| (_)  \___|_|\__,_|_.__/ 
                    __/ |                     __/ |                                         
                   |___/                     |___/                                          
*/

// SPDX-License-Identifier: MIT

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 no longer needed starting with Solidity 0.8. 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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = '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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, 'Strings: hex length insufficient');
        return string(buffer);
    }
}

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;
        // solhint-disable-next-line no-inline-assembly
        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');

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/*
 * @dev 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), 'ERC721: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721: transfer to non ERC721Receiver implementer');
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

contract BBCard is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;

    uint256 public constant NFT_PRICE = 20000000000000000; // 0.02 Eth
    uint public constant MAX_NFT_PURCHASE = 10; // One free BBCard plus purchase of 10 extra
    uint256 public MAX_PUBLIC_SUPPLY = 10000; // Total Supply
    uint256 public DEV_RESERVE = 30; // Reserved for marketing purposes
    bool public saleIsActive = false; // Deploy with inactive state
    address one_address = 0x34E98a271FED8fA16c713D76b29aE5F315CCb9DD; // Developers
    address two_address = 0xeED58972Fc22A23713944DE59D03B6964c947Ffe; // Degign and Marketing
    bool public publicMintPaused = false;

    string private _baseURIExtended;
    mapping(uint256 => string) _tokenURIs;
    mapping(address => bool) minted;
    mapping(address => uint256) purchased;

    receive() external payable {}
     
    modifier mintOnlyOnce() {
        require(!minted[_msgSender()], 'Can only mint once');
        minted[_msgSender()] = true;
        _;
    }

    constructor() ERC721("BANG BANG CLUB", "BBCard") {}

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function update_two_address(address new_two_address) public onlyOwner{
        two_address = new_two_address;
    }

    function withdraw() external {
        require(
                msg.sender == one_address ||
                msg.sender == two_address
        );

        uint256 bal = address(this).balance;

        uint256 Fifty = bal.mul(50).div(100);
        (bool sent1,) = one_address.call{value: Fifty}("");
        require(sent1, "Failed to send Ether");

        uint256 Fifty1 = bal.mul(50).div(100);
        (bool sent2,) = two_address.call{value: Fifty1}("");
        require(sent2, "Failed to send Ether");
        
         uint256 remaining = address(this).balance;
        (bool sent3,) = one_address.call{value: remaining}("");
        require(sent3, "Failed to send Ether");
    }


    function mintBBCard(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale is not active at the moment");
        require(purchased[msg.sender].add(numberOfTokens) <= MAX_NFT_PURCHASE, "Can only mint up to 10 per address");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(totalSupply().add(numberOfTokens) <= MAX_PUBLIC_SUPPLY, "Purchase would exceed max supply of tokens");
        require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 10 per purchase");
        require(NFT_PRICE.mul(numberOfTokens) == msg.value, "Sent ether value is incorrect");
        purchased[msg.sender] = purchased[msg.sender].add(numberOfTokens);
        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function claimOneFreeBBcard() public mintOnlyOnce {
        require(saleIsActive, "Sale is not active at the moment");
        require(totalSupply().add(1) <= MAX_PUBLIC_SUPPLY, "Purchase would exceed max public supply of tokens");
        _safeMint(msg.sender, totalSupply());
    }
    function reserveTokens(uint256 _reserveAmount) public onlyOwner {
        require(
            _reserveAmount > 0 && _reserveAmount <= DEV_RESERVE, "Not enough reserve left for the team"
            );
        for (uint i = 0; i < _reserveAmount; i++) {
       _safeMint(msg.sender, totalSupply());
        }
        DEV_RESERVE = DEV_RESERVE.sub(_reserveAmount);
    }

    function leftForSale() public view returns(uint256) {
        return MAX_PUBLIC_SUPPLY - totalSupply();
}

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIExtended;
    }

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: 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));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEV_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOneFreeBBcard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBBCard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_two_address","type":"address"}],"name":"update_two_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052612710600b55601e600c556000600d60006101000a81548160ff0219169083151502179055507334e98a271fed8fa16c713d76b29ae5f315ccb9dd600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eed58972fc22a23713944de59d03b6964c947ffe600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60146101000a81548160ff021916908315150217905550348015620000fc57600080fd5b506040518060400160405280600e81526020017f42414e472042414e4720434c55420000000000000000000000000000000000008152506040518060400160405280600681526020017f42424361726400000000000000000000000000000000000000000000000000008152508160009080519060200190620001819291906200025c565b5080600190805190602001906200019a9291906200025c565b5050506000620001af6200025460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000371565b600033905090565b8280546200026a906200033b565b90600052602060002090601f0160209004810192826200028e5760008555620002da565b82601f10620002a957805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002d9578251825591602001919060010190620002bc565b5b509050620002e99190620002ed565b5090565b5b8082111562000308576000816000905550600101620002ee565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035457607f821691505b602082108114156200036b576200036a6200030c565b5b50919050565b614b6780620003816000396000f3fe6080604052600436106101f25760003560e01c806355f804b31161010d57806395fd0d7b116100a0578063d031370b1161006f578063d031370b146106c3578063d1e6a64f146106ec578063e985e9c514610717578063eb8d244414610754578063f2fde38b1461077f576101f9565b806395fd0d7b1461061d578063a22cb46514610634578063b88d4fde1461065d578063c87b56dd14610686576101f9565b8063715018a6116100dc578063715018a6146105945780638562838c146105ab5780638da5cb5b146105c757806395d89b41146105f2576101f9565b806355f804b3146104c65780636352211e146104ef578063676dd5631461052c57806370a0823114610557576101f9565b80632a47f7991161018557806334df1f7c1161015457806334df1f7c1461041e5780633ccfd60b1461044957806342842e0e146104605780634f6ccce714610489576101f9565b80632a47f799146103745780632f745c591461039f57806333d9d5fd146103dc57806334918dfd14610407576101f9565b8063095ea7b3116101c1578063095ea7b3146102ce578063116348b1146102f757806318160ddd1461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe578063020b39cc1461023b57806306fdde0314610266578063081812fc14610291576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906131f3565b6107a8565b604051610232919061323b565b60405180910390f35b34801561024757600080fd5b50610250610822565b60405161025d919061326f565b60405180910390f35b34801561027257600080fd5b5061027b610827565b6040516102889190613323565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190613371565b6108b9565b6040516102c591906133df565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f09190613426565b61093e565b005b34801561030357600080fd5b5061031e60048036038101906103199190613466565b610a56565b005b34801561032c57600080fd5b50610335610b16565b604051610342919061326f565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613493565b610b23565b005b34801561038057600080fd5b50610389610b83565b604051610396919061326f565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190613426565b610b89565b6040516103d3919061326f565b60405180910390f35b3480156103e857600080fd5b506103f1610c2e565b6040516103fe919061323b565b60405180910390f35b34801561041357600080fd5b5061041c610c41565b005b34801561042a57600080fd5b50610433610ce9565b604051610440919061326f565b60405180910390f35b34801561045557600080fd5b5061045e610cef565b005b34801561046c57600080fd5b5061048760048036038101906104829190613493565b611074565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613371565b611094565b6040516104bd919061326f565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061361b565b611105565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613371565b61119b565b60405161052391906133df565b60405180910390f35b34801561053857600080fd5b5061054161124d565b60405161054e919061326f565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190613466565b611258565b60405161058b919061326f565b60405180910390f35b3480156105a057600080fd5b506105a9611310565b005b6105c560048036038101906105c09190613371565b61144d565b005b3480156105d357600080fd5b506105dc611739565b6040516105e991906133df565b60405180910390f35b3480156105fe57600080fd5b50610607611763565b6040516106149190613323565b60405180910390f35b34801561062957600080fd5b506106326117f5565b005b34801561064057600080fd5b5061065b60048036038101906106569190613690565b6119a9565b005b34801561066957600080fd5b50610684600480360381019061067f9190613771565b611b2a565b005b34801561069257600080fd5b506106ad60048036038101906106a89190613371565b611b8c565b6040516106ba9190613323565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190613371565b611cff565b005b3480156106f857600080fd5b50610701611e1a565b60405161070e919061326f565b60405180910390f35b34801561072357600080fd5b5061073e600480360381019061073991906137f4565b611e36565b60405161074b919061323b565b60405180910390f35b34801561076057600080fd5b50610769611eca565b604051610776919061323b565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190613466565b611edd565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081b575061081a82612089565b5b9050919050565b600a81565b60606000805461083690613863565b80601f016020809104026020016040519081016040528092919081815260200182805461086290613863565b80156108af5780601f10610884576101008083540402835291602001916108af565b820191906000526020600020905b81548152906001019060200180831161089257829003601f168201915b5050505050905090565b60006108c48261216b565b610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa90613907565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109498261119b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190613999565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d96121d7565b73ffffffffffffffffffffffffffffffffffffffff161480610a085750610a0781610a026121d7565b611e36565b5b610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90613a2b565b60405180910390fd5b610a5183836121df565b505050565b610a5e6121d7565b73ffffffffffffffffffffffffffffffffffffffff16610a7c611739565b73ffffffffffffffffffffffffffffffffffffffff1614610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990613a97565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600880549050905090565b610b34610b2e6121d7565b82612298565b610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90613b29565b60405180910390fd5b610b7e838383612376565b505050565b600b5481565b6000610b9483611258565b8210610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613bbb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e60149054906101000a900460ff1681565b610c496121d7565b73ffffffffffffffffffffffffffffffffffffffff16610c67611739565b73ffffffffffffffffffffffffffffffffffffffff1614610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490613a97565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600c5481565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d985750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610da157600080fd5b60004790506000610dcf6064610dc16032856125d290919063ffffffff16565b6125e890919063ffffffff16565b90506000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610e1990613c0c565b60006040518083038185875af1925050503d8060008114610e56576040519150601f19603f3d011682016040523d82523d6000602084013e610e5b565b606091505b5050905080610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690613c6d565b60405180910390fd5b6000610ec86064610eba6032876125d290919063ffffffff16565b6125e890919063ffffffff16565b90506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610f1290613c0c565b60006040518083038185875af1925050503d8060008114610f4f576040519150601f19603f3d011682016040523d82523d6000602084013e610f54565b606091505b5050905080610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90613c6d565b60405180910390fd5b60004790506000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610fe590613c0c565b60006040518083038185875af1925050503d8060008114611022576040519150601f19603f3d011682016040523d82523d6000602084013e611027565b606091505b505090508061106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106290613c6d565b60405180910390fd5b50505050505050565b61108f83838360405180602001604052806000815250611b2a565b505050565b600061109e610b16565b82106110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613cff565b60405180910390fd5b600882815481106110f3576110f2613d1f565b5b90600052602060002001549050919050565b61110d6121d7565b73ffffffffffffffffffffffffffffffffffffffff1661112b611739565b73ffffffffffffffffffffffffffffffffffffffff1614611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613a97565b60405180910390fd5b80600f90805190602001906111979291906130e4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613dc0565b60405180910390fd5b80915050919050565b66470de4df82000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090613e52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113186121d7565b73ffffffffffffffffffffffffffffffffffffffff16611336611739565b73ffffffffffffffffffffffffffffffffffffffff161461138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390613a97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d60009054906101000a900460ff1661149c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149390613ebe565b60405180910390fd5b600a6114f082601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125fe90919063ffffffff16565b1115611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613f50565b60405180910390fd5b60008111611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b90613fe2565b60405180910390fd5b600b5461159182611583610b16565b6125fe90919063ffffffff16565b11156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614074565b60405180910390fd5b600a811115611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90614106565b60405180910390fd5b346116318266470de4df8200006125d290919063ffffffff16565b14611671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166890614172565b60405180910390fd5b6116c381601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125fe90919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b81811015611735576117223361171d610b16565b612614565b808061172d906141c1565b915050611709565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461177290613863565b80601f016020809104026020016040519081016040528092919081815260200182805461179e90613863565b80156117eb5780601f106117c0576101008083540402835291602001916117eb565b820191906000526020600020905b8154815290600101906020018083116117ce57829003601f168201915b5050505050905090565b601160006118016121d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090614256565b60405180910390fd5b6001601160006118976121d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d60009054906101000a900460ff16611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90613ebe565b60405180910390fd5b600b546119556001611947610b16565b6125fe90919063ffffffff16565b1115611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d906142e8565b60405180910390fd5b6119a7336119a2610b16565b612614565b565b6119b16121d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1690614354565b60405180910390fd5b8060056000611a2c6121d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ad96121d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b1e919061323b565b60405180910390a35050565b611b3b611b356121d7565b83612298565b611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190613b29565b60405180910390fd5b611b8684848484612632565b50505050565b6060611b978261216b565b611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd906143e6565b60405180910390fd5b6000601060008481526020019081526020016000208054611bf690613863565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2290613863565b8015611c6f5780601f10611c4457610100808354040283529160200191611c6f565b820191906000526020600020905b815481529060010190602001808311611c5257829003601f168201915b505050505090506000611c8061268e565b9050600081511415611c96578192505050611cfa565b600082511115611ccb578082604051602001611cb3929190614442565b60405160208183030381529060405292505050611cfa565b80611cd585612720565b604051602001611ce6929190614442565b604051602081830303815290604052925050505b919050565b611d076121d7565b73ffffffffffffffffffffffffffffffffffffffff16611d25611739565b73ffffffffffffffffffffffffffffffffffffffff1614611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7290613a97565b60405180910390fd5b600081118015611d8d5750600c548111155b611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc3906144d8565b60405180910390fd5b60005b81811015611dfb57611de833611de3610b16565b612614565b8080611df3906141c1565b915050611dcf565b50611e1181600c5461288190919063ffffffff16565b600c8190555050565b6000611e24610b16565b600b54611e3191906144f8565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611ee56121d7565b73ffffffffffffffffffffffffffffffffffffffff16611f03611739565b73ffffffffffffffffffffffffffffffffffffffff1614611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090613a97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc09061459e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061215457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612164575061216382612897565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122528361119b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122a38261216b565b6122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d990614630565b60405180910390fd5b60006122ed8361119b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061235c57508373ffffffffffffffffffffffffffffffffffffffff16612344846108b9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061236d575061236c8185611e36565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123968261119b565b73ffffffffffffffffffffffffffffffffffffffff16146123ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e3906146c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561245c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245390614754565b60405180910390fd5b612467838383612901565b6124726000826121df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c291906144f8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125199190614774565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836125e091906147ca565b905092915050565b600081836125f69190614853565b905092915050565b6000818361260c9190614774565b905092915050565b61262e828260405180602001604052806000815250612a15565b5050565b61263d848484612376565b61264984848484612a70565b612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f906148f6565b60405180910390fd5b50505050565b6060600f805461269d90613863565b80601f01602080910402602001604051908101604052809291908181526020018280546126c990613863565b80156127165780601f106126eb57610100808354040283529160200191612716565b820191906000526020600020905b8154815290600101906020018083116126f957829003601f168201915b5050505050905090565b60606000821415612768576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061287c565b600082905060005b6000821461279a578080612783906141c1565b915050600a826127939190614853565b9150612770565b60008167ffffffffffffffff8111156127b6576127b56134f0565b5b6040519080825280601f01601f1916602001820160405280156127e85781602001600182028036833780820191505090505b5090505b600085146128755760018261280191906144f8565b9150600a856128109190614916565b603061281c9190614774565b60f81b81838151811061283257612831613d1f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561286e9190614853565b94506127ec565b8093505050505b919050565b6000818361288f91906144f8565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61290c838383612bf8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561294f5761294a81612bfd565b61298e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461298d5761298c8382612c46565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d1576129cc81612db3565b612a10565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0f57612a0e8282612e84565b5b5b505050565b612a1f8383612f03565b612a2c6000848484612a70565b612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a62906148f6565b60405180910390fd5b505050565b6000612a918473ffffffffffffffffffffffffffffffffffffffff166130d1565b15612beb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612aba6121d7565b8786866040518563ffffffff1660e01b8152600401612adc949392919061499c565b6020604051808303816000875af1925050508015612b1857506040513d601f19601f82011682018060405250810190612b1591906149fd565b60015b612b9b573d8060008114612b48576040519150601f19603f3d011682016040523d82523d6000602084013e612b4d565b606091505b50600081511415612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a906148f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bf0565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c5384611258565b612c5d91906144f8565b9050600060076000848152602001908152602001600020549050818114612d42576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612dc791906144f8565b9050600060096000848152602001908152602001600020549050600060088381548110612df757612df6613d1f565b5b906000526020600020015490508060088381548110612e1957612e18613d1f565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e6857612e67614a2a565b5b6001900381819060005260206000200160009055905550505050565b6000612e8f83611258565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6a90614aa5565b60405180910390fd5b612f7c8161216b565b15612fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb390614b11565b60405180910390fd5b612fc860008383612901565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130189190614774565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546130f090613863565b90600052602060002090601f0160209004810192826131125760008555613159565b82601f1061312b57805160ff1916838001178555613159565b82800160010185558215613159579182015b8281111561315857825182559160200191906001019061313d565b5b509050613166919061316a565b5090565b5b8082111561318357600081600090555060010161316b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131d08161319b565b81146131db57600080fd5b50565b6000813590506131ed816131c7565b92915050565b60006020828403121561320957613208613191565b5b6000613217848285016131de565b91505092915050565b60008115159050919050565b61323581613220565b82525050565b6000602082019050613250600083018461322c565b92915050565b6000819050919050565b61326981613256565b82525050565b60006020820190506132846000830184613260565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132c45780820151818401526020810190506132a9565b838111156132d3576000848401525b50505050565b6000601f19601f8301169050919050565b60006132f58261328a565b6132ff8185613295565b935061330f8185602086016132a6565b613318816132d9565b840191505092915050565b6000602082019050818103600083015261333d81846132ea565b905092915050565b61334e81613256565b811461335957600080fd5b50565b60008135905061336b81613345565b92915050565b60006020828403121561338757613386613191565b5b60006133958482850161335c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133c98261339e565b9050919050565b6133d9816133be565b82525050565b60006020820190506133f460008301846133d0565b92915050565b613403816133be565b811461340e57600080fd5b50565b600081359050613420816133fa565b92915050565b6000806040838503121561343d5761343c613191565b5b600061344b85828601613411565b925050602061345c8582860161335c565b9150509250929050565b60006020828403121561347c5761347b613191565b5b600061348a84828501613411565b91505092915050565b6000806000606084860312156134ac576134ab613191565b5b60006134ba86828701613411565b93505060206134cb86828701613411565b92505060406134dc8682870161335c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613528826132d9565b810181811067ffffffffffffffff82111715613547576135466134f0565b5b80604052505050565b600061355a613187565b9050613566828261351f565b919050565b600067ffffffffffffffff821115613586576135856134f0565b5b61358f826132d9565b9050602081019050919050565b82818337600083830152505050565b60006135be6135b98461356b565b613550565b9050828152602081018484840111156135da576135d96134eb565b5b6135e584828561359c565b509392505050565b600082601f830112613602576136016134e6565b5b81356136128482602086016135ab565b91505092915050565b60006020828403121561363157613630613191565b5b600082013567ffffffffffffffff81111561364f5761364e613196565b5b61365b848285016135ed565b91505092915050565b61366d81613220565b811461367857600080fd5b50565b60008135905061368a81613664565b92915050565b600080604083850312156136a7576136a6613191565b5b60006136b585828601613411565b92505060206136c68582860161367b565b9150509250929050565b600067ffffffffffffffff8211156136eb576136ea6134f0565b5b6136f4826132d9565b9050602081019050919050565b600061371461370f846136d0565b613550565b9050828152602081018484840111156137305761372f6134eb565b5b61373b84828561359c565b509392505050565b600082601f830112613758576137576134e6565b5b8135613768848260208601613701565b91505092915050565b6000806000806080858703121561378b5761378a613191565b5b600061379987828801613411565b94505060206137aa87828801613411565b93505060406137bb8782880161335c565b925050606085013567ffffffffffffffff8111156137dc576137db613196565b5b6137e887828801613743565b91505092959194509250565b6000806040838503121561380b5761380a613191565b5b600061381985828601613411565b925050602061382a85828601613411565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387b57607f821691505b6020821081141561388f5761388e613834565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138f1602c83613295565b91506138fc82613895565b604082019050919050565b60006020820190508181036000830152613920816138e4565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613983602183613295565b915061398e82613927565b604082019050919050565b600060208201905081810360008301526139b281613976565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a15603883613295565b9150613a20826139b9565b604082019050919050565b60006020820190508181036000830152613a4481613a08565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a81602083613295565b9150613a8c82613a4b565b602082019050919050565b60006020820190508181036000830152613ab081613a74565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b13603183613295565b9150613b1e82613ab7565b604082019050919050565b60006020820190508181036000830152613b4281613b06565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ba5602b83613295565b9150613bb082613b49565b604082019050919050565b60006020820190508181036000830152613bd481613b98565b9050919050565b600081905092915050565b50565b6000613bf6600083613bdb565b9150613c0182613be6565b600082019050919050565b6000613c1782613be9565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000613c57601483613295565b9150613c6282613c21565b602082019050919050565b60006020820190508181036000830152613c8681613c4a565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ce9602c83613295565b9150613cf482613c8d565b604082019050919050565b60006020820190508181036000830152613d1881613cdc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613daa602983613295565b9150613db582613d4e565b604082019050919050565b60006020820190508181036000830152613dd981613d9d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613e3c602a83613295565b9150613e4782613de0565b604082019050919050565b60006020820190508181036000830152613e6b81613e2f565b9050919050565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6000613ea8602083613295565b9150613eb382613e72565b602082019050919050565b60006020820190508181036000830152613ed781613e9b565b9050919050565b7f43616e206f6e6c79206d696e7420757020746f2031302070657220616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f3a602283613295565b9150613f4582613ede565b604082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b6000613fcc603383613295565b9150613fd782613f70565b604082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b600061405e602a83613295565b915061406982614002565b604082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b7f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b60006140f0602383613295565b91506140fb82614094565b604082019050919050565b6000602082019050818103600083015261411f816140e3565b9050919050565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b600061415c601d83613295565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141cc82613256565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ff576141fe614192565b5b600182019050919050565b7f43616e206f6e6c79206d696e74206f6e63650000000000000000000000000000600082015250565b6000614240601283613295565b915061424b8261420a565b602082019050919050565b6000602082019050818103600083015261426f81614233565b9050919050565b7f507572636861736520776f756c6420657863656564206d6178207075626c696360008201527f20737570706c79206f6620746f6b656e73000000000000000000000000000000602082015250565b60006142d2603183613295565b91506142dd82614276565b604082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061433e601983613295565b915061434982614308565b602082019050919050565b6000602082019050818103600083015261436d81614331565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143d0602f83613295565b91506143db82614374565b604082019050919050565b600060208201905081810360008301526143ff816143c3565b9050919050565b600081905092915050565b600061441c8261328a565b6144268185614406565b93506144368185602086016132a6565b80840191505092915050565b600061444e8285614411565b915061445a8284614411565b91508190509392505050565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207468652060008201527f7465616d00000000000000000000000000000000000000000000000000000000602082015250565b60006144c2602483613295565b91506144cd82614466565b604082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b600061450382613256565b915061450e83613256565b92508282101561452157614520614192565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614588602683613295565b91506145938261452c565b604082019050919050565b600060208201905081810360008301526145b78161457b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061461a602c83613295565b9150614625826145be565b604082019050919050565b600060208201905081810360008301526146498161460d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146ac602983613295565b91506146b782614650565b604082019050919050565b600060208201905081810360008301526146db8161469f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061473e602483613295565b9150614749826146e2565b604082019050919050565b6000602082019050818103600083015261476d81614731565b9050919050565b600061477f82613256565b915061478a83613256565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147bf576147be614192565b5b828201905092915050565b60006147d582613256565b91506147e083613256565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481957614818614192565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061485e82613256565b915061486983613256565b92508261487957614878614824565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148e0603283613295565b91506148eb82614884565b604082019050919050565b6000602082019050818103600083015261490f816148d3565b9050919050565b600061492182613256565b915061492c83613256565b92508261493c5761493b614824565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061496e82614947565b6149788185614952565b93506149888185602086016132a6565b614991816132d9565b840191505092915050565b60006080820190506149b160008301876133d0565b6149be60208301866133d0565b6149cb6040830185613260565b81810360608301526149dd8184614963565b905095945050505050565b6000815190506149f7816131c7565b92915050565b600060208284031215614a1357614a12613191565b5b6000614a21848285016149e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a8f602083613295565b9150614a9a82614a59565b602082019050919050565b60006020820190508181036000830152614abe81614a82565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614afb601c83613295565b9150614b0682614ac5565b602082019050919050565b60006020820190508181036000830152614b2a81614aee565b905091905056fea264697066735822122059504e3ddc815653a80086de7ea4f1f9116e1733e1e29f2f248d5d62ccf7b86a64736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106101f25760003560e01c806355f804b31161010d57806395fd0d7b116100a0578063d031370b1161006f578063d031370b146106c3578063d1e6a64f146106ec578063e985e9c514610717578063eb8d244414610754578063f2fde38b1461077f576101f9565b806395fd0d7b1461061d578063a22cb46514610634578063b88d4fde1461065d578063c87b56dd14610686576101f9565b8063715018a6116100dc578063715018a6146105945780638562838c146105ab5780638da5cb5b146105c757806395d89b41146105f2576101f9565b806355f804b3146104c65780636352211e146104ef578063676dd5631461052c57806370a0823114610557576101f9565b80632a47f7991161018557806334df1f7c1161015457806334df1f7c1461041e5780633ccfd60b1461044957806342842e0e146104605780634f6ccce714610489576101f9565b80632a47f799146103745780632f745c591461039f57806333d9d5fd146103dc57806334918dfd14610407576101f9565b8063095ea7b3116101c1578063095ea7b3146102ce578063116348b1146102f757806318160ddd1461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe578063020b39cc1461023b57806306fdde0314610266578063081812fc14610291576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906131f3565b6107a8565b604051610232919061323b565b60405180910390f35b34801561024757600080fd5b50610250610822565b60405161025d919061326f565b60405180910390f35b34801561027257600080fd5b5061027b610827565b6040516102889190613323565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190613371565b6108b9565b6040516102c591906133df565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f09190613426565b61093e565b005b34801561030357600080fd5b5061031e60048036038101906103199190613466565b610a56565b005b34801561032c57600080fd5b50610335610b16565b604051610342919061326f565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613493565b610b23565b005b34801561038057600080fd5b50610389610b83565b604051610396919061326f565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190613426565b610b89565b6040516103d3919061326f565b60405180910390f35b3480156103e857600080fd5b506103f1610c2e565b6040516103fe919061323b565b60405180910390f35b34801561041357600080fd5b5061041c610c41565b005b34801561042a57600080fd5b50610433610ce9565b604051610440919061326f565b60405180910390f35b34801561045557600080fd5b5061045e610cef565b005b34801561046c57600080fd5b5061048760048036038101906104829190613493565b611074565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613371565b611094565b6040516104bd919061326f565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061361b565b611105565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613371565b61119b565b60405161052391906133df565b60405180910390f35b34801561053857600080fd5b5061054161124d565b60405161054e919061326f565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190613466565b611258565b60405161058b919061326f565b60405180910390f35b3480156105a057600080fd5b506105a9611310565b005b6105c560048036038101906105c09190613371565b61144d565b005b3480156105d357600080fd5b506105dc611739565b6040516105e991906133df565b60405180910390f35b3480156105fe57600080fd5b50610607611763565b6040516106149190613323565b60405180910390f35b34801561062957600080fd5b506106326117f5565b005b34801561064057600080fd5b5061065b60048036038101906106569190613690565b6119a9565b005b34801561066957600080fd5b50610684600480360381019061067f9190613771565b611b2a565b005b34801561069257600080fd5b506106ad60048036038101906106a89190613371565b611b8c565b6040516106ba9190613323565b60405180910390f35b3480156106cf57600080fd5b506106ea60048036038101906106e59190613371565b611cff565b005b3480156106f857600080fd5b50610701611e1a565b60405161070e919061326f565b60405180910390f35b34801561072357600080fd5b5061073e600480360381019061073991906137f4565b611e36565b60405161074b919061323b565b60405180910390f35b34801561076057600080fd5b50610769611eca565b604051610776919061323b565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190613466565b611edd565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081b575061081a82612089565b5b9050919050565b600a81565b60606000805461083690613863565b80601f016020809104026020016040519081016040528092919081815260200182805461086290613863565b80156108af5780601f10610884576101008083540402835291602001916108af565b820191906000526020600020905b81548152906001019060200180831161089257829003601f168201915b5050505050905090565b60006108c48261216b565b610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa90613907565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109498261119b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190613999565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d96121d7565b73ffffffffffffffffffffffffffffffffffffffff161480610a085750610a0781610a026121d7565b611e36565b5b610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e90613a2b565b60405180910390fd5b610a5183836121df565b505050565b610a5e6121d7565b73ffffffffffffffffffffffffffffffffffffffff16610a7c611739565b73ffffffffffffffffffffffffffffffffffffffff1614610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990613a97565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600880549050905090565b610b34610b2e6121d7565b82612298565b610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90613b29565b60405180910390fd5b610b7e838383612376565b505050565b600b5481565b6000610b9483611258565b8210610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613bbb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e60149054906101000a900460ff1681565b610c496121d7565b73ffffffffffffffffffffffffffffffffffffffff16610c67611739565b73ffffffffffffffffffffffffffffffffffffffff1614610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490613a97565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600c5481565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d985750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610da157600080fd5b60004790506000610dcf6064610dc16032856125d290919063ffffffff16565b6125e890919063ffffffff16565b90506000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610e1990613c0c565b60006040518083038185875af1925050503d8060008114610e56576040519150601f19603f3d011682016040523d82523d6000602084013e610e5b565b606091505b5050905080610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690613c6d565b60405180910390fd5b6000610ec86064610eba6032876125d290919063ffffffff16565b6125e890919063ffffffff16565b90506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610f1290613c0c565b60006040518083038185875af1925050503d8060008114610f4f576040519150601f19603f3d011682016040523d82523d6000602084013e610f54565b606091505b5050905080610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90613c6d565b60405180910390fd5b60004790506000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610fe590613c0c565b60006040518083038185875af1925050503d8060008114611022576040519150601f19603f3d011682016040523d82523d6000602084013e611027565b606091505b505090508061106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106290613c6d565b60405180910390fd5b50505050505050565b61108f83838360405180602001604052806000815250611b2a565b505050565b600061109e610b16565b82106110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613cff565b60405180910390fd5b600882815481106110f3576110f2613d1f565b5b90600052602060002001549050919050565b61110d6121d7565b73ffffffffffffffffffffffffffffffffffffffff1661112b611739565b73ffffffffffffffffffffffffffffffffffffffff1614611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613a97565b60405180910390fd5b80600f90805190602001906111979291906130e4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613dc0565b60405180910390fd5b80915050919050565b66470de4df82000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090613e52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113186121d7565b73ffffffffffffffffffffffffffffffffffffffff16611336611739565b73ffffffffffffffffffffffffffffffffffffffff161461138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390613a97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d60009054906101000a900460ff1661149c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149390613ebe565b60405180910390fd5b600a6114f082601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125fe90919063ffffffff16565b1115611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613f50565b60405180910390fd5b60008111611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b90613fe2565b60405180910390fd5b600b5461159182611583610b16565b6125fe90919063ffffffff16565b11156115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614074565b60405180910390fd5b600a811115611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90614106565b60405180910390fd5b346116318266470de4df8200006125d290919063ffffffff16565b14611671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166890614172565b60405180910390fd5b6116c381601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125fe90919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b81811015611735576117223361171d610b16565b612614565b808061172d906141c1565b915050611709565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461177290613863565b80601f016020809104026020016040519081016040528092919081815260200182805461179e90613863565b80156117eb5780601f106117c0576101008083540402835291602001916117eb565b820191906000526020600020905b8154815290600101906020018083116117ce57829003601f168201915b5050505050905090565b601160006118016121d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090614256565b60405180910390fd5b6001601160006118976121d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d60009054906101000a900460ff16611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90613ebe565b60405180910390fd5b600b546119556001611947610b16565b6125fe90919063ffffffff16565b1115611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d906142e8565b60405180910390fd5b6119a7336119a2610b16565b612614565b565b6119b16121d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1690614354565b60405180910390fd5b8060056000611a2c6121d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ad96121d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b1e919061323b565b60405180910390a35050565b611b3b611b356121d7565b83612298565b611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190613b29565b60405180910390fd5b611b8684848484612632565b50505050565b6060611b978261216b565b611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd906143e6565b60405180910390fd5b6000601060008481526020019081526020016000208054611bf690613863565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2290613863565b8015611c6f5780601f10611c4457610100808354040283529160200191611c6f565b820191906000526020600020905b815481529060010190602001808311611c5257829003601f168201915b505050505090506000611c8061268e565b9050600081511415611c96578192505050611cfa565b600082511115611ccb578082604051602001611cb3929190614442565b60405160208183030381529060405292505050611cfa565b80611cd585612720565b604051602001611ce6929190614442565b604051602081830303815290604052925050505b919050565b611d076121d7565b73ffffffffffffffffffffffffffffffffffffffff16611d25611739565b73ffffffffffffffffffffffffffffffffffffffff1614611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7290613a97565b60405180910390fd5b600081118015611d8d5750600c548111155b611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc3906144d8565b60405180910390fd5b60005b81811015611dfb57611de833611de3610b16565b612614565b8080611df3906141c1565b915050611dcf565b50611e1181600c5461288190919063ffffffff16565b600c8190555050565b6000611e24610b16565b600b54611e3191906144f8565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611ee56121d7565b73ffffffffffffffffffffffffffffffffffffffff16611f03611739565b73ffffffffffffffffffffffffffffffffffffffff1614611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090613a97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc09061459e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061215457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612164575061216382612897565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122528361119b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122a38261216b565b6122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d990614630565b60405180910390fd5b60006122ed8361119b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061235c57508373ffffffffffffffffffffffffffffffffffffffff16612344846108b9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061236d575061236c8185611e36565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123968261119b565b73ffffffffffffffffffffffffffffffffffffffff16146123ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e3906146c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561245c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245390614754565b60405180910390fd5b612467838383612901565b6124726000826121df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c291906144f8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125199190614774565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836125e091906147ca565b905092915050565b600081836125f69190614853565b905092915050565b6000818361260c9190614774565b905092915050565b61262e828260405180602001604052806000815250612a15565b5050565b61263d848484612376565b61264984848484612a70565b612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f906148f6565b60405180910390fd5b50505050565b6060600f805461269d90613863565b80601f01602080910402602001604051908101604052809291908181526020018280546126c990613863565b80156127165780601f106126eb57610100808354040283529160200191612716565b820191906000526020600020905b8154815290600101906020018083116126f957829003601f168201915b5050505050905090565b60606000821415612768576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061287c565b600082905060005b6000821461279a578080612783906141c1565b915050600a826127939190614853565b9150612770565b60008167ffffffffffffffff8111156127b6576127b56134f0565b5b6040519080825280601f01601f1916602001820160405280156127e85781602001600182028036833780820191505090505b5090505b600085146128755760018261280191906144f8565b9150600a856128109190614916565b603061281c9190614774565b60f81b81838151811061283257612831613d1f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561286e9190614853565b94506127ec565b8093505050505b919050565b6000818361288f91906144f8565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61290c838383612bf8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561294f5761294a81612bfd565b61298e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461298d5761298c8382612c46565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d1576129cc81612db3565b612a10565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0f57612a0e8282612e84565b5b5b505050565b612a1f8383612f03565b612a2c6000848484612a70565b612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a62906148f6565b60405180910390fd5b505050565b6000612a918473ffffffffffffffffffffffffffffffffffffffff166130d1565b15612beb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612aba6121d7565b8786866040518563ffffffff1660e01b8152600401612adc949392919061499c565b6020604051808303816000875af1925050508015612b1857506040513d601f19601f82011682018060405250810190612b1591906149fd565b60015b612b9b573d8060008114612b48576040519150601f19603f3d011682016040523d82523d6000602084013e612b4d565b606091505b50600081511415612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a906148f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bf0565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c5384611258565b612c5d91906144f8565b9050600060076000848152602001908152602001600020549050818114612d42576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612dc791906144f8565b9050600060096000848152602001908152602001600020549050600060088381548110612df757612df6613d1f565b5b906000526020600020015490508060088381548110612e1957612e18613d1f565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e6857612e67614a2a565b5b6001900381819060005260206000200160009055905550505050565b6000612e8f83611258565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6a90614aa5565b60405180910390fd5b612f7c8161216b565b15612fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb390614b11565b60405180910390fd5b612fc860008383612901565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130189190614774565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546130f090613863565b90600052602060002090601f0160209004810192826131125760008555613159565b82601f1061312b57805160ff1916838001178555613159565b82800160010185558215613159579182015b8281111561315857825182559160200191906001019061313d565b5b509050613166919061316a565b5090565b5b8082111561318357600081600090555060010161316b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131d08161319b565b81146131db57600080fd5b50565b6000813590506131ed816131c7565b92915050565b60006020828403121561320957613208613191565b5b6000613217848285016131de565b91505092915050565b60008115159050919050565b61323581613220565b82525050565b6000602082019050613250600083018461322c565b92915050565b6000819050919050565b61326981613256565b82525050565b60006020820190506132846000830184613260565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132c45780820151818401526020810190506132a9565b838111156132d3576000848401525b50505050565b6000601f19601f8301169050919050565b60006132f58261328a565b6132ff8185613295565b935061330f8185602086016132a6565b613318816132d9565b840191505092915050565b6000602082019050818103600083015261333d81846132ea565b905092915050565b61334e81613256565b811461335957600080fd5b50565b60008135905061336b81613345565b92915050565b60006020828403121561338757613386613191565b5b60006133958482850161335c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133c98261339e565b9050919050565b6133d9816133be565b82525050565b60006020820190506133f460008301846133d0565b92915050565b613403816133be565b811461340e57600080fd5b50565b600081359050613420816133fa565b92915050565b6000806040838503121561343d5761343c613191565b5b600061344b85828601613411565b925050602061345c8582860161335c565b9150509250929050565b60006020828403121561347c5761347b613191565b5b600061348a84828501613411565b91505092915050565b6000806000606084860312156134ac576134ab613191565b5b60006134ba86828701613411565b93505060206134cb86828701613411565b92505060406134dc8682870161335c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613528826132d9565b810181811067ffffffffffffffff82111715613547576135466134f0565b5b80604052505050565b600061355a613187565b9050613566828261351f565b919050565b600067ffffffffffffffff821115613586576135856134f0565b5b61358f826132d9565b9050602081019050919050565b82818337600083830152505050565b60006135be6135b98461356b565b613550565b9050828152602081018484840111156135da576135d96134eb565b5b6135e584828561359c565b509392505050565b600082601f830112613602576136016134e6565b5b81356136128482602086016135ab565b91505092915050565b60006020828403121561363157613630613191565b5b600082013567ffffffffffffffff81111561364f5761364e613196565b5b61365b848285016135ed565b91505092915050565b61366d81613220565b811461367857600080fd5b50565b60008135905061368a81613664565b92915050565b600080604083850312156136a7576136a6613191565b5b60006136b585828601613411565b92505060206136c68582860161367b565b9150509250929050565b600067ffffffffffffffff8211156136eb576136ea6134f0565b5b6136f4826132d9565b9050602081019050919050565b600061371461370f846136d0565b613550565b9050828152602081018484840111156137305761372f6134eb565b5b61373b84828561359c565b509392505050565b600082601f830112613758576137576134e6565b5b8135613768848260208601613701565b91505092915050565b6000806000806080858703121561378b5761378a613191565b5b600061379987828801613411565b94505060206137aa87828801613411565b93505060406137bb8782880161335c565b925050606085013567ffffffffffffffff8111156137dc576137db613196565b5b6137e887828801613743565b91505092959194509250565b6000806040838503121561380b5761380a613191565b5b600061381985828601613411565b925050602061382a85828601613411565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387b57607f821691505b6020821081141561388f5761388e613834565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138f1602c83613295565b91506138fc82613895565b604082019050919050565b60006020820190508181036000830152613920816138e4565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613983602183613295565b915061398e82613927565b604082019050919050565b600060208201905081810360008301526139b281613976565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a15603883613295565b9150613a20826139b9565b604082019050919050565b60006020820190508181036000830152613a4481613a08565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a81602083613295565b9150613a8c82613a4b565b602082019050919050565b60006020820190508181036000830152613ab081613a74565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b13603183613295565b9150613b1e82613ab7565b604082019050919050565b60006020820190508181036000830152613b4281613b06565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ba5602b83613295565b9150613bb082613b49565b604082019050919050565b60006020820190508181036000830152613bd481613b98565b9050919050565b600081905092915050565b50565b6000613bf6600083613bdb565b9150613c0182613be6565b600082019050919050565b6000613c1782613be9565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000613c57601483613295565b9150613c6282613c21565b602082019050919050565b60006020820190508181036000830152613c8681613c4a565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ce9602c83613295565b9150613cf482613c8d565b604082019050919050565b60006020820190508181036000830152613d1881613cdc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613daa602983613295565b9150613db582613d4e565b604082019050919050565b60006020820190508181036000830152613dd981613d9d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613e3c602a83613295565b9150613e4782613de0565b604082019050919050565b60006020820190508181036000830152613e6b81613e2f565b9050919050565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6000613ea8602083613295565b9150613eb382613e72565b602082019050919050565b60006020820190508181036000830152613ed781613e9b565b9050919050565b7f43616e206f6e6c79206d696e7420757020746f2031302070657220616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f3a602283613295565b9150613f4582613ede565b604082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b6000613fcc603383613295565b9150613fd782613f70565b604082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b600061405e602a83613295565b915061406982614002565b604082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b7f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b60006140f0602383613295565b91506140fb82614094565b604082019050919050565b6000602082019050818103600083015261411f816140e3565b9050919050565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b600061415c601d83613295565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141cc82613256565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ff576141fe614192565b5b600182019050919050565b7f43616e206f6e6c79206d696e74206f6e63650000000000000000000000000000600082015250565b6000614240601283613295565b915061424b8261420a565b602082019050919050565b6000602082019050818103600083015261426f81614233565b9050919050565b7f507572636861736520776f756c6420657863656564206d6178207075626c696360008201527f20737570706c79206f6620746f6b656e73000000000000000000000000000000602082015250565b60006142d2603183613295565b91506142dd82614276565b604082019050919050565b60006020820190508181036000830152614301816142c5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061433e601983613295565b915061434982614308565b602082019050919050565b6000602082019050818103600083015261436d81614331565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143d0602f83613295565b91506143db82614374565b604082019050919050565b600060208201905081810360008301526143ff816143c3565b9050919050565b600081905092915050565b600061441c8261328a565b6144268185614406565b93506144368185602086016132a6565b80840191505092915050565b600061444e8285614411565b915061445a8284614411565b91508190509392505050565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207468652060008201527f7465616d00000000000000000000000000000000000000000000000000000000602082015250565b60006144c2602483613295565b91506144cd82614466565b604082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b600061450382613256565b915061450e83613256565b92508282101561452157614520614192565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614588602683613295565b91506145938261452c565b604082019050919050565b600060208201905081810360008301526145b78161457b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061461a602c83613295565b9150614625826145be565b604082019050919050565b600060208201905081810360008301526146498161460d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146ac602983613295565b91506146b782614650565b604082019050919050565b600060208201905081810360008301526146db8161469f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061473e602483613295565b9150614749826146e2565b604082019050919050565b6000602082019050818103600083015261476d81614731565b9050919050565b600061477f82613256565b915061478a83613256565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147bf576147be614192565b5b828201905092915050565b60006147d582613256565b91506147e083613256565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481957614818614192565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061485e82613256565b915061486983613256565b92508261487957614878614824565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148e0603283613295565b91506148eb82614884565b604082019050919050565b6000602082019050818103600083015261490f816148d3565b9050919050565b600061492182613256565b915061492c83613256565b92508261493c5761493b614824565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061496e82614947565b6149788185614952565b93506149888185602086016132a6565b614991816132d9565b840191505092915050565b60006080820190506149b160008301876133d0565b6149be60208301866133d0565b6149cb6040830185613260565b81810360608301526149dd8184614963565b905095945050505050565b6000815190506149f7816131c7565b92915050565b600060208284031215614a1357614a12613191565b5b6000614a21848285016149e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a8f602083613295565b9150614a9a82614a59565b602082019050919050565b60006020820190508181036000830152614abe81614a82565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614afb601c83613295565b9150614b0682614ac5565b602082019050919050565b60006020820190508181036000830152614b2a81614aee565b905091905056fea264697066735822122059504e3ddc815653a80086de7ea4f1f9116e1733e1e29f2f248d5d62ccf7b86a64736f6c634300080a0033

Deployed Bytecode Sourcemap

50513:4860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44336:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50736:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32314:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33762:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33285:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51777:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44976:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34652:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50830:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44644:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51215:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51680:89;;;;;;;;;;;;;:::i;:::-;;50893:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51902:701;;;;;;;;;;;;;:::i;:::-;;35062:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45166:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54460:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32008:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50664:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31738:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29561:148;;;;;;;;;;;;;:::i;:::-;;52613:842;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28910:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32483:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53463:287;;;;;;;;;;;;;:::i;:::-;;34055:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35318:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54577:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53756:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54141:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34421:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50966:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29864:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44336:224;44438:4;44477:35;44462:50;;;:11;:50;;;;:90;;;;44516:36;44540:11;44516:23;:36::i;:::-;44462:90;44455:97;;44336:224;;;:::o;50736:42::-;50776:2;50736:42;:::o;32314:100::-;32368:13;32401:5;32394:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32314:100;:::o;33762:221::-;33838:7;33866:16;33874:7;33866;:16::i;:::-;33858:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33951:15;:24;33967:7;33951:24;;;;;;;;;;;;;;;;;;;;;33944:31;;33762:221;;;:::o;33285:411::-;33366:13;33382:23;33397:7;33382:14;:23::i;:::-;33366:39;;33430:5;33424:11;;:2;:11;;;;33416:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33524:5;33508:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33533:37;33550:5;33557:12;:10;:12::i;:::-;33533:16;:37::i;:::-;33508:62;33486:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33667:21;33676:2;33680:7;33667:8;:21::i;:::-;33355:341;33285:411;;:::o;51777:117::-;29141:12;:10;:12::i;:::-;29130:23;;:7;:5;:7::i;:::-;:23;;;29122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51871:15:::1;51857:11;;:29;;;;;;;;;;;;;;;;;;51777:117:::0;:::o;44976:113::-;45037:7;45064:10;:17;;;;45057:24;;44976:113;:::o;34652:339::-;34847:41;34866:12;:10;:12::i;:::-;34880:7;34847:18;:41::i;:::-;34839:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34955:28;34965:4;34971:2;34975:7;34955:9;:28::i;:::-;34652:339;;;:::o;50830:40::-;;;;:::o;44644:256::-;44741:7;44777:23;44794:5;44777:16;:23::i;:::-;44769:5;:31;44761:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44866:12;:19;44879:5;44866:19;;;;;;;;;;;;;;;:26;44886:5;44866:26;;;;;;;;;;;;44859:33;;44644:256;;;;:::o;51215:36::-;;;;;;;;;;;;;:::o;51680:89::-;29141:12;:10;:12::i;:::-;29130:23;;:7;:5;:7::i;:::-;:23;;;29122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51749:12:::1;;;;;;;;;;;51748:13;51733:12;;:28;;;;;;;;;;;;;;;;;;51680:89::o:0;50893:31::-;;;;:::o;51902:701::-;51982:11;;;;;;;;;;;51968:25;;:10;:25;;;:71;;;;52028:11;;;;;;;;;;;52014:25;;:10;:25;;;51968:71;51942:108;;;;;;52063:11;52077:21;52063:35;;52111:13;52127:20;52143:3;52127:11;52135:2;52127:3;:7;;:11;;;;:::i;:::-;:15;;:20;;;;:::i;:::-;52111:36;;52159:10;52174:11;;;;;;;;;;;:16;;52198:5;52174:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52158:50;;;52227:5;52219:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52270:14;52287:20;52303:3;52287:11;52295:2;52287:3;:7;;:11;;;;:::i;:::-;:15;;:20;;;;:::i;:::-;52270:37;;52319:10;52334:11;;;;;;;;;;;:16;;52358:6;52334:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52318:51;;;52388:5;52380:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52440:17;52460:21;52440:41;;52493:10;52508:11;;;;;;;;;;;:16;;52532:9;52508:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52492:54;;;52565:5;52557:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51931:672;;;;;;;51902:701::o;35062:185::-;35200:39;35217:4;35223:2;35227:7;35200:39;;;;;;;;;;;;:16;:39::i;:::-;35062:185;;;:::o;45166:233::-;45241:7;45277:30;:28;:30::i;:::-;45269:5;:38;45261:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45374:10;45385:5;45374:17;;;;;;;;:::i;:::-;;;;;;;;;;45367:24;;45166:233;;;:::o;54460:109::-;29141:12;:10;:12::i;:::-;29130:23;;:7;:5;:7::i;:::-;:23;;;29122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54553:8:::1;54534:16;:27;;;;;;;;;;;;:::i;:::-;;54460:109:::0;:::o;32008:239::-;32080:7;32100:13;32116:7;:16;32124:7;32116:16;;;;;;;;;;;;;;;;;;;;;32100:32;;32168:1;32151:19;;:5;:19;;;;32143:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32234:5;32227:12;;;32008:239;;;:::o;50664:53::-;50700:17;50664:53;:::o;31738:208::-;31810:7;31855:1;31838:19;;:5;:19;;;;31830:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31922:9;:16;31932:5;31922:16;;;;;;;;;;;;;;;;31915:23;;31738:208;;;:::o;29561:148::-;29141:12;:10;:12::i;:::-;29130:23;;:7;:5;:7::i;:::-;:23;;;29122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29668:1:::1;29631:40;;29652:6;;;;;;;;;;;29631:40;;;;;;;;;;;;29699:1;29682:6;;:19;;;;;;;;;;;;;;;;;;29561:148::o:0;52613:842::-;52688:12;;;;;;;;;;;52680:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50776:2;52756:41;52782:14;52756:9;:21;52766:10;52756:21;;;;;;;;;;;;;;;;:25;;:41;;;;:::i;:::-;:61;;52748:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;52892:1;52875:14;:18;52867:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;53005:17;;52968:33;52986:14;52968:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:54;;52960:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;50776:2;53088:14;:34;;53080:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53213:9;53180:29;53194:14;50700:17;53180:13;;:29;;;;:::i;:::-;:42;53172:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53291:41;53317:14;53291:9;:21;53301:10;53291:21;;;;;;;;;;;;;;;;:25;;:41;;;;:::i;:::-;53267:9;:21;53277:10;53267:21;;;;;;;;;;;;;;;:65;;;;53348:6;53343:105;53364:14;53360:1;:18;53343:105;;;53400:36;53410:10;53422:13;:11;:13::i;:::-;53400:9;:36::i;:::-;53380:3;;;;;:::i;:::-;;;;53343:105;;;;52613:842;:::o;28910:87::-;28956:7;28983:6;;;;;;;;;;;28976:13;;28910:87;:::o;32483:104::-;32539:13;32572:7;32565:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32483:104;:::o;53463:287::-;51512:6;:20;51519:12;:10;:12::i;:::-;51512:20;;;;;;;;;;;;;;;;;;;;;;;;;51511:21;51503:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;51589:4;51566:6;:20;51573:12;:10;:12::i;:::-;51566:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;53532:12:::1;;;;;;;;;;;53524:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53624:17;;53600:20;53618:1;53600:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:41;;53592:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53706:36;53716:10;53728:13;:11;:13::i;:::-;53706:9;:36::i;:::-;53463:287::o:0;34055:295::-;34170:12;:10;:12::i;:::-;34158:24;;:8;:24;;;;34150:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34270:8;34225:18;:32;34244:12;:10;:12::i;:::-;34225:32;;;;;;;;;;;;;;;:42;34258:8;34225:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34323:8;34294:48;;34309:12;:10;:12::i;:::-;34294:48;;;34333:8;34294:48;;;;;;:::i;:::-;;;;;;;;34055:295;;:::o;35318:328::-;35493:41;35512:12;:10;:12::i;:::-;35526:7;35493:18;:41::i;:::-;35485:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35599:39;35613:4;35619:2;35623:7;35632:5;35599:13;:39::i;:::-;35318:328;;;;:::o;54577:793::-;54650:13;54684:16;54692:7;54684;:16::i;:::-;54676:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54765:23;54791:10;:19;54802:7;54791:19;;;;;;;;;;;54765:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54821:18;54842:10;:8;:10::i;:::-;54821:31;;54950:1;54934:4;54928:18;:23;54924:72;;;54975:9;54968:16;;;;;;54924:72;55126:1;55106:9;55100:23;:27;55096:108;;;55175:4;55181:9;55158:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55144:48;;;;;;55096:108;55336:4;55342:18;:7;:16;:18::i;:::-;55319:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55305:57;;;;54577:793;;;;:::o;53756:377::-;29141:12;:10;:12::i;:::-;29130:23;;:7;:5;:7::i;:::-;:23;;;29122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53870:1:::1;53853:14;:18;:51;;;;;53893:11;;53875:14;:29;;53853:51;53831:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;53975:6;53970:100;53991:14;53987:1;:18;53970:100;;;54022:36;54032:10;54044:13;:11;:13::i;:::-;54022:9;:36::i;:::-;54007:3;;;;;:::i;:::-;;;;53970:100;;;;54094:31;54110:14;54094:11;;:15;;:31;;;;:::i;:::-;54080:11;:45;;;;53756:377:::0;:::o;54141:107::-;54184:7;54231:13;:11;:13::i;:::-;54211:17;;:33;;;;:::i;:::-;54204:40;;54141:107;:::o;34421:164::-;34518:4;34542:18;:25;34561:5;34542:25;;;;;;;;;;;;;;;:35;34568:8;34542:35;;;;;;;;;;;;;;;;;;;;;;;;;34535:42;;34421:164;;;;:::o;50966:32::-;;;;;;;;;;;;;:::o;29864:244::-;29141:12;:10;:12::i;:::-;29130:23;;:7;:5;:7::i;:::-;:23;;;29122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29973:1:::1;29953:22;;:8;:22;;;;29945:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30063:8;30034:38;;30055:6;;;;;;;;;;;30034:38;;;;;;;;;;;;30092:8;30083:6;;:17;;;;;;;;;;;;;;;;;;29864:244:::0;:::o;31369:305::-;31471:4;31523:25;31508:40;;;:11;:40;;;;:105;;;;31580:33;31565:48;;;:11;:48;;;;31508:105;:158;;;;31630:36;31654:11;31630:23;:36::i;:::-;31508:158;31488:178;;31369:305;;;:::o;37156:127::-;37221:4;37273:1;37245:30;;:7;:16;37253:7;37245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37238:37;;37156:127;;;:::o;27528:98::-;27581:7;27608:10;27601:17;;27528:98;:::o;41138:174::-;41240:2;41213:15;:24;41229:7;41213:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41296:7;41292:2;41258:46;;41267:23;41282:7;41267:14;:23::i;:::-;41258:46;;;;;;;;;;;;41138:174;;:::o;37450:348::-;37543:4;37568:16;37576:7;37568;:16::i;:::-;37560:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37644:13;37660:23;37675:7;37660:14;:23::i;:::-;37644:39;;37713:5;37702:16;;:7;:16;;;:51;;;;37746:7;37722:31;;:20;37734:7;37722:11;:20::i;:::-;:31;;;37702:51;:87;;;;37757:32;37774:5;37781:7;37757:16;:32::i;:::-;37702:87;37694:96;;;37450:348;;;;:::o;40442:578::-;40601:4;40574:31;;:23;40589:7;40574:14;:23::i;:::-;:31;;;40566:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40684:1;40670:16;;:2;:16;;;;40662:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40740:39;40761:4;40767:2;40771:7;40740:20;:39::i;:::-;40844:29;40861:1;40865:7;40844:8;:29::i;:::-;40905:1;40886:9;:15;40896:4;40886:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40934:1;40917:9;:13;40927:2;40917:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40965:2;40946:7;:16;40954:7;40946:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41004:7;41000:2;40985:27;;40994:4;40985:27;;;;;;;;;;;;40442:578;;;:::o;4264:98::-;4322:7;4353:1;4349;:5;;;;:::i;:::-;4342:12;;4264:98;;;;:::o;4663:::-;4721:7;4752:1;4748;:5;;;;:::i;:::-;4741:12;;4663:98;;;;:::o;3526:::-;3584:7;3615:1;3611;:5;;;;:::i;:::-;3604:12;;3526:98;;;;:::o;38140:110::-;38216:26;38226:2;38230:7;38216:26;;;;;;;;;;;;:9;:26::i;:::-;38140:110;;:::o;36528:315::-;36685:28;36695:4;36701:2;36705:7;36685:9;:28::i;:::-;36732:48;36755:4;36761:2;36765:7;36774:5;36732:22;:48::i;:::-;36724:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36528:315;;;;:::o;54256:117::-;54316:13;54349:16;54342:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54256:117;:::o;8167:723::-;8223:13;8453:1;8444:5;:10;8440:53;;;8471:10;;;;;;;;;;;;;;;;;;;;;8440:53;8503:12;8518:5;8503:20;;8534:14;8559:78;8574:1;8566:4;:9;8559:78;;8592:8;;;;;:::i;:::-;;;;8623:2;8615:10;;;;;:::i;:::-;;;8559:78;;;8647:19;8679:6;8669:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8647:39;;8697:154;8713:1;8704:5;:10;8697:154;;8741:1;8731:11;;;;;:::i;:::-;;;8808:2;8800:5;:10;;;;:::i;:::-;8787:2;:24;;;;:::i;:::-;8774:39;;8757:6;8764;8757:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8837:2;8828:11;;;;;:::i;:::-;;;8697:154;;;8875:6;8861:21;;;;;8167:723;;;;:::o;3907:98::-;3965:7;3996:1;3992;:5;;;;:::i;:::-;3985:12;;3907:98;;;;:::o;20514:157::-;20599:4;20638:25;20623:40;;;:11;:40;;;;20616:47;;20514:157;;;:::o;46012:589::-;46156:45;46183:4;46189:2;46193:7;46156:26;:45::i;:::-;46234:1;46218:18;;:4;:18;;;46214:187;;;46253:40;46285:7;46253:31;:40::i;:::-;46214:187;;;46323:2;46315:10;;:4;:10;;;46311:90;;46342:47;46375:4;46381:7;46342:32;:47::i;:::-;46311:90;46214:187;46429:1;46415:16;;:2;:16;;;46411:183;;;46448:45;46485:7;46448:36;:45::i;:::-;46411:183;;;46521:4;46515:10;;:2;:10;;;46511:83;;46542:40;46570:2;46574:7;46542:27;:40::i;:::-;46511:83;46411:183;46012:589;;;:::o;38477:321::-;38607:18;38613:2;38617:7;38607:5;:18::i;:::-;38658:54;38689:1;38693:2;38697:7;38706:5;38658:22;:54::i;:::-;38636:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38477:321;;;:::o;41877:872::-;42032:4;42053:15;:2;:13;;;:15::i;:::-;42049:693;;;42105:2;42089:36;;;42126:12;:10;:12::i;:::-;42140:4;42146:7;42155:5;42089:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42085:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42352:1;42335:6;:13;:18;42331:341;;;42378:60;;;;;;;;;;:::i;:::-;;;;;;;;42331:341;42622:6;42616:13;42607:6;42603:2;42599:15;42592:38;42085:602;42222:45;;;42212:55;;;:6;:55;;;;42205:62;;;;;42049:693;42726:4;42719:11;;41877:872;;;;;;;:::o;43362:126::-;;;;:::o;47324:164::-;47428:10;:17;;;;47401:15;:24;47417:7;47401:24;;;;;;;;;;;:44;;;;47456:10;47472:7;47456:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47324:164;:::o;48115:988::-;48381:22;48431:1;48406:22;48423:4;48406:16;:22::i;:::-;:26;;;;:::i;:::-;48381:51;;48443:18;48464:17;:26;48482:7;48464:26;;;;;;;;;;;;48443:47;;48611:14;48597:10;:28;48593:328;;48642:19;48664:12;:18;48677:4;48664:18;;;;;;;;;;;;;;;:34;48683:14;48664:34;;;;;;;;;;;;48642:56;;48748:11;48715:12;:18;48728:4;48715:18;;;;;;;;;;;;;;;:30;48734:10;48715:30;;;;;;;;;;;:44;;;;48865:10;48832:17;:30;48850:11;48832:30;;;;;;;;;;;:43;;;;48627:294;48593:328;49017:17;:26;49035:7;49017:26;;;;;;;;;;;49010:33;;;49061:12;:18;49074:4;49061:18;;;;;;;;;;;;;;;:34;49080:14;49061:34;;;;;;;;;;;49054:41;;;48196:907;;48115:988;;:::o;49398:1079::-;49651:22;49696:1;49676:10;:17;;;;:21;;;;:::i;:::-;49651:46;;49708:18;49729:15;:24;49745:7;49729:24;;;;;;;;;;;;49708:45;;50080:19;50102:10;50113:14;50102:26;;;;;;;;:::i;:::-;;;;;;;;;;50080:48;;50166:11;50141:10;50152;50141:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;50277:10;50246:15;:28;50262:11;50246:28;;;;;;;;;;;:41;;;;50418:15;:24;50434:7;50418:24;;;;;;;;;;;50411:31;;;50453:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49469:1008;;;49398:1079;:::o;46902:221::-;46987:14;47004:20;47021:2;47004:16;:20::i;:::-;46987:37;;47062:7;47035:12;:16;47048:2;47035:16;;;;;;;;;;;;;;;:24;47052:6;47035:24;;;;;;;;;;;:34;;;;47109:6;47080:17;:26;47098:7;47080:26;;;;;;;;;;;:35;;;;46976:147;46902:221;;:::o;39134:382::-;39228:1;39214:16;;:2;:16;;;;39206:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39287:16;39295:7;39287;:16::i;:::-;39286:17;39278:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39349:45;39378:1;39382:2;39386:7;39349:20;:45::i;:::-;39424:1;39407:9;:13;39417:2;39407:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39455:2;39436:7;:16;39444:7;39436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39500:7;39496:2;39475:33;;39492:1;39475:33;;;;;;;;;;;;39134:382;;:::o;10630:444::-;10690:4;10898:12;11022:7;11010:20;11002:28;;11065:1;11058:4;:8;11051:15;;;10630:444;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:231::-;12773:34;12769:1;12761:6;12757:14;12750:58;12842:14;12837:2;12829:6;12825:15;12818:39;12633:231;:::o;12870:366::-;13012:3;13033:67;13097:2;13092:3;13033:67;:::i;:::-;13026:74;;13109:93;13198:3;13109:93;:::i;:::-;13227:2;13222:3;13218:12;13211:19;;12870:366;;;:::o;13242:419::-;13408:4;13446:2;13435:9;13431:18;13423:26;;13495:9;13489:4;13485:20;13481:1;13470:9;13466:17;13459:47;13523:131;13649:4;13523:131;:::i;:::-;13515:139;;13242:419;;;:::o;13667:220::-;13807:34;13803:1;13795:6;13791:14;13784:58;13876:3;13871:2;13863:6;13859:15;13852:28;13667:220;:::o;13893:366::-;14035:3;14056:67;14120:2;14115:3;14056:67;:::i;:::-;14049:74;;14132:93;14221:3;14132:93;:::i;:::-;14250:2;14245:3;14241:12;14234:19;;13893:366;;;:::o;14265:419::-;14431:4;14469:2;14458:9;14454:18;14446:26;;14518:9;14512:4;14508:20;14504:1;14493:9;14489:17;14482:47;14546:131;14672:4;14546:131;:::i;:::-;14538:139;;14265:419;;;:::o;14690:243::-;14830:34;14826:1;14818:6;14814:14;14807:58;14899:26;14894:2;14886:6;14882:15;14875:51;14690:243;:::o;14939:366::-;15081:3;15102:67;15166:2;15161:3;15102:67;:::i;:::-;15095:74;;15178:93;15267:3;15178:93;:::i;:::-;15296:2;15291:3;15287:12;15280:19;;14939:366;;;:::o;15311:419::-;15477:4;15515:2;15504:9;15500:18;15492:26;;15564:9;15558:4;15554:20;15550:1;15539:9;15535:17;15528:47;15592:131;15718:4;15592:131;:::i;:::-;15584:139;;15311:419;;;:::o;15736:182::-;15876:34;15872:1;15864:6;15860:14;15853:58;15736:182;:::o;15924:366::-;16066:3;16087:67;16151:2;16146:3;16087:67;:::i;:::-;16080:74;;16163:93;16252:3;16163:93;:::i;:::-;16281:2;16276:3;16272:12;16265:19;;15924:366;;;:::o;16296:419::-;16462:4;16500:2;16489:9;16485:18;16477:26;;16549:9;16543:4;16539:20;16535:1;16524:9;16520:17;16513:47;16577:131;16703:4;16577:131;:::i;:::-;16569:139;;16296:419;;;:::o;16721:236::-;16861:34;16857:1;16849:6;16845:14;16838:58;16930:19;16925:2;16917:6;16913:15;16906:44;16721:236;:::o;16963:366::-;17105:3;17126:67;17190:2;17185:3;17126:67;:::i;:::-;17119:74;;17202:93;17291:3;17202:93;:::i;:::-;17320:2;17315:3;17311:12;17304:19;;16963:366;;;:::o;17335:419::-;17501:4;17539:2;17528:9;17524:18;17516:26;;17588:9;17582:4;17578:20;17574:1;17563:9;17559:17;17552:47;17616:131;17742:4;17616:131;:::i;:::-;17608:139;;17335:419;;;:::o;17760:230::-;17900:34;17896:1;17888:6;17884:14;17877:58;17969:13;17964:2;17956:6;17952:15;17945:38;17760:230;:::o;17996:366::-;18138:3;18159:67;18223:2;18218:3;18159:67;:::i;:::-;18152:74;;18235:93;18324:3;18235:93;:::i;:::-;18353:2;18348:3;18344:12;18337:19;;17996:366;;;:::o;18368:419::-;18534:4;18572:2;18561:9;18557:18;18549:26;;18621:9;18615:4;18611:20;18607:1;18596:9;18592:17;18585:47;18649:131;18775:4;18649:131;:::i;:::-;18641:139;;18368:419;;;:::o;18793:147::-;18894:11;18931:3;18916:18;;18793:147;;;;:::o;18946:114::-;;:::o;19066:398::-;19225:3;19246:83;19327:1;19322:3;19246:83;:::i;:::-;19239:90;;19338:93;19427:3;19338:93;:::i;:::-;19456:1;19451:3;19447:11;19440:18;;19066:398;;;:::o;19470:379::-;19654:3;19676:147;19819:3;19676:147;:::i;:::-;19669:154;;19840:3;19833:10;;19470:379;;;:::o;19855:170::-;19995:22;19991:1;19983:6;19979:14;19972:46;19855:170;:::o;20031:366::-;20173:3;20194:67;20258:2;20253:3;20194:67;:::i;:::-;20187:74;;20270:93;20359:3;20270:93;:::i;:::-;20388:2;20383:3;20379:12;20372:19;;20031:366;;;:::o;20403:419::-;20569:4;20607:2;20596:9;20592:18;20584:26;;20656:9;20650:4;20646:20;20642:1;20631:9;20627:17;20620:47;20684:131;20810:4;20684:131;:::i;:::-;20676:139;;20403:419;;;:::o;20828:231::-;20968:34;20964:1;20956:6;20952:14;20945:58;21037:14;21032:2;21024:6;21020:15;21013:39;20828:231;:::o;21065:366::-;21207:3;21228:67;21292:2;21287:3;21228:67;:::i;:::-;21221:74;;21304:93;21393:3;21304:93;:::i;:::-;21422:2;21417:3;21413:12;21406:19;;21065:366;;;:::o;21437:419::-;21603:4;21641:2;21630:9;21626:18;21618:26;;21690:9;21684:4;21680:20;21676:1;21665:9;21661:17;21654:47;21718:131;21844:4;21718:131;:::i;:::-;21710:139;;21437:419;;;:::o;21862:180::-;21910:77;21907:1;21900:88;22007:4;22004:1;21997:15;22031:4;22028:1;22021:15;22048:228;22188:34;22184:1;22176:6;22172:14;22165:58;22257:11;22252:2;22244:6;22240:15;22233:36;22048:228;:::o;22282:366::-;22424:3;22445:67;22509:2;22504:3;22445:67;:::i;:::-;22438:74;;22521:93;22610:3;22521:93;:::i;:::-;22639:2;22634:3;22630:12;22623:19;;22282:366;;;:::o;22654:419::-;22820:4;22858:2;22847:9;22843:18;22835:26;;22907:9;22901:4;22897:20;22893:1;22882:9;22878:17;22871:47;22935:131;23061:4;22935:131;:::i;:::-;22927:139;;22654:419;;;:::o;23079:229::-;23219:34;23215:1;23207:6;23203:14;23196:58;23288:12;23283:2;23275:6;23271:15;23264:37;23079:229;:::o;23314:366::-;23456:3;23477:67;23541:2;23536:3;23477:67;:::i;:::-;23470:74;;23553:93;23642:3;23553:93;:::i;:::-;23671:2;23666:3;23662:12;23655:19;;23314:366;;;:::o;23686:419::-;23852:4;23890:2;23879:9;23875:18;23867:26;;23939:9;23933:4;23929:20;23925:1;23914:9;23910:17;23903:47;23967:131;24093:4;23967:131;:::i;:::-;23959:139;;23686:419;;;:::o;24111:182::-;24251:34;24247:1;24239:6;24235:14;24228:58;24111:182;:::o;24299:366::-;24441:3;24462:67;24526:2;24521:3;24462:67;:::i;:::-;24455:74;;24538:93;24627:3;24538:93;:::i;:::-;24656:2;24651:3;24647:12;24640:19;;24299:366;;;:::o;24671:419::-;24837:4;24875:2;24864:9;24860:18;24852:26;;24924:9;24918:4;24914:20;24910:1;24899:9;24895:17;24888:47;24952:131;25078:4;24952:131;:::i;:::-;24944:139;;24671:419;;;:::o;25096:221::-;25236:34;25232:1;25224:6;25220:14;25213:58;25305:4;25300:2;25292:6;25288:15;25281:29;25096:221;:::o;25323:366::-;25465:3;25486:67;25550:2;25545:3;25486:67;:::i;:::-;25479:74;;25562:93;25651:3;25562:93;:::i;:::-;25680:2;25675:3;25671:12;25664:19;;25323:366;;;:::o;25695:419::-;25861:4;25899:2;25888:9;25884:18;25876:26;;25948:9;25942:4;25938:20;25934:1;25923:9;25919:17;25912:47;25976:131;26102:4;25976:131;:::i;:::-;25968:139;;25695:419;;;:::o;26120:238::-;26260:34;26256:1;26248:6;26244:14;26237:58;26329:21;26324:2;26316:6;26312:15;26305:46;26120:238;:::o;26364:366::-;26506:3;26527:67;26591:2;26586:3;26527:67;:::i;:::-;26520:74;;26603:93;26692:3;26603:93;:::i;:::-;26721:2;26716:3;26712:12;26705:19;;26364:366;;;:::o;26736:419::-;26902:4;26940:2;26929:9;26925:18;26917:26;;26989:9;26983:4;26979:20;26975:1;26964:9;26960:17;26953:47;27017:131;27143:4;27017:131;:::i;:::-;27009:139;;26736:419;;;:::o;27161:229::-;27301:34;27297:1;27289:6;27285:14;27278:58;27370:12;27365:2;27357:6;27353:15;27346:37;27161:229;:::o;27396:366::-;27538:3;27559:67;27623:2;27618:3;27559:67;:::i;:::-;27552:74;;27635:93;27724:3;27635:93;:::i;:::-;27753:2;27748:3;27744:12;27737:19;;27396:366;;;:::o;27768:419::-;27934:4;27972:2;27961:9;27957:18;27949:26;;28021:9;28015:4;28011:20;28007:1;27996:9;27992:17;27985:47;28049:131;28175:4;28049:131;:::i;:::-;28041:139;;27768:419;;;:::o;28193:222::-;28333:34;28329:1;28321:6;28317:14;28310:58;28402:5;28397:2;28389:6;28385:15;28378:30;28193:222;:::o;28421:366::-;28563:3;28584:67;28648:2;28643:3;28584:67;:::i;:::-;28577:74;;28660:93;28749:3;28660:93;:::i;:::-;28778:2;28773:3;28769:12;28762:19;;28421:366;;;:::o;28793:419::-;28959:4;28997:2;28986:9;28982:18;28974:26;;29046:9;29040:4;29036:20;29032:1;29021:9;29017:17;29010:47;29074:131;29200:4;29074:131;:::i;:::-;29066:139;;28793:419;;;:::o;29218:179::-;29358:31;29354:1;29346:6;29342:14;29335:55;29218:179;:::o;29403:366::-;29545:3;29566:67;29630:2;29625:3;29566:67;:::i;:::-;29559:74;;29642:93;29731:3;29642:93;:::i;:::-;29760:2;29755:3;29751:12;29744:19;;29403:366;;;:::o;29775:419::-;29941:4;29979:2;29968:9;29964:18;29956:26;;30028:9;30022:4;30018:20;30014:1;30003:9;29999:17;29992:47;30056:131;30182:4;30056:131;:::i;:::-;30048:139;;29775:419;;;:::o;30200:180::-;30248:77;30245:1;30238:88;30345:4;30342:1;30335:15;30369:4;30366:1;30359:15;30386:233;30425:3;30448:24;30466:5;30448:24;:::i;:::-;30439:33;;30494:66;30487:5;30484:77;30481:103;;;30564:18;;:::i;:::-;30481:103;30611:1;30604:5;30600:13;30593:20;;30386:233;;;:::o;30625:168::-;30765:20;30761:1;30753:6;30749:14;30742:44;30625:168;:::o;30799:366::-;30941:3;30962:67;31026:2;31021:3;30962:67;:::i;:::-;30955:74;;31038:93;31127:3;31038:93;:::i;:::-;31156:2;31151:3;31147:12;31140:19;;30799:366;;;:::o;31171:419::-;31337:4;31375:2;31364:9;31360:18;31352:26;;31424:9;31418:4;31414:20;31410:1;31399:9;31395:17;31388:47;31452:131;31578:4;31452:131;:::i;:::-;31444:139;;31171:419;;;:::o;31596:236::-;31736:34;31732:1;31724:6;31720:14;31713:58;31805:19;31800:2;31792:6;31788:15;31781:44;31596:236;:::o;31838:366::-;31980:3;32001:67;32065:2;32060:3;32001:67;:::i;:::-;31994:74;;32077:93;32166:3;32077:93;:::i;:::-;32195:2;32190:3;32186:12;32179:19;;31838:366;;;:::o;32210:419::-;32376:4;32414:2;32403:9;32399:18;32391:26;;32463:9;32457:4;32453:20;32449:1;32438:9;32434:17;32427:47;32491:131;32617:4;32491:131;:::i;:::-;32483:139;;32210:419;;;:::o;32635:175::-;32775:27;32771:1;32763:6;32759:14;32752:51;32635:175;:::o;32816:366::-;32958:3;32979:67;33043:2;33038:3;32979:67;:::i;:::-;32972:74;;33055:93;33144:3;33055:93;:::i;:::-;33173:2;33168:3;33164:12;33157:19;;32816:366;;;:::o;33188:419::-;33354:4;33392:2;33381:9;33377:18;33369:26;;33441:9;33435:4;33431:20;33427:1;33416:9;33412:17;33405:47;33469:131;33595:4;33469:131;:::i;:::-;33461:139;;33188:419;;;:::o;33613:234::-;33753:34;33749:1;33741:6;33737:14;33730:58;33822:17;33817:2;33809:6;33805:15;33798:42;33613:234;:::o;33853:366::-;33995:3;34016:67;34080:2;34075:3;34016:67;:::i;:::-;34009:74;;34092:93;34181:3;34092:93;:::i;:::-;34210:2;34205:3;34201:12;34194:19;;33853:366;;;:::o;34225:419::-;34391:4;34429:2;34418:9;34414:18;34406:26;;34478:9;34472:4;34468:20;34464:1;34453:9;34449:17;34442:47;34506:131;34632:4;34506:131;:::i;:::-;34498:139;;34225:419;;;:::o;34650:148::-;34752:11;34789:3;34774:18;;34650:148;;;;:::o;34804:377::-;34910:3;34938:39;34971:5;34938:39;:::i;:::-;34993:89;35075:6;35070:3;34993:89;:::i;:::-;34986:96;;35091:52;35136:6;35131:3;35124:4;35117:5;35113:16;35091:52;:::i;:::-;35168:6;35163:3;35159:16;35152:23;;34914:267;34804:377;;;;:::o;35187:435::-;35367:3;35389:95;35480:3;35471:6;35389:95;:::i;:::-;35382:102;;35501:95;35592:3;35583:6;35501:95;:::i;:::-;35494:102;;35613:3;35606:10;;35187:435;;;;;:::o;35628:223::-;35768:34;35764:1;35756:6;35752:14;35745:58;35837:6;35832:2;35824:6;35820:15;35813:31;35628:223;:::o;35857:366::-;35999:3;36020:67;36084:2;36079:3;36020:67;:::i;:::-;36013:74;;36096:93;36185:3;36096:93;:::i;:::-;36214:2;36209:3;36205:12;36198:19;;35857:366;;;:::o;36229:419::-;36395:4;36433:2;36422:9;36418:18;36410:26;;36482:9;36476:4;36472:20;36468:1;36457:9;36453:17;36446:47;36510:131;36636:4;36510:131;:::i;:::-;36502:139;;36229:419;;;:::o;36654:191::-;36694:4;36714:20;36732:1;36714:20;:::i;:::-;36709:25;;36748:20;36766:1;36748:20;:::i;:::-;36743:25;;36787:1;36784;36781:8;36778:34;;;36792:18;;:::i;:::-;36778:34;36837:1;36834;36830:9;36822:17;;36654:191;;;;:::o;36851:225::-;36991:34;36987:1;36979:6;36975:14;36968:58;37060:8;37055:2;37047:6;37043:15;37036:33;36851:225;:::o;37082:366::-;37224:3;37245:67;37309:2;37304:3;37245:67;:::i;:::-;37238:74;;37321:93;37410:3;37321:93;:::i;:::-;37439:2;37434:3;37430:12;37423:19;;37082:366;;;:::o;37454:419::-;37620:4;37658:2;37647:9;37643:18;37635:26;;37707:9;37701:4;37697:20;37693:1;37682:9;37678:17;37671:47;37735:131;37861:4;37735:131;:::i;:::-;37727:139;;37454:419;;;:::o;37879:231::-;38019:34;38015:1;38007:6;38003:14;37996:58;38088:14;38083:2;38075:6;38071:15;38064:39;37879:231;:::o;38116:366::-;38258:3;38279:67;38343:2;38338:3;38279:67;:::i;:::-;38272:74;;38355:93;38444:3;38355:93;:::i;:::-;38473:2;38468:3;38464:12;38457:19;;38116:366;;;:::o;38488:419::-;38654:4;38692:2;38681:9;38677:18;38669:26;;38741:9;38735:4;38731:20;38727:1;38716:9;38712:17;38705:47;38769:131;38895:4;38769:131;:::i;:::-;38761:139;;38488:419;;;:::o;38913:228::-;39053:34;39049:1;39041:6;39037:14;39030:58;39122:11;39117:2;39109:6;39105:15;39098:36;38913:228;:::o;39147:366::-;39289:3;39310:67;39374:2;39369:3;39310:67;:::i;:::-;39303:74;;39386:93;39475:3;39386:93;:::i;:::-;39504:2;39499:3;39495:12;39488:19;;39147:366;;;:::o;39519:419::-;39685:4;39723:2;39712:9;39708:18;39700:26;;39772:9;39766:4;39762:20;39758:1;39747:9;39743:17;39736:47;39800:131;39926:4;39800:131;:::i;:::-;39792:139;;39519:419;;;:::o;39944:223::-;40084:34;40080:1;40072:6;40068:14;40061:58;40153:6;40148:2;40140:6;40136:15;40129:31;39944:223;:::o;40173:366::-;40315:3;40336:67;40400:2;40395:3;40336:67;:::i;:::-;40329:74;;40412:93;40501:3;40412:93;:::i;:::-;40530:2;40525:3;40521:12;40514:19;;40173:366;;;:::o;40545:419::-;40711:4;40749:2;40738:9;40734:18;40726:26;;40798:9;40792:4;40788:20;40784:1;40773:9;40769:17;40762:47;40826:131;40952:4;40826:131;:::i;:::-;40818:139;;40545:419;;;:::o;40970:305::-;41010:3;41029:20;41047:1;41029:20;:::i;:::-;41024:25;;41063:20;41081:1;41063:20;:::i;:::-;41058:25;;41217:1;41149:66;41145:74;41142:1;41139:81;41136:107;;;41223:18;;:::i;:::-;41136:107;41267:1;41264;41260:9;41253:16;;40970:305;;;;:::o;41281:348::-;41321:7;41344:20;41362:1;41344:20;:::i;:::-;41339:25;;41378:20;41396:1;41378:20;:::i;:::-;41373:25;;41566:1;41498:66;41494:74;41491:1;41488:81;41483:1;41476:9;41469:17;41465:105;41462:131;;;41573:18;;:::i;:::-;41462:131;41621:1;41618;41614:9;41603:20;;41281:348;;;;:::o;41635:180::-;41683:77;41680:1;41673:88;41780:4;41777:1;41770:15;41804:4;41801:1;41794:15;41821:185;41861:1;41878:20;41896:1;41878:20;:::i;:::-;41873:25;;41912:20;41930:1;41912:20;:::i;:::-;41907:25;;41951:1;41941:35;;41956:18;;:::i;:::-;41941:35;41998:1;41995;41991:9;41986:14;;41821:185;;;;:::o;42012:237::-;42152:34;42148:1;42140:6;42136:14;42129:58;42221:20;42216:2;42208:6;42204:15;42197:45;42012:237;:::o;42255:366::-;42397:3;42418:67;42482:2;42477:3;42418:67;:::i;:::-;42411:74;;42494:93;42583:3;42494:93;:::i;:::-;42612:2;42607:3;42603:12;42596:19;;42255:366;;;:::o;42627:419::-;42793:4;42831:2;42820:9;42816:18;42808:26;;42880:9;42874:4;42870:20;42866:1;42855:9;42851:17;42844:47;42908:131;43034:4;42908:131;:::i;:::-;42900:139;;42627:419;;;:::o;43052:176::-;43084:1;43101:20;43119:1;43101:20;:::i;:::-;43096:25;;43135:20;43153:1;43135:20;:::i;:::-;43130:25;;43174:1;43164:35;;43179:18;;:::i;:::-;43164:35;43220:1;43217;43213:9;43208:14;;43052:176;;;;:::o;43234:98::-;43285:6;43319:5;43313:12;43303:22;;43234:98;;;:::o;43338:168::-;43421:11;43455:6;43450:3;43443:19;43495:4;43490:3;43486:14;43471:29;;43338:168;;;;:::o;43512:360::-;43598:3;43626:38;43658:5;43626:38;:::i;:::-;43680:70;43743:6;43738:3;43680:70;:::i;:::-;43673:77;;43759:52;43804:6;43799:3;43792:4;43785:5;43781:16;43759:52;:::i;:::-;43836:29;43858:6;43836:29;:::i;:::-;43831:3;43827:39;43820:46;;43602:270;43512:360;;;;:::o;43878:640::-;44073:4;44111:3;44100:9;44096:19;44088:27;;44125:71;44193:1;44182:9;44178:17;44169:6;44125:71;:::i;:::-;44206:72;44274:2;44263:9;44259:18;44250:6;44206:72;:::i;:::-;44288;44356:2;44345:9;44341:18;44332:6;44288:72;:::i;:::-;44407:9;44401:4;44397:20;44392:2;44381:9;44377:18;44370:48;44435:76;44506:4;44497:6;44435:76;:::i;:::-;44427:84;;43878:640;;;;;;;:::o;44524:141::-;44580:5;44611:6;44605:13;44596:22;;44627:32;44653:5;44627:32;:::i;:::-;44524:141;;;;:::o;44671:349::-;44740:6;44789:2;44777:9;44768:7;44764:23;44760:32;44757:119;;;44795:79;;:::i;:::-;44757:119;44915:1;44940:63;44995:7;44986:6;44975:9;44971:22;44940:63;:::i;:::-;44930:73;;44886:127;44671:349;;;;:::o;45026:180::-;45074:77;45071:1;45064:88;45171:4;45168:1;45161:15;45195:4;45192:1;45185:15;45212:182;45352:34;45348:1;45340:6;45336:14;45329:58;45212:182;:::o;45400:366::-;45542:3;45563:67;45627:2;45622:3;45563:67;:::i;:::-;45556:74;;45639:93;45728:3;45639:93;:::i;:::-;45757:2;45752:3;45748:12;45741:19;;45400:366;;;:::o;45772:419::-;45938:4;45976:2;45965:9;45961:18;45953:26;;46025:9;46019:4;46015:20;46011:1;46000:9;45996:17;45989:47;46053:131;46179:4;46053:131;:::i;:::-;46045:139;;45772:419;;;:::o;46197:178::-;46337:30;46333:1;46325:6;46321:14;46314:54;46197:178;:::o;46381:366::-;46523:3;46544:67;46608:2;46603:3;46544:67;:::i;:::-;46537:74;;46620:93;46709:3;46620:93;:::i;:::-;46738:2;46733:3;46729:12;46722:19;;46381:366;;;:::o;46753:419::-;46919:4;46957:2;46946:9;46942:18;46934:26;;47006:9;47000:4;46996:20;46992:1;46981:9;46977:17;46970:47;47034:131;47160:4;47034:131;:::i;:::-;47026:139;;46753:419;;;:::o

Swarm Source

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