ETH Price: $2,594.27 (-3.08%)
Gas: 5 Gwei

Token

Harems (HAR)
 

Overview

Max Total Supply

655 HAR

Holders

168

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HAR
0x60121735afe56d3b6de0b799d333615903c35faf
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:
Harems

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File @openzeppelin/contracts/utils/math/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. 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/[email protected]



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/[email protected]



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 contracts/clubs.sol


pragma solidity ^0.8.0;


contract Clubs is Ownable {

    using SafeMath for uint256;

    Club[3] internal arrayClubs;

    modifier clubExist(uint256 id) {
        require(id < arrayClubs.length, "This club does not exist.");
        _;
    }

    struct Club {
        string name;
        uint256[] tokens;
        bool locked;
    }

    constructor() {
        arrayClubs[0] = Club("Curators", new uint256[](0), false);
        arrayClubs[1] = Club("Royalties", new uint256[](0), false);
        arrayClubs[2] = Club("Traders", new uint256[](0), false);
    }

    function getClub(uint256 id) external view clubExist(id) returns(Club memory) {
        return arrayClubs[id];
    }

    function addClubToken(uint256 id, uint256 _tokenId) external onlyOwner clubExist(id) {
        require(!arrayClubs[id].locked, "Club is locked.");

        bool isAlreadyInClub = false;
        for (uint256 i; i < arrayClubs[id].tokens.length; i++) {
            if (arrayClubs[id].tokens[i] == _tokenId) {
                isAlreadyInClub = true;
            }
        }

        if (!isAlreadyInClub) {
            arrayClubs[id].tokens.push(_tokenId);
        }
    }

    function updateClubToken(uint256 id, uint256 _oldTokenId, uint256 _newTokenId) external onlyOwner clubExist(id) {
        require(!arrayClubs[id].locked, "Club is locked.");

        for (uint256 i; i < arrayClubs[id].tokens.length; i++) {
            if (arrayClubs[id].tokens[i] == _oldTokenId) {
                arrayClubs[id].tokens[i] = _newTokenId;
            }
        }
    }

    function lockClub(uint256 id) external onlyOwner clubExist(id) {
        require(!arrayClubs[id].locked, "Club is locked.");

        arrayClubs[id].locked = true;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



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/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



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/[email protected]



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]



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/[email protected]



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/Harems.sol


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

01100010 01111001 00100000 01000010 01101100 01100001 
01100011 01101011 00100000 01001010 01100101 01110011 
01110101 01110011

*/

pragma solidity ^0.8.0;





contract Harems is ERC721, ERC721Enumerable, Ownable, Clubs {

    using SafeMath for uint256;

    uint256 public constant maxSupply = 10000;
    uint256 private _price = 0.069 ether;
    uint256 private _reserved = 100;

    string public HAR_PROVENANCE = "";
    uint256 public startingIndex;

    bool private _saleStarted;
    string public baseURI;

    address t1 = 0x37f0945Dc06BF627d4cF875Be442b012eCCd53cb;
    address t2 = 0x0693E3446e5DC51BEb27AFDe9d9d42a1d47A8189;

    constructor() ERC721("Harems", "HAR") {
        _saleStarted = false;
    }

    modifier whenSaleStarted() {
        require(_saleStarted);
        _;
    }

    function mint(uint256 _nbTokens) external payable whenSaleStarted {
        uint256 supply = totalSupply();
        require(_nbTokens < 21, "You cannot mint more than 20 Tokens at once!");
        require(supply + _nbTokens <= maxSupply - _reserved, "Not enough Tokens left.");
        require(_nbTokens * _price <= msg.value, "Inconsistent amount sent!");

        for (uint256 i; i < _nbTokens; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function flipSaleStarted() external onlyOwner {
        _saleStarted = !_saleStarted;

        if (_saleStarted && startingIndex == 0) {
            setStartingIndex();
        }
    }

    function saleStarted() public view returns(bool) {
        return _saleStarted;
    }

    function setBaseURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }

    function _baseURI() internal view override(ERC721) returns(string memory) {
        return baseURI;
    }

    // Make it possible to change the price: just in case
    function setPrice(uint256 _newPrice) external onlyOwner {
        _price = _newPrice;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }

    function getReservedLeft() public view returns (uint256) {
        return _reserved;
    }

    // This should be set before sales open.
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        HAR_PROVENANCE = provenanceHash;
    }

    // Helper to list all the Women of a wallet
    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function claimReserved(uint256 _number, address _receiver) external onlyOwner {
        require(_number <= _reserved, "That would exceed the max reserved.");

        uint256 _tokenId = totalSupply();
        for (uint256 i; i < _number; i++) {
            _safeMint(_receiver, _tokenId + i);
        }

        _reserved = _reserved - _number;
    }

    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");

        // BlockHash only works for the most 256 recent blocks.
        uint256 _block_shift = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
        _block_shift =  1 + (_block_shift % 255);

        // This shouldn't happen, but just in case the blockchain gets a reboot?
        if (block.number < _block_shift) {
            _block_shift = 1;
        }

        uint256 _block_ref = block.number - _block_shift;
        startingIndex = uint(blockhash(_block_ref)) % maxSupply;

        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex + 1;
        }
    }
 
    function withdraw() public onlyOwner {
        uint256 _balance = address(this).balance;
        uint256 _split = _balance.mul(95).div(100);

        require(payable(t1).send(_split));
        require(payable(t2).send(_balance.sub(_split)));
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

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":"HAR_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"addClubToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"claimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStarted","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":"uint256","name":"id","type":"uint256"}],"name":"getClub","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"},{"internalType":"bool","name":"locked","type":"bool"}],"internalType":"struct Clubs.Club","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReservedLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"lockClub","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nbTokens","type":"uint256"}],"name":"mint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_oldTokenId","type":"uint256"},{"internalType":"uint256","name":"_newTokenId","type":"uint256"}],"name":"updateClubToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f5232269808000601455606460155560405180602001604052806000815250601690805190602001906200003b929190620006d2565b507337f0945dc06bf627d4cf875be442b012eccd53cb601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730693e3446e5dc51beb27afde9d9d42a1d47a8189601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f357600080fd5b506040518060400160405280600681526020017f486172656d7300000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4841520000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000178929190620006d2565b50806001908051906020019062000191929190620006d2565b505050620001b4620001a86200060460201b60201c565b6200060c60201b60201c565b60405180606001604052806040518060400160405280600881526020017f43757261746f72730000000000000000000000000000000000000000000000008152508152602001600067ffffffffffffffff8111156200023c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156200026b5781602001602082028036833780820191505090505b50815260200160001515815250600b600060038110620002b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016000820151816000019080519060200190620002d6929190620006d2565b506020820151816001019080519060200190620002f592919062000763565b5060408201518160020160006101000a81548160ff02191690831515021790555090505060405180606001604052806040518060400160405280600981526020017f526f79616c7469657300000000000000000000000000000000000000000000008152508152602001600067ffffffffffffffff811115620003a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015620003d05781602001602082028036833780820191505090505b50815260200160001515815250600b60016003811062000419577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160008201518160000190805190602001906200043b929190620006d2565b5060208201518160010190805190602001906200045a92919062000763565b5060408201518160020160006101000a81548160ff02191690831515021790555090505060405180606001604052806040518060400160405280600781526020017f54726164657273000000000000000000000000000000000000000000000000008152508152602001600067ffffffffffffffff81111562000506577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015620005355781602001602082028036833780820191505090505b50815260200160001515815250600b6002600381106200057e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016000820151816000019080519060200190620005a0929190620006d2565b506020820151816001019080519060200190620005bf92919062000763565b5060408201518160020160006101000a81548160ff0219169083151502179055509050506000601860006101000a81548160ff02191690831515021790555062000839565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620006e090620007d4565b90600052602060002090601f01602090048101928262000704576000855562000750565b82601f106200071f57805160ff191683800117855562000750565b8280016001018555821562000750579182015b828111156200074f57825182559160200191906001019062000732565b5b5090506200075f9190620007b5565b5090565b828054828255906000526020600020908101928215620007a2579160200282015b82811115620007a157825182559160200191906001019062000784565b5b509050620007b19190620007b5565b5090565b5b80821115620007d0576000816000905550600101620007b6565b5090565b60006002820490506001821680620007ed57607f821691505b602082108114156200080457620008036200080a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6153ac80620008496000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063b0e1d7f3116100ab578063d5abeb011161006f578063d5abeb011461082a578063daa023aa14610855578063e985e9c514610880578063e9866550146108bd578063f2fde38b146108d457610230565b8063b0e1d7f314610747578063b88d4fde14610770578063bae92c6e14610799578063c87b56dd146107c2578063cb774d47146107ff57610230565b806395d89b41116100f257806395d89b411461068357806398d5fdca146106ae578063a0712d68146106d9578063a22cb465146106f5578063a4c96fc11461071e57610230565b806370a08231146105c4578063715018a614610601578063899d7b38146106185780638da5cb5b1461062f57806391b7f5ed1461065a57610230565b80632f745c59116101bc57806355f804b31161018057806355f804b3146104cb5780635adf16af146104f45780635c474f9e146105315780636352211e1461055c5780636c0360eb1461059957610230565b80632f745c59146103d45780633ccfd60b1461041157806342842e0e14610428578063438b6300146104515780634f6ccce71461048e57610230565b8063095ea7b311610203578063095ea7b3146103035780630e912d9c1461032c578063109695231461035757806318160ddd1461038057806323b872dd146103ab57610230565b806301ffc9a71461023557806303c156971461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613c4b565b6108fd565b604051610269919061447b565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613d43565b61090f565b005b3480156102a757600080fd5b506102b0610bc6565b6040516102bd9190614496565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613cde565b610c58565b6040516102fa91906143f2565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613c0f565b610cdd565b005b34801561033857600080fd5b50610341610df5565b60405161034e9190614496565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613c9d565b610e83565b005b34801561038c57600080fd5b50610395610f19565b6040516103a291906147fa565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613b09565b610f26565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613c0f565b610f86565b60405161040891906147fa565b60405180910390f35b34801561041d57600080fd5b5061042661102b565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613b09565b6111ad565b005b34801561045d57600080fd5b5061047860048036038101906104739190613aa4565b6111cd565b6040516104859190614459565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613cde565b6112c7565b6040516104c291906147fa565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed9190613c9d565b61135e565b005b34801561050057600080fd5b5061051b60048036038101906105169190613cde565b6113f4565b60405161052891906147d8565b60405180910390f35b34801561053d57600080fd5b50610546611596565b604051610553919061447b565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613cde565b6115ad565b60405161059091906143f2565b60405180910390f35b3480156105a557600080fd5b506105ae61165f565b6040516105bb9190614496565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190613aa4565b6116ed565b6040516105f891906147fa565b60405180910390f35b34801561060d57600080fd5b506106166117a5565b005b34801561062457600080fd5b5061062d61182d565b005b34801561063b57600080fd5b50610644611901565b60405161065191906143f2565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190613cde565b61192b565b005b34801561068f57600080fd5b506106986119b1565b6040516106a59190614496565b60405180910390f35b3480156106ba57600080fd5b506106c3611a43565b6040516106d091906147fa565b60405180910390f35b6106f360048036038101906106ee9190613cde565b611a4d565b005b34801561070157600080fd5b5061071c60048036038101906107179190613bd3565b611b9a565b005b34801561072a57600080fd5b5061074560048036038101906107409190613d7f565b611d1b565b005b34801561075357600080fd5b5061076e60048036038101906107699190613d07565b611fe7565b005b34801561077c57600080fd5b5061079760048036038101906107929190613b58565b612101565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613cde565b612163565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613cde565b612310565b6040516107f69190614496565b60405180910390f35b34801561080b57600080fd5b506108146123b7565b60405161082191906147fa565b60405180910390f35b34801561083657600080fd5b5061083f6123bd565b60405161084c91906147fa565b60405180910390f35b34801561086157600080fd5b5061086a6123c3565b60405161087791906147fa565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613acd565b6123cd565b6040516108b4919061447b565b60405180910390f35b3480156108c957600080fd5b506108d2612461565b005b3480156108e057600080fd5b506108fb60048036038101906108f69190613aa4565b61254b565b005b600061090882612643565b9050919050565b6109176126bd565b73ffffffffffffffffffffffffffffffffffffffff16610935611901565b73ffffffffffffffffffffffffffffffffffffffff161461098b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610982906146b8565b60405180910390fd5b81600381106109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690614678565b60405180910390fd5b600b8360038110610a09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160009054906101000a900460ff1615610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906147b8565b60405180910390fd5b6000805b600b8560038110610a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160010180549050811015610b515783600b8660038110610ae9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018281548110610b28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541415610b3e57600191505b8080610b4990614b68565b915050610a62565b5080610bc057600b8460038110610b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018390806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b606060008054610bd590614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0190614b05565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b5050505050905090565b6000610c63826126c5565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9990614698565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce8826115ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090614738565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d786126bd565b73ffffffffffffffffffffffffffffffffffffffff161480610da75750610da681610da16126bd565b6123cd565b5b610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906145f8565b60405180910390fd5b610df08383612731565b505050565b60168054610e0290614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e90614b05565b8015610e7b5780601f10610e5057610100808354040283529160200191610e7b565b820191906000526020600020905b815481529060010190602001808311610e5e57829003601f168201915b505050505081565b610e8b6126bd565b73ffffffffffffffffffffffffffffffffffffffff16610ea9611901565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906146b8565b60405180910390fd5b8060169080519060200190610f159291906138a5565b5050565b6000600880549050905090565b610f37610f316126bd565b826127ea565b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614778565b60405180910390fd5b610f818383836128c8565b505050565b6000610f91836116ed565b8210610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc9906144b8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110336126bd565b73ffffffffffffffffffffffffffffffffffffffff16611051611901565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e906146b8565b60405180910390fd5b600047905060006110d560646110c7605f85612b2490919063ffffffff16565b612b3a90919063ffffffff16565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061113757600080fd5b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6111868385612b5090919063ffffffff16565b9081150290604051600060405180830381858888f193505050506111a957600080fd5b5050565b6111c883838360405180602001604052806000815250612101565b505050565b606060006111da836116ed565b905060008167ffffffffffffffff81111561121e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561124c5781602001602082028036833780820191505090505b50905060005b828110156112bc576112648582610f86565b82828151811061129d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806112b490614b68565b915050611252565b508092505050919050565b60006112d1610f19565b8210611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990614798565b60405180910390fd5b6008828154811061134c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6113666126bd565b73ffffffffffffffffffffffffffffffffffffffff16611384611901565b73ffffffffffffffffffffffffffffffffffffffff16146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d1906146b8565b60405180910390fd5b80601990805190602001906113f09291906138a5565b5050565b6113fc61392b565b8160038110611440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143790614678565b60405180910390fd5b600b836003811061147a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160405180606001604052908160008201805461149990614b05565b80601f01602080910402602001604051908101604052809291908181526020018280546114c590614b05565b80156115125780601f106114e757610100808354040283529160200191611512565b820191906000526020600020905b8154815290600101906020018083116114f557829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561156a57602002820191906000526020600020905b815481526020019060010190808311611556575b505050505081526020016002820160009054906101000a900460ff161515151581525050915050919050565b6000601860009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90614638565b60405180910390fd5b80915050919050565b6019805461166c90614b05565b80601f016020809104026020016040519081016040528092919081815260200182805461169890614b05565b80156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175590614618565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ad6126bd565b73ffffffffffffffffffffffffffffffffffffffff166117cb611901565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611818906146b8565b60405180910390fd5b61182b6000612b66565b565b6118356126bd565b73ffffffffffffffffffffffffffffffffffffffff16611853611901565b73ffffffffffffffffffffffffffffffffffffffff16146118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906146b8565b60405180910390fd5b601860009054906101000a900460ff1615601860006101000a81548160ff021916908315150217905550601860009054906101000a900460ff1680156118f157506000601754145b156118ff576118fe612461565b5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119336126bd565b73ffffffffffffffffffffffffffffffffffffffff16611951611901565b73ffffffffffffffffffffffffffffffffffffffff16146119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906146b8565b60405180910390fd5b8060148190555050565b6060600180546119c090614b05565b80601f01602080910402602001604051908101604052809291908181526020018280546119ec90614b05565b8015611a395780601f10611a0e57610100808354040283529160200191611a39565b820191906000526020600020905b815481529060010190602001808311611a1c57829003601f168201915b5050505050905090565b6000601454905090565b601860009054906101000a900460ff16611a6657600080fd5b6000611a70610f19565b905060158210611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90614578565b60405180910390fd5b601554612710611ac59190614a1b565b8282611ad1919061493a565b1115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906146d8565b60405180910390fd5b3460145483611b2191906149c1565b1115611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614598565b60405180910390fd5b60005b82811015611b9557611b82338284611b7d919061493a565b612c2c565b8080611b8d90614b68565b915050611b65565b505050565b611ba26126bd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0790614558565b60405180910390fd5b8060056000611c1d6126bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cca6126bd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d0f919061447b565b60405180910390a35050565b611d236126bd565b73ffffffffffffffffffffffffffffffffffffffff16611d41611901565b73ffffffffffffffffffffffffffffffffffffffff1614611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e906146b8565b60405180910390fd5b8260038110611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290614678565b60405180910390fd5b600b8460038110611e15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160009054906101000a900460ff1615611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e61906147b8565b60405180910390fd5b60005b600b8560038110611ea7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160010180549050811015611fe05783600b8660038110611ef4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018281548110611f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541415611fcd5782600b8660038110611f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018281548110611fbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055505b8080611fd890614b68565b915050611e6d565b5050505050565b611fef6126bd565b73ffffffffffffffffffffffffffffffffffffffff1661200d611901565b73ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a906146b8565b60405180910390fd5b6015548211156120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614758565b60405180910390fd5b60006120b2610f19565b905060005b838110156120e7576120d48382846120cf919061493a565b612c2c565b80806120df90614b68565b9150506120b7565b50826015546120f69190614a1b565b601581905550505050565b61211261210c6126bd565b836127ea565b612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214890614778565b60405180910390fd5b61215d84848484612c4a565b50505050565b61216b6126bd565b73ffffffffffffffffffffffffffffffffffffffff16612189611901565b73ffffffffffffffffffffffffffffffffffffffff16146121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d6906146b8565b60405180910390fd5b8060038110612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a90614678565b60405180910390fd5b600b826003811061225d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160009054906101000a900460ff16156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a9906147b8565b60405180910390fd5b6001600b83600381106122ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160006101000a81548160ff0219169083151502179055505050565b606061231b826126c5565b61235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235190614718565b60405180910390fd5b6000612364612ca6565b9050600081511161238457604051806020016040528060008152506123af565b8061238e84612d38565b60405160200161239f9291906143a2565b6040516020818303038152906040525b915050919050565b60175481565b61271081565b6000601554905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601754146124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249d906145d8565b60405180910390fd5b600044426040516020016124bb9291906143c6565b6040516020818303038152906040528051906020012060001c905060ff816124e39190614bbb565b60016124ef919061493a565b9050804310156124fe57600190505b6000814361250c9190614a1b565b9050612710814060001c6125209190614bbb565b60178190555060006017541415612547576001601754612540919061493a565b6017819055505b5050565b6125536126bd565b73ffffffffffffffffffffffffffffffffffffffff16612571611901565b73ffffffffffffffffffffffffffffffffffffffff16146125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125be906146b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e906144f8565b60405180910390fd5b61264081612b66565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126b657506126b582612ee5565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127a4836115ad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127f5826126c5565b612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b906145b8565b60405180910390fd5b600061283f836115ad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ae57508373ffffffffffffffffffffffffffffffffffffffff1661289684610c58565b73ffffffffffffffffffffffffffffffffffffffff16145b806128bf57506128be81856123cd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e8826115ad565b73ffffffffffffffffffffffffffffffffffffffff161461293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612935906146f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a590614538565b60405180910390fd5b6129b9838383612fc7565b6129c4600082612731565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a149190614a1b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a6b919061493a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612b3291906149c1565b905092915050565b60008183612b489190614990565b905092915050565b60008183612b5e9190614a1b565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c46828260405180602001604052806000815250612fd7565b5050565b612c558484846128c8565b612c6184848484613032565b612ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c97906144d8565b60405180910390fd5b50505050565b606060198054612cb590614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce190614b05565b8015612d2e5780601f10612d0357610100808354040283529160200191612d2e565b820191906000526020600020905b815481529060010190602001808311612d1157829003601f168201915b5050505050905090565b60606000821415612d80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ee0565b600082905060005b60008214612db2578080612d9b90614b68565b915050600a82612dab9190614990565b9150612d88565b60008167ffffffffffffffff811115612df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e265781602001600182028036833780820191505090505b5090505b60008514612ed957600182612e3f9190614a1b565b9150600a85612e4e9190614bbb565b6030612e5a919061493a565b60f81b818381518110612e96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ed29190614990565b9450612e2a565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fb057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fc05750612fbf826131c9565b5b9050919050565b612fd2838383613233565b505050565b612fe18383613347565b612fee6000848484613032565b61302d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613024906144d8565b60405180910390fd5b505050565b60006130538473ffffffffffffffffffffffffffffffffffffffff16613515565b156131bc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307c6126bd565b8786866040518563ffffffff1660e01b815260040161309e949392919061440d565b602060405180830381600087803b1580156130b857600080fd5b505af19250505080156130e957506040513d601f19601f820116820180604052508101906130e69190613c74565b60015b61316c573d8060008114613119576040519150601f19603f3d011682016040523d82523d6000602084013e61311e565b606091505b50600081511415613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b906144d8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131c1565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61323e838383613528565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132815761327c8161352d565b6132c0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132bf576132be8382613576565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613303576132fe816136e3565b613342565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613341576133408282613826565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ae90614658565b60405180910390fd5b6133c0816126c5565b15613400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f790614518565b60405180910390fd5b61340c60008383612fc7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461345c919061493a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613583846116ed565b61358d9190614a1b565b9050600060076000848152602001908152602001600020549050818114613672576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136f79190614a1b565b905060006009600084815260200190815260200160002054905060006008838154811061374d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613795577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061380a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613831836116ed565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546138b190614b05565b90600052602060002090601f0160209004810192826138d3576000855561391a565b82601f106138ec57805160ff191683800117855561391a565b8280016001018555821561391a579182015b828111156139195782518255916020019190600101906138fe565b5b509050613927919061394e565b5090565b604051806060016040528060608152602001606081526020016000151581525090565b5b8082111561396757600081600090555060010161394f565b5090565b600061397e6139798461483a565b614815565b90508281526020810184848401111561399657600080fd5b6139a1848285614ac3565b509392505050565b60006139bc6139b78461486b565b614815565b9050828152602081018484840111156139d457600080fd5b6139df848285614ac3565b509392505050565b6000813590506139f68161531a565b92915050565b600081359050613a0b81615331565b92915050565b600081359050613a2081615348565b92915050565b600081519050613a3581615348565b92915050565b600082601f830112613a4c57600080fd5b8135613a5c84826020860161396b565b91505092915050565b600082601f830112613a7657600080fd5b8135613a868482602086016139a9565b91505092915050565b600081359050613a9e8161535f565b92915050565b600060208284031215613ab657600080fd5b6000613ac4848285016139e7565b91505092915050565b60008060408385031215613ae057600080fd5b6000613aee858286016139e7565b9250506020613aff858286016139e7565b9150509250929050565b600080600060608486031215613b1e57600080fd5b6000613b2c868287016139e7565b9350506020613b3d868287016139e7565b9250506040613b4e86828701613a8f565b9150509250925092565b60008060008060808587031215613b6e57600080fd5b6000613b7c878288016139e7565b9450506020613b8d878288016139e7565b9350506040613b9e87828801613a8f565b925050606085013567ffffffffffffffff811115613bbb57600080fd5b613bc787828801613a3b565b91505092959194509250565b60008060408385031215613be657600080fd5b6000613bf4858286016139e7565b9250506020613c05858286016139fc565b9150509250929050565b60008060408385031215613c2257600080fd5b6000613c30858286016139e7565b9250506020613c4185828601613a8f565b9150509250929050565b600060208284031215613c5d57600080fd5b6000613c6b84828501613a11565b91505092915050565b600060208284031215613c8657600080fd5b6000613c9484828501613a26565b91505092915050565b600060208284031215613caf57600080fd5b600082013567ffffffffffffffff811115613cc957600080fd5b613cd584828501613a65565b91505092915050565b600060208284031215613cf057600080fd5b6000613cfe84828501613a8f565b91505092915050565b60008060408385031215613d1a57600080fd5b6000613d2885828601613a8f565b9250506020613d39858286016139e7565b9150509250929050565b60008060408385031215613d5657600080fd5b6000613d6485828601613a8f565b9250506020613d7585828601613a8f565b9150509250929050565b600080600060608486031215613d9457600080fd5b6000613da286828701613a8f565b9350506020613db386828701613a8f565b9250506040613dc486828701613a8f565b9150509250925092565b6000613dda838361436d565b60208301905092915050565b613def81614a4f565b82525050565b6000613e00826148ac565b613e0a81856148da565b9350613e158361489c565b8060005b83811015613e46578151613e2d8882613dce565b9750613e38836148cd565b925050600181019050613e19565b5085935050505092915050565b6000613e5e826148ac565b613e6881856148eb565b9350613e738361489c565b8060005b83811015613ea4578151613e8b8882613dce565b9750613e96836148cd565b925050600181019050613e77565b5085935050505092915050565b613eba81614a61565b82525050565b613ec981614a61565b82525050565b6000613eda826148b7565b613ee481856148fc565b9350613ef4818560208601614ad2565b613efd81614ca8565b840191505092915050565b6000613f13826148c2565b613f1d818561490d565b9350613f2d818560208601614ad2565b613f3681614ca8565b840191505092915050565b6000613f4c826148c2565b613f56818561491e565b9350613f66818560208601614ad2565b613f6f81614ca8565b840191505092915050565b6000613f85826148c2565b613f8f818561492f565b9350613f9f818560208601614ad2565b80840191505092915050565b6000613fb8602b8361491e565b9150613fc382614cb9565b604082019050919050565b6000613fdb60328361491e565b9150613fe682614d08565b604082019050919050565b6000613ffe60268361491e565b915061400982614d57565b604082019050919050565b6000614021601c8361491e565b915061402c82614da6565b602082019050919050565b600061404460248361491e565b915061404f82614dcf565b604082019050919050565b600061406760198361491e565b915061407282614e1e565b602082019050919050565b600061408a602c8361491e565b915061409582614e47565b604082019050919050565b60006140ad60198361491e565b91506140b882614e96565b602082019050919050565b60006140d0602c8361491e565b91506140db82614ebf565b604082019050919050565b60006140f3601d8361491e565b91506140fe82614f0e565b602082019050919050565b600061411660388361491e565b915061412182614f37565b604082019050919050565b6000614139602a8361491e565b915061414482614f86565b604082019050919050565b600061415c60298361491e565b915061416782614fd5565b604082019050919050565b600061417f60208361491e565b915061418a82615024565b602082019050919050565b60006141a260198361491e565b91506141ad8261504d565b602082019050919050565b60006141c5602c8361491e565b91506141d082615076565b604082019050919050565b60006141e860208361491e565b91506141f3826150c5565b602082019050919050565b600061420b60178361491e565b9150614216826150ee565b602082019050919050565b600061422e60298361491e565b915061423982615117565b604082019050919050565b6000614251602f8361491e565b915061425c82615166565b604082019050919050565b600061427460218361491e565b915061427f826151b5565b604082019050919050565b600061429760238361491e565b91506142a282615204565b604082019050919050565b60006142ba60318361491e565b91506142c582615253565b604082019050919050565b60006142dd602c8361491e565b91506142e8826152a2565b604082019050919050565b6000614300600f8361491e565b915061430b826152f1565b602082019050919050565b600060608301600083015184820360008601526143338282613f08565b9150506020830151848203602086015261434d8282613df5565b91505060408301516143626040860182613eb1565b508091505092915050565b61437681614ab9565b82525050565b61438581614ab9565b82525050565b61439c61439782614ab9565b614bb1565b82525050565b60006143ae8285613f7a565b91506143ba8284613f7a565b91508190509392505050565b60006143d2828561438b565b6020820191506143e2828461438b565b6020820191508190509392505050565b60006020820190506144076000830184613de6565b92915050565b60006080820190506144226000830187613de6565b61442f6020830186613de6565b61443c604083018561437c565b818103606083015261444e8184613ecf565b905095945050505050565b600060208201905081810360008301526144738184613e53565b905092915050565b60006020820190506144906000830184613ec0565b92915050565b600060208201905081810360008301526144b08184613f41565b905092915050565b600060208201905081810360008301526144d181613fab565b9050919050565b600060208201905081810360008301526144f181613fce565b9050919050565b6000602082019050818103600083015261451181613ff1565b9050919050565b6000602082019050818103600083015261453181614014565b9050919050565b6000602082019050818103600083015261455181614037565b9050919050565b600060208201905081810360008301526145718161405a565b9050919050565b600060208201905081810360008301526145918161407d565b9050919050565b600060208201905081810360008301526145b1816140a0565b9050919050565b600060208201905081810360008301526145d1816140c3565b9050919050565b600060208201905081810360008301526145f1816140e6565b9050919050565b6000602082019050818103600083015261461181614109565b9050919050565b600060208201905081810360008301526146318161412c565b9050919050565b600060208201905081810360008301526146518161414f565b9050919050565b6000602082019050818103600083015261467181614172565b9050919050565b6000602082019050818103600083015261469181614195565b9050919050565b600060208201905081810360008301526146b1816141b8565b9050919050565b600060208201905081810360008301526146d1816141db565b9050919050565b600060208201905081810360008301526146f1816141fe565b9050919050565b6000602082019050818103600083015261471181614221565b9050919050565b6000602082019050818103600083015261473181614244565b9050919050565b6000602082019050818103600083015261475181614267565b9050919050565b600060208201905081810360008301526147718161428a565b9050919050565b60006020820190508181036000830152614791816142ad565b9050919050565b600060208201905081810360008301526147b1816142d0565b9050919050565b600060208201905081810360008301526147d1816142f3565b9050919050565b600060208201905081810360008301526147f28184614316565b905092915050565b600060208201905061480f600083018461437c565b92915050565b600061481f614830565b905061482b8282614b37565b919050565b6000604051905090565b600067ffffffffffffffff82111561485557614854614c79565b5b61485e82614ca8565b9050602081019050919050565b600067ffffffffffffffff82111561488657614885614c79565b5b61488f82614ca8565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061494582614ab9565b915061495083614ab9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561498557614984614bec565b5b828201905092915050565b600061499b82614ab9565b91506149a683614ab9565b9250826149b6576149b5614c1b565b5b828204905092915050565b60006149cc82614ab9565b91506149d783614ab9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1057614a0f614bec565b5b828202905092915050565b6000614a2682614ab9565b9150614a3183614ab9565b925082821015614a4457614a43614bec565b5b828203905092915050565b6000614a5a82614a99565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614af0578082015181840152602081019050614ad5565b83811115614aff576000848401525b50505050565b60006002820490506001821680614b1d57607f821691505b60208210811415614b3157614b30614c4a565b5b50919050565b614b4082614ca8565b810181811067ffffffffffffffff82111715614b5f57614b5e614c79565b5b80604052505050565b6000614b7382614ab9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ba657614ba5614bec565b5b600182019050919050565b6000819050919050565b6000614bc682614ab9565b9150614bd183614ab9565b925082614be157614be0614c1b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20323020546f6b60008201527f656e73206174206f6e6365210000000000000000000000000000000000000000602082015250565b7f496e636f6e73697374656e7420616d6f756e742073656e742100000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5468697320636c756220646f6573206e6f742065786973742e00000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f75676820546f6b656e73206c6566742e000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468617420776f756c642065786365656420746865206d61782072657365727660008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436c7562206973206c6f636b65642e0000000000000000000000000000000000600082015250565b61532381614a4f565b811461532e57600080fd5b50565b61533a81614a61565b811461534557600080fd5b50565b61535181614a6d565b811461535c57600080fd5b50565b61536881614ab9565b811461537357600080fd5b5056fea2646970667358221220b39f7fea283f2289486646fbb6fee6c6403c62767b6f87d22c96cd11facb44f664736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063b0e1d7f3116100ab578063d5abeb011161006f578063d5abeb011461082a578063daa023aa14610855578063e985e9c514610880578063e9866550146108bd578063f2fde38b146108d457610230565b8063b0e1d7f314610747578063b88d4fde14610770578063bae92c6e14610799578063c87b56dd146107c2578063cb774d47146107ff57610230565b806395d89b41116100f257806395d89b411461068357806398d5fdca146106ae578063a0712d68146106d9578063a22cb465146106f5578063a4c96fc11461071e57610230565b806370a08231146105c4578063715018a614610601578063899d7b38146106185780638da5cb5b1461062f57806391b7f5ed1461065a57610230565b80632f745c59116101bc57806355f804b31161018057806355f804b3146104cb5780635adf16af146104f45780635c474f9e146105315780636352211e1461055c5780636c0360eb1461059957610230565b80632f745c59146103d45780633ccfd60b1461041157806342842e0e14610428578063438b6300146104515780634f6ccce71461048e57610230565b8063095ea7b311610203578063095ea7b3146103035780630e912d9c1461032c578063109695231461035757806318160ddd1461038057806323b872dd146103ab57610230565b806301ffc9a71461023557806303c156971461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613c4b565b6108fd565b604051610269919061447b565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613d43565b61090f565b005b3480156102a757600080fd5b506102b0610bc6565b6040516102bd9190614496565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613cde565b610c58565b6040516102fa91906143f2565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613c0f565b610cdd565b005b34801561033857600080fd5b50610341610df5565b60405161034e9190614496565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613c9d565b610e83565b005b34801561038c57600080fd5b50610395610f19565b6040516103a291906147fa565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613b09565b610f26565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613c0f565b610f86565b60405161040891906147fa565b60405180910390f35b34801561041d57600080fd5b5061042661102b565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613b09565b6111ad565b005b34801561045d57600080fd5b5061047860048036038101906104739190613aa4565b6111cd565b6040516104859190614459565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613cde565b6112c7565b6040516104c291906147fa565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed9190613c9d565b61135e565b005b34801561050057600080fd5b5061051b60048036038101906105169190613cde565b6113f4565b60405161052891906147d8565b60405180910390f35b34801561053d57600080fd5b50610546611596565b604051610553919061447b565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190613cde565b6115ad565b60405161059091906143f2565b60405180910390f35b3480156105a557600080fd5b506105ae61165f565b6040516105bb9190614496565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190613aa4565b6116ed565b6040516105f891906147fa565b60405180910390f35b34801561060d57600080fd5b506106166117a5565b005b34801561062457600080fd5b5061062d61182d565b005b34801561063b57600080fd5b50610644611901565b60405161065191906143f2565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190613cde565b61192b565b005b34801561068f57600080fd5b506106986119b1565b6040516106a59190614496565b60405180910390f35b3480156106ba57600080fd5b506106c3611a43565b6040516106d091906147fa565b60405180910390f35b6106f360048036038101906106ee9190613cde565b611a4d565b005b34801561070157600080fd5b5061071c60048036038101906107179190613bd3565b611b9a565b005b34801561072a57600080fd5b5061074560048036038101906107409190613d7f565b611d1b565b005b34801561075357600080fd5b5061076e60048036038101906107699190613d07565b611fe7565b005b34801561077c57600080fd5b5061079760048036038101906107929190613b58565b612101565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613cde565b612163565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613cde565b612310565b6040516107f69190614496565b60405180910390f35b34801561080b57600080fd5b506108146123b7565b60405161082191906147fa565b60405180910390f35b34801561083657600080fd5b5061083f6123bd565b60405161084c91906147fa565b60405180910390f35b34801561086157600080fd5b5061086a6123c3565b60405161087791906147fa565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613acd565b6123cd565b6040516108b4919061447b565b60405180910390f35b3480156108c957600080fd5b506108d2612461565b005b3480156108e057600080fd5b506108fb60048036038101906108f69190613aa4565b61254b565b005b600061090882612643565b9050919050565b6109176126bd565b73ffffffffffffffffffffffffffffffffffffffff16610935611901565b73ffffffffffffffffffffffffffffffffffffffff161461098b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610982906146b8565b60405180910390fd5b81600381106109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690614678565b60405180910390fd5b600b8360038110610a09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160009054906101000a900460ff1615610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906147b8565b60405180910390fd5b6000805b600b8560038110610a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160010180549050811015610b515783600b8660038110610ae9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018281548110610b28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541415610b3e57600191505b8080610b4990614b68565b915050610a62565b5080610bc057600b8460038110610b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018390806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b606060008054610bd590614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0190614b05565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b5050505050905090565b6000610c63826126c5565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9990614698565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce8826115ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090614738565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d786126bd565b73ffffffffffffffffffffffffffffffffffffffff161480610da75750610da681610da16126bd565b6123cd565b5b610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906145f8565b60405180910390fd5b610df08383612731565b505050565b60168054610e0290614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e90614b05565b8015610e7b5780601f10610e5057610100808354040283529160200191610e7b565b820191906000526020600020905b815481529060010190602001808311610e5e57829003601f168201915b505050505081565b610e8b6126bd565b73ffffffffffffffffffffffffffffffffffffffff16610ea9611901565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906146b8565b60405180910390fd5b8060169080519060200190610f159291906138a5565b5050565b6000600880549050905090565b610f37610f316126bd565b826127ea565b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614778565b60405180910390fd5b610f818383836128c8565b505050565b6000610f91836116ed565b8210610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc9906144b8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110336126bd565b73ffffffffffffffffffffffffffffffffffffffff16611051611901565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e906146b8565b60405180910390fd5b600047905060006110d560646110c7605f85612b2490919063ffffffff16565b612b3a90919063ffffffff16565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061113757600080fd5b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6111868385612b5090919063ffffffff16565b9081150290604051600060405180830381858888f193505050506111a957600080fd5b5050565b6111c883838360405180602001604052806000815250612101565b505050565b606060006111da836116ed565b905060008167ffffffffffffffff81111561121e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561124c5781602001602082028036833780820191505090505b50905060005b828110156112bc576112648582610f86565b82828151811061129d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806112b490614b68565b915050611252565b508092505050919050565b60006112d1610f19565b8210611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990614798565b60405180910390fd5b6008828154811061134c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6113666126bd565b73ffffffffffffffffffffffffffffffffffffffff16611384611901565b73ffffffffffffffffffffffffffffffffffffffff16146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d1906146b8565b60405180910390fd5b80601990805190602001906113f09291906138a5565b5050565b6113fc61392b565b8160038110611440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143790614678565b60405180910390fd5b600b836003811061147a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160405180606001604052908160008201805461149990614b05565b80601f01602080910402602001604051908101604052809291908181526020018280546114c590614b05565b80156115125780601f106114e757610100808354040283529160200191611512565b820191906000526020600020905b8154815290600101906020018083116114f557829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561156a57602002820191906000526020600020905b815481526020019060010190808311611556575b505050505081526020016002820160009054906101000a900460ff161515151581525050915050919050565b6000601860009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90614638565b60405180910390fd5b80915050919050565b6019805461166c90614b05565b80601f016020809104026020016040519081016040528092919081815260200182805461169890614b05565b80156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175590614618565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ad6126bd565b73ffffffffffffffffffffffffffffffffffffffff166117cb611901565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611818906146b8565b60405180910390fd5b61182b6000612b66565b565b6118356126bd565b73ffffffffffffffffffffffffffffffffffffffff16611853611901565b73ffffffffffffffffffffffffffffffffffffffff16146118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906146b8565b60405180910390fd5b601860009054906101000a900460ff1615601860006101000a81548160ff021916908315150217905550601860009054906101000a900460ff1680156118f157506000601754145b156118ff576118fe612461565b5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119336126bd565b73ffffffffffffffffffffffffffffffffffffffff16611951611901565b73ffffffffffffffffffffffffffffffffffffffff16146119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906146b8565b60405180910390fd5b8060148190555050565b6060600180546119c090614b05565b80601f01602080910402602001604051908101604052809291908181526020018280546119ec90614b05565b8015611a395780601f10611a0e57610100808354040283529160200191611a39565b820191906000526020600020905b815481529060010190602001808311611a1c57829003601f168201915b5050505050905090565b6000601454905090565b601860009054906101000a900460ff16611a6657600080fd5b6000611a70610f19565b905060158210611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90614578565b60405180910390fd5b601554612710611ac59190614a1b565b8282611ad1919061493a565b1115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906146d8565b60405180910390fd5b3460145483611b2191906149c1565b1115611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614598565b60405180910390fd5b60005b82811015611b9557611b82338284611b7d919061493a565b612c2c565b8080611b8d90614b68565b915050611b65565b505050565b611ba26126bd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0790614558565b60405180910390fd5b8060056000611c1d6126bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cca6126bd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d0f919061447b565b60405180910390a35050565b611d236126bd565b73ffffffffffffffffffffffffffffffffffffffff16611d41611901565b73ffffffffffffffffffffffffffffffffffffffff1614611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e906146b8565b60405180910390fd5b8260038110611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290614678565b60405180910390fd5b600b8460038110611e15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160009054906101000a900460ff1615611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e61906147b8565b60405180910390fd5b60005b600b8560038110611ea7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160010180549050811015611fe05783600b8660038110611ef4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018281548110611f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541415611fcd5782600b8660038110611f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600302016001018281548110611fbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055505b8080611fd890614b68565b915050611e6d565b5050505050565b611fef6126bd565b73ffffffffffffffffffffffffffffffffffffffff1661200d611901565b73ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a906146b8565b60405180910390fd5b6015548211156120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614758565b60405180910390fd5b60006120b2610f19565b905060005b838110156120e7576120d48382846120cf919061493a565b612c2c565b80806120df90614b68565b9150506120b7565b50826015546120f69190614a1b565b601581905550505050565b61211261210c6126bd565b836127ea565b612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214890614778565b60405180910390fd5b61215d84848484612c4a565b50505050565b61216b6126bd565b73ffffffffffffffffffffffffffffffffffffffff16612189611901565b73ffffffffffffffffffffffffffffffffffffffff16146121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d6906146b8565b60405180910390fd5b8060038110612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a90614678565b60405180910390fd5b600b826003811061225d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160009054906101000a900460ff16156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a9906147b8565b60405180910390fd5b6001600b83600381106122ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6003020160020160006101000a81548160ff0219169083151502179055505050565b606061231b826126c5565b61235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235190614718565b60405180910390fd5b6000612364612ca6565b9050600081511161238457604051806020016040528060008152506123af565b8061238e84612d38565b60405160200161239f9291906143a2565b6040516020818303038152906040525b915050919050565b60175481565b61271081565b6000601554905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601754146124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249d906145d8565b60405180910390fd5b600044426040516020016124bb9291906143c6565b6040516020818303038152906040528051906020012060001c905060ff816124e39190614bbb565b60016124ef919061493a565b9050804310156124fe57600190505b6000814361250c9190614a1b565b9050612710814060001c6125209190614bbb565b60178190555060006017541415612547576001601754612540919061493a565b6017819055505b5050565b6125536126bd565b73ffffffffffffffffffffffffffffffffffffffff16612571611901565b73ffffffffffffffffffffffffffffffffffffffff16146125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125be906146b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e906144f8565b60405180910390fd5b61264081612b66565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126b657506126b582612ee5565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127a4836115ad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127f5826126c5565b612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b906145b8565b60405180910390fd5b600061283f836115ad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ae57508373ffffffffffffffffffffffffffffffffffffffff1661289684610c58565b73ffffffffffffffffffffffffffffffffffffffff16145b806128bf57506128be81856123cd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e8826115ad565b73ffffffffffffffffffffffffffffffffffffffff161461293e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612935906146f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a590614538565b60405180910390fd5b6129b9838383612fc7565b6129c4600082612731565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a149190614a1b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a6b919061493a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612b3291906149c1565b905092915050565b60008183612b489190614990565b905092915050565b60008183612b5e9190614a1b565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c46828260405180602001604052806000815250612fd7565b5050565b612c558484846128c8565b612c6184848484613032565b612ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c97906144d8565b60405180910390fd5b50505050565b606060198054612cb590614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce190614b05565b8015612d2e5780601f10612d0357610100808354040283529160200191612d2e565b820191906000526020600020905b815481529060010190602001808311612d1157829003601f168201915b5050505050905090565b60606000821415612d80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ee0565b600082905060005b60008214612db2578080612d9b90614b68565b915050600a82612dab9190614990565b9150612d88565b60008167ffffffffffffffff811115612df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e265781602001600182028036833780820191505090505b5090505b60008514612ed957600182612e3f9190614a1b565b9150600a85612e4e9190614bbb565b6030612e5a919061493a565b60f81b818381518110612e96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ed29190614990565b9450612e2a565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fb057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fc05750612fbf826131c9565b5b9050919050565b612fd2838383613233565b505050565b612fe18383613347565b612fee6000848484613032565b61302d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613024906144d8565b60405180910390fd5b505050565b60006130538473ffffffffffffffffffffffffffffffffffffffff16613515565b156131bc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307c6126bd565b8786866040518563ffffffff1660e01b815260040161309e949392919061440d565b602060405180830381600087803b1580156130b857600080fd5b505af19250505080156130e957506040513d601f19601f820116820180604052508101906130e69190613c74565b60015b61316c573d8060008114613119576040519150601f19603f3d011682016040523d82523d6000602084013e61311e565b606091505b50600081511415613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b906144d8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131c1565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61323e838383613528565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132815761327c8161352d565b6132c0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132bf576132be8382613576565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613303576132fe816136e3565b613342565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613341576133408282613826565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ae90614658565b60405180910390fd5b6133c0816126c5565b15613400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f790614518565b60405180910390fd5b61340c60008383612fc7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461345c919061493a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613583846116ed565b61358d9190614a1b565b9050600060076000848152602001908152602001600020549050818114613672576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136f79190614a1b565b905060006009600084815260200190815260200160002054905060006008838154811061374d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613795577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061380a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613831836116ed565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546138b190614b05565b90600052602060002090601f0160209004810192826138d3576000855561391a565b82601f106138ec57805160ff191683800117855561391a565b8280016001018555821561391a579182015b828111156139195782518255916020019190600101906138fe565b5b509050613927919061394e565b5090565b604051806060016040528060608152602001606081526020016000151581525090565b5b8082111561396757600081600090555060010161394f565b5090565b600061397e6139798461483a565b614815565b90508281526020810184848401111561399657600080fd5b6139a1848285614ac3565b509392505050565b60006139bc6139b78461486b565b614815565b9050828152602081018484840111156139d457600080fd5b6139df848285614ac3565b509392505050565b6000813590506139f68161531a565b92915050565b600081359050613a0b81615331565b92915050565b600081359050613a2081615348565b92915050565b600081519050613a3581615348565b92915050565b600082601f830112613a4c57600080fd5b8135613a5c84826020860161396b565b91505092915050565b600082601f830112613a7657600080fd5b8135613a868482602086016139a9565b91505092915050565b600081359050613a9e8161535f565b92915050565b600060208284031215613ab657600080fd5b6000613ac4848285016139e7565b91505092915050565b60008060408385031215613ae057600080fd5b6000613aee858286016139e7565b9250506020613aff858286016139e7565b9150509250929050565b600080600060608486031215613b1e57600080fd5b6000613b2c868287016139e7565b9350506020613b3d868287016139e7565b9250506040613b4e86828701613a8f565b9150509250925092565b60008060008060808587031215613b6e57600080fd5b6000613b7c878288016139e7565b9450506020613b8d878288016139e7565b9350506040613b9e87828801613a8f565b925050606085013567ffffffffffffffff811115613bbb57600080fd5b613bc787828801613a3b565b91505092959194509250565b60008060408385031215613be657600080fd5b6000613bf4858286016139e7565b9250506020613c05858286016139fc565b9150509250929050565b60008060408385031215613c2257600080fd5b6000613c30858286016139e7565b9250506020613c4185828601613a8f565b9150509250929050565b600060208284031215613c5d57600080fd5b6000613c6b84828501613a11565b91505092915050565b600060208284031215613c8657600080fd5b6000613c9484828501613a26565b91505092915050565b600060208284031215613caf57600080fd5b600082013567ffffffffffffffff811115613cc957600080fd5b613cd584828501613a65565b91505092915050565b600060208284031215613cf057600080fd5b6000613cfe84828501613a8f565b91505092915050565b60008060408385031215613d1a57600080fd5b6000613d2885828601613a8f565b9250506020613d39858286016139e7565b9150509250929050565b60008060408385031215613d5657600080fd5b6000613d6485828601613a8f565b9250506020613d7585828601613a8f565b9150509250929050565b600080600060608486031215613d9457600080fd5b6000613da286828701613a8f565b9350506020613db386828701613a8f565b9250506040613dc486828701613a8f565b9150509250925092565b6000613dda838361436d565b60208301905092915050565b613def81614a4f565b82525050565b6000613e00826148ac565b613e0a81856148da565b9350613e158361489c565b8060005b83811015613e46578151613e2d8882613dce565b9750613e38836148cd565b925050600181019050613e19565b5085935050505092915050565b6000613e5e826148ac565b613e6881856148eb565b9350613e738361489c565b8060005b83811015613ea4578151613e8b8882613dce565b9750613e96836148cd565b925050600181019050613e77565b5085935050505092915050565b613eba81614a61565b82525050565b613ec981614a61565b82525050565b6000613eda826148b7565b613ee481856148fc565b9350613ef4818560208601614ad2565b613efd81614ca8565b840191505092915050565b6000613f13826148c2565b613f1d818561490d565b9350613f2d818560208601614ad2565b613f3681614ca8565b840191505092915050565b6000613f4c826148c2565b613f56818561491e565b9350613f66818560208601614ad2565b613f6f81614ca8565b840191505092915050565b6000613f85826148c2565b613f8f818561492f565b9350613f9f818560208601614ad2565b80840191505092915050565b6000613fb8602b8361491e565b9150613fc382614cb9565b604082019050919050565b6000613fdb60328361491e565b9150613fe682614d08565b604082019050919050565b6000613ffe60268361491e565b915061400982614d57565b604082019050919050565b6000614021601c8361491e565b915061402c82614da6565b602082019050919050565b600061404460248361491e565b915061404f82614dcf565b604082019050919050565b600061406760198361491e565b915061407282614e1e565b602082019050919050565b600061408a602c8361491e565b915061409582614e47565b604082019050919050565b60006140ad60198361491e565b91506140b882614e96565b602082019050919050565b60006140d0602c8361491e565b91506140db82614ebf565b604082019050919050565b60006140f3601d8361491e565b91506140fe82614f0e565b602082019050919050565b600061411660388361491e565b915061412182614f37565b604082019050919050565b6000614139602a8361491e565b915061414482614f86565b604082019050919050565b600061415c60298361491e565b915061416782614fd5565b604082019050919050565b600061417f60208361491e565b915061418a82615024565b602082019050919050565b60006141a260198361491e565b91506141ad8261504d565b602082019050919050565b60006141c5602c8361491e565b91506141d082615076565b604082019050919050565b60006141e860208361491e565b91506141f3826150c5565b602082019050919050565b600061420b60178361491e565b9150614216826150ee565b602082019050919050565b600061422e60298361491e565b915061423982615117565b604082019050919050565b6000614251602f8361491e565b915061425c82615166565b604082019050919050565b600061427460218361491e565b915061427f826151b5565b604082019050919050565b600061429760238361491e565b91506142a282615204565b604082019050919050565b60006142ba60318361491e565b91506142c582615253565b604082019050919050565b60006142dd602c8361491e565b91506142e8826152a2565b604082019050919050565b6000614300600f8361491e565b915061430b826152f1565b602082019050919050565b600060608301600083015184820360008601526143338282613f08565b9150506020830151848203602086015261434d8282613df5565b91505060408301516143626040860182613eb1565b508091505092915050565b61437681614ab9565b82525050565b61438581614ab9565b82525050565b61439c61439782614ab9565b614bb1565b82525050565b60006143ae8285613f7a565b91506143ba8284613f7a565b91508190509392505050565b60006143d2828561438b565b6020820191506143e2828461438b565b6020820191508190509392505050565b60006020820190506144076000830184613de6565b92915050565b60006080820190506144226000830187613de6565b61442f6020830186613de6565b61443c604083018561437c565b818103606083015261444e8184613ecf565b905095945050505050565b600060208201905081810360008301526144738184613e53565b905092915050565b60006020820190506144906000830184613ec0565b92915050565b600060208201905081810360008301526144b08184613f41565b905092915050565b600060208201905081810360008301526144d181613fab565b9050919050565b600060208201905081810360008301526144f181613fce565b9050919050565b6000602082019050818103600083015261451181613ff1565b9050919050565b6000602082019050818103600083015261453181614014565b9050919050565b6000602082019050818103600083015261455181614037565b9050919050565b600060208201905081810360008301526145718161405a565b9050919050565b600060208201905081810360008301526145918161407d565b9050919050565b600060208201905081810360008301526145b1816140a0565b9050919050565b600060208201905081810360008301526145d1816140c3565b9050919050565b600060208201905081810360008301526145f1816140e6565b9050919050565b6000602082019050818103600083015261461181614109565b9050919050565b600060208201905081810360008301526146318161412c565b9050919050565b600060208201905081810360008301526146518161414f565b9050919050565b6000602082019050818103600083015261467181614172565b9050919050565b6000602082019050818103600083015261469181614195565b9050919050565b600060208201905081810360008301526146b1816141b8565b9050919050565b600060208201905081810360008301526146d1816141db565b9050919050565b600060208201905081810360008301526146f1816141fe565b9050919050565b6000602082019050818103600083015261471181614221565b9050919050565b6000602082019050818103600083015261473181614244565b9050919050565b6000602082019050818103600083015261475181614267565b9050919050565b600060208201905081810360008301526147718161428a565b9050919050565b60006020820190508181036000830152614791816142ad565b9050919050565b600060208201905081810360008301526147b1816142d0565b9050919050565b600060208201905081810360008301526147d1816142f3565b9050919050565b600060208201905081810360008301526147f28184614316565b905092915050565b600060208201905061480f600083018461437c565b92915050565b600061481f614830565b905061482b8282614b37565b919050565b6000604051905090565b600067ffffffffffffffff82111561485557614854614c79565b5b61485e82614ca8565b9050602081019050919050565b600067ffffffffffffffff82111561488657614885614c79565b5b61488f82614ca8565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061494582614ab9565b915061495083614ab9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561498557614984614bec565b5b828201905092915050565b600061499b82614ab9565b91506149a683614ab9565b9250826149b6576149b5614c1b565b5b828204905092915050565b60006149cc82614ab9565b91506149d783614ab9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1057614a0f614bec565b5b828202905092915050565b6000614a2682614ab9565b9150614a3183614ab9565b925082821015614a4457614a43614bec565b5b828203905092915050565b6000614a5a82614a99565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614af0578082015181840152602081019050614ad5565b83811115614aff576000848401525b50505050565b60006002820490506001821680614b1d57607f821691505b60208210811415614b3157614b30614c4a565b5b50919050565b614b4082614ca8565b810181811067ffffffffffffffff82111715614b5f57614b5e614c79565b5b80604052505050565b6000614b7382614ab9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ba657614ba5614bec565b5b600182019050919050565b6000819050919050565b6000614bc682614ab9565b9150614bd183614ab9565b925082614be157614be0614c1b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20323020546f6b60008201527f656e73206174206f6e6365210000000000000000000000000000000000000000602082015250565b7f496e636f6e73697374656e7420616d6f756e742073656e742100000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5468697320636c756220646f6573206e6f742065786973742e00000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f75676820546f6b656e73206c6566742e000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468617420776f756c642065786365656420746865206d61782072657365727660008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436c7562206973206c6f636b65642e0000000000000000000000000000000000600082015250565b61532381614a4f565b811461532e57600080fd5b50565b61533a81614a61565b811461534557600080fd5b50565b61535181614a6d565b811461535c57600080fd5b50565b61536881614ab9565b811461537357600080fd5b5056fea2646970667358221220b39f7fea283f2289486646fbb6fee6c6403c62767b6f87d22c96cd11facb44f664736f6c63430008040033

