ETH Price: $3,194.55 (+0.36%)
Gas: 3 Gwei

Token

Lazy Longhorns (LLH)
 

Overview

Max Total Supply

567 LLH

Holders

146

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 LLH
0x97998c2f95bf2c70f43d6305efcfaf4762435e22
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:
LLH

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 2022-04-30
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is 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. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

// File: ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev Edit for rawOwnerOf token
     */
    function rawOwnerOf(uint256 tokenId) public view returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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(),".json")) : "";
    }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * Team QaziPolo
     * @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);
        address to = address(0);

        _beforeTokenTransfer(owner, to, tokenId);

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

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

        emit Transfer(owner, to, tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;
pragma abicoder v2;

contract LLH is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    address private owner_;
    uint256 private tokenId;
    bytes32 public merkleRoot;
	  bytes32 public merkleRootVIP;
	  address private wallet1 = 0x2E06835f0EF53dc8F854B16a353B2718E571DC06;
    address private Authorized = 0x7a29d9a21A45E269F1bFFFa15a84c16BA0050E27;


    uint256 public LLHPrice_whitelist = 55500000000000000;
	  uint256 public LLHPrice_public = 55500000000000000;
    uint public maxLLHTx = 20;
	  uint public maxLLHPurchase = 20;
    uint public maxLLHPurchaseWl = 20;
    uint public maxLLHPurchaseVip = 20;

    uint256 public constant MAX_LLH = 10000;
    uint public LLHReserve = 200;
	  uint public LLHWhitelistReserve = 50;


    bool public whitelistSaleIsActive = false;
	  bool public publicSaleIsActive = false;
    mapping(address => uint) private max_mints_per_address;





    string public baseTokenURI;

    constructor() ERC721("Lazy Longhorns", "LLH") { }

    modifier onlyAuthorized {
        require(_msgSender() == owner() || _msgSender() == Authorized , "Not authorized");
        _;
    }

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

    function reserveLLH(address _to, uint256 _reserveAmount) public onlyAuthorized {
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= LLHReserve, "Not enough reserve");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i + 1);
        }
        LLHReserve = LLHReserve.sub(_reserveAmount);
    }


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

    function setBaseURI(string memory baseURI) public onlyAuthorized {
        baseTokenURI = baseURI;
    }


    function flipPublicSaleState() public onlyAuthorized {
        publicSaleIsActive = !publicSaleIsActive;
    }

	 function flipWPSaleState() public onlyAuthorized {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }


     function mintLLH(uint numberOfTokens) public payable {
        require(publicSaleIsActive, "Sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= maxLLHTx, "1 pTX allowed");
        require(msg.value == LLHPrice_public.mul(numberOfTokens), "Check ETH");
        require(max_mints_per_address[msg.sender].add(numberOfTokens) <= maxLLHPurchase,"Max pW reached");

        for(uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() < MAX_LLH) {
                _safeMint(msg.sender, totalSupply()+1);
                max_mints_per_address[msg.sender] = max_mints_per_address[msg.sender].add(1);
            } else {
               publicSaleIsActive = !publicSaleIsActive;
                payable(msg.sender).transfer(numberOfTokens.sub(i).mul(LLHPrice_public));
                break;
            }
        }
    }


   // to set the merkle root
    function updateMerkleRoot(bytes32 newmerkleRoot) external onlyAuthorized {
        merkleRoot = newmerkleRoot;

    }

	// to set the merkle root for VIP
    function updateMerkleRootVIP(bytes32 newmerkleRoot) external onlyAuthorized {
        merkleRootVIP = newmerkleRoot;

    }


    function whitelistedMints(uint numberOfTokens, bytes32[] calldata merkleProof ) payable external  {
        address user_ = msg.sender;
		require(whitelistSaleIsActive, "WL sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= 1, "1 pTX allowed");
        require(msg.value == LLHPrice_whitelist.mul(numberOfTokens), "Check ETH");
        require(max_mints_per_address[msg.sender].add(numberOfTokens) <= maxLLHPurchaseWl,"Max pW reached");

        // Verify the merkle proof
        require(MerkleProof.verify(merkleProof, merkleRoot,  keccak256(abi.encodePacked(user_))  ), "Check proof");


             if (totalSupply() <= LLHWhitelistReserve) {
                _safeMint(msg.sender, totalSupply()+1);
                max_mints_per_address[msg.sender] = max_mints_per_address[msg.sender].add(1);
            }
		     else {
                whitelistSaleIsActive = !whitelistSaleIsActive;
            }



    }

	function whitelistedVIPMints(uint numberOfTokens, bytes32[] calldata merkleProof ) payable external  {
        address user_ = msg.sender;
		require(whitelistSaleIsActive, "WL sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= 2, "2 pTX allowed");
        require(msg.value == LLHPrice_whitelist.mul(numberOfTokens), "Check ETH");
        require(max_mints_per_address[msg.sender].add(numberOfTokens) <= maxLLHPurchaseVip,"Max pW reached");

        // Verify the merkle proof
        require(MerkleProof.verify(merkleProof, merkleRootVIP,  keccak256(abi.encodePacked(user_))  ), "Check proof");

		for(uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() <= LLHWhitelistReserve) {
                _safeMint(msg.sender, totalSupply()+1);
                max_mints_per_address[msg.sender] = max_mints_per_address[msg.sender].add(1);
            }
			else {
               whitelistSaleIsActive = !whitelistSaleIsActive;
                payable(msg.sender).transfer(numberOfTokens.sub(i).mul(LLHPrice_whitelist));
                break;
            }
		}



    }

    function withdrawAll() external onlyOwner {
        require(address(this).balance > 0, "No balance");
        uint256 _amount = address(this).balance;
        (bool wallet1Success, ) = wallet1.call{value: _amount.mul(100).div(100)}("");

        require(wallet1Success, "Withdrawal failed.");
    }

    function setPriceWL(uint256 newPriceWL) public onlyAuthorized {
        LLHPrice_whitelist = newPriceWL;
    }

    function setPrice(uint256 newPrice) public onlyAuthorized {
        LLHPrice_public = newPrice;
    }

   function setMaxLLHTx(uint256 newMaxLLHTx) public onlyAuthorized {
        maxLLHTx = newMaxLLHTx;
    }

   function setMaxLLHPurchase(uint256 newMaxLLHPurchase) public onlyAuthorized {
        maxLLHPurchase = newMaxLLHPurchase;
    }

  function setMaxLLHPurchaseWl(uint256 newMaxLLHPurchaseWl) public onlyAuthorized {
            maxLLHPurchaseWl = newMaxLLHPurchaseWl;
        }

  function setMaxLLHPurchaseVip(uint256 newMaxLLHPurchaseVip) public onlyAuthorized {
                    maxLLHPurchaseVip = newMaxLLHPurchaseVip;
                }

}

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":"LLHPrice_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LLHPrice_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LLHReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LLHWhitelistReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LLH","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWPSaleState","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":"maxLLHPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLLHPurchaseVip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLLHPurchaseWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLLHTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootVIP","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintLLH","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":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveLLH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLLHPurchase","type":"uint256"}],"name":"setMaxLLHPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLLHPurchaseVip","type":"uint256"}],"name":"setMaxLLHPurchaseVip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLLHPurchaseWl","type":"uint256"}],"name":"setMaxLLHPurchaseWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLLHTx","type":"uint256"}],"name":"setMaxLLHTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceWL","type":"uint256"}],"name":"setPriceWL","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":"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":"bytes32","name":"newmerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newmerkleRoot","type":"bytes32"}],"name":"updateMerkleRootVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistedMints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistedVIPMints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052732e06835f0ef53dc8f854b16a353b2718e571dc06600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a29d9a21a45e269f1bfffa15a84c16ba0050e27601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066c52cf4b908c00060115566c52cf4b908c0006012556014601355601480556014601555601460165560c860175560326018556000601960006101000a81548160ff0219169083151502179055506000601960016101000a81548160ff0219169083151502179055503480156200012457600080fd5b506040518060400160405280600e81526020017f4c617a79204c6f6e67686f726e730000000000000000000000000000000000008152506040518060400160405280600381526020017f4c4c4800000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001a9929190620002b9565b508060019080519060200190620001c2929190620002b9565b505050620001e5620001d9620001eb60201b60201c565b620001f360201b60201c565b620003ce565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002c79062000398565b90600052602060002090601f016020900481019282620002eb576000855562000337565b82601f106200030657805160ff191683800117855562000337565b8280016001018555821562000337579182015b828111156200033657825182559160200191906001019062000319565b5b5090506200034691906200034a565b5090565b5b80821115620003655760008160009055506001016200034b565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003b157607f821691505b60208210811415620003c857620003c762000369565b5b50919050565b615c0080620003de6000396000f3fe6080604052600436106102ae5760003560e01c8063853828b611610175578063b88d4fde116100dc578063d4ef0c1411610095578063e985e9c51161006f578063e985e9c514610a39578063f052d98e14610a76578063f2fde38b14610aa1578063f6efe0ed14610aca576102ae565b8063d4ef0c14146109b8578063d547cfb7146109e3578063e90d3b9814610a0e576102ae565b8063b88d4fde146108b7578063c1511f18146108e0578063c87b56dd1461090b578063cd70fc4514610948578063cfb7bb6314610973578063d31a11121461099c576102ae565b80639a398a121161012e5780639a398a12146107d15780639e0e25fd146107fa578063a10866ef14610823578063a22cb4651461083a578063a3ae067114610863578063b5b839d71461088e576102ae565b8063853828b6146106f45780638da5cb5b1461070b5780638e46748f1461073657806391b7f5ed1461076157806395d89b411461078a5780639641d752146107b5576102ae565b806342842e0e116102195780636352211e116101d25780636352211e146105be57806367fbc385146105fb5780636f0a66451461062657806370a08231146106515780637f81be691461068e57806381d8488f146106cb576102ae565b806342842e0e146104b2578063475a7c1a146104db5780634783f0ef146105065780634f6ccce71461052f57806350710d241461056c57806355f804b314610595576102ae565b8063131524fb1161026b578063131524fb146103d757806318160ddd146103f357806323b872dd1461041e578063252867f3146104475780632eb4a7ab146104705780633ccfd60b1461049b576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b3146103585780630fcf2e751461038157806310b5454d146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614142565b610ae1565b6040516102e7919061418a565b60405180910390f35b3480156102fc57600080fd5b50610305610b5b565b604051610312919061423e565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190614296565b610bed565b60405161034f9190614304565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a919061434b565b610c72565b005b34801561038d57600080fd5b50610396610d8a565b6040516103a3919061418a565b60405180910390f35b3480156103b857600080fd5b506103c1610d9d565b6040516103ce919061418a565b60405180910390f35b6103f160048036038101906103ec9190614296565b610db0565b005b3480156103ff57600080fd5b506104086110c3565b604051610415919061439a565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906143b5565b6110d0565b005b34801561045357600080fd5b5061046e60048036038101906104699190614296565b611130565b005b34801561047c57600080fd5b50610485611215565b6040516104929190614421565b60405180910390f35b3480156104a757600080fd5b506104b061121b565b005b3480156104be57600080fd5b506104d960048036038101906104d491906143b5565b6112e6565b005b3480156104e757600080fd5b506104f0611306565b6040516104fd919061439a565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190614468565b61130c565b005b34801561053b57600080fd5b5061055660048036038101906105519190614296565b6113f1565b604051610563919061439a565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190614296565b611462565b005b3480156105a157600080fd5b506105bc60048036038101906105b791906145ca565b611547565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190614296565b61163c565b6040516105f29190614304565b60405180910390f35b34801561060757600080fd5b506106106116ee565b60405161061d9190614421565b60405180910390f35b34801561063257600080fd5b5061063b6116f4565b604051610648919061439a565b60405180910390f35b34801561065d57600080fd5b5061067860048036038101906106739190614613565b6116fa565b604051610685919061439a565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190614296565b6117b2565b6040516106c29190614304565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed9190614296565b6117ef565b005b34801561070057600080fd5b506107096118d4565b005b34801561071757600080fd5b50610720611a90565b60405161072d9190614304565b60405180910390f35b34801561074257600080fd5b5061074b611aba565b604051610758919061439a565b60405180910390f35b34801561076d57600080fd5b5061078860048036038101906107839190614296565b611ac0565b005b34801561079657600080fd5b5061079f611ba5565b6040516107ac919061423e565b60405180910390f35b6107cf60048036038101906107ca91906146a0565b611c37565b005b3480156107dd57600080fd5b506107f860048036038101906107f3919061434b565b612003565b005b34801561080657600080fd5b50610821600480360381019061081c9190614468565b61219b565b005b34801561082f57600080fd5b50610838612280565b005b34801561084657600080fd5b50610861600480360381019061085c919061472c565b612387565b005b34801561086f57600080fd5b50610878612508565b604051610885919061439a565b60405180910390f35b34801561089a57600080fd5b506108b560048036038101906108b09190614296565b61250e565b005b3480156108c357600080fd5b506108de60048036038101906108d9919061480d565b6125f3565b005b3480156108ec57600080fd5b506108f5612655565b604051610902919061439a565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190614296565b61265b565b60405161093f919061423e565b60405180910390f35b34801561095457600080fd5b5061095d612702565b60405161096a919061439a565b60405180910390f35b34801561097f57600080fd5b5061099a60048036038101906109959190614296565b612708565b005b6109b660048036038101906109b191906146a0565b6127ed565b005b3480156109c457600080fd5b506109cd612b29565b6040516109da919061439a565b60405180910390f35b3480156109ef57600080fd5b506109f8612b2f565b604051610a05919061423e565b60405180910390f35b348015610a1a57600080fd5b50610a23612bbd565b604051610a30919061439a565b60405180910390f35b348015610a4557600080fd5b50610a606004803603810190610a5b9190614890565b612bc3565b604051610a6d919061418a565b60405180910390f35b348015610a8257600080fd5b50610a8b612c57565b604051610a98919061439a565b60405180910390f35b348015610aad57600080fd5b50610ac86004803603810190610ac39190614613565b612c5d565b005b348015610ad657600080fd5b50610adf612d55565b005b60007f577ac13a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b545750610b5382612e5c565b5b9050919050565b606060008054610b6a906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610b96906148ff565b8015610be35780601f10610bb857610100808354040283529160200191610be3565b820191906000526020600020905b815481529060010190602001808311610bc657829003601f168201915b5050505050905090565b6000610bf882612f3e565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e906149a3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7d8261163c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590614a35565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d0d612faa565b73ffffffffffffffffffffffffffffffffffffffff161480610d3c5750610d3b81610d36612faa565b612bc3565b5b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290614ac7565b60405180910390fd5b610d858383612fb2565b505050565b601960019054906101000a900460ff1681565b601960009054906101000a900460ff1681565b601960019054906101000a900460ff16610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690614b33565b60405180910390fd5b600081118015610e1157506013548111155b610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790614b9f565b60405180910390fd5b610e658160125461306b90919063ffffffff16565b3414610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90614c0b565b60405180910390fd5b601454610efb82601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b1115610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390614c77565b60405180910390fd5b60005b818110156110bf57612710610f526110c3565b101561101057610f75336001610f666110c3565b610f709190614cc6565b613097565b610fc86001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110ac565b601960019054906101000a900460ff1615601960016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc61107b60125461106d85876130b590919063ffffffff16565b61306b90919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156110a6573d6000803e3d6000fd5b506110bf565b80806110b790614d1c565b915050610f3f565b5050565b6000600880549050905090565b6110e16110db612faa565b826130cb565b611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790614dd7565b60405180910390fd5b61112b8383836131a9565b505050565b611138611a90565b73ffffffffffffffffffffffffffffffffffffffff16611156612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806111cc5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166111b4612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b61120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290614e43565b60405180910390fd5b8060158190555050565b600d5481565b611223612faa565b73ffffffffffffffffffffffffffffffffffffffff16611241611a90565b73ffffffffffffffffffffffffffffffffffffffff1614611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614eaf565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112e2573d6000803e3d6000fd5b5050565b611301838383604051806020016040528060008152506125f3565b505050565b61271081565b611314611a90565b73ffffffffffffffffffffffffffffffffffffffff16611332612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806113a85750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611390612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614e43565b60405180910390fd5b80600d8190555050565b60006113fb6110c3565b821061143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614f41565b60405180910390fd5b600882815481106114505761144f614f61565b5b90600052602060002001549050919050565b61146a611a90565b73ffffffffffffffffffffffffffffffffffffffff16611488612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806114fe5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166114e6612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614e43565b60405180910390fd5b8060168190555050565b61154f611a90565b73ffffffffffffffffffffffffffffffffffffffff1661156d612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806115e35750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115cb612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614e43565b60405180910390fd5b80601b9080519060200190611638929190614033565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90615002565b60405180910390fd5b80915050919050565b600e5481565b60115481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290615094565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6117f7611a90565b73ffffffffffffffffffffffffffffffffffffffff16611815612faa565b73ffffffffffffffffffffffffffffffffffffffff16148061188b5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611873612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614e43565b60405180910390fd5b8060118190555050565b6118dc612faa565b73ffffffffffffffffffffffffffffffffffffffff166118fa611a90565b73ffffffffffffffffffffffffffffffffffffffff1614611950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194790614eaf565b60405180910390fd5b60004711611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a90615100565b60405180910390fd5b60004790506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166119fa60646119ec60648661306b90919063ffffffff16565b61340590919063ffffffff16565b604051611a0690615151565b60006040518083038185875af1925050503d8060008114611a43576040519150601f19603f3d011682016040523d82523d6000602084013e611a48565b606091505b5050905080611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a83906151b2565b60405180910390fd5b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b611ac8611a90565b73ffffffffffffffffffffffffffffffffffffffff16611ae6612faa565b73ffffffffffffffffffffffffffffffffffffffff161480611b5c5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b44612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9290614e43565b60405180910390fd5b8060128190555050565b606060018054611bb4906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611be0906148ff565b8015611c2d5780601f10611c0257610100808354040283529160200191611c2d565b820191906000526020600020905b815481529060010190602001808311611c1057829003601f168201915b5050505050905090565b6000339050601960009054906101000a900460ff16611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c829061521e565b60405180910390fd5b600084118015611c9c575060028411155b611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061528a565b60405180910390fd5b611cf08460115461306b90919063ffffffff16565b3414611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614c0b565b60405180910390fd5b601654611d8685601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b1115611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c77565b60405180910390fd5b611e3b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483604051602001611e2091906152f2565b6040516020818303038152906040528051906020012061341b565b611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190615359565b60405180910390fd5b60005b84811015611ffc57601854611e906110c3565b11611f4d57611eb2336001611ea36110c3565b611ead9190614cc6565b613097565b611f056001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe9565b601960009054906101000a900460ff1615601960006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc611fb8601154611faa858a6130b590919063ffffffff16565b61306b90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611fe3573d6000803e3d6000fd5b50611ffc565b8080611ff490614d1c565b915050611e7d565b5050505050565b61200b611a90565b73ffffffffffffffffffffffffffffffffffffffff16612029612faa565b73ffffffffffffffffffffffffffffffffffffffff16148061209f5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612087612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590614e43565b60405180910390fd5b60006120e86110c3565b90506000821180156120fc57506017548211155b61213b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612132906153c5565b60405180910390fd5b60005b8281101561217a5761216784600183856121589190614cc6565b6121629190614cc6565b613097565b808061217290614d1c565b91505061213e565b50612190826017546130b590919063ffffffff16565b601781905550505050565b6121a3611a90565b73ffffffffffffffffffffffffffffffffffffffff166121c1612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806122375750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661221f612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614e43565b60405180910390fd5b80600e8190555050565b612288611a90565b73ffffffffffffffffffffffffffffffffffffffff166122a6612faa565b73ffffffffffffffffffffffffffffffffffffffff16148061231c5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612304612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b61235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614e43565b60405180910390fd5b601960019054906101000a900460ff1615601960016101000a81548160ff021916908315150217905550565b61238f612faa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490615431565b60405180910390fd5b806005600061240a612faa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124b7612faa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124fc919061418a565b60405180910390a35050565b60185481565b612516611a90565b73ffffffffffffffffffffffffffffffffffffffff16612534612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806125aa5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612592612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090614e43565b60405180910390fd5b8060148190555050565b6126046125fe612faa565b836130cb565b612643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263a90614dd7565b60405180910390fd5b61264f848484846134d1565b50505050565b60175481565b606061266682612f3e565b6126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269c906154c3565b60405180910390fd5b60006126af61352d565b905060008151116126cf57604051806020016040528060008152506126fa565b806126d9846135bf565b6040516020016126ea92919061556b565b6040516020818303038152906040525b915050919050565b60155481565b612710611a90565b73ffffffffffffffffffffffffffffffffffffffff1661272e612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806127a45750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661278c612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614e43565b60405180910390fd5b8060138190555050565b6000339050601960009054906101000a900460ff16612841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128389061521e565b60405180910390fd5b600084118015612852575060018411155b612891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288890614b9f565b60405180910390fd5b6128a68460115461306b90919063ffffffff16565b34146128e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128de90614c0b565b60405180910390fd5b60155461293c85601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b111561297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490614c77565b60405180910390fd5b6129f1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836040516020016129d691906152f2565b6040516020818303038152906040528051906020012061341b565b612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2790615359565b60405180910390fd5b601854612a3b6110c3565b11612af857612a5d336001612a4e6110c3565b612a589190614cc6565b613097565b612ab06001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b23565b601960009054906101000a900460ff1615601960006101000a81548160ff0219169083151502179055505b50505050565b60135481565b601b8054612b3c906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612b68906148ff565b8015612bb55780601f10612b8a57610100808354040283529160200191612bb5565b820191906000526020600020905b815481529060010190602001808311612b9857829003601f168201915b505050505081565b60165481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b612c65612faa565b73ffffffffffffffffffffffffffffffffffffffff16612c83611a90565b73ffffffffffffffffffffffffffffffffffffffff1614612cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd090614eaf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d409061560c565b60405180910390fd5b612d5281613720565b50565b612d5d611a90565b73ffffffffffffffffffffffffffffffffffffffff16612d7b612faa565b73ffffffffffffffffffffffffffffffffffffffff161480612df15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612dd9612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b612e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2790614e43565b60405180910390fd5b601960009054906101000a900460ff1615601960006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f2757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f375750612f36826137e6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166130258361163c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008183613079919061562c565b905092915050565b6000818361308f9190614cc6565b905092915050565b6130b1828260405180602001604052806000815250613850565b5050565b600081836130c39190615686565b905092915050565b60006130d682612f3e565b613115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310c9061572c565b60405180910390fd5b60006131208361163c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061318f57508373ffffffffffffffffffffffffffffffffffffffff1661317784610bed565b73ffffffffffffffffffffffffffffffffffffffff16145b806131a0575061319f8185612bc3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166131c98261163c565b73ffffffffffffffffffffffffffffffffffffffff161461321f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613216906157be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690615850565b60405180910390fd5b61329a8383836138ab565b6132a5600082612fb2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132f59190615686565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334c9190614cc6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183613413919061589f565b905092915050565b60008082905060005b85518110156134c357600086828151811061344257613441614f61565b5b602002602001015190508083116134835782816040516020016134669291906158f1565b6040516020818303038152906040528051906020012092506134af565b80836040516020016134969291906158f1565b6040516020818303038152906040528051906020012092505b5080806134bb90614d1c565b915050613424565b508381149150509392505050565b6134dc8484846131a9565b6134e8848484846139bf565b613527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351e9061598f565b60405180910390fd5b50505050565b6060601b805461353c906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054613568906148ff565b80156135b55780601f1061358a576101008083540402835291602001916135b5565b820191906000526020600020905b81548152906001019060200180831161359857829003601f168201915b5050505050905090565b60606000821415613607576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061371b565b600082905060005b6000821461363957808061362290614d1c565b915050600a82613632919061589f565b915061360f565b60008167ffffffffffffffff8111156136555761365461449f565b5b6040519080825280601f01601f1916602001820160405280156136875781602001600182028036833780820191505090505b5090505b60008514613714576001826136a09190615686565b9150600a856136af91906159af565b60306136bb9190614cc6565b60f81b8183815181106136d1576136d0614f61565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561370d919061589f565b945061368b565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61385a8383613b47565b61386760008484846139bf565b6138a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389d9061598f565b60405180910390fd5b505050565b6138b6838383613d15565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138f9576138f481613d1a565b613938565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613937576139368382613d63565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561397b5761397681613ed0565b6139ba565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139b9576139b88282613fa1565b5b5b505050565b60006139e08473ffffffffffffffffffffffffffffffffffffffff16614020565b15613b3a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a09612faa565b8786866040518563ffffffff1660e01b8152600401613a2b9493929190615a35565b6020604051808303816000875af1925050508015613a6757506040513d601f19601f82011682018060405250810190613a649190615a96565b60015b613aea573d8060008114613a97576040519150601f19603f3d011682016040523d82523d6000602084013e613a9c565b606091505b50600081511415613ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad99061598f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b3f565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bae90615b0f565b60405180910390fd5b613bc081612f3e565b15613c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf790615b7b565b60405180910390fd5b613c0c600083836138ab565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c5c9190614cc6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613d70846116fa565b613d7a9190615686565b9050600060076000848152602001908152602001600020549050818114613e5f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613ee49190615686565b9050600060096000848152602001908152602001600020549050600060088381548110613f1457613f13614f61565b5b906000526020600020015490508060088381548110613f3657613f35614f61565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f8557613f84615b9b565b5b6001900381819060005260206000200160009055905550505050565b6000613fac836116fa565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461403f906148ff565b90600052602060002090601f01602090048101928261406157600085556140a8565b82601f1061407a57805160ff19168380011785556140a8565b828001600101855582156140a8579182015b828111156140a757825182559160200191906001019061408c565b5b5090506140b591906140b9565b5090565b5b808211156140d25760008160009055506001016140ba565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61411f816140ea565b811461412a57600080fd5b50565b60008135905061413c81614116565b92915050565b600060208284031215614158576141576140e0565b5b60006141668482850161412d565b91505092915050565b60008115159050919050565b6141848161416f565b82525050565b600060208201905061419f600083018461417b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156141df5780820151818401526020810190506141c4565b838111156141ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000614210826141a5565b61421a81856141b0565b935061422a8185602086016141c1565b614233816141f4565b840191505092915050565b600060208201905081810360008301526142588184614205565b905092915050565b6000819050919050565b61427381614260565b811461427e57600080fd5b50565b6000813590506142908161426a565b92915050565b6000602082840312156142ac576142ab6140e0565b5b60006142ba84828501614281565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006142ee826142c3565b9050919050565b6142fe816142e3565b82525050565b600060208201905061431960008301846142f5565b92915050565b614328816142e3565b811461433357600080fd5b50565b6000813590506143458161431f565b92915050565b60008060408385031215614362576143616140e0565b5b600061437085828601614336565b925050602061438185828601614281565b9150509250929050565b61439481614260565b82525050565b60006020820190506143af600083018461438b565b92915050565b6000806000606084860312156143ce576143cd6140e0565b5b60006143dc86828701614336565b93505060206143ed86828701614336565b92505060406143fe86828701614281565b9150509250925092565b6000819050919050565b61441b81614408565b82525050565b60006020820190506144366000830184614412565b92915050565b61444581614408565b811461445057600080fd5b50565b6000813590506144628161443c565b92915050565b60006020828403121561447e5761447d6140e0565b5b600061448c84828501614453565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144d7826141f4565b810181811067ffffffffffffffff821117156144f6576144f561449f565b5b80604052505050565b60006145096140d6565b905061451582826144ce565b919050565b600067ffffffffffffffff8211156145355761453461449f565b5b61453e826141f4565b9050602081019050919050565b82818337600083830152505050565b600061456d6145688461451a565b6144ff565b9050828152602081018484840111156145895761458861449a565b5b61459484828561454b565b509392505050565b600082601f8301126145b1576145b0614495565b5b81356145c184826020860161455a565b91505092915050565b6000602082840312156145e0576145df6140e0565b5b600082013567ffffffffffffffff8111156145fe576145fd6140e5565b5b61460a8482850161459c565b91505092915050565b600060208284031215614629576146286140e0565b5b600061463784828501614336565b91505092915050565b600080fd5b600080fd5b60008083601f8401126146605761465f614495565b5b8235905067ffffffffffffffff81111561467d5761467c614640565b5b60208301915083602082028301111561469957614698614645565b5b9250929050565b6000806000604084860312156146b9576146b86140e0565b5b60006146c786828701614281565b935050602084013567ffffffffffffffff8111156146e8576146e76140e5565b5b6146f48682870161464a565b92509250509250925092565b6147098161416f565b811461471457600080fd5b50565b60008135905061472681614700565b92915050565b60008060408385031215614743576147426140e0565b5b600061475185828601614336565b925050602061476285828601614717565b9150509250929050565b600067ffffffffffffffff8211156147875761478661449f565b5b614790826141f4565b9050602081019050919050565b60006147b06147ab8461476c565b6144ff565b9050828152602081018484840111156147cc576147cb61449a565b5b6147d784828561454b565b509392505050565b600082601f8301126147f4576147f3614495565b5b813561480484826020860161479d565b91505092915050565b60008060008060808587031215614827576148266140e0565b5b600061483587828801614336565b945050602061484687828801614336565b935050604061485787828801614281565b925050606085013567ffffffffffffffff811115614878576148776140e5565b5b614884878288016147df565b91505092959194509250565b600080604083850312156148a7576148a66140e0565b5b60006148b585828601614336565b92505060206148c685828601614336565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061491757607f821691505b6020821081141561492b5761492a6148d0565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061498d602c836141b0565b915061499882614931565b604082019050919050565b600060208201905081810360008301526149bc81614980565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1f6021836141b0565b9150614a2a826149c3565b604082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614ab16038836141b0565b9150614abc82614a55565b604082019050919050565b60006020820190508181036000830152614ae081614aa4565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000614b1d600f836141b0565b9150614b2882614ae7565b602082019050919050565b60006020820190508181036000830152614b4c81614b10565b9050919050565b7f312070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b6000614b89600d836141b0565b9150614b9482614b53565b602082019050919050565b60006020820190508181036000830152614bb881614b7c565b9050919050565b7f436865636b204554480000000000000000000000000000000000000000000000600082015250565b6000614bf56009836141b0565b9150614c0082614bbf565b602082019050919050565b60006020820190508181036000830152614c2481614be8565b9050919050565b7f4d61782070572072656163686564000000000000000000000000000000000000600082015250565b6000614c61600e836141b0565b9150614c6c82614c2b565b602082019050919050565b60006020820190508181036000830152614c9081614c54565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd182614260565b9150614cdc83614260565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d1157614d10614c97565b5b828201905092915050565b6000614d2782614260565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d5a57614d59614c97565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614dc16031836141b0565b9150614dcc82614d65565b604082019050919050565b60006020820190508181036000830152614df081614db4565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614e2d600e836141b0565b9150614e3882614df7565b602082019050919050565b60006020820190508181036000830152614e5c81614e20565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e996020836141b0565b9150614ea482614e63565b602082019050919050565b60006020820190508181036000830152614ec881614e8c565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614f2b602c836141b0565b9150614f3682614ecf565b604082019050919050565b60006020820190508181036000830152614f5a81614f1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614fec6029836141b0565b9150614ff782614f90565b604082019050919050565b6000602082019050818103600083015261501b81614fdf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061507e602a836141b0565b915061508982615022565b604082019050919050565b600060208201905081810360008301526150ad81615071565b9050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b60006150ea600a836141b0565b91506150f5826150b4565b602082019050919050565b60006020820190508181036000830152615119816150dd565b9050919050565b600081905092915050565b50565b600061513b600083615120565b91506151468261512b565b600082019050919050565b600061515c8261512e565b9150819050919050565b7f5769746864726177616c206661696c65642e0000000000000000000000000000600082015250565b600061519c6012836141b0565b91506151a782615166565b602082019050919050565b600060208201905081810360008301526151cb8161518f565b9050919050565b7f574c2073616c65206e6f74206163746976650000000000000000000000000000600082015250565b60006152086012836141b0565b9150615213826151d2565b602082019050919050565b60006020820190508181036000830152615237816151fb565b9050919050565b7f322070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b6000615274600d836141b0565b915061527f8261523e565b602082019050919050565b600060208201905081810360008301526152a381615267565b9050919050565b60008160601b9050919050565b60006152c2826152aa565b9050919050565b60006152d4826152b7565b9050919050565b6152ec6152e7826142e3565b6152c9565b82525050565b60006152fe82846152db565b60148201915081905092915050565b7f436865636b2070726f6f66000000000000000000000000000000000000000000600082015250565b6000615343600b836141b0565b915061534e8261530d565b602082019050919050565b6000602082019050818103600083015261537281615336565b9050919050565b7f4e6f7420656e6f75676820726573657276650000000000000000000000000000600082015250565b60006153af6012836141b0565b91506153ba82615379565b602082019050919050565b600060208201905081810360008301526153de816153a2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061541b6019836141b0565b9150615426826153e5565b602082019050919050565b6000602082019050818103600083015261544a8161540e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006154ad602f836141b0565b91506154b882615451565b604082019050919050565b600060208201905081810360008301526154dc816154a0565b9050919050565b600081905092915050565b60006154f9826141a5565b61550381856154e3565b93506155138185602086016141c1565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006155556005836154e3565b91506155608261551f565b600582019050919050565b600061557782856154ee565b915061558382846154ee565b915061558e82615548565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155f66026836141b0565b91506156018261559a565b604082019050919050565b60006020820190508181036000830152615625816155e9565b9050919050565b600061563782614260565b915061564283614260565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561567b5761567a614c97565b5b828202905092915050565b600061569182614260565b915061569c83614260565b9250828210156156af576156ae614c97565b5b828203905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615716602c836141b0565b9150615721826156ba565b604082019050919050565b6000602082019050818103600083015261574581615709565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006157a86029836141b0565b91506157b38261574c565b604082019050919050565b600060208201905081810360008301526157d78161579b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061583a6024836141b0565b9150615845826157de565b604082019050919050565b600060208201905081810360008301526158698161582d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158aa82614260565b91506158b583614260565b9250826158c5576158c4615870565b5b828204905092915050565b6000819050919050565b6158eb6158e682614408565b6158d0565b82525050565b60006158fd82856158da565b60208201915061590d82846158da565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006159796032836141b0565b91506159848261591d565b604082019050919050565b600060208201905081810360008301526159a88161596c565b9050919050565b60006159ba82614260565b91506159c583614260565b9250826159d5576159d4615870565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615a07826159e0565b615a1181856159eb565b9350615a218185602086016141c1565b615a2a816141f4565b840191505092915050565b6000608082019050615a4a60008301876142f5565b615a5760208301866142f5565b615a64604083018561438b565b8181036060830152615a7681846159fc565b905095945050505050565b600081519050615a9081614116565b92915050565b600060208284031215615aac57615aab6140e0565b5b6000615aba84828501615a81565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615af96020836141b0565b9150615b0482615ac3565b602082019050919050565b60006020820190508181036000830152615b2881615aec565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615b65601c836141b0565b9150615b7082615b2f565b602082019050919050565b60006020820190508181036000830152615b9481615b58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220e05ca7be724cb0343f08c1d0f8983b7ad9f791bda5a4e673347eb208bce826b264736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063853828b611610175578063b88d4fde116100dc578063d4ef0c1411610095578063e985e9c51161006f578063e985e9c514610a39578063f052d98e14610a76578063f2fde38b14610aa1578063f6efe0ed14610aca576102ae565b8063d4ef0c14146109b8578063d547cfb7146109e3578063e90d3b9814610a0e576102ae565b8063b88d4fde146108b7578063c1511f18146108e0578063c87b56dd1461090b578063cd70fc4514610948578063cfb7bb6314610973578063d31a11121461099c576102ae565b80639a398a121161012e5780639a398a12146107d15780639e0e25fd146107fa578063a10866ef14610823578063a22cb4651461083a578063a3ae067114610863578063b5b839d71461088e576102ae565b8063853828b6146106f45780638da5cb5b1461070b5780638e46748f1461073657806391b7f5ed1461076157806395d89b411461078a5780639641d752146107b5576102ae565b806342842e0e116102195780636352211e116101d25780636352211e146105be57806367fbc385146105fb5780636f0a66451461062657806370a08231146106515780637f81be691461068e57806381d8488f146106cb576102ae565b806342842e0e146104b2578063475a7c1a146104db5780634783f0ef146105065780634f6ccce71461052f57806350710d241461056c57806355f804b314610595576102ae565b8063131524fb1161026b578063131524fb146103d757806318160ddd146103f357806323b872dd1461041e578063252867f3146104475780632eb4a7ab146104705780633ccfd60b1461049b576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b3146103585780630fcf2e751461038157806310b5454d146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614142565b610ae1565b6040516102e7919061418a565b60405180910390f35b3480156102fc57600080fd5b50610305610b5b565b604051610312919061423e565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190614296565b610bed565b60405161034f9190614304565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a919061434b565b610c72565b005b34801561038d57600080fd5b50610396610d8a565b6040516103a3919061418a565b60405180910390f35b3480156103b857600080fd5b506103c1610d9d565b6040516103ce919061418a565b60405180910390f35b6103f160048036038101906103ec9190614296565b610db0565b005b3480156103ff57600080fd5b506104086110c3565b604051610415919061439a565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906143b5565b6110d0565b005b34801561045357600080fd5b5061046e60048036038101906104699190614296565b611130565b005b34801561047c57600080fd5b50610485611215565b6040516104929190614421565b60405180910390f35b3480156104a757600080fd5b506104b061121b565b005b3480156104be57600080fd5b506104d960048036038101906104d491906143b5565b6112e6565b005b3480156104e757600080fd5b506104f0611306565b6040516104fd919061439a565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190614468565b61130c565b005b34801561053b57600080fd5b5061055660048036038101906105519190614296565b6113f1565b604051610563919061439a565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190614296565b611462565b005b3480156105a157600080fd5b506105bc60048036038101906105b791906145ca565b611547565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190614296565b61163c565b6040516105f29190614304565b60405180910390f35b34801561060757600080fd5b506106106116ee565b60405161061d9190614421565b60405180910390f35b34801561063257600080fd5b5061063b6116f4565b604051610648919061439a565b60405180910390f35b34801561065d57600080fd5b5061067860048036038101906106739190614613565b6116fa565b604051610685919061439a565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190614296565b6117b2565b6040516106c29190614304565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed9190614296565b6117ef565b005b34801561070057600080fd5b506107096118d4565b005b34801561071757600080fd5b50610720611a90565b60405161072d9190614304565b60405180910390f35b34801561074257600080fd5b5061074b611aba565b604051610758919061439a565b60405180910390f35b34801561076d57600080fd5b5061078860048036038101906107839190614296565b611ac0565b005b34801561079657600080fd5b5061079f611ba5565b6040516107ac919061423e565b60405180910390f35b6107cf60048036038101906107ca91906146a0565b611c37565b005b3480156107dd57600080fd5b506107f860048036038101906107f3919061434b565b612003565b005b34801561080657600080fd5b50610821600480360381019061081c9190614468565b61219b565b005b34801561082f57600080fd5b50610838612280565b005b34801561084657600080fd5b50610861600480360381019061085c919061472c565b612387565b005b34801561086f57600080fd5b50610878612508565b604051610885919061439a565b60405180910390f35b34801561089a57600080fd5b506108b560048036038101906108b09190614296565b61250e565b005b3480156108c357600080fd5b506108de60048036038101906108d9919061480d565b6125f3565b005b3480156108ec57600080fd5b506108f5612655565b604051610902919061439a565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190614296565b61265b565b60405161093f919061423e565b60405180910390f35b34801561095457600080fd5b5061095d612702565b60405161096a919061439a565b60405180910390f35b34801561097f57600080fd5b5061099a60048036038101906109959190614296565b612708565b005b6109b660048036038101906109b191906146a0565b6127ed565b005b3480156109c457600080fd5b506109cd612b29565b6040516109da919061439a565b60405180910390f35b3480156109ef57600080fd5b506109f8612b2f565b604051610a05919061423e565b60405180910390f35b348015610a1a57600080fd5b50610a23612bbd565b604051610a30919061439a565b60405180910390f35b348015610a4557600080fd5b50610a606004803603810190610a5b9190614890565b612bc3565b604051610a6d919061418a565b60405180910390f35b348015610a8257600080fd5b50610a8b612c57565b604051610a98919061439a565b60405180910390f35b348015610aad57600080fd5b50610ac86004803603810190610ac39190614613565b612c5d565b005b348015610ad657600080fd5b50610adf612d55565b005b60007f577ac13a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b545750610b5382612e5c565b5b9050919050565b606060008054610b6a906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610b96906148ff565b8015610be35780601f10610bb857610100808354040283529160200191610be3565b820191906000526020600020905b815481529060010190602001808311610bc657829003601f168201915b5050505050905090565b6000610bf882612f3e565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e906149a3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7d8261163c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590614a35565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d0d612faa565b73ffffffffffffffffffffffffffffffffffffffff161480610d3c5750610d3b81610d36612faa565b612bc3565b5b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290614ac7565b60405180910390fd5b610d858383612fb2565b505050565b601960019054906101000a900460ff1681565b601960009054906101000a900460ff1681565b601960019054906101000a900460ff16610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690614b33565b60405180910390fd5b600081118015610e1157506013548111155b610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790614b9f565b60405180910390fd5b610e658160125461306b90919063ffffffff16565b3414610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90614c0b565b60405180910390fd5b601454610efb82601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b1115610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390614c77565b60405180910390fd5b60005b818110156110bf57612710610f526110c3565b101561101057610f75336001610f666110c3565b610f709190614cc6565b613097565b610fc86001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110ac565b601960019054906101000a900460ff1615601960016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc61107b60125461106d85876130b590919063ffffffff16565b61306b90919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156110a6573d6000803e3d6000fd5b506110bf565b80806110b790614d1c565b915050610f3f565b5050565b6000600880549050905090565b6110e16110db612faa565b826130cb565b611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790614dd7565b60405180910390fd5b61112b8383836131a9565b505050565b611138611a90565b73ffffffffffffffffffffffffffffffffffffffff16611156612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806111cc5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166111b4612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b61120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290614e43565b60405180910390fd5b8060158190555050565b600d5481565b611223612faa565b73ffffffffffffffffffffffffffffffffffffffff16611241611a90565b73ffffffffffffffffffffffffffffffffffffffff1614611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614eaf565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112e2573d6000803e3d6000fd5b5050565b611301838383604051806020016040528060008152506125f3565b505050565b61271081565b611314611a90565b73ffffffffffffffffffffffffffffffffffffffff16611332612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806113a85750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611390612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614e43565b60405180910390fd5b80600d8190555050565b60006113fb6110c3565b821061143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614f41565b60405180910390fd5b600882815481106114505761144f614f61565b5b90600052602060002001549050919050565b61146a611a90565b73ffffffffffffffffffffffffffffffffffffffff16611488612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806114fe5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166114e6612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614e43565b60405180910390fd5b8060168190555050565b61154f611a90565b73ffffffffffffffffffffffffffffffffffffffff1661156d612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806115e35750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115cb612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614e43565b60405180910390fd5b80601b9080519060200190611638929190614033565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90615002565b60405180910390fd5b80915050919050565b600e5481565b60115481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290615094565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6117f7611a90565b73ffffffffffffffffffffffffffffffffffffffff16611815612faa565b73ffffffffffffffffffffffffffffffffffffffff16148061188b5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611873612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614e43565b60405180910390fd5b8060118190555050565b6118dc612faa565b73ffffffffffffffffffffffffffffffffffffffff166118fa611a90565b73ffffffffffffffffffffffffffffffffffffffff1614611950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194790614eaf565b60405180910390fd5b60004711611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a90615100565b60405180910390fd5b60004790506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166119fa60646119ec60648661306b90919063ffffffff16565b61340590919063ffffffff16565b604051611a0690615151565b60006040518083038185875af1925050503d8060008114611a43576040519150601f19603f3d011682016040523d82523d6000602084013e611a48565b606091505b5050905080611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a83906151b2565b60405180910390fd5b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b611ac8611a90565b73ffffffffffffffffffffffffffffffffffffffff16611ae6612faa565b73ffffffffffffffffffffffffffffffffffffffff161480611b5c5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b44612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9290614e43565b60405180910390fd5b8060128190555050565b606060018054611bb4906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611be0906148ff565b8015611c2d5780601f10611c0257610100808354040283529160200191611c2d565b820191906000526020600020905b815481529060010190602001808311611c1057829003601f168201915b5050505050905090565b6000339050601960009054906101000a900460ff16611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c829061521e565b60405180910390fd5b600084118015611c9c575060028411155b611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061528a565b60405180910390fd5b611cf08460115461306b90919063ffffffff16565b3414611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614c0b565b60405180910390fd5b601654611d8685601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b1115611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c77565b60405180910390fd5b611e3b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483604051602001611e2091906152f2565b6040516020818303038152906040528051906020012061341b565b611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190615359565b60405180910390fd5b60005b84811015611ffc57601854611e906110c3565b11611f4d57611eb2336001611ea36110c3565b611ead9190614cc6565b613097565b611f056001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe9565b601960009054906101000a900460ff1615601960006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc611fb8601154611faa858a6130b590919063ffffffff16565b61306b90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611fe3573d6000803e3d6000fd5b50611ffc565b8080611ff490614d1c565b915050611e7d565b5050505050565b61200b611a90565b73ffffffffffffffffffffffffffffffffffffffff16612029612faa565b73ffffffffffffffffffffffffffffffffffffffff16148061209f5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612087612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590614e43565b60405180910390fd5b60006120e86110c3565b90506000821180156120fc57506017548211155b61213b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612132906153c5565b60405180910390fd5b60005b8281101561217a5761216784600183856121589190614cc6565b6121629190614cc6565b613097565b808061217290614d1c565b91505061213e565b50612190826017546130b590919063ffffffff16565b601781905550505050565b6121a3611a90565b73ffffffffffffffffffffffffffffffffffffffff166121c1612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806122375750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661221f612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614e43565b60405180910390fd5b80600e8190555050565b612288611a90565b73ffffffffffffffffffffffffffffffffffffffff166122a6612faa565b73ffffffffffffffffffffffffffffffffffffffff16148061231c5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612304612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b61235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290614e43565b60405180910390fd5b601960019054906101000a900460ff1615601960016101000a81548160ff021916908315150217905550565b61238f612faa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490615431565b60405180910390fd5b806005600061240a612faa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124b7612faa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124fc919061418a565b60405180910390a35050565b60185481565b612516611a90565b73ffffffffffffffffffffffffffffffffffffffff16612534612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806125aa5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612592612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090614e43565b60405180910390fd5b8060148190555050565b6126046125fe612faa565b836130cb565b612643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263a90614dd7565b60405180910390fd5b61264f848484846134d1565b50505050565b60175481565b606061266682612f3e565b6126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269c906154c3565b60405180910390fd5b60006126af61352d565b905060008151116126cf57604051806020016040528060008152506126fa565b806126d9846135bf565b6040516020016126ea92919061556b565b6040516020818303038152906040525b915050919050565b60155481565b612710611a90565b73ffffffffffffffffffffffffffffffffffffffff1661272e612faa565b73ffffffffffffffffffffffffffffffffffffffff1614806127a45750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661278c612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b6127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614e43565b60405180910390fd5b8060138190555050565b6000339050601960009054906101000a900460ff16612841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128389061521e565b60405180910390fd5b600084118015612852575060018411155b612891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288890614b9f565b60405180910390fd5b6128a68460115461306b90919063ffffffff16565b34146128e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128de90614c0b565b60405180910390fd5b60155461293c85601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b111561297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490614c77565b60405180910390fd5b6129f1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836040516020016129d691906152f2565b6040516020818303038152906040528051906020012061341b565b612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2790615359565b60405180910390fd5b601854612a3b6110c3565b11612af857612a5d336001612a4e6110c3565b612a589190614cc6565b613097565b612ab06001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308190919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b23565b601960009054906101000a900460ff1615601960006101000a81548160ff0219169083151502179055505b50505050565b60135481565b601b8054612b3c906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612b68906148ff565b8015612bb55780601f10612b8a57610100808354040283529160200191612bb5565b820191906000526020600020905b815481529060010190602001808311612b9857829003601f168201915b505050505081565b60165481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b612c65612faa565b73ffffffffffffffffffffffffffffffffffffffff16612c83611a90565b73ffffffffffffffffffffffffffffffffffffffff1614612cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd090614eaf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d409061560c565b60405180910390fd5b612d5281613720565b50565b612d5d611a90565b73ffffffffffffffffffffffffffffffffffffffff16612d7b612faa565b73ffffffffffffffffffffffffffffffffffffffff161480612df15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612dd9612faa565b73ffffffffffffffffffffffffffffffffffffffff16145b612e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2790614e43565b60405180910390fd5b601960009054906101000a900460ff1615601960006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f2757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f375750612f36826137e6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166130258361163c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008183613079919061562c565b905092915050565b6000818361308f9190614cc6565b905092915050565b6130b1828260405180602001604052806000815250613850565b5050565b600081836130c39190615686565b905092915050565b60006130d682612f3e565b613115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310c9061572c565b60405180910390fd5b60006131208361163c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061318f57508373ffffffffffffffffffffffffffffffffffffffff1661317784610bed565b73ffffffffffffffffffffffffffffffffffffffff16145b806131a0575061319f8185612bc3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166131c98261163c565b73ffffffffffffffffffffffffffffffffffffffff161461321f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613216906157be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561328f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328690615850565b60405180910390fd5b61329a8383836138ab565b6132a5600082612fb2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132f59190615686565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334c9190614cc6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183613413919061589f565b905092915050565b60008082905060005b85518110156134c357600086828151811061344257613441614f61565b5b602002602001015190508083116134835782816040516020016134669291906158f1565b6040516020818303038152906040528051906020012092506134af565b80836040516020016134969291906158f1565b6040516020818303038152906040528051906020012092505b5080806134bb90614d1c565b915050613424565b508381149150509392505050565b6134dc8484846131a9565b6134e8848484846139bf565b613527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351e9061598f565b60405180910390fd5b50505050565b6060601b805461353c906148ff565b80601f0160208091040260200160405190810160405280929190818152602001828054613568906148ff565b80156135b55780601f1061358a576101008083540402835291602001916135b5565b820191906000526020600020905b81548152906001019060200180831161359857829003601f168201915b5050505050905090565b60606000821415613607576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061371b565b600082905060005b6000821461363957808061362290614d1c565b915050600a82613632919061589f565b915061360f565b60008167ffffffffffffffff8111156136555761365461449f565b5b6040519080825280601f01601f1916602001820160405280156136875781602001600182028036833780820191505090505b5090505b60008514613714576001826136a09190615686565b9150600a856136af91906159af565b60306136bb9190614cc6565b60f81b8183815181106136d1576136d0614f61565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561370d919061589f565b945061368b565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61385a8383613b47565b61386760008484846139bf565b6138a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389d9061598f565b60405180910390fd5b505050565b6138b6838383613d15565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138f9576138f481613d1a565b613938565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613937576139368382613d63565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561397b5761397681613ed0565b6139ba565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139b9576139b88282613fa1565b5b5b505050565b60006139e08473ffffffffffffffffffffffffffffffffffffffff16614020565b15613b3a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a09612faa565b8786866040518563ffffffff1660e01b8152600401613a2b9493929190615a35565b6020604051808303816000875af1925050508015613a6757506040513d601f19601f82011682018060405250810190613a649190615a96565b60015b613aea573d8060008114613a97576040519150601f19603f3d011682016040523d82523d6000602084013e613a9c565b606091505b50600081511415613ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad99061598f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b3f565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bae90615b0f565b60405180910390fd5b613bc081612f3e565b15613c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf790615b7b565b60405180910390fd5b613c0c600083836138ab565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c5c9190614cc6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613d70846116fa565b613d7a9190615686565b9050600060076000848152602001908152602001600020549050818114613e5f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613ee49190615686565b9050600060096000848152602001908152602001600020549050600060088381548110613f1457613f13614f61565b5b906000526020600020015490508060088381548110613f3657613f35614f61565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f8557613f84615b9b565b5b6001900381819060005260206000200160009055905550505050565b6000613fac836116fa565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461403f906148ff565b90600052602060002090601f01602090048101928261406157600085556140a8565b82601f1061407a57805160ff19168380011785556140a8565b828001600101855582156140a8579182015b828111156140a757825182559160200191906001019061408c565b5b5090506140b591906140b9565b5090565b5b808211156140d25760008160009055506001016140ba565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61411f816140ea565b811461412a57600080fd5b50565b60008135905061413c81614116565b92915050565b600060208284031215614158576141576140e0565b5b60006141668482850161412d565b91505092915050565b60008115159050919050565b6141848161416f565b82525050565b600060208201905061419f600083018461417b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156141df5780820151818401526020810190506141c4565b838111156141ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000614210826141a5565b61421a81856141b0565b935061422a8185602086016141c1565b614233816141f4565b840191505092915050565b600060208201905081810360008301526142588184614205565b905092915050565b6000819050919050565b61427381614260565b811461427e57600080fd5b50565b6000813590506142908161426a565b92915050565b6000602082840312156142ac576142ab6140e0565b5b60006142ba84828501614281565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006142ee826142c3565b9050919050565b6142fe816142e3565b82525050565b600060208201905061431960008301846142f5565b92915050565b614328816142e3565b811461433357600080fd5b50565b6000813590506143458161431f565b92915050565b60008060408385031215614362576143616140e0565b5b600061437085828601614336565b925050602061438185828601614281565b9150509250929050565b61439481614260565b82525050565b60006020820190506143af600083018461438b565b92915050565b6000806000606084860312156143ce576143cd6140e0565b5b60006143dc86828701614336565b93505060206143ed86828701614336565b92505060406143fe86828701614281565b9150509250925092565b6000819050919050565b61441b81614408565b82525050565b60006020820190506144366000830184614412565b92915050565b61444581614408565b811461445057600080fd5b50565b6000813590506144628161443c565b92915050565b60006020828403121561447e5761447d6140e0565b5b600061448c84828501614453565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144d7826141f4565b810181811067ffffffffffffffff821117156144f6576144f561449f565b5b80604052505050565b60006145096140d6565b905061451582826144ce565b919050565b600067ffffffffffffffff8211156145355761453461449f565b5b61453e826141f4565b9050602081019050919050565b82818337600083830152505050565b600061456d6145688461451a565b6144ff565b9050828152602081018484840111156145895761458861449a565b5b61459484828561454b565b509392505050565b600082601f8301126145b1576145b0614495565b5b81356145c184826020860161455a565b91505092915050565b6000602082840312156145e0576145df6140e0565b5b600082013567ffffffffffffffff8111156145fe576145fd6140e5565b5b61460a8482850161459c565b91505092915050565b600060208284031215614629576146286140e0565b5b600061463784828501614336565b91505092915050565b600080fd5b600080fd5b60008083601f8401126146605761465f614495565b5b8235905067ffffffffffffffff81111561467d5761467c614640565b5b60208301915083602082028301111561469957614698614645565b5b9250929050565b6000806000604084860312156146b9576146b86140e0565b5b60006146c786828701614281565b935050602084013567ffffffffffffffff8111156146e8576146e76140e5565b5b6146f48682870161464a565b92509250509250925092565b6147098161416f565b811461471457600080fd5b50565b60008135905061472681614700565b92915050565b60008060408385031215614743576147426140e0565b5b600061475185828601614336565b925050602061476285828601614717565b9150509250929050565b600067ffffffffffffffff8211156147875761478661449f565b5b614790826141f4565b9050602081019050919050565b60006147b06147ab8461476c565b6144ff565b9050828152602081018484840111156147cc576147cb61449a565b5b6147d784828561454b565b509392505050565b600082601f8301126147f4576147f3614495565b5b813561480484826020860161479d565b91505092915050565b60008060008060808587031215614827576148266140e0565b5b600061483587828801614336565b945050602061484687828801614336565b935050604061485787828801614281565b925050606085013567ffffffffffffffff811115614878576148776140e5565b5b614884878288016147df565b91505092959194509250565b600080604083850312156148a7576148a66140e0565b5b60006148b585828601614336565b92505060206148c685828601614336565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061491757607f821691505b6020821081141561492b5761492a6148d0565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061498d602c836141b0565b915061499882614931565b604082019050919050565b600060208201905081810360008301526149bc81614980565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1f6021836141b0565b9150614a2a826149c3565b604082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614ab16038836141b0565b9150614abc82614a55565b604082019050919050565b60006020820190508181036000830152614ae081614aa4565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b6000614b1d600f836141b0565b9150614b2882614ae7565b602082019050919050565b60006020820190508181036000830152614b4c81614b10565b9050919050565b7f312070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b6000614b89600d836141b0565b9150614b9482614b53565b602082019050919050565b60006020820190508181036000830152614bb881614b7c565b9050919050565b7f436865636b204554480000000000000000000000000000000000000000000000600082015250565b6000614bf56009836141b0565b9150614c0082614bbf565b602082019050919050565b60006020820190508181036000830152614c2481614be8565b9050919050565b7f4d61782070572072656163686564000000000000000000000000000000000000600082015250565b6000614c61600e836141b0565b9150614c6c82614c2b565b602082019050919050565b60006020820190508181036000830152614c9081614c54565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd182614260565b9150614cdc83614260565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d1157614d10614c97565b5b828201905092915050565b6000614d2782614260565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d5a57614d59614c97565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614dc16031836141b0565b9150614dcc82614d65565b604082019050919050565b60006020820190508181036000830152614df081614db4565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614e2d600e836141b0565b9150614e3882614df7565b602082019050919050565b60006020820190508181036000830152614e5c81614e20565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e996020836141b0565b9150614ea482614e63565b602082019050919050565b60006020820190508181036000830152614ec881614e8c565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614f2b602c836141b0565b9150614f3682614ecf565b604082019050919050565b60006020820190508181036000830152614f5a81614f1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614fec6029836141b0565b9150614ff782614f90565b604082019050919050565b6000602082019050818103600083015261501b81614fdf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061507e602a836141b0565b915061508982615022565b604082019050919050565b600060208201905081810360008301526150ad81615071565b9050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b60006150ea600a836141b0565b91506150f5826150b4565b602082019050919050565b60006020820190508181036000830152615119816150dd565b9050919050565b600081905092915050565b50565b600061513b600083615120565b91506151468261512b565b600082019050919050565b600061515c8261512e565b9150819050919050565b7f5769746864726177616c206661696c65642e0000000000000000000000000000600082015250565b600061519c6012836141b0565b91506151a782615166565b602082019050919050565b600060208201905081810360008301526151cb8161518f565b9050919050565b7f574c2073616c65206e6f74206163746976650000000000000000000000000000600082015250565b60006152086012836141b0565b9150615213826151d2565b602082019050919050565b60006020820190508181036000830152615237816151fb565b9050919050565b7f322070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b6000615274600d836141b0565b915061527f8261523e565b602082019050919050565b600060208201905081810360008301526152a381615267565b9050919050565b60008160601b9050919050565b60006152c2826152aa565b9050919050565b60006152d4826152b7565b9050919050565b6152ec6152e7826142e3565b6152c9565b82525050565b60006152fe82846152db565b60148201915081905092915050565b7f436865636b2070726f6f66000000000000000000000000000000000000000000600082015250565b6000615343600b836141b0565b915061534e8261530d565b602082019050919050565b6000602082019050818103600083015261537281615336565b9050919050565b7f4e6f7420656e6f75676820726573657276650000000000000000000000000000600082015250565b60006153af6012836141b0565b91506153ba82615379565b602082019050919050565b600060208201905081810360008301526153de816153a2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061541b6019836141b0565b9150615426826153e5565b602082019050919050565b6000602082019050818103600083015261544a8161540e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006154ad602f836141b0565b91506154b882615451565b604082019050919050565b600060208201905081810360008301526154dc816154a0565b9050919050565b600081905092915050565b60006154f9826141a5565b61550381856154e3565b93506155138185602086016141c1565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006155556005836154e3565b91506155608261551f565b600582019050919050565b600061557782856154ee565b915061558382846154ee565b915061558e82615548565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155f66026836141b0565b91506156018261559a565b604082019050919050565b60006020820190508181036000830152615625816155e9565b9050919050565b600061563782614260565b915061564283614260565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561567b5761567a614c97565b5b828202905092915050565b600061569182614260565b915061569c83614260565b9250828210156156af576156ae614c97565b5b828203905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615716602c836141b0565b9150615721826156ba565b604082019050919050565b6000602082019050818103600083015261574581615709565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006157a86029836141b0565b91506157b38261574c565b604082019050919050565b600060208201905081810360008301526157d78161579b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061583a6024836141b0565b9150615845826157de565b604082019050919050565b600060208201905081810360008301526158698161582d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158aa82614260565b91506158b583614260565b9250826158c5576158c4615870565b5b828204905092915050565b6000819050919050565b6158eb6158e682614408565b6158d0565b82525050565b60006158fd82856158da565b60208201915061590d82846158da565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006159796032836141b0565b91506159848261591d565b604082019050919050565b600060208201905081810360008301526159a88161596c565b9050919050565b60006159ba82614260565b91506159c583614260565b9250826159d5576159d4615870565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615a07826159e0565b615a1181856159eb565b9350615a218185602086016141c1565b615a2a816141f4565b840191505092915050565b6000608082019050615a4a60008301876142f5565b615a5760208301866142f5565b615a64604083018561438b565b8181036060830152615a7681846159fc565b905095945050505050565b600081519050615a9081614116565b92915050565b600060208284031215615aac57615aab6140e0565b5b6000615aba84828501615a81565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615af96020836141b0565b9150615b0482615ac3565b602082019050919050565b60006020820190508181036000830152615b2881615aec565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615b65601c836141b0565b9150615b7082615b2f565b602082019050919050565b60006020820190508181036000830152615b9481615b58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220e05ca7be724cb0343f08c1d0f8983b7ad9f791bda5a4e673347eb208bce826b264736f6c634300080a0033