Deployed Bytecode Sourcemap

52262:4417:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56464:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10883:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32543:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34102:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33625:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52497:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54320:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46298:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34992:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45966:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55991:253;;;;;;;;;;;;;:::i;:::-;;35402:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54501:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46488:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53710:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10757:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53615:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32237:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52606:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31967:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9495:94;;;;;;;;;;;;;:::i;:::-;;53417:190;;;;;;;;;;;;;:::i;:::-;;8844:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53984:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32712:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54085:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52934:475;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34395:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11373:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54851:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35658:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11773:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32887:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52537:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52366:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54174:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34761:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55218:764;;;;;;;;;;;;;:::i;:::-;;9744:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56464:212;56603:4;56632:36;56656:11;56632:23;:36::i;:::-;56625:43;;56464:212;;;:::o;10883:482::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10964:2:::1;10349:17;10344:2;:22;10336:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;10988:10:::2;10999:2;10988:14;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;10987:22;10979:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11042:20;11086:9:::0;11081:180:::2;11101:10;11112:2;11101:14;;;;;;;;;;;;;;;;;;:21;;:28;;;;11097:1;:32;11081:180;;;11183:8;11155:10;11166:2;11155:14;;;;;;;;;;;;;;;;;;:21;;11177:1;11155:24;;;;;;;;;;;;;;;;;;;;;;;;:36;11151:99;;;11230:4;11212:22;;11151:99;11131:3;;;;;:::i;:::-;;;;11081:180;;;;11278:15;11273:85;;11310:10;11321:2;11310:14;;;;;;;;;;;;;;;;;;:21;;11337:8;11310:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11273:85;10407:1;9135::::1;10883:482:::0;;:::o;32543:100::-;32597:13;32630:5;32623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32543:100;:::o;34102:221::-;34178:7;34206:16;34214:7;34206;:16::i;:::-;34198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34291:15;:24;34307:7;34291:24;;;;;;;;;;;;;;;;;;;;;34284:31;;34102:221;;;:::o;33625:411::-;33706:13;33722:23;33737:7;33722:14;:23::i;:::-;33706:39;;33770:5;33764:11;;:2;:11;;;;33756:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33864:5;33848:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33873:37;33890:5;33897:12;:10;:12::i;:::-;33873:16;:37::i;:::-;33848:62;33826:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34007:21;34016:2;34020:7;34007:8;:21::i;:::-;33625:411;;;:::o;52497:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54320:124::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54422:14:::1;54405;:31;;;;;;;;;;;;:::i;:::-;;54320:124:::0;:::o;46298:113::-;46359:7;46386:10;:17;;;;46379:24;;46298:113;:::o;34992:339::-;35187:41;35206:12;:10;:12::i;:::-;35220:7;35187:18;:41::i;:::-;35179:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35295:28;35305:4;35311:2;35315:7;35295:9;:28::i;:::-;34992:339;;;:::o;45966:256::-;46063:7;46099:23;46116:5;46099:16;:23::i;:::-;46091:5;:31;46083:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46188:12;:19;46201:5;46188:19;;;;;;;;;;;;;;;:26;46208:5;46188:26;;;;;;;;;;;;46181:33;;45966:256;;;;:::o;55991:253::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56039:16:::1;56058:21;56039:40;;56090:14;56107:25;56128:3;56107:16;56120:2;56107:8;:12;;:16;;;;:::i;:::-;:20;;:25;;;;:::i;:::-;56090:42;;56161:2;;;;;;;;;;;56153:16;;:24;56170:6;56153:24;;;;;;;;;;;;;;;;;;;;;;;56145:33;;;::::0;::::1;;56205:2;;;;;;;;;;;56197:16;;:38;56214:20;56227:6;56214:8;:12;;:20;;;;:::i;:::-;56197:38;;;;;;;;;;;;;;;;;;;;;;;56189:47;;;::::0;::::1;;9135:1;;55991:253::o:0;35402:185::-;35540:39;35557:4;35563:2;35567:7;35540:39;;;;;;;;;;;;:16;:39::i;:::-;35402:185;;;:::o;54501:342::-;54560:16;54589:18;54610:17;54620:6;54610:9;:17::i;:::-;54589:38;;54640:25;54682:10;54668:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54640:53;;54708:9;54704:106;54723:10;54719:1;:14;54704:106;;;54768:30;54788:6;54796:1;54768:19;:30::i;:::-;54754:8;54763:1;54754:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;54735:3;;;;;:::i;:::-;;;;54704:106;;;;54827:8;54820:15;;;;54501:342;;;:::o;46488:233::-;46563:7;46599:30;:28;:30::i;:::-;46591:5;:38;46583:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46696:10;46707:5;46696:17;;;;;;;;;;;;;;;;;;;;;;;;46689:24;;46488:233;;;:::o;53710:92::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53790:4:::1;53780:7;:14;;;;;;;;;;;;:::i;:::-;;53710:92:::0;:::o;10757:118::-;10822:11;;:::i;:::-;10810:2;10349:17;10344:2;:22;10336:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;10853:10:::1;10864:2;10853:14;;;;;;;;;;;;;;;;;;10846:21;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;10757:118:::0;;;;:::o;53615:87::-;53658:4;53682:12;;;;;;;;;;;53675:19;;53615:87;:::o;32237:239::-;32309:7;32329:13;32345:7;:16;32353:7;32345:16;;;;;;;;;;;;;;;;;;;;;32329:32;;32397:1;32380:19;;:5;:19;;;;32372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32463:5;32456:12;;;32237:239;;;:::o;52606:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31967:208::-;32039:7;32084:1;32067:19;;:5;:19;;;;32059:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32151:9;:16;32161:5;32151:16;;;;;;;;;;;;;;;;32144:23;;31967:208;;;:::o;9495:94::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9560:21:::1;9578:1;9560:9;:21::i;:::-;9495:94::o:0;53417:190::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53490:12:::1;;;;;;;;;;;53489:13;53474:12;;:28;;;;;;;;;;;;;;;;;;53519:12;;;;;;;;;;;:34;;;;;53552:1;53535:13;;:18;53519:34;53515:85;;;53570:18;:16;:18::i;:::-;53515:85;53417:190::o:0;8844:87::-;8890:7;8917:6;;;;;;;;;;;8910:13;;8844:87;:::o;53984:93::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:9:::1;54051:6;:18;;;;53984:93:::0;:::o;32712:104::-;32768:13;32801:7;32794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32712:104;:::o;54085:81::-;54126:7;54152:6;;54145:13;;54085:81;:::o;52934:475::-;52893:12;;;;;;;;;;;52885:21;;;;;;53011:14:::1;53028:13;:11;:13::i;:::-;53011:30;;53072:2;53060:9;:14;53052:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53176:9;;52402:5;53164:21;;;;:::i;:::-;53151:9;53142:6;:18;;;;:::i;:::-;:43;;53134:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53254:9;53244:6;;53232:9;:18;;;;:::i;:::-;:31;;53224:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53311:9;53306:96;53326:9;53322:1;:13;53306:96;;;53357:33;53367:10;53388:1;53379:6;:10;;;;:::i;:::-;53357:9;:33::i;:::-;53337:3;;;;;:::i;:::-;;;;53306:96;;;;52917:1;52934:475:::0;:::o;34395:295::-;34510:12;:10;:12::i;:::-;34498:24;;:8;:24;;;;34490:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34610:8;34565:18;:32;34584:12;:10;:12::i;:::-;34565:32;;;;;;;;;;;;;;;:42;34598:8;34565:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34663:8;34634:48;;34649:12;:10;:12::i;:::-;34634:48;;;34673:8;34634:48;;;;;;:::i;:::-;;;;;;;;34395:295;;:::o;11373:392::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11481:2:::1;10349:17;10344:2;:22;10336:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11505:10:::2;11516:2;11505:14;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;11504:22;11496:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11564:9;11559:199;11579:10;11590:2;11579:14;;;;;;;;;;;;;;;;;;:21;;:28;;;;11575:1;:32;11559:199;;;11661:11;11633:10;11644:2;11633:14;;;;;;;;;;;;;;;;;;:21;;11655:1;11633:24;;;;;;;;;;;;;;;;;;;;;;;;:39;11629:118;;;11720:11;11693:10;11704:2;11693:14;;;;;;;;;;;;;;;;;;:21;;11715:1;11693:24;;;;;;;;;;;;;;;;;;;;;;;:38;;;;11629:118;11609:3;;;;;:::i;:::-;;;;11559:199;;;;9135:1:::1;11373:392:::0;;;:::o;54851:359::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54959:9:::1;;54948:7;:20;;54940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55021:16;55040:13;:11;:13::i;:::-;55021:32;;55069:9;55064:95;55084:7;55080:1;:11;55064:95;;;55113:34;55123:9;55145:1;55134:8;:12;;;;:::i;:::-;55113:9;:34::i;:::-;55093:3;;;;;:::i;:::-;;;;55064:95;;;;55195:7;55183:9;;:19;;;;:::i;:::-;55171:9;:31;;;;9135:1;54851:359:::0;;:::o;35658:328::-;35833:41;35852:12;:10;:12::i;:::-;35866:7;35833:18;:41::i;:::-;35825:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35939:39;35953:4;35959:2;35963:7;35972:5;35939:13;:39::i;:::-;35658:328;;;;:::o;11773:173::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11832:2:::1;10349:17;10344:2;:22;10336:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11856:10:::2;11867:2;11856:14;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;11855:22;11847:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11934:4;11910:10;11921:2;11910:14;;;;;;;;;;;;;;;;;;:21;;;:28;;;;;;;;;;;;;;;;;;9135:1:::1;11773:173:::0;:::o;32887:334::-;32960:13;32994:16;33002:7;32994;:16::i;:::-;32986:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33075:21;33099:10;:8;:10::i;:::-;33075:34;;33151:1;33133:7;33127:21;:25;:86;;;;;;;;;;;;;;;;;33179:7;33188:18;:7;:16;:18::i;:::-;33162:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33127:86;33120:93;;;32887:334;;;:::o;52537:28::-;;;;:::o;52366:41::-;52402:5;52366:41;:::o;54174:92::-;54222:7;54249:9;;54242:16;;54174:92;:::o;34761:164::-;34858:4;34882:18;:25;34901:5;34882:25;;;;;;;;;;;;;;;:35;34908:8;34882:35;;;;;;;;;;;;;;;;;;;;;;;;;34875:42;;34761:164;;;;:::o;55218:764::-;55289:1;55272:13;;:18;55264:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55402:20;55457:16;55475:15;55440:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55430:62;;;;;;55425:68;;55402:91;;55540:3;55525:12;:18;;;;:::i;:::-;55520:1;:24;;;;:::i;:::-;55504:40;;55658:12;55643;:27;55639:76;;;55702:1;55687:16;;55639:76;55727:18;55763:12;55748;:27;;;;:::i;:::-;55727:48;;52402:5;55817:10;55807:21;55802:27;;:39;;;;:::i;:::-;55786:13;:55;;;;55912:1;55895:13;;:18;55891:84;;;55962:1;55946:13;;:17;;;;:::i;:::-;55930:13;:33;;;;55891:84;55218:764;;:::o;9744:192::-;9075:12;:10;:12::i;:::-;9064:23;;:7;:5;:7::i;:::-;:23;;;9056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9853:1:::1;9833:22;;:8;:22;;;;9825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9909:19;9919:8;9909:9;:19::i;:::-;9744:192:::0;:::o;45658:224::-;45760:4;45799:35;45784:50;;;:11;:50;;;;:90;;;;45838:36;45862:11;45838:23;:36::i;:::-;45784:90;45777:97;;45658:224;;;:::o;7626:98::-;7679:7;7706:10;7699:17;;7626:98;:::o;37496:127::-;37561:4;37613:1;37585:30;;:7;:16;37593:7;37585:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37578:37;;37496:127;;;:::o;41478:174::-;41580:2;41553:15;:24;41569:7;41553:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41636:7;41632:2;41598:46;;41607:23;41622:7;41607:14;:23::i;:::-;41598:46;;;;;;;;;;;;41478:174;;:::o;37790:348::-;37883:4;37908:16;37916:7;37908;:16::i;:::-;37900:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37984:13;38000:23;38015:7;38000:14;:23::i;:::-;37984:39;;38053:5;38042:16;;:7;:16;;;:51;;;;38086:7;38062:31;;:20;38074:7;38062:11;:20::i;:::-;:31;;;38042:51;:87;;;;38097:32;38114:5;38121:7;38097:16;:32::i;:::-;38042:87;38034:96;;;37790:348;;;;:::o;40782:578::-;40941:4;40914:31;;:23;40929:7;40914:14;:23::i;:::-;:31;;;40906:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41024:1;41010:16;;:2;:16;;;;41002:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41080:39;41101:4;41107:2;41111:7;41080:20;:39::i;:::-;41184:29;41201:1;41205:7;41184:8;:29::i;:::-;41245:1;41226:9;:15;41236:4;41226:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41274:1;41257:9;:13;41267:2;41257:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41305:2;41286:7;:16;41294:7;41286:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41344:7;41340:2;41325:27;;41334:4;41325:27;;;;;;;;;;;;40782:578;;;:::o;3567:98::-;3625:7;3656:1;3652;:5;;;;:::i;:::-;3645:12;;3567:98;;;;:::o;3966:::-;4024:7;4055:1;4051;:5;;;;:::i;:::-;4044:12;;3966:98;;;;:::o;3210:::-;3268:7;3299:1;3295;:5;;;;:::i;:::-;3288:12;;3210:98;;;;:::o;9944:173::-;10000:16;10019:6;;;;;;;;;;;10000:25;;10045:8;10036:6;;:17;;;;;;;;;;;;;;;;;;10100:8;10069:40;;10090:8;10069:40;;;;;;;;;;;;9944:173;;:::o;38480:110::-;38556:26;38566:2;38570:7;38556:26;;;;;;;;;;;;:9;:26::i;:::-;38480:110;;:::o;36868:315::-;37025:28;37035:4;37041:2;37045:7;37025:9;:28::i;:::-;37072:48;37095:4;37101:2;37105:7;37114:5;37072:22;:48::i;:::-;37064:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36868:315;;;;:::o;53810:107::-;53869:13;53902:7;53895:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53810:107;:::o;27533:723::-;27589:13;27819:1;27810:5;:10;27806:53;;;27837:10;;;;;;;;;;;;;;;;;;;;;27806:53;27869:12;27884:5;27869:20;;27900:14;27925:78;27940:1;27932:4;:9;27925:78;;27958:8;;;;;:::i;:::-;;;;27989:2;27981:10;;;;;:::i;:::-;;;27925:78;;;28013:19;28045:6;28035:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28013:39;;28063:154;28079:1;28070:5;:10;28063:154;;28107:1;28097:11;;;;;:::i;:::-;;;28174:2;28166:5;:10;;;;:::i;:::-;28153:2;:24;;;;:::i;:::-;28140:39;;28123:6;28130;28123:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;28203:2;28194:11;;;;;:::i;:::-;;;28063:154;;;28241:6;28227:21;;;;;27533:723;;;;:::o;31598:305::-;31700:4;31752:25;31737:40;;;:11;:40;;;;:105;;;;31809:33;31794:48;;;:11;:48;;;;31737:105;:158;;;;31859:36;31883:11;31859:23;:36::i;:::-;31737:158;31717:178;;31598:305;;;:::o;56252:204::-;56403:45;56430:4;56436:2;56440:7;56403:26;:45::i;:::-;56252:204;;;:::o;38817:321::-;38947:18;38953:2;38957:7;38947:5;:18::i;:::-;38998:54;39029:1;39033:2;39037:7;39046:5;38998:22;:54::i;:::-;38976:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38817:321;;;:::o;42217:803::-;42372:4;42393:15;:2;:13;;;:15::i;:::-;42389:624;;;42445:2;42429:36;;;42466:12;:10;:12::i;:::-;42480:4;42486:7;42495:5;42429:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42425:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42692:1;42675:6;:13;:18;42671:272;;;42718:60;;;;;;;;;;:::i;:::-;;;;;;;;42671:272;42893:6;42887:13;42878:6;42874:2;42870:15;42863:38;42425:533;42562:45;;;42552:55;;;:6;:55;;;;42545:62;;;;;42389:624;42997:4;42990:11;;42217:803;;;;;;;:::o;30096:157::-;30181:4;30220:25;30205:40;;;:11;:40;;;;30198:47;;30096:157;;;:::o;47334:589::-;47478:45;47505:4;47511:2;47515:7;47478:26;:45::i;:::-;47556:1;47540:18;;:4;:18;;;47536:187;;;47575:40;47607:7;47575:31;:40::i;:::-;47536:187;;;47645:2;47637:10;;:4;:10;;;47633:90;;47664:47;47697:4;47703:7;47664:32;:47::i;:::-;47633:90;47536:187;47751:1;47737:16;;:2;:16;;;47733:183;;;47770:45;47807:7;47770:36;:45::i;:::-;47733:183;;;47843:4;47837:10;;:2;:10;;;47833:83;;47864:40;47892:2;47896:7;47864:27;:40::i;:::-;47833:83;47733:183;47334:589;;;:::o;39474:382::-;39568:1;39554:16;;:2;:16;;;;39546:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39627:16;39635:7;39627;:16::i;:::-;39626:17;39618:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39689:45;39718:1;39722:2;39726:7;39689:20;:45::i;:::-;39764:1;39747:9;:13;39757:2;39747:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39795:2;39776:7;:16;39784:7;39776:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39840:7;39836:2;39815:33;;39832:1;39815:33;;;;;;;;;;;;39474:382;;:::o;20100:387::-;20160:4;20368:12;20435:7;20423:20;20415:28;;20478:1;20471:4;:8;20464:15;;;20100:387;;;:::o;43592:126::-;;;;:::o;48646:164::-;48750:10;:17;;;;48723:15;:24;48739:7;48723:24;;;;;;;;;;;:44;;;;48778:10;48794:7;48778:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48646:164;:::o;49437:988::-;49703:22;49753:1;49728:22;49745:4;49728:16;:22::i;:::-;:26;;;;:::i;:::-;49703:51;;49765:18;49786:17;:26;49804:7;49786:26;;;;;;;;;;;;49765:47;;49933:14;49919:10;:28;49915:328;;49964:19;49986:12;:18;49999:4;49986:18;;;;;;;;;;;;;;;:34;50005:14;49986:34;;;;;;;;;;;;49964:56;;50070:11;50037:12;:18;50050:4;50037:18;;;;;;;;;;;;;;;:30;50056:10;50037:30;;;;;;;;;;;:44;;;;50187:10;50154:17;:30;50172:11;50154:30;;;;;;;;;;;:43;;;;49915:328;;50339:17;:26;50357:7;50339:26;;;;;;;;;;;50332:33;;;50383:12;:18;50396:4;50383:18;;;;;;;;;;;;;;;:34;50402:14;50383:34;;;;;;;;;;;50376:41;;;49437:988;;;;:::o;50720:1079::-;50973:22;51018:1;50998:10;:17;;;;:21;;;;:::i;:::-;50973:46;;51030:18;51051:15;:24;51067:7;51051:24;;;;;;;;;;;;51030:45;;51402:19;51424:10;51435:14;51424:26;;;;;;;;;;;;;;;;;;;;;;;;51402:48;;51488:11;51463:10;51474;51463:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;51599:10;51568:15;:28;51584:11;51568:28;;;;;;;;;;;:41;;;;51740:15;:24;51756:7;51740:24;;;;;;;;;;;51733:31;;;51775:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50720:1079;;;;:::o;48224:221::-;48309:14;48326:20;48343:2;48326:16;:20::i;:::-;48309:37;;48384:7;48357:12;:16;48370:2;48357:16;;;;;;;;;;;;;;;:24;48374:6;48357:24;;;;;;;;;;;:34;;;;48431:6;48402:17;:26;48420:7;48402:26;;;;;;;;;;;:35;;;;48224:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:407::-;6154:6;6162;6211:2;6199:9;6190:7;6186:23;6182:32;6179:2;;;6227:1;6224;6217:12;6179:2;6270:1;6295:53;6340:7;6331:6;6320:9;6316:22;6295:53;:::i;:::-;6285:63;;6241:117;6397:2;6423:53;6468:7;6459:6;6448:9;6444:22;6423:53;:::i;:::-;6413:63;;6368:118;6169:324;;;;;:::o;6499:407::-;6567:6;6575;6624:2;6612:9;6603:7;6599:23;6595:32;6592:2;;;6640:1;6637;6630:12;6592:2;6683:1;6708:53;6753:7;6744:6;6733:9;6729:22;6708:53;:::i;:::-;6698:63;;6654:117;6810:2;6836:53;6881:7;6872:6;6861:9;6857:22;6836:53;:::i;:::-;6826:63;;6781:118;6582:324;;;;;:::o;6912:552::-;6989:6;6997;7005;7054:2;7042:9;7033:7;7029:23;7025:32;7022:2;;;7070:1;7067;7060:12;7022:2;7113:1;7138:53;7183:7;7174:6;7163:9;7159:22;7138:53;:::i;:::-;7128:63;;7084:117;7240:2;7266:53;7311:7;7302:6;7291:9;7287:22;7266:53;:::i;:::-;7256:63;;7211:118;7368:2;7394:53;7439:7;7430:6;7419:9;7415:22;7394:53;:::i;:::-;7384:63;;7339:118;7012:452;;;;;:::o;7470:179::-;7539:10;7560:46;7602:3;7594:6;7560:46;:::i;:::-;7638:4;7633:3;7629:14;7615:28;;7550:99;;;;:::o;7655:118::-;7742:24;7760:5;7742:24;:::i;:::-;7737:3;7730:37;7720:53;;:::o;7809:712::-;7918:3;7947:54;7995:5;7947:54;:::i;:::-;8017:76;8086:6;8081:3;8017:76;:::i;:::-;8010:83;;8117:56;8167:5;8117:56;:::i;:::-;8196:7;8227:1;8212:284;8237:6;8234:1;8231:13;8212:284;;;8313:6;8307:13;8340:63;8399:3;8384:13;8340:63;:::i;:::-;8333:70;;8426:60;8479:6;8426:60;:::i;:::-;8416:70;;8272:224;8259:1;8256;8252:9;8247:14;;8212:284;;;8216:14;8512:3;8505:10;;7923:598;;;;;;;:::o;8557:732::-;8676:3;8705:54;8753:5;8705:54;:::i;:::-;8775:86;8854:6;8849:3;8775:86;:::i;:::-;8768:93;;8885:56;8935:5;8885:56;:::i;:::-;8964:7;8995:1;8980:284;9005:6;9002:1;8999:13;8980:284;;;9081:6;9075:13;9108:63;9167:3;9152:13;9108:63;:::i;:::-;9101:70;;9194:60;9247:6;9194:60;:::i;:::-;9184:70;;9040:224;9027:1;9024;9020:9;9015:14;;8980:284;;;8984:14;9280:3;9273:10;;8681:608;;;;;;;:::o;9295:99::-;9366:21;9381:5;9366:21;:::i;:::-;9361:3;9354:34;9344:50;;:::o;9400:109::-;9481:21;9496:5;9481:21;:::i;:::-;9476:3;9469:34;9459:50;;:::o;9515:360::-;9601:3;9629:38;9661:5;9629:38;:::i;:::-;9683:70;9746:6;9741:3;9683:70;:::i;:::-;9676:77;;9762:52;9807:6;9802:3;9795:4;9788:5;9784:16;9762:52;:::i;:::-;9839:29;9861:6;9839:29;:::i;:::-;9834:3;9830:39;9823:46;;9605:270;;;;;:::o;9881:344::-;9959:3;9987:39;10020:5;9987:39;:::i;:::-;10042:61;10096:6;10091:3;10042:61;:::i;:::-;10035:68;;10112:52;10157:6;10152:3;10145:4;10138:5;10134:16;10112:52;:::i;:::-;10189:29;10211:6;10189:29;:::i;:::-;10184:3;10180:39;10173:46;;9963:262;;;;;:::o;10231:364::-;10319:3;10347:39;10380:5;10347:39;:::i;:::-;10402:71;10466:6;10461:3;10402:71;:::i;:::-;10395:78;;10482:52;10527:6;10522:3;10515:4;10508:5;10504:16;10482:52;:::i;:::-;10559:29;10581:6;10559:29;:::i;:::-;10554:3;10550:39;10543:46;;10323:272;;;;;:::o;10601:377::-;10707:3;10735:39;10768:5;10735:39;:::i;:::-;10790:89;10872:6;10867:3;10790:89;:::i;:::-;10783:96;;10888:52;10933:6;10928:3;10921:4;10914:5;10910:16;10888:52;:::i;:::-;10965:6;10960:3;10956:16;10949:23;;10711:267;;;;;:::o;10984:366::-;11126:3;11147:67;11211:2;11206:3;11147:67;:::i;:::-;11140:74;;11223:93;11312:3;11223:93;:::i;:::-;11341:2;11336:3;11332:12;11325:19;;11130:220;;;:::o;11356:366::-;11498:3;11519:67;11583:2;11578:3;11519:67;:::i;:::-;11512:74;;11595:93;11684:3;11595:93;:::i;:::-;11713:2;11708:3;11704:12;11697:19;;11502:220;;;:::o;11728:366::-;11870:3;11891:67;11955:2;11950:3;11891:67;:::i;:::-;11884:74;;11967:93;12056:3;11967:93;:::i;:::-;12085:2;12080:3;12076:12;12069:19;;11874:220;;;:::o;12100:366::-;12242:3;12263:67;12327:2;12322:3;12263:67;:::i;:::-;12256:74;;12339:93;12428:3;12339:93;:::i;:::-;12457:2;12452:3;12448:12;12441:19;;12246:220;;;:::o;12472:366::-;12614:3;12635:67;12699:2;12694:3;12635:67;:::i;:::-;12628:74;;12711:93;12800:3;12711:93;:::i;:::-;12829:2;12824:3;12820:12;12813:19;;12618:220;;;:::o;12844:366::-;12986:3;13007:67;13071:2;13066:3;13007:67;:::i;:::-;13000:74;;13083:93;13172:3;13083:93;:::i;:::-;13201:2;13196:3;13192:12;13185:19;;12990:220;;;:::o;13216:366::-;13358:3;13379:67;13443:2;13438:3;13379:67;:::i;:::-;13372:74;;13455:93;13544:3;13455:93;:::i;:::-;13573:2;13568:3;13564:12;13557:19;;13362:220;;;:::o;13588:366::-;13730:3;13751:67;13815:2;13810:3;13751:67;:::i;:::-;13744:74;;13827:93;13916:3;13827:93;:::i;:::-;13945:2;13940:3;13936:12;13929:19;;13734:220;;;:::o;13960:366::-;14102:3;14123:67;14187:2;14182:3;14123:67;:::i;:::-;14116:74;;14199:93;14288:3;14199:93;:::i;:::-;14317:2;14312:3;14308:12;14301:19;;14106:220;;;:::o;14332:366::-;14474:3;14495:67;14559:2;14554:3;14495:67;:::i;:::-;14488:74;;14571:93;14660:3;14571:93;:::i;:::-;14689:2;14684:3;14680:12;14673:19;;14478:220;;;:::o;14704:366::-;14846:3;14867:67;14931:2;14926:3;14867:67;:::i;:::-;14860:74;;14943:93;15032:3;14943:93;:::i;:::-;15061:2;15056:3;15052:12;15045:19;;14850:220;;;:::o;15076:366::-;15218:3;15239:67;15303:2;15298:3;15239:67;:::i;:::-;15232:74;;15315:93;15404:3;15315:93;:::i;:::-;15433:2;15428:3;15424:12;15417:19;;15222:220;;;:::o;15448:366::-;15590:3;15611:67;15675:2;15670:3;15611:67;:::i;:::-;15604:74;;15687:93;15776:3;15687:93;:::i;:::-;15805:2;15800:3;15796:12;15789:19;;15594:220;;;:::o;15820:366::-;15962:3;15983:67;16047:2;16042:3;15983:67;:::i;:::-;15976:74;;16059:93;16148:3;16059:93;:::i;:::-;16177:2;16172:3;16168:12;16161:19;;15966:220;;;:::o;16192:366::-;16334:3;16355:67;16419:2;16414:3;16355:67;:::i;:::-;16348:74;;16431:93;16520:3;16431:93;:::i;:::-;16549:2;16544:3;16540:12;16533:19;;16338:220;;;:::o;16564:366::-;16706:3;16727:67;16791:2;16786:3;16727:67;:::i;:::-;16720:74;;16803:93;16892:3;16803:93;:::i;:::-;16921:2;16916:3;16912:12;16905:19;;16710:220;;;:::o;16936:366::-;17078:3;17099:67;17163:2;17158:3;17099:67;:::i;:::-;17092:74;;17175:93;17264:3;17175:93;:::i;:::-;17293:2;17288:3;17284:12;17277:19;;17082:220;;;:::o;17308:366::-;17450:3;17471:67;17535:2;17530:3;17471:67;:::i;:::-;17464:74;;17547:93;17636:3;17547:93;:::i;:::-;17665:2;17660:3;17656:12;17649:19;;17454:220;;;:::o;17680:366::-;17822:3;17843:67;17907:2;17902:3;17843:67;:::i;:::-;17836:74;;17919:93;18008:3;17919:93;:::i;:::-;18037:2;18032:3;18028:12;18021:19;;17826:220;;;:::o;18052:366::-;18194:3;18215:67;18279:2;18274:3;18215:67;:::i;:::-;18208:74;;18291:93;18380:3;18291:93;:::i;:::-;18409:2;18404:3;18400:12;18393:19;;18198:220;;;:::o;18424:366::-;18566:3;18587:67;18651:2;18646:3;18587:67;:::i;:::-;18580:74;;18663:93;18752:3;18663:93;:::i;:::-;18781:2;18776:3;18772:12;18765:19;;18570:220;;;:::o;18796:366::-;18938:3;18959:67;19023:2;19018:3;18959:67;:::i;:::-;18952:74;;19035:93;19124:3;19035:93;:::i;:::-;19153:2;19148:3;19144:12;19137:19;;18942:220;;;:::o;19168:366::-;19310:3;19331:67;19395:2;19390:3;19331:67;:::i;:::-;19324:74;;19407:93;19496:3;19407:93;:::i;:::-;19525:2;19520:3;19516:12;19509:19;;19314:220;;;:::o;19540:366::-;19682:3;19703:67;19767:2;19762:3;19703:67;:::i;:::-;19696:74;;19779:93;19868:3;19779:93;:::i;:::-;19897:2;19892:3;19888:12;19881:19;;19686:220;;;:::o;19912:366::-;20054:3;20075:67;20139:2;20134:3;20075:67;:::i;:::-;20068:74;;20151:93;20240:3;20151:93;:::i;:::-;20269:2;20264:3;20260:12;20253:19;;20058:220;;;:::o;20330:871::-;20441:3;20477:4;20472:3;20468:14;20564:4;20557:5;20553:16;20547:23;20617:3;20611:4;20607:14;20600:4;20595:3;20591:14;20584:38;20643:73;20711:4;20697:12;20643:73;:::i;:::-;20635:81;;20492:235;20811:4;20804:5;20800:16;20794:23;20864:3;20858:4;20854:14;20847:4;20842:3;20838:14;20831:38;20890:103;20988:4;20974:12;20890:103;:::i;:::-;20882:111;;20737:267;21088:4;21081:5;21077:16;21071:23;21107:57;21158:4;21153:3;21149:14;21135:12;21107:57;:::i;:::-;21014:160;21191:4;21184:11;;20446:755;;;;;:::o;21207:108::-;21284:24;21302:5;21284:24;:::i;:::-;21279:3;21272:37;21262:53;;:::o;21321:118::-;21408:24;21426:5;21408:24;:::i;:::-;21403:3;21396:37;21386:53;;:::o;21445:157::-;21550:45;21570:24;21588:5;21570:24;:::i;:::-;21550:45;:::i;:::-;21545:3;21538:58;21528:74;;:::o;21608:435::-;21788:3;21810:95;21901:3;21892:6;21810:95;:::i;:::-;21803:102;;21922:95;22013:3;22004:6;21922:95;:::i;:::-;21915:102;;22034:3;22027:10;;21792:251;;;;;:::o;22049:397::-;22189:3;22204:75;22275:3;22266:6;22204:75;:::i;:::-;22304:2;22299:3;22295:12;22288:19;;22317:75;22388:3;22379:6;22317:75;:::i;:::-;22417:2;22412:3;22408:12;22401:19;;22437:3;22430:10;;22193:253;;;;;:::o;22452:222::-;22545:4;22583:2;22572:9;22568:18;22560:26;;22596:71;22664:1;22653:9;22649:17;22640:6;22596:71;:::i;:::-;22550:124;;;;:::o;22680:640::-;22875:4;22913:3;22902:9;22898:19;22890:27;;22927:71;22995:1;22984:9;22980:17;22971:6;22927:71;:::i;:::-;23008:72;23076:2;23065:9;23061:18;23052:6;23008:72;:::i;:::-;23090;23158:2;23147:9;23143:18;23134:6;23090:72;:::i;:::-;23209:9;23203:4;23199:20;23194:2;23183:9;23179:18;23172:48;23237:76;23308:4;23299:6;23237:76;:::i;:::-;23229:84;;22880:440;;;;;;;:::o;23326:373::-;23469:4;23507:2;23496:9;23492:18;23484:26;;23556:9;23550:4;23546:20;23542:1;23531:9;23527:17;23520:47;23584:108;23687:4;23678:6;23584:108;:::i;:::-;23576:116;;23474:225;;;;:::o;23705:210::-;23792:4;23830:2;23819:9;23815:18;23807:26;;23843:65;23905:1;23894:9;23890:17;23881:6;23843:65;:::i;:::-;23797:118;;;;:::o;23921:313::-;24034:4;24072:2;24061:9;24057:18;24049:26;;24121:9;24115:4;24111:20;24107:1;24096:9;24092:17;24085:47;24149:78;24222:4;24213:6;24149:78;:::i;:::-;24141:86;;24039:195;;;;:::o;24240:419::-;24406:4;24444:2;24433:9;24429:18;24421:26;;24493:9;24487:4;24483:20;24479:1;24468:9;24464:17;24457:47;24521:131;24647:4;24521:131;:::i;:::-;24513:139;;24411:248;;;:::o;24665:419::-;24831:4;24869:2;24858:9;24854:18;24846:26;;24918:9;24912:4;24908:20;24904:1;24893:9;24889:17;24882:47;24946:131;25072:4;24946:131;:::i;:::-;24938:139;;24836:248;;;:::o;25090:419::-;25256:4;25294:2;25283:9;25279:18;25271:26;;25343:9;25337:4;25333:20;25329:1;25318:9;25314:17;25307:47;25371:131;25497:4;25371:131;:::i;:::-;25363:139;;25261:248;;;:::o;25515:419::-;25681:4;25719:2;25708:9;25704:18;25696:26;;25768:9;25762:4;25758:20;25754:1;25743:9;25739:17;25732:47;25796:131;25922:4;25796:131;:::i;:::-;25788:139;;25686:248;;;:::o;25940:419::-;26106:4;26144:2;26133:9;26129:18;26121:26;;26193:9;26187:4;26183:20;26179:1;26168:9;26164:17;26157:47;26221:131;26347:4;26221:131;:::i;:::-;26213:139;;26111:248;;;:::o;26365:419::-;26531:4;26569:2;26558:9;26554:18;26546:26;;26618:9;26612:4;26608:20;26604:1;26593:9;26589:17;26582:47;26646:131;26772:4;26646:131;:::i;:::-;26638:139;;26536:248;;;:::o;26790:419::-;26956:4;26994:2;26983:9;26979:18;26971:26;;27043:9;27037:4;27033:20;27029:1;27018:9;27014:17;27007:47;27071:131;27197:4;27071:131;:::i;:::-;27063:139;;26961:248;;;:::o;27215:419::-;27381:4;27419:2;27408:9;27404:18;27396:26;;27468:9;27462:4;27458:20;27454:1;27443:9;27439:17;27432:47;27496:131;27622:4;27496:131;:::i;:::-;27488:139;;27386:248;;;:::o;27640:419::-;27806:4;27844:2;27833:9;27829:18;27821:26;;27893:9;27887:4;27883:20;27879:1;27868:9;27864:17;27857:47;27921:131;28047:4;27921:131;:::i;:::-;27913:139;;27811:248;;;:::o;28065:419::-;28231:4;28269:2;28258:9;28254:18;28246:26;;28318:9;28312:4;28308:20;28304:1;28293:9;28289:17;28282:47;28346:131;28472:4;28346:131;:::i;:::-;28338:139;;28236:248;;;:::o;28490:419::-;28656:4;28694:2;28683:9;28679:18;28671:26;;28743:9;28737:4;28733:20;28729:1;28718:9;28714:17;28707:47;28771:131;28897:4;28771:131;:::i;:::-;28763:139;;28661:248;;;:::o;28915:419::-;29081:4;29119:2;29108:9;29104:18;29096:26;;29168:9;29162:4;29158:20;29154:1;29143:9;29139:17;29132:47;29196:131;29322:4;29196:131;:::i;:::-;29188:139;;29086:248;;;:::o;29340:419::-;29506:4;29544:2;29533:9;29529:18;29521:26;;29593:9;29587:4;29583:20;29579:1;29568:9;29564:17;29557:47;29621:131;29747:4;29621:131;:::i;:::-;29613:139;;29511:248;;;:::o;29765:419::-;29931:4;29969:2;29958:9;29954:18;29946:26;;30018:9;30012:4;30008:20;30004:1;29993:9;29989:17;29982:47;30046:131;30172:4;30046:131;:::i;:::-;30038:139;;29936:248;;;:::o;30190:419::-;30356:4;30394:2;30383:9;30379:18;30371:26;;30443:9;30437:4;30433:20;30429:1;30418:9;30414:17;30407:47;30471:131;30597:4;30471:131;:::i;:::-;30463:139;;30361:248;;;:::o;30615:419::-;30781:4;30819:2;30808:9;30804:18;30796:26;;30868:9;30862:4;30858:20;30854:1;30843:9;30839:17;30832:47;30896:131;31022:4;30896:131;:::i;:::-;30888:139;;30786:248;;;:::o;31040:419::-;31206:4;31244:2;31233:9;31229:18;31221:26;;31293:9;31287:4;31283:20;31279:1;31268:9;31264:17;31257:47;31321:131;31447:4;31321:131;:::i;:::-;31313:139;;31211:248;;;:::o;31465:419::-;31631:4;31669:2;31658:9;31654:18;31646:26;;31718:9;31712:4;31708:20;31704:1;31693:9;31689:17;31682:47;31746:131;31872:4;31746:131;:::i;:::-;31738:139;;31636:248;;;:::o;31890:419::-;32056:4;32094:2;32083:9;32079:18;32071:26;;32143:9;32137:4;32133:20;32129:1;32118:9;32114:17;32107:47;32171:131;32297:4;32171:131;:::i;:::-;32163:139;;32061:248;;;:::o;32315:419::-;32481:4;32519:2;32508:9;32504:18;32496:26;;32568:9;32562:4;32558:20;32554:1;32543:9;32539:17;32532:47;32596:131;32722:4;32596:131;:::i;:::-;32588:139;;32486:248;;;:::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;;32911:248;;;:::o;33165:419::-;33331:4;33369:2;33358:9;33354:18;33346:26;;33418:9;33412:4;33408:20;33404:1;33393:9;33389:17;33382:47;33446:131;33572:4;33446:131;:::i;:::-;33438:139;;33336:248;;;:::o;33590:419::-;33756:4;33794:2;33783:9;33779:18;33771:26;;33843:9;33837:4;33833:20;33829:1;33818:9;33814:17;33807:47;33871:131;33997:4;33871:131;:::i;:::-;33863:139;;33761:248;;;:::o;34015:419::-;34181:4;34219:2;34208:9;34204:18;34196:26;;34268:9;34262:4;34258:20;34254:1;34243:9;34239:17;34232:47;34296:131;34422:4;34296:131;:::i;:::-;34288:139;;34186:248;;;:::o;34440:419::-;34606:4;34644:2;34633:9;34629:18;34621:26;;34693:9;34687:4;34683:20;34679:1;34668:9;34664:17;34657:47;34721:131;34847:4;34721:131;:::i;:::-;34713:139;;34611:248;;;:::o;34865:357::-;35000:4;35038:2;35027:9;35023:18;35015:26;;35087:9;35081:4;35077:20;35073:1;35062:9;35058:17;35051:47;35115:100;35210:4;35201:6;35115:100;:::i;:::-;35107:108;;35005:217;;;;:::o;35228:222::-;35321:4;35359:2;35348:9;35344:18;35336:26;;35372:71;35440:1;35429:9;35425:17;35416:6;35372:71;:::i;:::-;35326:124;;;;:::o;35456:129::-;35490:6;35517:20;;:::i;:::-;35507:30;;35546:33;35574:4;35566:6;35546:33;:::i;:::-;35497:88;;;:::o;35591:75::-;35624:6;35657:2;35651:9;35641:19;;35631:35;:::o;35672:307::-;35733:4;35823:18;35815:6;35812:30;35809:2;;;35845:18;;:::i;:::-;35809:2;35883:29;35905:6;35883:29;:::i;:::-;35875:37;;35967:4;35961;35957:15;35949:23;;35738:241;;;:::o;35985:308::-;36047:4;36137:18;36129:6;36126:30;36123:2;;;36159:18;;:::i;:::-;36123:2;36197:29;36219:6;36197:29;:::i;:::-;36189:37;;36281:4;36275;36271:15;36263:23;;36052:241;;;:::o;36299:132::-;36366:4;36389:3;36381:11;;36419:4;36414:3;36410:14;36402:22;;36371:60;;;:::o;36437:114::-;36504:6;36538:5;36532:12;36522:22;;36511:40;;;:::o;36557:98::-;36608:6;36642:5;36636:12;36626:22;;36615:40;;;:::o;36661:99::-;36713:6;36747:5;36741:12;36731:22;;36720:40;;;:::o;36766:113::-;36836:4;36868;36863:3;36859:14;36851:22;;36841:38;;;:::o;36885:174::-;36974:11;37008:6;37003:3;36996:19;37048:4;37043:3;37039:14;37024:29;;36986:73;;;;:::o;37065:184::-;37164:11;37198:6;37193:3;37186:19;37238:4;37233:3;37229:14;37214:29;;37176:73;;;;:::o;37255:168::-;37338:11;37372:6;37367:3;37360:19;37412:4;37407:3;37403:14;37388:29;;37350:73;;;;:::o;37429:159::-;37503:11;37537:6;37532:3;37525:19;37577:4;37572:3;37568:14;37553:29;;37515:73;;;;:::o;37594:169::-;37678:11;37712:6;37707:3;37700:19;37752:4;37747:3;37743:14;37728:29;;37690:73;;;;:::o;37769:148::-;37871:11;37908:3;37893:18;;37883:34;;;;:::o;37923:305::-;37963:3;37982:20;38000:1;37982:20;:::i;:::-;37977:25;;38016:20;38034:1;38016:20;:::i;:::-;38011:25;;38170:1;38102:66;38098:74;38095:1;38092:81;38089:2;;;38176:18;;:::i;:::-;38089:2;38220:1;38217;38213:9;38206:16;;37967:261;;;;:::o;38234:185::-;38274:1;38291:20;38309:1;38291:20;:::i;:::-;38286:25;;38325:20;38343:1;38325:20;:::i;:::-;38320:25;;38364:1;38354:2;;38369:18;;:::i;:::-;38354:2;38411:1;38408;38404:9;38399:14;;38276:143;;;;:::o;38425:348::-;38465:7;38488:20;38506:1;38488:20;:::i;:::-;38483:25;;38522:20;38540:1;38522:20;:::i;:::-;38517:25;;38710:1;38642:66;38638:74;38635:1;38632:81;38627:1;38620:9;38613:17;38609:105;38606:2;;;38717:18;;:::i;:::-;38606:2;38765:1;38762;38758:9;38747:20;;38473:300;;;;:::o;38779:191::-;38819:4;38839:20;38857:1;38839:20;:::i;:::-;38834:25;;38873:20;38891:1;38873:20;:::i;:::-;38868:25;;38912:1;38909;38906:8;38903:2;;;38917:18;;:::i;:::-;38903:2;38962:1;38959;38955:9;38947:17;;38824:146;;;;:::o;38976:96::-;39013:7;39042:24;39060:5;39042:24;:::i;:::-;39031:35;;39021:51;;;:::o;39078:90::-;39112:7;39155:5;39148:13;39141:21;39130:32;;39120:48;;;:::o;39174:149::-;39210:7;39250:66;39243:5;39239:78;39228:89;;39218:105;;;:::o;39329:126::-;39366:7;39406:42;39399:5;39395:54;39384:65;;39374:81;;;:::o;39461:77::-;39498:7;39527:5;39516:16;;39506:32;;;:::o;39544:154::-;39628:6;39623:3;39618;39605:30;39690:1;39681:6;39676:3;39672:16;39665:27;39595:103;;;:::o;39704:307::-;39772:1;39782:113;39796:6;39793:1;39790:13;39782:113;;;39881:1;39876:3;39872:11;39866:18;39862:1;39857:3;39853:11;39846:39;39818:2;39815:1;39811:10;39806:15;;39782:113;;;39913:6;39910:1;39907:13;39904:2;;;39993:1;39984:6;39979:3;39975:16;39968:27;39904:2;39753:258;;;;:::o;40017:320::-;40061:6;40098:1;40092:4;40088:12;40078:22;;40145:1;40139:4;40135:12;40166:18;40156:2;;40222:4;40214:6;40210:17;40200:27;;40156:2;40284;40276:6;40273:14;40253:18;40250:38;40247:2;;;40303:18;;:::i;:::-;40247:2;40068:269;;;;:::o;40343:281::-;40426:27;40448:4;40426:27;:::i;:::-;40418:6;40414:40;40556:6;40544:10;40541:22;40520:18;40508:10;40505:34;40502:62;40499:2;;;40567:18;;:::i;:::-;40499:2;40607:10;40603:2;40596:22;40386:238;;;:::o;40630:233::-;40669:3;40692:24;40710:5;40692:24;:::i;:::-;40683:33;;40738:66;40731:5;40728:77;40725:2;;;40808:18;;:::i;:::-;40725:2;40855:1;40848:5;40844:13;40837:20;;40673:190;;;:::o;40869:79::-;40908:7;40937:5;40926:16;;40916:32;;;:::o;40954:176::-;40986:1;41003:20;41021:1;41003:20;:::i;:::-;40998:25;;41037:20;41055:1;41037:20;:::i;:::-;41032:25;;41076:1;41066:2;;41081:18;;:::i;:::-;41066:2;41122:1;41119;41115:9;41110:14;;40988:142;;;;:::o;41136:180::-;41184:77;41181:1;41174:88;41281:4;41278:1;41271:15;41305:4;41302:1;41295:15;41322:180;41370:77;41367:1;41360:88;41467:4;41464:1;41457:15;41491:4;41488:1;41481:15;41508:180;41556:77;41553:1;41546:88;41653:4;41650:1;41643:15;41677:4;41674:1;41667:15;41694:180;41742:77;41739:1;41732:88;41839:4;41836:1;41829:15;41863:4;41860:1;41853:15;41880:102;41921:6;41972:2;41968:7;41963:2;41956:5;41952:14;41948:28;41938:38;;41928:54;;;:::o;41988:230::-;42128:34;42124:1;42116:6;42112:14;42105:58;42197:13;42192:2;42184:6;42180:15;42173:38;42094:124;:::o;42224:237::-;42364:34;42360:1;42352:6;42348:14;42341:58;42433:20;42428:2;42420:6;42416:15;42409:45;42330:131;:::o;42467:225::-;42607:34;42603:1;42595:6;42591:14;42584:58;42676:8;42671:2;42663:6;42659:15;42652:33;42573:119;:::o;42698:178::-;42838:30;42834:1;42826:6;42822:14;42815:54;42804:72;:::o;42882:223::-;43022:34;43018:1;43010:6;43006:14;42999:58;43091:6;43086:2;43078:6;43074:15;43067:31;42988:117;:::o;43111:175::-;43251:27;43247:1;43239:6;43235:14;43228:51;43217:69;:::o;43292:231::-;43432:34;43428:1;43420:6;43416:14;43409:58;43501:14;43496:2;43488:6;43484:15;43477:39;43398:125;:::o;43529:175::-;43669:27;43665:1;43657:6;43653:14;43646:51;43635:69;:::o;43710:231::-;43850:34;43846:1;43838:6;43834:14;43827:58;43919:14;43914:2;43906:6;43902:15;43895:39;43816:125;:::o;43947:179::-;44087:31;44083:1;44075:6;44071:14;44064:55;44053:73;:::o;44132:243::-;44272:34;44268:1;44260:6;44256:14;44249:58;44341:26;44336:2;44328:6;44324:15;44317:51;44238:137;:::o;44381:229::-;44521:34;44517:1;44509:6;44505:14;44498:58;44590:12;44585:2;44577:6;44573:15;44566:37;44487:123;:::o;44616:228::-;44756:34;44752:1;44744:6;44740:14;44733:58;44825:11;44820:2;44812:6;44808:15;44801:36;44722:122;:::o;44850:182::-;44990:34;44986:1;44978:6;44974:14;44967:58;44956:76;:::o;45038:175::-;45178:27;45174:1;45166:6;45162:14;45155:51;45144:69;:::o;45219:231::-;45359:34;45355:1;45347:6;45343:14;45336:58;45428:14;45423:2;45415:6;45411:15;45404:39;45325:125;:::o;45456:182::-;45596:34;45592:1;45584:6;45580:14;45573:58;45562:76;:::o;45644:173::-;45784:25;45780:1;45772:6;45768:14;45761:49;45750:67;:::o;45823:228::-;45963:34;45959:1;45951:6;45947:14;45940:58;46032:11;46027:2;46019:6;46015:15;46008:36;45929:122;:::o;46057:234::-;46197:34;46193:1;46185:6;46181:14;46174:58;46266:17;46261:2;46253:6;46249:15;46242:42;46163:128;:::o;46297:220::-;46437:34;46433:1;46425:6;46421:14;46414:58;46506:3;46501:2;46493:6;46489:15;46482:28;46403:114;:::o;46523:222::-;46663:34;46659:1;46651:6;46647:14;46640:58;46732:5;46727:2;46719:6;46715:15;46708:30;46629:116;:::o;46751:236::-;46891:34;46887:1;46879:6;46875:14;46868:58;46960:19;46955:2;46947:6;46943:15;46936:44;46857:130;:::o;46993:231::-;47133:34;47129:1;47121:6;47117:14;47110:58;47202:14;47197:2;47189:6;47185:15;47178:39;47099:125;:::o;47230:165::-;47370:17;47366:1;47358:6;47354:14;47347:41;47336:59;:::o;47401:122::-;47474:24;47492:5;47474:24;:::i;:::-;47467:5;47464:35;47454:2;;47513:1;47510;47503:12;47454:2;47444:79;:::o;47529:116::-;47599:21;47614:5;47599:21;:::i;:::-;47592:5;47589:32;47579:2;;47635:1;47632;47625:12;47579:2;47569:76;:::o;47651:120::-;47723:23;47740:5;47723:23;:::i;:::-;47716:5;47713:34;47703:2;;47761:1;47758;47751:12;47703:2;47693:78;:::o;47777:122::-;47850:24;47868:5;47850:24;:::i;:::-;47843:5;47840:35;47830:2;;47889:1;47886;47879:12;47830:2;47820:79;:::o

Swarm Source

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