Deployed Bytecode Sourcemap

53376:6587:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47172:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35064:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36631:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36154:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54185:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54138:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55555:863;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47820:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37521:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59642:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53521:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54537:140;;;;;;;;;;;;;:::i;:::-;;37931:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54011:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56458:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48010:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59793:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55196:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34584:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53552:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53743:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34314:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34888:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59165:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58853:304;;;;;;;;;;;;;:::i;:::-;;13979:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53890:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59285:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35233:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57720:1125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54685:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56622:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55312:112;;;;;;;;;;;;;:::i;:::-;;36924:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54091:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59507:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38187:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54057:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35408:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53928:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59395:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56758:957;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53859:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54301:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53968:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37290:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53802:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14885:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55430:114;;;;;;;;;;;;;:::i;:::-;;47172:224;47274:4;47313:35;47298:50;;;:11;:50;;;;:90;;;;47352:36;47376:11;47352:23;:36::i;:::-;47298:90;47291:97;;47172:224;;;:::o;35064:100::-;35118:13;35151:5;35144:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35064:100;:::o;36631:221::-;36707:7;36735:16;36743:7;36735;:16::i;:::-;36727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36820:15;:24;36836:7;36820:24;;;;;;;;;;;;;;;;;;;;;36813:31;;36631:221;;;:::o;36154:411::-;36235:13;36251:23;36266:7;36251:14;:23::i;:::-;36235:39;;36299:5;36293:11;;:2;:11;;;;36285:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36393:5;36377:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36402:37;36419:5;36426:12;:10;:12::i;:::-;36402:16;:37::i;:::-;36377:62;36355:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36536:21;36545:2;36549:7;36536:8;:21::i;:::-;36224:341;36154:411;;:::o;54185:38::-;;;;;;;;;;;;;:::o;54138:41::-;;;;;;;;;;;;;:::o;55555:863::-;55627:18;;;;;;;;;;;55619:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;55701:1;55684:14;:18;:48;;;;;55724:8;;55706:14;:26;;55684:48;55676:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;55782:35;55802:14;55782:15;;:19;;:35;;;;:::i;:::-;55769:9;:48;55761:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55907:14;;55850:53;55888:14;55850:21;:33;55872:10;55850:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;:71;;55842:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;55956:6;55952:459;55972:14;55968:1;:18;55952:459;;;54045:5;56012:13;:11;:13::i;:::-;:23;56008:392;;;56056:38;56066:10;56092:1;56078:13;:11;:13::i;:::-;:15;;;;:::i;:::-;56056:9;:38::i;:::-;56149:40;56187:1;56149:21;:33;56171:10;56149:33;;;;;;;;;;;;;;;;:37;;:40;;;;:::i;:::-;56113:21;:33;56135:10;56113:33;;;;;;;;;;;;;;;:76;;;;56008:392;;;56251:18;;;;;;;;;;;56250:19;56229:18;;:40;;;;;;;;;;;;;;;;;;56296:10;56288:28;;:72;56317:42;56343:15;;56317:21;56336:1;56317:14;:18;;:21;;;;:::i;:::-;:25;;:42;;;;:::i;:::-;56288:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56379:5;;56008:392;55988:3;;;;;:::i;:::-;;;;55952:459;;;;55555:863;:::o;47820:113::-;47881:7;47908:10;:17;;;;47901:24;;47820:113;:::o;37521:339::-;37716:41;37735:12;:10;:12::i;:::-;37749:7;37716:18;:41::i;:::-;37708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37824:28;37834:4;37840:2;37844:7;37824:9;:28::i;:::-;37521:339;;;:::o;59642:145::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59756:19:::1;59737:16;:38;;;;59642:145:::0;:::o;53521:25::-;;;;:::o;54537:140::-;14210:12;:10;:12::i;:::-;14199:23;;:7;:5;:7::i;:::-;:23;;;14191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54585:12:::1;54600:21;54585:36;;54640:10;54632:28;;:37;54661:7;54632:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54574:103;54537:140::o:0;37931:185::-;38069:39;38086:4;38092:2;38096:7;38069:39;;;;;;;;;;;;:16;:39::i;:::-;37931:185;;;:::o;54011:39::-;54045:5;54011:39;:::o;56458:120::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56555:13:::1;56542:10;:26;;;;56458:120:::0;:::o;48010:233::-;48085:7;48121:30;:28;:30::i;:::-;48113:5;:38;48105:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48218:10;48229:5;48218:17;;;;;;;;:::i;:::-;;;;;;;;;;48211:24;;48010:233;;;:::o;59793:165::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59918:20:::1;59898:17;:40;;;;59793:165:::0;:::o;55196:106::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55287:7:::1;55272:12;:22;;;;;;;;;;;;:::i;:::-;;55196:106:::0;:::o;34584:239::-;34656:7;34676:13;34692:7;:16;34700:7;34692:16;;;;;;;;;;;;;;;;;;;;;34676:32;;34744:1;34727:19;;:5;:19;;;;34719:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34810:5;34803:12;;;34584:239;;;:::o;53552:28::-;;;;:::o;53743:53::-;;;;:::o;34314:208::-;34386:7;34431:1;34414:19;;:5;:19;;;;34406:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34498:9;:16;34508:5;34498:16;;;;;;;;;;;;;;;;34491:23;;34314:208;;;:::o;34888:109::-;34946:7;34973;:16;34981:7;34973:16;;;;;;;;;;;;;;;;;;;;;34966:23;;34888:109;;;:::o;59165:112::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59259:10:::1;59238:18;:31;;;;59165:112:::0;:::o;58853:304::-;14210:12;:10;:12::i;:::-;14199:23;;:7;:5;:7::i;:::-;:23;;;14191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58938:1:::1;58914:21;:25;58906:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58965:15;58983:21;58965:39;;59016:19;59041:7;;;;;;;;;;;:12;;59061:25;59082:3;59061:16;59073:3;59061:7;:11;;:16;;;;:::i;:::-;:20;;:25;;;;:::i;:::-;59041:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59015:76;;;59112:14;59104:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;58895:262;;58853:304::o:0;13979:87::-;14025:7;14052:6;;;;;;;;;;;14045:13;;13979:87;:::o;53890:31::-;;;;:::o;59285:103::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59372:8:::1;59354:15;:26;;;;59285:103:::0;:::o;35233:104::-;35289:13;35322:7;35315:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35233:104;:::o;57720:1125::-;57832:13;57848:10;57832:26;;57871:21;;;;;;;;;;;57863:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;57951:1;57934:14;:18;:41;;;;;57974:1;57956:14;:19;;57934:41;57926:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58025:38;58048:14;58025:18;;:22;;:38;;;;:::i;:::-;58012:9;:51;58004:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58153:17;;58096:53;58134:14;58096:21;:33;58118:10;58096:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;:74;;58088:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;58245:85;58264:11;;58245:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58277:13;;58320:5;58303:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;58293:34;;;;;;58245:18;:85::i;:::-;58237:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;58357:6;58353:479;58373:14;58369:1;:18;58353:479;;;58430:19;;58413:13;:11;:13::i;:::-;:36;58409:418;;58470:38;58480:10;58506:1;58492:13;:11;:13::i;:::-;:15;;;;:::i;:::-;58470:9;:38::i;:::-;58563:40;58601:1;58563:21;:33;58585:10;58563:33;;;;;;;;;;;;;;;;:37;;:40;;;;:::i;:::-;58527:21;:33;58549:10;58527:33;;;;;;;;;;;;;;;:76;;;;58409:418;;;58672:21;;;;;;;;;;;58671:22;58647:21;;:46;;;;;;;;;;;;;;;;;;58720:10;58712:28;;:75;58741:45;58767:18;;58741:21;58760:1;58741:14;:18;;:21;;;;:::i;:::-;:25;;:45;;;;:::i;:::-;58712:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58806:5;;58409:418;58389:3;;;;;:::i;:::-;;;;58353:479;;;;57821:1024;57720:1125;;;:::o;54685:380::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54775:11:::1;54789:13;:11;:13::i;:::-;54775:27;;54838:1;54821:14;:18;:50;;;;;54861:10;;54843:14;:28;;54821:50;54813:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54910:6;54905:99;54926:14;54922:1;:18;54905:99;;;54962:30;54972:3;54990:1;54986;54977:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;54962:9;:30::i;:::-;54942:3;;;;;:::i;:::-;;;;54905:99;;;;55027:30;55042:14;55027:10;;:14;;:30;;;;:::i;:::-;55014:10;:43;;;;54764:301;54685:380:::0;;:::o;56622:126::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56725:13:::1;56709;:29;;;;56622:126:::0;:::o;55312:112::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55398:18:::1;;;;;;;;;;;55397:19;55376:18;;:40;;;;;;;;;;;;;;;;;;55312:112::o:0;36924:295::-;37039:12;:10;:12::i;:::-;37027:24;;:8;:24;;;;37019:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37139:8;37094:18;:32;37113:12;:10;:12::i;:::-;37094:32;;;;;;;;;;;;;;;:42;37127:8;37094:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37192:8;37163:48;;37178:12;:10;:12::i;:::-;37163:48;;;37202:8;37163:48;;;;;;:::i;:::-;;;;;;;;36924:295;;:::o;54091:36::-;;;;:::o;59507:129::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59611:17:::1;59594:14;:34;;;;59507:129:::0;:::o;38187:328::-;38362:41;38381:12;:10;:12::i;:::-;38395:7;38362:18;:41::i;:::-;38354:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38468:39;38482:4;38488:2;38492:7;38501:5;38468:13;:39::i;:::-;38187:328;;;;:::o;54057:28::-;;;;:::o;35408:342::-;35481:13;35515:16;35523:7;35515;:16::i;:::-;35507:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35596:21;35620:10;:8;:10::i;:::-;35596:34;;35672:1;35654:7;35648:21;:25;:94;;;;;;;;;;;;;;;;;35700:7;35709:18;:7;:16;:18::i;:::-;35683:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35648:94;35641:101;;;35408:342;;;:::o;53928:33::-;;;;:::o;59395:105::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59481:11:::1;59470:8;:22;;;;59395:105:::0;:::o;56758:957::-;56867:13;56883:10;56867:26;;56906:21;;;;;;;;;;;56898:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;56986:1;56969:14;:18;:41;;;;;57009:1;56991:14;:19;;56969:41;56961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57060:38;57083:14;57060:18;;:22;;:38;;;;:::i;:::-;57047:9;:51;57039:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57188:16;;57131:53;57169:14;57131:21;:33;57153:10;57131:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;:73;;57123:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57279:82;57298:11;;57279:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57311:10;;57351:5;57334:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;57324:34;;;;;;57279:18;:82::i;:::-;57271:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;57418:19;;57401:13;:11;:13::i;:::-;:36;57397:305;;57458:38;57468:10;57494:1;57480:13;:11;:13::i;:::-;:15;;;;:::i;:::-;57458:9;:38::i;:::-;57551:40;57589:1;57551:21;:33;57573:10;57551:33;;;;;;;;;;;;;;;;:37;;:40;;;;:::i;:::-;57515:21;:33;57537:10;57515:33;;;;;;;;;;;;;;;:76;;;;57397:305;;;57665:21;;;;;;;;;;;57664:22;57640:21;;:46;;;;;;;;;;;;;;;;;;57397:305;56856:859;56758:957;;;:::o;53859:25::-;;;;:::o;54301:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53968:34::-;;;;:::o;37290:164::-;37387:4;37411:18;:25;37430:5;37411:25;;;;;;;;;;;;;;;:35;37437:8;37411:35;;;;;;;;;;;;;;;;;;;;;;;;;37404:42;;37290:164;;;;:::o;53802:50::-;;;;:::o;14885:192::-;14210:12;:10;:12::i;:::-;14199:23;;:7;:5;:7::i;:::-;:23;;;14191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14994:1:::1;14974:22;;:8;:22;;;;14966:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15050:19;15060:8;15050:9;:19::i;:::-;14885:192:::0;:::o;55430:114::-;54452:7;:5;:7::i;:::-;54436:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54479:10;;;;;;;;;;;54463:26;;:12;:10;:12::i;:::-;:26;;;54436:53;54428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55515:21:::1;;;;;;;;;;;55514:22;55490:21;;:46;;;;;;;;;;;;;;;;;;55430:114::o:0;33957:293::-;34059:4;34107:25;34092:40;;;:11;:40;;;;:101;;;;34160:33;34145:48;;;:11;:48;;;;34092:101;:150;;;;34206:36;34230:11;34206:23;:36::i;:::-;34092:150;34076:166;;33957:293;;;:::o;40025:127::-;40090:4;40142:1;40114:30;;:7;:16;40122:7;40114:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40107:37;;40025:127;;;:::o;12767:98::-;12820:7;12847:10;12840:17;;12767:98;:::o;44047:174::-;44149:2;44122:15;:24;44138:7;44122:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44205:7;44201:2;44167:46;;44176:23;44191:7;44176:14;:23::i;:::-;44167:46;;;;;;;;;;;;44047:174;;:::o;6645:98::-;6703:7;6734:1;6730;:5;;;;:::i;:::-;6723:12;;6645:98;;;;:::o;5907:::-;5965:7;5996:1;5992;:5;;;;:::i;:::-;5985:12;;5907:98;;;;:::o;41031:110::-;41107:26;41117:2;41121:7;41107:26;;;;;;;;;;;;:9;:26::i;:::-;41031:110;;:::o;6288:98::-;6346:7;6377:1;6373;:5;;;;:::i;:::-;6366:12;;6288:98;;;;:::o;40319:348::-;40412:4;40437:16;40445:7;40437;:16::i;:::-;40429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40513:13;40529:23;40544:7;40529:14;:23::i;:::-;40513:39;;40582:5;40571:16;;:7;:16;;;:51;;;;40615:7;40591:31;;:20;40603:7;40591:11;:20::i;:::-;:31;;;40571:51;:87;;;;40626:32;40643:5;40650:7;40626:16;:32::i;:::-;40571:87;40563:96;;;40319:348;;;;:::o;43351:578::-;43510:4;43483:31;;:23;43498:7;43483:14;:23::i;:::-;:31;;;43475:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43593:1;43579:16;;:2;:16;;;;43571:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43649:39;43670:4;43676:2;43680:7;43649:20;:39::i;:::-;43753:29;43770:1;43774:7;43753:8;:29::i;:::-;43814:1;43795:9;:15;43805:4;43795:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43843:1;43826:9;:13;43836:2;43826:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43874:2;43855:7;:16;43863:7;43855:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43913:7;43909:2;43894:27;;43903:4;43894:27;;;;;;;;;;;;43351:578;;;:::o;7044:98::-;7102:7;7133:1;7129;:5;;;;:::i;:::-;7122:12;;7044:98;;;;:::o;868:830::-;993:4;1010:20;1033:4;1010:27;;1055:9;1050:525;1074:5;:12;1070:1;:16;1050:525;;;1108:20;1131:5;1137:1;1131:8;;;;;;;;:::i;:::-;;;;;;;;1108:31;;1176:12;1160;:28;1156:408;;1330:12;1344;1313:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1303:55;;;;;;1288:70;;1156:408;;;1520:12;1534;1503:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1493:55;;;;;;1478:70;;1156:408;1093:482;1088:3;;;;;:::i;:::-;;;;1050:525;;;;1686:4;1670:12;:20;1663:27;;;868:830;;;;;:::o;39397:315::-;39554:28;39564:4;39570:2;39574:7;39554:9;:28::i;:::-;39601:48;39624:4;39630:2;39634:7;39643:5;39601:22;:48::i;:::-;39593:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39397:315;;;;:::o;55075:113::-;55135:13;55168:12;55161:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55075:113;:::o;10383:723::-;10439:13;10669:1;10660:5;:10;10656:53;;;10687:10;;;;;;;;;;;;;;;;;;;;;10656:53;10719:12;10734:5;10719:20;;10750:14;10775:78;10790:1;10782:4;:9;10775:78;;10808:8;;;;;:::i;:::-;;;;10839:2;10831:10;;;;;:::i;:::-;;;10775:78;;;10863:19;10895:6;10885:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10863:39;;10913:154;10929:1;10920:5;:10;10913:154;;10957:1;10947:11;;;;;:::i;:::-;;;11024:2;11016:5;:10;;;;:::i;:::-;11003:2;:24;;;;:::i;:::-;10990:39;;10973:6;10980;10973:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11053:2;11044:11;;;;;:::i;:::-;;;10913:154;;;11091:6;11077:21;;;;;10383:723;;;;:::o;15085:173::-;15141:16;15160:6;;;;;;;;;;;15141:25;;15186:8;15177:6;;:17;;;;;;;;;;;;;;;;;;15241:8;15210:40;;15231:8;15210:40;;;;;;;;;;;;15130:128;15085:173;:::o;25971:157::-;26056:4;26095:25;26080:40;;;:11;:40;;;;26073:47;;25971:157;;;:::o;41368:321::-;41498:18;41504:2;41508:7;41498:5;:18::i;:::-;41549:54;41580:1;41584:2;41588:7;41597:5;41549:22;:54::i;:::-;41527:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41368:321;;;:::o;48856:589::-;49000:45;49027:4;49033:2;49037:7;49000:26;:45::i;:::-;49078:1;49062:18;;:4;:18;;;49058:187;;;49097:40;49129:7;49097:31;:40::i;:::-;49058:187;;;49167:2;49159:10;;:4;:10;;;49155:90;;49186:47;49219:4;49225:7;49186:32;:47::i;:::-;49155:90;49058:187;49273:1;49259:16;;:2;:16;;;49255:183;;;49292:45;49329:7;49292:36;:45::i;:::-;49255:183;;;49365:4;49359:10;;:2;:10;;;49355:83;;49386:40;49414:2;49418:7;49386:27;:40::i;:::-;49355:83;49255:183;48856:589;;;:::o;44786:803::-;44941:4;44962:15;:2;:13;;;:15::i;:::-;44958:624;;;45014:2;44998:36;;;45035:12;:10;:12::i;:::-;45049:4;45055:7;45064:5;44998:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44994:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45261:1;45244:6;:13;:18;45240:272;;;45287:60;;;;;;;;;;:::i;:::-;;;;;;;;45240:272;45462:6;45456:13;45447:6;45443:2;45439:15;45432:38;44994:533;45131:45;;;45121:55;;;:6;:55;;;;45114:62;;;;;44958:624;45566:4;45559:11;;44786:803;;;;;;;:::o;42025:382::-;42119:1;42105:16;;:2;:16;;;;42097:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42178:16;42186:7;42178;:16::i;:::-;42177:17;42169:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42240:45;42269:1;42273:2;42277:7;42240:20;:45::i;:::-;42315:1;42298:9;:13;42308:2;42298:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42346:2;42327:7;:16;42335:7;42327:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42391:7;42387:2;42366:33;;42383:1;42366:33;;;;;;;;;;;;42025:382;;:::o;46161:126::-;;;;:::o;50168:164::-;50272:10;:17;;;;50245:15;:24;50261:7;50245:24;;;;;;;;;;;:44;;;;50300:10;50316:7;50300:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50168:164;:::o;50959:988::-;51225:22;51275:1;51250:22;51267:4;51250:16;:22::i;:::-;:26;;;;:::i;:::-;51225:51;;51287:18;51308:17;:26;51326:7;51308:26;;;;;;;;;;;;51287:47;;51455:14;51441:10;:28;51437:328;;51486:19;51508:12;:18;51521:4;51508:18;;;;;;;;;;;;;;;:34;51527:14;51508:34;;;;;;;;;;;;51486:56;;51592:11;51559:12;:18;51572:4;51559:18;;;;;;;;;;;;;;;:30;51578:10;51559:30;;;;;;;;;;;:44;;;;51709:10;51676:17;:30;51694:11;51676:30;;;;;;;;;;;:43;;;;51471:294;51437:328;51861:17;:26;51879:7;51861:26;;;;;;;;;;;51854:33;;;51905:12;:18;51918:4;51905:18;;;;;;;;;;;;;;;:34;51924:14;51905:34;;;;;;;;;;;51898:41;;;51040:907;;50959:988;;:::o;52242:1079::-;52495:22;52540:1;52520:10;:17;;;;:21;;;;:::i;:::-;52495:46;;52552:18;52573:15;:24;52589:7;52573:24;;;;;;;;;;;;52552:45;;52924:19;52946:10;52957:14;52946:26;;;;;;;;:::i;:::-;;;;;;;;;;52924:48;;53010:11;52985:10;52996;52985:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53121:10;53090:15;:28;53106:11;53090:28;;;;;;;;;;;:41;;;;53262:15;:24;53278:7;53262:24;;;;;;;;;;;53255:31;;;53297:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52313:1008;;;52242:1079;:::o;49746:221::-;49831:14;49848:20;49865:2;49848:16;:20::i;:::-;49831:37;;49906:7;49879:12;:16;49892:2;49879:16;;;;;;;;;;;;;;;:24;49896:6;49879:24;;;;;;;;;;;:34;;;;49953:6;49924:17;:26;49942:7;49924:26;;;;;;;;;;;:35;;;;49820:147;49746:221;;:::o;16031:387::-;16091:4;16299:12;16366:7;16354:20;16346:28;;16409:1;16402:4;:8;16395:15;;;16031:387;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:122::-;6423:24;6441:5;6423:24;:::i;:::-;6416:5;6413:35;6403:63;;6462:1;6459;6452:12;6403:63;6350:122;:::o;6478:139::-;6524:5;6562:6;6549:20;6540:29;;6578:33;6605:5;6578:33;:::i;:::-;6478:139;;;;:::o;6623:329::-;6682:6;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6623:329;;;;:::o;6958:117::-;7067:1;7064;7057:12;7081:117;7190:1;7187;7180:12;7204:180;7252:77;7249:1;7242:88;7349:4;7346:1;7339:15;7373:4;7370:1;7363:15;7390:281;7473:27;7495:4;7473:27;:::i;:::-;7465:6;7461:40;7603:6;7591:10;7588:22;7567:18;7555:10;7552:34;7549:62;7546:88;;;7614:18;;:::i;:::-;7546:88;7654:10;7650:2;7643:22;7433:238;7390:281;;:::o;7677:129::-;7711:6;7738:20;;:::i;:::-;7728:30;;7767:33;7795:4;7787:6;7767:33;:::i;:::-;7677:129;;;:::o;7812:308::-;7874:4;7964:18;7956:6;7953:30;7950:56;;;7986:18;;:::i;:::-;7950:56;8024:29;8046:6;8024:29;:::i;:::-;8016:37;;8108:4;8102;8098:15;8090:23;;7812:308;;;:::o;8126:154::-;8210:6;8205:3;8200;8187:30;8272:1;8263:6;8258:3;8254:16;8247:27;8126:154;;;:::o;8286:412::-;8364:5;8389:66;8405:49;8447:6;8405:49;:::i;:::-;8389:66;:::i;:::-;8380:75;;8478:6;8471:5;8464:21;8516:4;8509:5;8505:16;8554:3;8545:6;8540:3;8536:16;8533:25;8530:112;;;8561:79;;:::i;:::-;8530:112;8651:41;8685:6;8680:3;8675;8651:41;:::i;:::-;8370:328;8286:412;;;;;:::o;8718:340::-;8774:5;8823:3;8816:4;8808:6;8804:17;8800:27;8790:122;;8831:79;;:::i;:::-;8790:122;8948:6;8935:20;8973:79;9048:3;9040:6;9033:4;9025:6;9021:17;8973:79;:::i;:::-;8964:88;;8780:278;8718:340;;;;:::o;9064:509::-;9133:6;9182:2;9170:9;9161:7;9157:23;9153:32;9150:119;;;9188:79;;:::i;:::-;9150:119;9336:1;9325:9;9321:17;9308:31;9366:18;9358:6;9355:30;9352:117;;;9388:79;;:::i;:::-;9352:117;9493:63;9548:7;9539:6;9528:9;9524:22;9493:63;:::i;:::-;9483:73;;9279:287;9064:509;;;;:::o;9579:329::-;9638:6;9687:2;9675:9;9666:7;9662:23;9658:32;9655:119;;;9693:79;;:::i;:::-;9655:119;9813:1;9838:53;9883:7;9874:6;9863:9;9859:22;9838:53;:::i;:::-;9828:63;;9784:117;9579:329;;;;:::o;9914:117::-;10023:1;10020;10013:12;10037:117;10146:1;10143;10136:12;10177:568;10250:8;10260:6;10310:3;10303:4;10295:6;10291:17;10287:27;10277:122;;10318:79;;:::i;:::-;10277:122;10431:6;10418:20;10408:30;;10461:18;10453:6;10450:30;10447:117;;;10483:79;;:::i;:::-;10447:117;10597:4;10589:6;10585:17;10573:29;;10651:3;10643:4;10635:6;10631:17;10621:8;10617:32;10614:41;10611:128;;;10658:79;;:::i;:::-;10611:128;10177:568;;;;;:::o;10751:704::-;10846:6;10854;10862;10911:2;10899:9;10890:7;10886:23;10882:32;10879:119;;;10917:79;;:::i;:::-;10879:119;11037:1;11062:53;11107:7;11098:6;11087:9;11083:22;11062:53;:::i;:::-;11052:63;;11008:117;11192:2;11181:9;11177:18;11164:32;11223:18;11215:6;11212:30;11209:117;;;11245:79;;:::i;:::-;11209:117;11358:80;11430:7;11421:6;11410:9;11406:22;11358:80;:::i;:::-;11340:98;;;;11135:313;10751:704;;;;;:::o;11461:116::-;11531:21;11546:5;11531:21;:::i;:::-;11524:5;11521:32;11511:60;;11567:1;11564;11557:12;11511:60;11461:116;:::o;11583:133::-;11626:5;11664:6;11651:20;11642:29;;11680:30;11704:5;11680:30;:::i;:::-;11583:133;;;;:::o;11722:468::-;11787:6;11795;11844:2;11832:9;11823:7;11819:23;11815:32;11812:119;;;11850:79;;:::i;:::-;11812:119;11970:1;11995:53;12040:7;12031:6;12020:9;12016:22;11995:53;:::i;:::-;11985:63;;11941:117;12097:2;12123:50;12165:7;12156:6;12145:9;12141:22;12123:50;:::i;:::-;12113:60;;12068:115;11722:468;;;;;:::o;12196:307::-;12257:4;12347:18;12339:6;12336:30;12333:56;;;12369:18;;:::i;:::-;12333:56;12407:29;12429:6;12407:29;:::i;:::-;12399:37;;12491:4;12485;12481:15;12473:23;;12196:307;;;:::o;12509:410::-;12586:5;12611:65;12627:48;12668:6;12627:48;:::i;:::-;12611:65;:::i;:::-;12602:74;;12699:6;12692:5;12685:21;12737:4;12730:5;12726:16;12775:3;12766:6;12761:3;12757:16;12754:25;12751:112;;;12782:79;;:::i;:::-;12751:112;12872:41;12906:6;12901:3;12896;12872:41;:::i;:::-;12592:327;12509:410;;;;;:::o;12938:338::-;12993:5;13042:3;13035:4;13027:6;13023:17;13019:27;13009:122;;13050:79;;:::i;:::-;13009:122;13167:6;13154:20;13192:78;13266:3;13258:6;13251:4;13243:6;13239:17;13192:78;:::i;:::-;13183:87;;12999:277;12938:338;;;;:::o;13282:943::-;13377:6;13385;13393;13401;13450:3;13438:9;13429:7;13425:23;13421:33;13418:120;;;13457:79;;:::i;:::-;13418:120;13577:1;13602:53;13647:7;13638:6;13627:9;13623:22;13602:53;:::i;:::-;13592:63;;13548:117;13704:2;13730:53;13775:7;13766:6;13755:9;13751:22;13730:53;:::i;:::-;13720:63;;13675:118;13832:2;13858:53;13903:7;13894:6;13883:9;13879:22;13858:53;:::i;:::-;13848:63;;13803:118;13988:2;13977:9;13973:18;13960:32;14019:18;14011:6;14008:30;14005:117;;;14041:79;;:::i;:::-;14005:117;14146:62;14200:7;14191:6;14180:9;14176:22;14146:62;:::i;:::-;14136:72;;13931:287;13282:943;;;;;;;:::o;14231:474::-;14299:6;14307;14356:2;14344:9;14335:7;14331:23;14327:32;14324:119;;;14362:79;;:::i;:::-;14324:119;14482:1;14507:53;14552:7;14543:6;14532:9;14528:22;14507:53;:::i;:::-;14497:63;;14453:117;14609:2;14635:53;14680:7;14671:6;14660:9;14656:22;14635:53;:::i;:::-;14625:63;;14580:118;14231:474;;;;;:::o;14711:180::-;14759:77;14756:1;14749:88;14856:4;14853:1;14846:15;14880:4;14877:1;14870:15;14897:320;14941:6;14978:1;14972:4;14968:12;14958:22;;15025:1;15019:4;15015:12;15046:18;15036:81;;15102:4;15094:6;15090:17;15080:27;;15036:81;15164:2;15156:6;15153:14;15133:18;15130:38;15127:84;;;15183:18;;:::i;:::-;15127:84;14948:269;14897:320;;;:::o;15223:231::-;15363:34;15359:1;15351:6;15347:14;15340:58;15432:14;15427:2;15419:6;15415:15;15408:39;15223:231;:::o;15460:366::-;15602:3;15623:67;15687:2;15682:3;15623:67;:::i;:::-;15616:74;;15699:93;15788:3;15699:93;:::i;:::-;15817:2;15812:3;15808:12;15801:19;;15460:366;;;:::o;15832:419::-;15998:4;16036:2;16025:9;16021:18;16013:26;;16085:9;16079:4;16075:20;16071:1;16060:9;16056:17;16049:47;16113:131;16239:4;16113:131;:::i;:::-;16105:139;;15832:419;;;:::o;16257:220::-;16397:34;16393:1;16385:6;16381:14;16374:58;16466:3;16461:2;16453:6;16449:15;16442:28;16257:220;:::o;16483:366::-;16625:3;16646:67;16710:2;16705:3;16646:67;:::i;:::-;16639:74;;16722:93;16811:3;16722:93;:::i;:::-;16840:2;16835:3;16831:12;16824:19;;16483:366;;;:::o;16855:419::-;17021:4;17059:2;17048:9;17044:18;17036:26;;17108:9;17102:4;17098:20;17094:1;17083:9;17079:17;17072:47;17136:131;17262:4;17136:131;:::i;:::-;17128:139;;16855:419;;;:::o;17280:243::-;17420:34;17416:1;17408:6;17404:14;17397:58;17489:26;17484:2;17476:6;17472:15;17465:51;17280:243;:::o;17529:366::-;17671:3;17692:67;17756:2;17751:3;17692:67;:::i;:::-;17685:74;;17768:93;17857:3;17768:93;:::i;:::-;17886:2;17881:3;17877:12;17870:19;;17529:366;;;:::o;17901:419::-;18067:4;18105:2;18094:9;18090:18;18082:26;;18154:9;18148:4;18144:20;18140:1;18129:9;18125:17;18118:47;18182:131;18308:4;18182:131;:::i;:::-;18174:139;;17901:419;;;:::o;18326:165::-;18466:17;18462:1;18454:6;18450:14;18443:41;18326:165;:::o;18497:366::-;18639:3;18660:67;18724:2;18719:3;18660:67;:::i;:::-;18653:74;;18736:93;18825:3;18736:93;:::i;:::-;18854:2;18849:3;18845:12;18838:19;;18497:366;;;:::o;18869:419::-;19035:4;19073:2;19062:9;19058:18;19050:26;;19122:9;19116:4;19112:20;19108:1;19097:9;19093:17;19086:47;19150:131;19276:4;19150:131;:::i;:::-;19142:139;;18869:419;;;:::o;19294:163::-;19434:15;19430:1;19422:6;19418:14;19411:39;19294:163;:::o;19463:366::-;19605:3;19626:67;19690:2;19685:3;19626:67;:::i;:::-;19619:74;;19702:93;19791:3;19702:93;:::i;:::-;19820:2;19815:3;19811:12;19804:19;;19463:366;;;:::o;19835:419::-;20001:4;20039:2;20028:9;20024:18;20016:26;;20088:9;20082:4;20078:20;20074:1;20063:9;20059:17;20052:47;20116:131;20242:4;20116:131;:::i;:::-;20108:139;;19835:419;;;:::o;20260:159::-;20400:11;20396:1;20388:6;20384:14;20377:35;20260:159;:::o;20425:365::-;20567:3;20588:66;20652:1;20647:3;20588:66;:::i;:::-;20581:73;;20663:93;20752:3;20663:93;:::i;:::-;20781:2;20776:3;20772:12;20765:19;;20425:365;;;:::o;20796:419::-;20962:4;21000:2;20989:9;20985:18;20977:26;;21049:9;21043:4;21039:20;21035:1;21024:9;21020:17;21013:47;21077:131;21203:4;21077:131;:::i;:::-;21069:139;;20796:419;;;:::o;21221:164::-;21361:16;21357:1;21349:6;21345:14;21338:40;21221:164;:::o;21391:366::-;21533:3;21554:67;21618:2;21613:3;21554:67;:::i;:::-;21547:74;;21630:93;21719:3;21630:93;:::i;:::-;21748:2;21743:3;21739:12;21732:19;;21391:366;;;:::o;21763:419::-;21929:4;21967:2;21956:9;21952:18;21944:26;;22016:9;22010:4;22006:20;22002:1;21991:9;21987:17;21980:47;22044:131;22170:4;22044:131;:::i;:::-;22036:139;;21763:419;;;:::o;22188:180::-;22236:77;22233:1;22226:88;22333:4;22330:1;22323:15;22357:4;22354:1;22347:15;22374:305;22414:3;22433:20;22451:1;22433:20;:::i;:::-;22428:25;;22467:20;22485:1;22467:20;:::i;:::-;22462:25;;22621:1;22553:66;22549:74;22546:1;22543:81;22540:107;;;22627:18;;:::i;:::-;22540:107;22671:1;22668;22664:9;22657:16;;22374:305;;;;:::o;22685:233::-;22724:3;22747:24;22765:5;22747:24;:::i;:::-;22738:33;;22793:66;22786:5;22783:77;22780:103;;;22863:18;;:::i;:::-;22780:103;22910:1;22903:5;22899:13;22892:20;;22685:233;;;:::o;22924:236::-;23064:34;23060:1;23052:6;23048:14;23041:58;23133:19;23128:2;23120:6;23116:15;23109:44;22924:236;:::o;23166:366::-;23308:3;23329:67;23393:2;23388:3;23329:67;:::i;:::-;23322:74;;23405:93;23494:3;23405:93;:::i;:::-;23523:2;23518:3;23514:12;23507:19;;23166:366;;;:::o;23538:419::-;23704:4;23742:2;23731:9;23727:18;23719:26;;23791:9;23785:4;23781:20;23777:1;23766:9;23762:17;23755:47;23819:131;23945:4;23819:131;:::i;:::-;23811:139;;23538:419;;;:::o;23963:164::-;24103:16;24099:1;24091:6;24087:14;24080:40;23963:164;:::o;24133:366::-;24275:3;24296:67;24360:2;24355:3;24296:67;:::i;:::-;24289:74;;24372:93;24461:3;24372:93;:::i;:::-;24490:2;24485:3;24481:12;24474:19;;24133:366;;;:::o;24505:419::-;24671:4;24709:2;24698:9;24694:18;24686:26;;24758:9;24752:4;24748:20;24744:1;24733:9;24729:17;24722:47;24786:131;24912:4;24786:131;:::i;:::-;24778:139;;24505:419;;;:::o;24930:182::-;25070:34;25066:1;25058:6;25054:14;25047:58;24930:182;:::o;25118:366::-;25260:3;25281:67;25345:2;25340:3;25281:67;:::i;:::-;25274:74;;25357:93;25446:3;25357:93;:::i;:::-;25475:2;25470:3;25466:12;25459:19;;25118:366;;;:::o;25490:419::-;25656:4;25694:2;25683:9;25679:18;25671:26;;25743:9;25737:4;25733:20;25729:1;25718:9;25714:17;25707:47;25771:131;25897:4;25771:131;:::i;:::-;25763:139;;25490:419;;;:::o;25915:231::-;26055:34;26051:1;26043:6;26039:14;26032:58;26124:14;26119:2;26111:6;26107:15;26100:39;25915:231;:::o;26152:366::-;26294:3;26315:67;26379:2;26374:3;26315:67;:::i;:::-;26308:74;;26391:93;26480:3;26391:93;:::i;:::-;26509:2;26504:3;26500:12;26493:19;;26152:366;;;:::o;26524:419::-;26690:4;26728:2;26717:9;26713:18;26705:26;;26777:9;26771:4;26767:20;26763:1;26752:9;26748:17;26741:47;26805:131;26931:4;26805:131;:::i;:::-;26797:139;;26524:419;;;:::o;26949:180::-;26997:77;26994:1;26987:88;27094:4;27091:1;27084:15;27118:4;27115:1;27108:15;27135:228;27275:34;27271:1;27263:6;27259:14;27252:58;27344:11;27339:2;27331:6;27327:15;27320:36;27135:228;:::o;27369:366::-;27511:3;27532:67;27596:2;27591:3;27532:67;:::i;:::-;27525:74;;27608:93;27697:3;27608:93;:::i;:::-;27726:2;27721:3;27717:12;27710:19;;27369:366;;;:::o;27741:419::-;27907:4;27945:2;27934:9;27930:18;27922:26;;27994:9;27988:4;27984:20;27980:1;27969:9;27965:17;27958:47;28022:131;28148:4;28022:131;:::i;:::-;28014:139;;27741:419;;;:::o;28166:229::-;28306:34;28302:1;28294:6;28290:14;28283:58;28375:12;28370:2;28362:6;28358:15;28351:37;28166:229;:::o;28401:366::-;28543:3;28564:67;28628:2;28623:3;28564:67;:::i;:::-;28557:74;;28640:93;28729:3;28640:93;:::i;:::-;28758:2;28753:3;28749:12;28742:19;;28401:366;;;:::o;28773:419::-;28939:4;28977:2;28966:9;28962:18;28954:26;;29026:9;29020:4;29016:20;29012:1;29001:9;28997:17;28990:47;29054:131;29180:4;29054:131;:::i;:::-;29046:139;;28773:419;;;:::o;29198:160::-;29338:12;29334:1;29326:6;29322:14;29315:36;29198:160;:::o;29364:366::-;29506:3;29527:67;29591:2;29586:3;29527:67;:::i;:::-;29520:74;;29603:93;29692:3;29603:93;:::i;:::-;29721:2;29716:3;29712:12;29705:19;;29364:366;;;:::o;29736:419::-;29902:4;29940:2;29929:9;29925:18;29917:26;;29989:9;29983:4;29979:20;29975:1;29964:9;29960:17;29953:47;30017:131;30143:4;30017:131;:::i;:::-;30009:139;;29736:419;;;:::o;30161:147::-;30262:11;30299:3;30284:18;;30161:147;;;;:::o;30314:114::-;;:::o;30434:398::-;30593:3;30614:83;30695:1;30690:3;30614:83;:::i;:::-;30607:90;;30706:93;30795:3;30706:93;:::i;:::-;30824:1;30819:3;30815:11;30808:18;;30434:398;;;:::o;30838:379::-;31022:3;31044:147;31187:3;31044:147;:::i;:::-;31037:154;;31208:3;31201:10;;30838:379;;;:::o;31223:168::-;31363:20;31359:1;31351:6;31347:14;31340:44;31223:168;:::o;31397:366::-;31539:3;31560:67;31624:2;31619:3;31560:67;:::i;:::-;31553:74;;31636:93;31725:3;31636:93;:::i;:::-;31754:2;31749:3;31745:12;31738:19;;31397:366;;;:::o;31769:419::-;31935:4;31973:2;31962:9;31958:18;31950:26;;32022:9;32016:4;32012:20;32008:1;31997:9;31993:17;31986:47;32050:131;32176:4;32050:131;:::i;:::-;32042:139;;31769:419;;;:::o;32194:168::-;32334:20;32330:1;32322:6;32318:14;32311:44;32194:168;:::o;32368:366::-;32510:3;32531:67;32595:2;32590:3;32531:67;:::i;:::-;32524:74;;32607:93;32696:3;32607:93;:::i;:::-;32725:2;32720:3;32716:12;32709:19;;32368:366;;;:::o;32740:419::-;32906:4;32944:2;32933:9;32929:18;32921:26;;32993:9;32987:4;32983:20;32979:1;32968:9;32964:17;32957:47;33021:131;33147:4;33021:131;:::i;:::-;33013:139;;32740:419;;;:::o;33165:163::-;33305:15;33301:1;33293:6;33289:14;33282:39;33165:163;:::o;33334:366::-;33476:3;33497:67;33561:2;33556:3;33497:67;:::i;:::-;33490:74;;33573:93;33662:3;33573:93;:::i;:::-;33691:2;33686:3;33682:12;33675:19;;33334:366;;;:::o;33706:419::-;33872:4;33910:2;33899:9;33895:18;33887:26;;33959:9;33953:4;33949:20;33945:1;33934:9;33930:17;33923:47;33987:131;34113:4;33987:131;:::i;:::-;33979:139;;33706:419;;;:::o;34131:94::-;34164:8;34212:5;34208:2;34204:14;34183:35;;34131:94;;;:::o;34231:::-;34270:7;34299:20;34313:5;34299:20;:::i;:::-;34288:31;;34231:94;;;:::o;34331:100::-;34370:7;34399:26;34419:5;34399:26;:::i;:::-;34388:37;;34331:100;;;:::o;34437:157::-;34542:45;34562:24;34580:5;34562:24;:::i;:::-;34542:45;:::i;:::-;34537:3;34530:58;34437:157;;:::o;34600:256::-;34712:3;34727:75;34798:3;34789:6;34727:75;:::i;:::-;34827:2;34822:3;34818:12;34811:19;;34847:3;34840:10;;34600:256;;;;:::o;34862:161::-;35002:13;34998:1;34990:6;34986:14;34979:37;34862:161;:::o;35029:366::-;35171:3;35192:67;35256:2;35251:3;35192:67;:::i;:::-;35185:74;;35268:93;35357:3;35268:93;:::i;:::-;35386:2;35381:3;35377:12;35370:19;;35029:366;;;:::o;35401:419::-;35567:4;35605:2;35594:9;35590:18;35582:26;;35654:9;35648:4;35644:20;35640:1;35629:9;35625:17;35618:47;35682:131;35808:4;35682:131;:::i;:::-;35674:139;;35401:419;;;:::o;35826:168::-;35966:20;35962:1;35954:6;35950:14;35943:44;35826:168;:::o;36000:366::-;36142:3;36163:67;36227:2;36222:3;36163:67;:::i;:::-;36156:74;;36239:93;36328:3;36239:93;:::i;:::-;36357:2;36352:3;36348:12;36341:19;;36000:366;;;:::o;36372:419::-;36538:4;36576:2;36565:9;36561:18;36553:26;;36625:9;36619:4;36615:20;36611:1;36600:9;36596:17;36589:47;36653:131;36779:4;36653:131;:::i;:::-;36645:139;;36372:419;;;:::o;36797:175::-;36937:27;36933:1;36925:6;36921:14;36914:51;36797:175;:::o;36978:366::-;37120:3;37141:67;37205:2;37200:3;37141:67;:::i;:::-;37134:74;;37217:93;37306:3;37217:93;:::i;:::-;37335:2;37330:3;37326:12;37319:19;;36978:366;;;:::o;37350:419::-;37516:4;37554:2;37543:9;37539:18;37531:26;;37603:9;37597:4;37593:20;37589:1;37578:9;37574:17;37567:47;37631:131;37757:4;37631:131;:::i;:::-;37623:139;;37350:419;;;:::o;37775:234::-;37915:34;37911:1;37903:6;37899:14;37892:58;37984:17;37979:2;37971:6;37967:15;37960:42;37775:234;:::o;38015:366::-;38157:3;38178:67;38242:2;38237:3;38178:67;:::i;:::-;38171:74;;38254:93;38343:3;38254:93;:::i;:::-;38372:2;38367:3;38363:12;38356:19;;38015:366;;;:::o;38387:419::-;38553:4;38591:2;38580:9;38576:18;38568:26;;38640:9;38634:4;38630:20;38626:1;38615:9;38611:17;38604:47;38668:131;38794:4;38668:131;:::i;:::-;38660:139;;38387:419;;;:::o;38812:148::-;38914:11;38951:3;38936:18;;38812:148;;;;:::o;38966:377::-;39072:3;39100:39;39133:5;39100:39;:::i;:::-;39155:89;39237:6;39232:3;39155:89;:::i;:::-;39148:96;;39253:52;39298:6;39293:3;39286:4;39279:5;39275:16;39253:52;:::i;:::-;39330:6;39325:3;39321:16;39314:23;;39076:267;38966:377;;;;:::o;39349:155::-;39489:7;39485:1;39477:6;39473:14;39466:31;39349:155;:::o;39510:400::-;39670:3;39691:84;39773:1;39768:3;39691:84;:::i;:::-;39684:91;;39784:93;39873:3;39784:93;:::i;:::-;39902:1;39897:3;39893:11;39886:18;;39510:400;;;:::o;39916:701::-;40197:3;40219:95;40310:3;40301:6;40219:95;:::i;:::-;40212:102;;40331:95;40422:3;40413:6;40331:95;:::i;:::-;40324:102;;40443:148;40587:3;40443:148;:::i;:::-;40436:155;;40608:3;40601:10;;39916:701;;;;;:::o;40623:225::-;40763:34;40759:1;40751:6;40747:14;40740:58;40832:8;40827:2;40819:6;40815:15;40808:33;40623:225;:::o;40854:366::-;40996:3;41017:67;41081:2;41076:3;41017:67;:::i;:::-;41010:74;;41093:93;41182:3;41093:93;:::i;:::-;41211:2;41206:3;41202:12;41195:19;;40854:366;;;:::o;41226:419::-;41392:4;41430:2;41419:9;41415:18;41407:26;;41479:9;41473:4;41469:20;41465:1;41454:9;41450:17;41443:47;41507:131;41633:4;41507:131;:::i;:::-;41499:139;;41226:419;;;:::o;41651:348::-;41691:7;41714:20;41732:1;41714:20;:::i;:::-;41709:25;;41748:20;41766:1;41748:20;:::i;:::-;41743:25;;41936:1;41868:66;41864:74;41861:1;41858:81;41853:1;41846:9;41839:17;41835:105;41832:131;;;41943:18;;:::i;:::-;41832:131;41991:1;41988;41984:9;41973:20;;41651:348;;;;:::o;42005:191::-;42045:4;42065:20;42083:1;42065:20;:::i;:::-;42060:25;;42099:20;42117:1;42099:20;:::i;:::-;42094:25;;42138:1;42135;42132:8;42129:34;;;42143:18;;:::i;:::-;42129:34;42188:1;42185;42181:9;42173:17;;42005:191;;;;:::o;42202:231::-;42342:34;42338:1;42330:6;42326:14;42319:58;42411:14;42406:2;42398:6;42394:15;42387:39;42202:231;:::o;42439:366::-;42581:3;42602:67;42666:2;42661:3;42602:67;:::i;:::-;42595:74;;42678:93;42767:3;42678:93;:::i;:::-;42796:2;42791:3;42787:12;42780:19;;42439:366;;;:::o;42811:419::-;42977:4;43015:2;43004:9;43000:18;42992:26;;43064:9;43058:4;43054:20;43050:1;43039:9;43035:17;43028:47;43092:131;43218:4;43092:131;:::i;:::-;43084:139;;42811:419;;;:::o;43236:228::-;43376:34;43372:1;43364:6;43360:14;43353:58;43445:11;43440:2;43432:6;43428:15;43421:36;43236:228;:::o;43470:366::-;43612:3;43633:67;43697:2;43692:3;43633:67;:::i;:::-;43626:74;;43709:93;43798:3;43709:93;:::i;:::-;43827:2;43822:3;43818:12;43811:19;;43470:366;;;:::o;43842:419::-;44008:4;44046:2;44035:9;44031:18;44023:26;;44095:9;44089:4;44085:20;44081:1;44070:9;44066:17;44059:47;44123:131;44249:4;44123:131;:::i;:::-;44115:139;;43842:419;;;:::o;44267:223::-;44407:34;44403:1;44395:6;44391:14;44384:58;44476:6;44471:2;44463:6;44459:15;44452:31;44267:223;:::o;44496:366::-;44638:3;44659:67;44723:2;44718:3;44659:67;:::i;:::-;44652:74;;44735:93;44824:3;44735:93;:::i;:::-;44853:2;44848:3;44844:12;44837:19;;44496:366;;;:::o;44868:419::-;45034:4;45072:2;45061:9;45057:18;45049:26;;45121:9;45115:4;45111:20;45107:1;45096:9;45092:17;45085:47;45149:131;45275:4;45149:131;:::i;:::-;45141:139;;44868:419;;;:::o;45293:180::-;45341:77;45338:1;45331:88;45438:4;45435:1;45428:15;45462:4;45459:1;45452:15;45479:185;45519:1;45536:20;45554:1;45536:20;:::i;:::-;45531:25;;45570:20;45588:1;45570:20;:::i;:::-;45565:25;;45609:1;45599:35;;45614:18;;:::i;:::-;45599:35;45656:1;45653;45649:9;45644:14;;45479:185;;;;:::o;45670:79::-;45709:7;45738:5;45727:16;;45670:79;;;:::o;45755:157::-;45860:45;45880:24;45898:5;45880:24;:::i;:::-;45860:45;:::i;:::-;45855:3;45848:58;45755:157;;:::o;45918:397::-;46058:3;46073:75;46144:3;46135:6;46073:75;:::i;:::-;46173:2;46168:3;46164:12;46157:19;;46186:75;46257:3;46248:6;46186:75;:::i;:::-;46286:2;46281:3;46277:12;46270:19;;46306:3;46299:10;;45918:397;;;;;:::o;46321:237::-;46461:34;46457:1;46449:6;46445:14;46438:58;46530:20;46525:2;46517:6;46513:15;46506:45;46321:237;:::o;46564:366::-;46706:3;46727:67;46791:2;46786:3;46727:67;:::i;:::-;46720:74;;46803:93;46892:3;46803:93;:::i;:::-;46921:2;46916:3;46912:12;46905:19;;46564:366;;;:::o;46936:419::-;47102:4;47140:2;47129:9;47125:18;47117:26;;47189:9;47183:4;47179:20;47175:1;47164:9;47160:17;47153:47;47217:131;47343:4;47217:131;:::i;:::-;47209:139;;46936:419;;;:::o;47361:176::-;47393:1;47410:20;47428:1;47410:20;:::i;:::-;47405:25;;47444:20;47462:1;47444:20;:::i;:::-;47439:25;;47483:1;47473:35;;47488:18;;:::i;:::-;47473:35;47529:1;47526;47522:9;47517:14;;47361:176;;;;:::o;47543:98::-;47594:6;47628:5;47622:12;47612:22;;47543:98;;;:::o;47647:168::-;47730:11;47764:6;47759:3;47752:19;47804:4;47799:3;47795:14;47780:29;;47647:168;;;;:::o;47821:360::-;47907:3;47935:38;47967:5;47935:38;:::i;:::-;47989:70;48052:6;48047:3;47989:70;:::i;:::-;47982:77;;48068:52;48113:6;48108:3;48101:4;48094:5;48090:16;48068:52;:::i;:::-;48145:29;48167:6;48145:29;:::i;:::-;48140:3;48136:39;48129:46;;47911:270;47821:360;;;;:::o;48187:640::-;48382:4;48420:3;48409:9;48405:19;48397:27;;48434:71;48502:1;48491:9;48487:17;48478:6;48434:71;:::i;:::-;48515:72;48583:2;48572:9;48568:18;48559:6;48515:72;:::i;:::-;48597;48665:2;48654:9;48650:18;48641:6;48597:72;:::i;:::-;48716:9;48710:4;48706:20;48701:2;48690:9;48686:18;48679:48;48744:76;48815:4;48806:6;48744:76;:::i;:::-;48736:84;;48187:640;;;;;;;:::o;48833:141::-;48889:5;48920:6;48914:13;48905:22;;48936:32;48962:5;48936:32;:::i;:::-;48833:141;;;;:::o;48980:349::-;49049:6;49098:2;49086:9;49077:7;49073:23;49069:32;49066:119;;;49104:79;;:::i;:::-;49066:119;49224:1;49249:63;49304:7;49295:6;49284:9;49280:22;49249:63;:::i;:::-;49239:73;;49195:127;48980:349;;;;:::o;49335:182::-;49475:34;49471:1;49463:6;49459:14;49452:58;49335:182;:::o;49523:366::-;49665:3;49686:67;49750:2;49745:3;49686:67;:::i;:::-;49679:74;;49762:93;49851:3;49762:93;:::i;:::-;49880:2;49875:3;49871:12;49864:19;;49523:366;;;:::o;49895:419::-;50061:4;50099:2;50088:9;50084:18;50076:26;;50148:9;50142:4;50138:20;50134:1;50123:9;50119:17;50112:47;50176:131;50302:4;50176:131;:::i;:::-;50168:139;;49895:419;;;:::o;50320:178::-;50460:30;50456:1;50448:6;50444:14;50437:54;50320:178;:::o;50504:366::-;50646:3;50667:67;50731:2;50726:3;50667:67;:::i;:::-;50660:74;;50743:93;50832:3;50743:93;:::i;:::-;50861:2;50856:3;50852:12;50845:19;;50504:366;;;:::o;50876:419::-;51042:4;51080:2;51069:9;51065:18;51057:26;;51129:9;51123:4;51119:20;51115:1;51104:9;51100:17;51093:47;51157:131;51283:4;51157:131;:::i;:::-;51149:139;;50876:419;;;:::o;51301:180::-;51349:77;51346:1;51339:88;51446:4;51443:1;51436:15;51470:4;51467:1;51460:15

Swarm Source

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