ETH Price: $2,501.10 (-0.49%)

Token

Vault Of Gems (VOG)
 

Overview

Max Total Supply

4,807 VOG

Holders

1,918

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 VOG
0x53699e5de1ee7202eeb3eba53ea5723712b4b2a1
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:
VaultOfGems

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

}

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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




pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

    string public VOG_PROVENANCE  = ""; 
    uint256 public constant gemPrice = 80800000000000000; // 0.0808 ETH
    uint public constant MAX_NFT_PURCHASE = 20;
    uint256 public MAX_SUPPLY = 12345;
    bool public saleIsActive = false;

    uint256 public startingIndex;
    uint256 public startingIndexBlock;
    
    address public constant aAddress = 0x35ED04Cf90249A285d190e7D39ad66a508Ae38e0;
    address public constant bAddress = 0xBB389E40CFAdB0c50c2b60B6783D25CC4590ABCD;
    address public constant cAddress = 0xdDD1d36e3F6090A3337B8bba21ae03D3b11a4848;
    address public constant dAddress = 0xD0276987f3408d95a8Dc9917753ad2F4D9031233;
    address public constant eAddress = 0xCe0250aea1D634707D4d28bDd70e00E94CE594C6;
    address public constant fAddress = 0x7cEf0764fF117d09cDCfE9Be4Db0DaB043211ACc;
    address public constant gAddress = 0x43F668fe728F200268440D4d43678A0FbE608e53;
    address public constant hAddress = 0x7BB8128DB83FF858529A6f13B6494C834d0Cad76;
    address public constant iAddress = 0x40938D3543538AD92dBF2c5552545d4d62A96a7D;
    address public constant jAddress = 0x24f1E08eaecA9157Cc9890025171b31Ff21daDB5;
    address public constant kAddress = 0x5054a3A716e4374679450dDE08792A7EE2618142;
    address public constant lAddress = 0x2c1fCba608FCEc3142A063569BC851e29E4F6e5D;
    address public constant mAddress = 0xc365D6dA9293b8caDeC5d2e545Fb3BdC7b2B1592;
    address public constant nAddress = 0x4bC9c7D7F81504aA21C55d7e38e37197a817e3fc;
    address public constant oAddress = 0xc6296FEbb1ab09B093B5307d9f366Eb8b86d0427;
    address public constant pAddress = 0xB8AE8F4C35b51153a4A3C392eEa4C3BF88886dA5;
    address public constant qAddress = 0x5BfD8C4aA447CfB66014e9e4aBeAeA8b5bE5b9D5;
    address public constant rAddress = 0x4868DBC4801282f5FAB3759316FC182BDa27CCCC;
    address public constant sAddress = 0x0590B861515AFc4168168A52757444986bcf1Ba6;
    address public constant tAddress = 0xceb78908417B6A80b1Cb78148a4711c8253b1A9A;
    address public constant uAddress = 0x3DCc28dA8FA2eb3e1ec70cA471105cFA583b7895;
    address public constant vAddress = 0xd409de329593fF5f11B7eaE9D67bc5E26DDD787e;

    
    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;
    
    
    constructor() ERC721("Vault Of Gems","VOG"){
    }

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

    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;

        require(balance > 0);
        _withdraw(aAddress, balance.mul(704).div(1000));
        _withdraw(bAddress, balance.mul(3).div(100));
        _withdraw(cAddress, balance.mul(2).div(100));
        _withdraw(dAddress, balance.mul(2).div(100));
        _withdraw(eAddress, balance.mul(5).div(1000));
        _withdraw(fAddress, balance.mul(1).div(100));
        _withdraw(gAddress, balance.mul(3).div(100));
        _withdraw(hAddress, balance.mul(2).div(100));
        _withdraw(iAddress, balance.mul(1).div(100));
        _withdraw(jAddress, balance.mul(5).div(1000));
        _withdraw(kAddress, balance.mul(175).div(10000));
        _withdraw(lAddress, balance.mul(1).div(100));
        _withdraw(mAddress, balance.mul(5).div(1000));
        _withdraw(nAddress, balance.mul(1).div(100));
        _withdraw(oAddress, balance.mul(5).div(1000));
        _withdraw(pAddress, balance.mul(125).div(10000));
        _withdraw(qAddress, balance.mul(2).div(100));
        _withdraw(rAddress, balance.mul(35).div(1000));
        _withdraw(sAddress, balance.mul(15).div(1000));
        _withdraw(tAddress, balance.mul(75).div(10000));
        _withdraw(uAddress, balance.mul(75).div(10000));
        _withdraw(vAddress, balance.mul(1).div(1000));

    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function reserveTokens() public onlyOwner {
        uint supply = totalSupply();
        uint i;
        for (i = 0; i < 30; i++) {
            if ((supply + i) < MAX_SUPPLY) {
            _safeMint(msg.sender, supply + i);
            }
        }

        if (startingIndexBlock == 0) {
            startingIndexBlock = block.number;
        }
    }

 function reserveGems(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0, "Reserve amount is negative");
        for (uint i = 0; i < _reserveAmount; i++) {
            if ((supply + i) < MAX_SUPPLY) {
            _safeMint(_to, supply + i);
            }
        }

         if (startingIndexBlock == 0) {
            startingIndexBlock = block.number;
        }
    }

    function mintGem(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale is not active at the moment");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply of Gems");
        require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 20 per purchase");
        require(gemPrice.mul(numberOfTokens) == msg.value, "Sent ether value is incorrect");

        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function calcStartingIndex() public onlyOwner {
        require(startingIndex == 0, "Starting index has already been set");
        require(startingIndexBlock != 0, "Starting index has not been set yet");

        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if(block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY;
        }

        // To prevent original sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        VOG_PROVENANCE = provenanceHash;
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        startingIndexBlock = block.number;
    }

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOG_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gemPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintGem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"pAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveGems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","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":[],"name":"tAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"uAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b929190620001ba565b50613039600c556000600d60006101000a81548160ff0219169083151502179055503480156200005a57600080fd5b506040518060400160405280600d81526020017f5661756c74204f662047656d73000000000000000000000000000000000000008152506040518060400160405280600381526020017f564f4700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000df929190620001ba565b508060019080519060200190620000f8929190620001ba565b50505060006200010d620001b260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002cf565b600033905090565b828054620001c8906200026a565b90600052602060002090601f016020900481019282620001ec576000855562000238565b82601f106200020757805160ff191683800117855562000238565b8280016001018555821562000238579182015b82811115620002375782518255916020019190600101906200021a565b5b5090506200024791906200024b565b5090565b5b80821115620002665760008160009055506001016200024c565b5090565b600060028204905060018216806200028357607f821691505b602082108114156200029a5762000299620002a0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6155b280620002df6000396000f3fe6080604052600436106103765760003560e01c80636bf24dcd116101d1578063c253963b11610102578063e71f83c5116100a0578063f0dccbc91161006f578063f0dccbc914610c4e578063f2fde38b14610c79578063fc57fa4d14610ca2578063fe31572314610ccd57610376565b8063e71f83c514610b90578063e985e9c514610bbb578063eab6970b14610bf8578063eb8d244414610c2357610376565b8063cc5979fc116100dc578063cc5979fc14610af8578063d333232c14610b23578063e13f351a14610b4e578063e36d649814610b6557610376565b8063c253963b14610a65578063c87b56dd14610a90578063cb774d4714610acd57610376565b806389b057e11161016f578063a22cb46511610149578063a22cb465146109bd578063a3671b60146109e6578063b3c77d8014610a11578063b88d4fde14610a3c57610376565b806389b057e11461093c5780638da5cb5b1461096757806395d89b411461099257610376565b80637a114fa0116101ab5780637a114fa0146108c55780637d17fcbe146108f0578063853828b61461090757806387600df71461091157610376565b80636bf24dcd1461084657806370a0823114610871578063715018a6146108ae57610376565b806327ac36c4116102ab57806342842e0e1161024957806355f804b31161022357806355f804b314610799578063580081c4146107c25780636352211e146107ed57806368e54f701461082a57610376565b806342842e0e146107085780634f6ccce71461073157806351ab3a4f1461076e57610376565b80632f745c59116102855780632f745c591461065e57806332cb6b0c1461069b57806334918dfd146106c65780633f6489bd146106dd57610376565b806327ac36c4146105f157806328e7250d146106085780632edac37a1461063357610376565b80631096952311610318578063201d0ae4116102f2578063201d0ae41461054757806323b872dd14610572578063256fd6761461059b57806326237501146105c657610376565b806310969523146104c857806314ec0020146104f157806318160ddd1461051c57610376565b806306fdde031161035457806306fdde031461040e578063081812fc14610439578063095ea7b3146104765780630b06e1021461049f57610376565b806301ffc9a71461037b578063020b39cc146103b857806304f7df8b146103e3575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d919061410d565b610cf8565b6040516103af9190614d25565b60405180910390f35b3480156103c457600080fd5b506103cd610d72565b6040516103da91906150e2565b60405180910390f35b3480156103ef57600080fd5b506103f8610d77565b6040516104059190614cbe565b60405180910390f35b34801561041a57600080fd5b50610423610d8f565b6040516104309190614d40565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906141a0565b610e21565b60405161046d9190614cbe565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906140d1565b610ea6565b005b3480156104ab57600080fd5b506104c660048036038101906104c191906140d1565b610fbe565b005b3480156104d457600080fd5b506104ef60048036038101906104ea919061415f565b6110eb565b005b3480156104fd57600080fd5b50610506611181565b6040516105139190614cbe565b60405180910390f35b34801561052857600080fd5b50610531611199565b60405161053e91906150e2565b60405180910390f35b34801561055357600080fd5b5061055c6111a6565b6040516105699190614cbe565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190613fcb565b6111be565b005b3480156105a757600080fd5b506105b061121e565b6040516105bd9190614cbe565b60405180910390f35b3480156105d257600080fd5b506105db611236565b6040516105e89190614cbe565b60405180910390f35b3480156105fd57600080fd5b5061060661124e565b005b34801561061457600080fd5b5061061d611337565b60405161062a9190614cbe565b60405180910390f35b34801561063f57600080fd5b5061064861134f565b6040516106559190614cbe565b60405180910390f35b34801561066a57600080fd5b50610685600480360381019061068091906140d1565b611367565b60405161069291906150e2565b60405180910390f35b3480156106a757600080fd5b506106b061140c565b6040516106bd91906150e2565b60405180910390f35b3480156106d257600080fd5b506106db611412565b005b3480156106e957600080fd5b506106f26114ba565b6040516106ff9190614d40565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a9190613fcb565b611548565b005b34801561073d57600080fd5b50610758600480360381019061075391906141a0565b611568565b60405161076591906150e2565b60405180910390f35b34801561077a57600080fd5b506107836115ff565b6040516107909190614cbe565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb919061415f565b611617565b005b3480156107ce57600080fd5b506107d76116ad565b6040516107e49190614cbe565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f91906141a0565b6116c5565b6040516108219190614cbe565b60405180910390f35b610844600480360381019061083f91906141a0565b611777565b005b34801561085257600080fd5b5061085b61193a565b6040516108689190614cbe565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613f66565b611952565b6040516108a591906150e2565b60405180910390f35b3480156108ba57600080fd5b506108c3611a0a565b005b3480156108d157600080fd5b506108da611b47565b6040516108e79190614cbe565b60405180910390f35b3480156108fc57600080fd5b50610905611b5f565b005b61090f611c29565b005b34801561091d57600080fd5b5061092661229f565b6040516109339190614cbe565b60405180910390f35b34801561094857600080fd5b506109516122b7565b60405161095e9190614cbe565b60405180910390f35b34801561097357600080fd5b5061097c6122cf565b6040516109899190614cbe565b60405180910390f35b34801561099e57600080fd5b506109a76122f9565b6040516109b49190614d40565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190614095565b61238b565b005b3480156109f257600080fd5b506109fb61250c565b604051610a089190614cbe565b60405180910390f35b348015610a1d57600080fd5b50610a26612524565b604051610a339190614cbe565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e919061401a565b61253c565b005b348015610a7157600080fd5b50610a7a61259e565b604051610a879190614cbe565b60405180910390f35b348015610a9c57600080fd5b50610ab76004803603810190610ab291906141a0565b6125b6565b604051610ac49190614d40565b60405180910390f35b348015610ad957600080fd5b50610ae2612729565b604051610aef91906150e2565b60405180910390f35b348015610b0457600080fd5b50610b0d61272f565b604051610b1a9190614cbe565b60405180910390f35b348015610b2f57600080fd5b50610b38612747565b604051610b459190614cbe565b60405180910390f35b348015610b5a57600080fd5b50610b6361275f565b005b348015610b7157600080fd5b50610b7a6128ec565b604051610b8791906150e2565b60405180910390f35b348015610b9c57600080fd5b50610ba56128f2565b604051610bb29190614cbe565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd9190613f8f565b61290a565b604051610bef9190614d25565b60405180910390f35b348015610c0457600080fd5b50610c0d61299e565b604051610c1a91906150e2565b60405180910390f35b348015610c2f57600080fd5b50610c386129aa565b604051610c459190614d25565b60405180910390f35b348015610c5a57600080fd5b50610c636129bd565b604051610c709190614cbe565b60405180910390f35b348015610c8557600080fd5b50610ca06004803603810190610c9b9190613f66565b6129d5565b005b348015610cae57600080fd5b50610cb7612b81565b604051610cc49190614cbe565b60405180910390f35b348015610cd957600080fd5b50610ce2612b99565b604051610cef9190614cbe565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d6b5750610d6a82612bb1565b5b9050919050565b601481565b735054a3a716e4374679450dde08792a7ee261814281565b606060008054610d9e906153a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610dca906153a7565b8015610e175780601f10610dec57610100808354040283529160200191610e17565b820191906000526020600020905b815481529060010190602001808311610dfa57829003601f168201915b5050505050905090565b6000610e2c82612c93565b610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290614fa2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eb1826116c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990615022565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f41612cff565b73ffffffffffffffffffffffffffffffffffffffff161480610f705750610f6f81610f6a612cff565b61290a565b5b610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690614f02565b60405180910390fd5b610fb98383612d07565b505050565b610fc6612cff565b73ffffffffffffffffffffffffffffffffffffffff16610fe46122cf565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190614fc2565b60405180910390fd5b6000611044611199565b905060008211611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090614d82565b60405180910390fd5b60005b828110156110d257600c5481836110a391906151dc565b10156110bf576110be8482846110b991906151dc565b612dc0565b5b80806110ca906153d9565b91505061108c565b506000600f5414156110e65743600f819055505b505050565b6110f3612cff565b73ffffffffffffffffffffffffffffffffffffffff166111116122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614fc2565b60405180910390fd5b80600b908051906020019061117d929190613d8a565b5050565b732c1fcba608fcec3142a063569bc851e29e4f6e5d81565b6000600880549050905090565b7340938d3543538ad92dbf2c5552545d4d62a96a7d81565b6111cf6111c9612cff565b82612dde565b61120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590615062565b60405180910390fd5b611219838383612ebc565b505050565b73d409de329593ff5f11b7eae9d67bc5e26ddd787e81565b7324f1e08eaeca9157cc9890025171b31ff21dadb581565b611256612cff565b73ffffffffffffffffffffffffffffffffffffffff166112746122cf565b73ffffffffffffffffffffffffffffffffffffffff16146112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190614fc2565b60405180910390fd5b60006112d4611199565b905060005b601e81101561132057600c5481836112f191906151dc565b101561130d5761130c33828461130791906151dc565b612dc0565b5b8080611318906153d9565b9150506112d9565b6000600f5414156113335743600f819055505b5050565b73ddd1d36e3f6090a3337b8bba21ae03d3b11a484881565b735bfd8c4aa447cfb66014e9e4abeaea8b5be5b9d581565b600061137283611952565b82106113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa90614dc2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b61141a612cff565b73ffffffffffffffffffffffffffffffffffffffff166114386122cf565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614fc2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600b80546114c7906153a7565b80601f01602080910402602001604051908101604052809291908181526020018280546114f3906153a7565b80156115405780601f1061151557610100808354040283529160200191611540565b820191906000526020600020905b81548152906001019060200180831161152357829003601f168201915b505050505081565b6115638383836040518060200160405280600081525061253c565b505050565b6000611572611199565b82106115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90615082565b60405180910390fd5b600882815481106115ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b73ce0250aea1d634707d4d28bdd70e00e94ce594c681565b61161f612cff565b73ffffffffffffffffffffffffffffffffffffffff1661163d6122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90614fc2565b60405180910390fd5b80601090805190602001906116a9929190613d8a565b5050565b73ceb78908417b6a80b1cb78148a4711c8253b1a9a81565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590614f42565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff166117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd906150c2565b60405180910390fd5b60008111611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090614da2565b60405180910390fd5b600c5461182682611818611199565b61311890919063ffffffff16565b1115611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e90614e42565b60405180910390fd5b60148111156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290614ee2565b60405180910390fd5b346118c78267011f0f2c01da000061312e90919063ffffffff16565b14611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614f62565b60405180910390fd5b60005b81811015611936576119233361191e611199565b612dc0565b808061192e906153d9565b91505061190a565b5050565b73c6296febb1ab09b093b5307d9f366eb8b86d042781565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba90614f22565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a12612cff565b73ffffffffffffffffffffffffffffffffffffffff16611a306122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d90614fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b737bb8128db83ff858529a6f13b6494c834d0cad7681565b611b67612cff565b73ffffffffffffffffffffffffffffffffffffffff16611b856122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd290614fc2565b60405180910390fd5b6000600e5414611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790614ec2565b60405180910390fd5b43600f81905550565b611c31612cff565b73ffffffffffffffffffffffffffffffffffffffff16611c4f6122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90614fc2565b60405180910390fd5b600047905060008111611cb757600080fd5b611cfd7335ed04cf90249a285d190e7d39ad66a508ae38e0611cf86103e8611cea6102c08661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611d4173bb389e40cfadb0c50c2b60b6783d25cc4590abcd611d3c6064611d2e60038661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611d8573ddd1d36e3f6090a3337b8bba21ae03d3b11a4848611d806064611d7260028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611dc973d0276987f3408d95a8dc9917753ad2f4d9031233611dc46064611db660028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611e0e73ce0250aea1d634707d4d28bdd70e00e94ce594c6611e096103e8611dfb60058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611e52737cef0764ff117d09cdcfe9be4db0dab043211acc611e4d6064611e3f60018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611e967343f668fe728f200268440d4d43678a0fbe608e53611e916064611e8360038661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611eda737bb8128db83ff858529a6f13b6494c834d0cad76611ed56064611ec760028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611f1e7340938d3543538ad92dbf2c5552545d4d62a96a7d611f196064611f0b60018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611f637324f1e08eaeca9157cc9890025171b31ff21dadb5611f5e6103e8611f5060058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611fa8735054a3a716e4374679450dde08792a7ee2618142611fa3612710611f9560af8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611fec732c1fcba608fcec3142a063569bc851e29e4f6e5d611fe76064611fd960018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b61203173c365d6da9293b8cadec5d2e545fb3bdc7b2b159261202c6103e861201e60058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612075734bc9c7d7f81504aa21c55d7e38e37197a817e3fc612070606461206260018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b6120ba73c6296febb1ab09b093b5307d9f366eb8b86d04276120b56103e86120a760058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b6120ff73b8ae8f4c35b51153a4a3c392eea4c3bf88886da56120fa6127106120ec607d8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612143735bfd8c4aa447cfb66014e9e4abeaea8b5be5b9d561213e606461213060028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612188734868dbc4801282f5fab3759316fc182bda27cccc6121836103e861217560238661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b6121cd730590b861515afc4168168a52757444986bcf1ba66121c86103e86121ba600f8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b61221273ceb78908417b6a80b1cb78148a4711c8253b1a9a61220d6127106121ff604b8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612257733dcc28da8fa2eb3e1ec70ca471105cfa583b7895612252612710612244604b8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b61229c73d409de329593ff5f11b7eae9d67bc5e26ddd787e6122976103e861228960018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b50565b73c365d6da9293b8cadec5d2e545fb3bdc7b2b159281565b733dcc28da8fa2eb3e1ec70ca471105cfa583b789581565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054612308906153a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612334906153a7565b80156123815780601f1061235657610100808354040283529160200191612381565b820191906000526020600020905b81548152906001019060200180831161236457829003601f168201915b5050505050905090565b612393612cff565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890614e82565b60405180910390fd5b806005600061240e612cff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124bb612cff565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125009190614d25565b60405180910390a35050565b73d0276987f3408d95a8dc9917753ad2f4d903123381565b7343f668fe728f200268440d4d43678a0fbe608e5381565b61254d612547612cff565b83612dde565b61258c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258390615062565b60405180910390fd5b6125988484848461320b565b50505050565b73bb389e40cfadb0c50c2b60b6783d25cc4590abcd81565b60606125c182612c93565b612600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f790615002565b60405180910390fd5b6000601160008481526020019081526020016000208054612620906153a7565b80601f016020809104026020016040519081016040528092919081815260200182805461264c906153a7565b80156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050505050905060006126aa613267565b90506000815114156126c0578192505050612724565b6000825111156126f55780826040516020016126dd929190614c85565b60405160208183030381529060405292505050612724565b806126ff856132f9565b604051602001612710929190614c85565b604051602081830303815290604052925050505b919050565b600e5481565b737cef0764ff117d09cdcfe9be4db0dab043211acc81565b734bc9c7d7f81504aa21c55d7e38e37197a817e3fc81565b612767612cff565b73ffffffffffffffffffffffffffffffffffffffff166127856122cf565b73ffffffffffffffffffffffffffffffffffffffff16146127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d290614fc2565b60405180910390fd5b6000600e5414612820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612817906150a2565b60405180910390fd5b6000600f541415612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614d62565b60405180910390fd5b600c54600f544060001c61287a9190615422565b600e8190555060ff612897600f54436134a690919063ffffffff16565b11156128c257600c546001436128ad91906152bd565b4060001c6128bb9190615422565b600e819055505b6000600e5414156128ea576128e36001600e5461311890919063ffffffff16565b600e819055505b565b600f5481565b73b8ae8f4c35b51153a4a3c392eea4c3bf88886da581565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b67011f0f2c01da000081565b600d60009054906101000a900460ff1681565b730590b861515afc4168168a52757444986bcf1ba681565b6129dd612cff565b73ffffffffffffffffffffffffffffffffffffffff166129fb6122cf565b73ffffffffffffffffffffffffffffffffffffffff1614612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4890614fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab890614e02565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b734868dbc4801282f5fab3759316fc182bda27cccc81565b7335ed04cf90249a285d190e7d39ad66a508ae38e081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c7c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c8c5750612c8b826134bc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d7a836116c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612dda828260405180602001604052806000815250613526565b5050565b6000612de982612c93565b612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f90614ea2565b60405180910390fd5b6000612e33836116c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ea257508373ffffffffffffffffffffffffffffffffffffffff16612e8a84610e21565b73ffffffffffffffffffffffffffffffffffffffff16145b80612eb35750612eb2818561290a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612edc826116c5565b73ffffffffffffffffffffffffffffffffffffffff1614612f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2990614fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9990614e62565b60405180910390fd5b612fad838383613581565b612fb8600082612d07565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300891906152bd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461305f91906151dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361312691906151dc565b905092915050565b6000818361313c9190615263565b905092915050565b600081836131529190615232565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161318090614ca9565b60006040518083038185875af1925050503d80600081146131bd576040519150601f19603f3d011682016040523d82523d6000602084013e6131c2565b606091505b5050905080613206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fd90615042565b60405180910390fd5b505050565b613216848484612ebc565b61322284848484613695565b613261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325890614de2565b60405180910390fd5b50505050565b606060108054613276906153a7565b80601f01602080910402602001604051908101604052809291908181526020018280546132a2906153a7565b80156132ef5780601f106132c4576101008083540402835291602001916132ef565b820191906000526020600020905b8154815290600101906020018083116132d257829003601f168201915b5050505050905090565b60606000821415613341576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134a1565b600082905060005b6000821461337357808061335c906153d9565b915050600a8261336c9190615232565b9150613349565b60008167ffffffffffffffff8111156133b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133e75781602001600182028036833780820191505090505b5090505b6000851461349a5760018261340091906152bd565b9150600a8561340f9190615422565b603061341b91906151dc565b60f81b818381518110613457577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134939190615232565b94506133eb565b8093505050505b919050565b600081836134b491906152bd565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613530838361382c565b61353d6000848484613695565b61357c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357390614de2565b60405180910390fd5b505050565b61358c8383836139fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135cf576135ca816139ff565b61360e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461360d5761360c8382613a48565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136515761364c81613bb5565b613690565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461368f5761368e8282613cf8565b5b5b505050565b60006136b68473ffffffffffffffffffffffffffffffffffffffff16613d77565b1561381f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136df612cff565b8786866040518563ffffffff1660e01b81526004016137019493929190614cd9565b602060405180830381600087803b15801561371b57600080fd5b505af192505050801561374c57506040513d601f19601f820116820180604052508101906137499190614136565b60015b6137cf573d806000811461377c576040519150601f19603f3d011682016040523d82523d6000602084013e613781565b606091505b506000815114156137c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137be90614de2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613824565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561389c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389390614f82565b60405180910390fd5b6138a581612c93565b156138e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dc90614e22565b60405180910390fd5b6138f160008383613581565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461394191906151dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a5584611952565b613a5f91906152bd565b9050600060076000848152602001908152602001600020549050818114613b44576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613bc991906152bd565b9050600060096000848152602001908152602001600020549050600060088381548110613c1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613c67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613cdc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d0383611952565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613d96906153a7565b90600052602060002090601f016020900481019282613db85760008555613dff565b82601f10613dd157805160ff1916838001178555613dff565b82800160010185558215613dff579182015b82811115613dfe578251825591602001919060010190613de3565b5b509050613e0c9190613e10565b5090565b5b80821115613e29576000816000905550600101613e11565b5090565b6000613e40613e3b8461512e565b6150fd565b905082815260208101848484011115613e5857600080fd5b613e63848285615365565b509392505050565b6000613e7e613e798461515e565b6150fd565b905082815260208101848484011115613e9657600080fd5b613ea1848285615365565b509392505050565b600081359050613eb881615520565b92915050565b600081359050613ecd81615537565b92915050565b600081359050613ee28161554e565b92915050565b600081519050613ef78161554e565b92915050565b600082601f830112613f0e57600080fd5b8135613f1e848260208601613e2d565b91505092915050565b600082601f830112613f3857600080fd5b8135613f48848260208601613e6b565b91505092915050565b600081359050613f6081615565565b92915050565b600060208284031215613f7857600080fd5b6000613f8684828501613ea9565b91505092915050565b60008060408385031215613fa257600080fd5b6000613fb085828601613ea9565b9250506020613fc185828601613ea9565b9150509250929050565b600080600060608486031215613fe057600080fd5b6000613fee86828701613ea9565b9350506020613fff86828701613ea9565b925050604061401086828701613f51565b9150509250925092565b6000806000806080858703121561403057600080fd5b600061403e87828801613ea9565b945050602061404f87828801613ea9565b935050604061406087828801613f51565b925050606085013567ffffffffffffffff81111561407d57600080fd5b61408987828801613efd565b91505092959194509250565b600080604083850312156140a857600080fd5b60006140b685828601613ea9565b92505060206140c785828601613ebe565b9150509250929050565b600080604083850312156140e457600080fd5b60006140f285828601613ea9565b925050602061410385828601613f51565b9150509250929050565b60006020828403121561411f57600080fd5b600061412d84828501613ed3565b91505092915050565b60006020828403121561414857600080fd5b600061415684828501613ee8565b91505092915050565b60006020828403121561417157600080fd5b600082013567ffffffffffffffff81111561418b57600080fd5b61419784828501613f27565b91505092915050565b6000602082840312156141b257600080fd5b60006141c084828501613f51565b91505092915050565b6141d2816152f1565b82525050565b6141e181615303565b82525050565b60006141f28261518e565b6141fc81856151a4565b935061420c818560208601615374565b6142158161550f565b840191505092915050565b600061422b82615199565b61423581856151c0565b9350614245818560208601615374565b61424e8161550f565b840191505092915050565b600061426482615199565b61426e81856151d1565b935061427e818560208601615374565b80840191505092915050565b60006142976023836151c0565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142fd601a836151c0565b91507f5265736572766520616d6f756e74206973206e656761746976650000000000006000830152602082019050919050565b600061433d6033836151c0565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b60006143a3602b836151c0565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006144096032836151c0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061446f6026836151c0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144d5601c836151c0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006145156028836151c0565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662047656d730000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457b6024836151c0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e16019836151c0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614621602c836151c0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614687601d836151c0565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006146c76023836151c0565b91507f43616e206f6e6c79206d696e7420757020746f2032302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061472d6038836151c0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614793602a836151c0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006147f96029836151c0565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061485f601d836151c0565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b600061489f6020836151c0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006148df602c836151c0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149456020836151c0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149856029836151c0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149eb602f836151c0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614a516021836151c0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ab76000836151b5565b9150600082019050919050565b6000614ad16010836151c0565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000614b116031836151c0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614b77602c836151c0565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614bdd6023836151c0565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c436020836151c0565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b614c7f8161535b565b82525050565b6000614c918285614259565b9150614c9d8284614259565b91508190509392505050565b6000614cb482614aaa565b9150819050919050565b6000602082019050614cd360008301846141c9565b92915050565b6000608082019050614cee60008301876141c9565b614cfb60208301866141c9565b614d086040830185614c76565b8181036060830152614d1a81846141e7565b905095945050505050565b6000602082019050614d3a60008301846141d8565b92915050565b60006020820190508181036000830152614d5a8184614220565b905092915050565b60006020820190508181036000830152614d7b8161428a565b9050919050565b60006020820190508181036000830152614d9b816142f0565b9050919050565b60006020820190508181036000830152614dbb81614330565b9050919050565b60006020820190508181036000830152614ddb81614396565b9050919050565b60006020820190508181036000830152614dfb816143fc565b9050919050565b60006020820190508181036000830152614e1b81614462565b9050919050565b60006020820190508181036000830152614e3b816144c8565b9050919050565b60006020820190508181036000830152614e5b81614508565b9050919050565b60006020820190508181036000830152614e7b8161456e565b9050919050565b60006020820190508181036000830152614e9b816145d4565b9050919050565b60006020820190508181036000830152614ebb81614614565b9050919050565b60006020820190508181036000830152614edb8161467a565b9050919050565b60006020820190508181036000830152614efb816146ba565b9050919050565b60006020820190508181036000830152614f1b81614720565b9050919050565b60006020820190508181036000830152614f3b81614786565b9050919050565b60006020820190508181036000830152614f5b816147ec565b9050919050565b60006020820190508181036000830152614f7b81614852565b9050919050565b60006020820190508181036000830152614f9b81614892565b9050919050565b60006020820190508181036000830152614fbb816148d2565b9050919050565b60006020820190508181036000830152614fdb81614938565b9050919050565b60006020820190508181036000830152614ffb81614978565b9050919050565b6000602082019050818103600083015261501b816149de565b9050919050565b6000602082019050818103600083015261503b81614a44565b9050919050565b6000602082019050818103600083015261505b81614ac4565b9050919050565b6000602082019050818103600083015261507b81614b04565b9050919050565b6000602082019050818103600083015261509b81614b6a565b9050919050565b600060208201905081810360008301526150bb81614bd0565b9050919050565b600060208201905081810360008301526150db81614c36565b9050919050565b60006020820190506150f76000830184614c76565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615124576151236154e0565b5b8060405250919050565b600067ffffffffffffffff821115615149576151486154e0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615179576151786154e0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006151e78261535b565b91506151f28361535b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561522757615226615453565b5b828201905092915050565b600061523d8261535b565b91506152488361535b565b92508261525857615257615482565b5b828204905092915050565b600061526e8261535b565b91506152798361535b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b2576152b1615453565b5b828202905092915050565b60006152c88261535b565b91506152d38361535b565b9250828210156152e6576152e5615453565b5b828203905092915050565b60006152fc8261533b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615392578082015181840152602081019050615377565b838111156153a1576000848401525b50505050565b600060028204905060018216806153bf57607f821691505b602082108114156153d3576153d26154b1565b5b50919050565b60006153e48261535b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561541757615416615453565b5b600182019050919050565b600061542d8261535b565b91506154388361535b565b92508261544857615447615482565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615529816152f1565b811461553457600080fd5b50565b61554081615303565b811461554b57600080fd5b50565b6155578161530f565b811461556257600080fd5b50565b61556e8161535b565b811461557957600080fd5b5056fea26469706673582212205272f40ba8ade26113a0e60e4d5b535361ad6adf57ab2816b467f3ee86e3ab9d64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106103765760003560e01c80636bf24dcd116101d1578063c253963b11610102578063e71f83c5116100a0578063f0dccbc91161006f578063f0dccbc914610c4e578063f2fde38b14610c79578063fc57fa4d14610ca2578063fe31572314610ccd57610376565b8063e71f83c514610b90578063e985e9c514610bbb578063eab6970b14610bf8578063eb8d244414610c2357610376565b8063cc5979fc116100dc578063cc5979fc14610af8578063d333232c14610b23578063e13f351a14610b4e578063e36d649814610b6557610376565b8063c253963b14610a65578063c87b56dd14610a90578063cb774d4714610acd57610376565b806389b057e11161016f578063a22cb46511610149578063a22cb465146109bd578063a3671b60146109e6578063b3c77d8014610a11578063b88d4fde14610a3c57610376565b806389b057e11461093c5780638da5cb5b1461096757806395d89b411461099257610376565b80637a114fa0116101ab5780637a114fa0146108c55780637d17fcbe146108f0578063853828b61461090757806387600df71461091157610376565b80636bf24dcd1461084657806370a0823114610871578063715018a6146108ae57610376565b806327ac36c4116102ab57806342842e0e1161024957806355f804b31161022357806355f804b314610799578063580081c4146107c25780636352211e146107ed57806368e54f701461082a57610376565b806342842e0e146107085780634f6ccce71461073157806351ab3a4f1461076e57610376565b80632f745c59116102855780632f745c591461065e57806332cb6b0c1461069b57806334918dfd146106c65780633f6489bd146106dd57610376565b806327ac36c4146105f157806328e7250d146106085780632edac37a1461063357610376565b80631096952311610318578063201d0ae4116102f2578063201d0ae41461054757806323b872dd14610572578063256fd6761461059b57806326237501146105c657610376565b806310969523146104c857806314ec0020146104f157806318160ddd1461051c57610376565b806306fdde031161035457806306fdde031461040e578063081812fc14610439578063095ea7b3146104765780630b06e1021461049f57610376565b806301ffc9a71461037b578063020b39cc146103b857806304f7df8b146103e3575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d919061410d565b610cf8565b6040516103af9190614d25565b60405180910390f35b3480156103c457600080fd5b506103cd610d72565b6040516103da91906150e2565b60405180910390f35b3480156103ef57600080fd5b506103f8610d77565b6040516104059190614cbe565b60405180910390f35b34801561041a57600080fd5b50610423610d8f565b6040516104309190614d40565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906141a0565b610e21565b60405161046d9190614cbe565b60405180910390f35b34801561048257600080fd5b5061049d600480360381019061049891906140d1565b610ea6565b005b3480156104ab57600080fd5b506104c660048036038101906104c191906140d1565b610fbe565b005b3480156104d457600080fd5b506104ef60048036038101906104ea919061415f565b6110eb565b005b3480156104fd57600080fd5b50610506611181565b6040516105139190614cbe565b60405180910390f35b34801561052857600080fd5b50610531611199565b60405161053e91906150e2565b60405180910390f35b34801561055357600080fd5b5061055c6111a6565b6040516105699190614cbe565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190613fcb565b6111be565b005b3480156105a757600080fd5b506105b061121e565b6040516105bd9190614cbe565b60405180910390f35b3480156105d257600080fd5b506105db611236565b6040516105e89190614cbe565b60405180910390f35b3480156105fd57600080fd5b5061060661124e565b005b34801561061457600080fd5b5061061d611337565b60405161062a9190614cbe565b60405180910390f35b34801561063f57600080fd5b5061064861134f565b6040516106559190614cbe565b60405180910390f35b34801561066a57600080fd5b50610685600480360381019061068091906140d1565b611367565b60405161069291906150e2565b60405180910390f35b3480156106a757600080fd5b506106b061140c565b6040516106bd91906150e2565b60405180910390f35b3480156106d257600080fd5b506106db611412565b005b3480156106e957600080fd5b506106f26114ba565b6040516106ff9190614d40565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a9190613fcb565b611548565b005b34801561073d57600080fd5b50610758600480360381019061075391906141a0565b611568565b60405161076591906150e2565b60405180910390f35b34801561077a57600080fd5b506107836115ff565b6040516107909190614cbe565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb919061415f565b611617565b005b3480156107ce57600080fd5b506107d76116ad565b6040516107e49190614cbe565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f91906141a0565b6116c5565b6040516108219190614cbe565b60405180910390f35b610844600480360381019061083f91906141a0565b611777565b005b34801561085257600080fd5b5061085b61193a565b6040516108689190614cbe565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613f66565b611952565b6040516108a591906150e2565b60405180910390f35b3480156108ba57600080fd5b506108c3611a0a565b005b3480156108d157600080fd5b506108da611b47565b6040516108e79190614cbe565b60405180910390f35b3480156108fc57600080fd5b50610905611b5f565b005b61090f611c29565b005b34801561091d57600080fd5b5061092661229f565b6040516109339190614cbe565b60405180910390f35b34801561094857600080fd5b506109516122b7565b60405161095e9190614cbe565b60405180910390f35b34801561097357600080fd5b5061097c6122cf565b6040516109899190614cbe565b60405180910390f35b34801561099e57600080fd5b506109a76122f9565b6040516109b49190614d40565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190614095565b61238b565b005b3480156109f257600080fd5b506109fb61250c565b604051610a089190614cbe565b60405180910390f35b348015610a1d57600080fd5b50610a26612524565b604051610a339190614cbe565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e919061401a565b61253c565b005b348015610a7157600080fd5b50610a7a61259e565b604051610a879190614cbe565b60405180910390f35b348015610a9c57600080fd5b50610ab76004803603810190610ab291906141a0565b6125b6565b604051610ac49190614d40565b60405180910390f35b348015610ad957600080fd5b50610ae2612729565b604051610aef91906150e2565b60405180910390f35b348015610b0457600080fd5b50610b0d61272f565b604051610b1a9190614cbe565b60405180910390f35b348015610b2f57600080fd5b50610b38612747565b604051610b459190614cbe565b60405180910390f35b348015610b5a57600080fd5b50610b6361275f565b005b348015610b7157600080fd5b50610b7a6128ec565b604051610b8791906150e2565b60405180910390f35b348015610b9c57600080fd5b50610ba56128f2565b604051610bb29190614cbe565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd9190613f8f565b61290a565b604051610bef9190614d25565b60405180910390f35b348015610c0457600080fd5b50610c0d61299e565b604051610c1a91906150e2565b60405180910390f35b348015610c2f57600080fd5b50610c386129aa565b604051610c459190614d25565b60405180910390f35b348015610c5a57600080fd5b50610c636129bd565b604051610c709190614cbe565b60405180910390f35b348015610c8557600080fd5b50610ca06004803603810190610c9b9190613f66565b6129d5565b005b348015610cae57600080fd5b50610cb7612b81565b604051610cc49190614cbe565b60405180910390f35b348015610cd957600080fd5b50610ce2612b99565b604051610cef9190614cbe565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d6b5750610d6a82612bb1565b5b9050919050565b601481565b735054a3a716e4374679450dde08792a7ee261814281565b606060008054610d9e906153a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610dca906153a7565b8015610e175780601f10610dec57610100808354040283529160200191610e17565b820191906000526020600020905b815481529060010190602001808311610dfa57829003601f168201915b5050505050905090565b6000610e2c82612c93565b610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290614fa2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eb1826116c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990615022565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f41612cff565b73ffffffffffffffffffffffffffffffffffffffff161480610f705750610f6f81610f6a612cff565b61290a565b5b610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690614f02565b60405180910390fd5b610fb98383612d07565b505050565b610fc6612cff565b73ffffffffffffffffffffffffffffffffffffffff16610fe46122cf565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190614fc2565b60405180910390fd5b6000611044611199565b905060008211611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090614d82565b60405180910390fd5b60005b828110156110d257600c5481836110a391906151dc565b10156110bf576110be8482846110b991906151dc565b612dc0565b5b80806110ca906153d9565b91505061108c565b506000600f5414156110e65743600f819055505b505050565b6110f3612cff565b73ffffffffffffffffffffffffffffffffffffffff166111116122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614fc2565b60405180910390fd5b80600b908051906020019061117d929190613d8a565b5050565b732c1fcba608fcec3142a063569bc851e29e4f6e5d81565b6000600880549050905090565b7340938d3543538ad92dbf2c5552545d4d62a96a7d81565b6111cf6111c9612cff565b82612dde565b61120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590615062565b60405180910390fd5b611219838383612ebc565b505050565b73d409de329593ff5f11b7eae9d67bc5e26ddd787e81565b7324f1e08eaeca9157cc9890025171b31ff21dadb581565b611256612cff565b73ffffffffffffffffffffffffffffffffffffffff166112746122cf565b73ffffffffffffffffffffffffffffffffffffffff16146112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190614fc2565b60405180910390fd5b60006112d4611199565b905060005b601e81101561132057600c5481836112f191906151dc565b101561130d5761130c33828461130791906151dc565b612dc0565b5b8080611318906153d9565b9150506112d9565b6000600f5414156113335743600f819055505b5050565b73ddd1d36e3f6090a3337b8bba21ae03d3b11a484881565b735bfd8c4aa447cfb66014e9e4abeaea8b5be5b9d581565b600061137283611952565b82106113b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113aa90614dc2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b61141a612cff565b73ffffffffffffffffffffffffffffffffffffffff166114386122cf565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614fc2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600b80546114c7906153a7565b80601f01602080910402602001604051908101604052809291908181526020018280546114f3906153a7565b80156115405780601f1061151557610100808354040283529160200191611540565b820191906000526020600020905b81548152906001019060200180831161152357829003601f168201915b505050505081565b6115638383836040518060200160405280600081525061253c565b505050565b6000611572611199565b82106115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90615082565b60405180910390fd5b600882815481106115ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b73ce0250aea1d634707d4d28bdd70e00e94ce594c681565b61161f612cff565b73ffffffffffffffffffffffffffffffffffffffff1661163d6122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90614fc2565b60405180910390fd5b80601090805190602001906116a9929190613d8a565b5050565b73ceb78908417b6a80b1cb78148a4711c8253b1a9a81565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590614f42565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff166117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd906150c2565b60405180910390fd5b60008111611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090614da2565b60405180910390fd5b600c5461182682611818611199565b61311890919063ffffffff16565b1115611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e90614e42565b60405180910390fd5b60148111156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290614ee2565b60405180910390fd5b346118c78267011f0f2c01da000061312e90919063ffffffff16565b14611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614f62565b60405180910390fd5b60005b81811015611936576119233361191e611199565b612dc0565b808061192e906153d9565b91505061190a565b5050565b73c6296febb1ab09b093b5307d9f366eb8b86d042781565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba90614f22565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a12612cff565b73ffffffffffffffffffffffffffffffffffffffff16611a306122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d90614fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b737bb8128db83ff858529a6f13b6494c834d0cad7681565b611b67612cff565b73ffffffffffffffffffffffffffffffffffffffff16611b856122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd290614fc2565b60405180910390fd5b6000600e5414611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790614ec2565b60405180910390fd5b43600f81905550565b611c31612cff565b73ffffffffffffffffffffffffffffffffffffffff16611c4f6122cf565b73ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90614fc2565b60405180910390fd5b600047905060008111611cb757600080fd5b611cfd7335ed04cf90249a285d190e7d39ad66a508ae38e0611cf86103e8611cea6102c08661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611d4173bb389e40cfadb0c50c2b60b6783d25cc4590abcd611d3c6064611d2e60038661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611d8573ddd1d36e3f6090a3337b8bba21ae03d3b11a4848611d806064611d7260028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611dc973d0276987f3408d95a8dc9917753ad2f4d9031233611dc46064611db660028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611e0e73ce0250aea1d634707d4d28bdd70e00e94ce594c6611e096103e8611dfb60058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611e52737cef0764ff117d09cdcfe9be4db0dab043211acc611e4d6064611e3f60018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611e967343f668fe728f200268440d4d43678a0fbe608e53611e916064611e8360038661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611eda737bb8128db83ff858529a6f13b6494c834d0cad76611ed56064611ec760028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611f1e7340938d3543538ad92dbf2c5552545d4d62a96a7d611f196064611f0b60018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611f637324f1e08eaeca9157cc9890025171b31ff21dadb5611f5e6103e8611f5060058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611fa8735054a3a716e4374679450dde08792a7ee2618142611fa3612710611f9560af8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b611fec732c1fcba608fcec3142a063569bc851e29e4f6e5d611fe76064611fd960018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b61203173c365d6da9293b8cadec5d2e545fb3bdc7b2b159261202c6103e861201e60058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612075734bc9c7d7f81504aa21c55d7e38e37197a817e3fc612070606461206260018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b6120ba73c6296febb1ab09b093b5307d9f366eb8b86d04276120b56103e86120a760058661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b6120ff73b8ae8f4c35b51153a4a3c392eea4c3bf88886da56120fa6127106120ec607d8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612143735bfd8c4aa447cfb66014e9e4abeaea8b5be5b9d561213e606461213060028661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612188734868dbc4801282f5fab3759316fc182bda27cccc6121836103e861217560238661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b6121cd730590b861515afc4168168a52757444986bcf1ba66121c86103e86121ba600f8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b61221273ceb78908417b6a80b1cb78148a4711c8253b1a9a61220d6127106121ff604b8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b612257733dcc28da8fa2eb3e1ec70ca471105cfa583b7895612252612710612244604b8661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b61229c73d409de329593ff5f11b7eae9d67bc5e26ddd787e6122976103e861228960018661312e90919063ffffffff16565b61314490919063ffffffff16565b61315a565b50565b73c365d6da9293b8cadec5d2e545fb3bdc7b2b159281565b733dcc28da8fa2eb3e1ec70ca471105cfa583b789581565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054612308906153a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612334906153a7565b80156123815780601f1061235657610100808354040283529160200191612381565b820191906000526020600020905b81548152906001019060200180831161236457829003601f168201915b5050505050905090565b612393612cff565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890614e82565b60405180910390fd5b806005600061240e612cff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124bb612cff565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125009190614d25565b60405180910390a35050565b73d0276987f3408d95a8dc9917753ad2f4d903123381565b7343f668fe728f200268440d4d43678a0fbe608e5381565b61254d612547612cff565b83612dde565b61258c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258390615062565b60405180910390fd5b6125988484848461320b565b50505050565b73bb389e40cfadb0c50c2b60b6783d25cc4590abcd81565b60606125c182612c93565b612600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f790615002565b60405180910390fd5b6000601160008481526020019081526020016000208054612620906153a7565b80601f016020809104026020016040519081016040528092919081815260200182805461264c906153a7565b80156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050505050905060006126aa613267565b90506000815114156126c0578192505050612724565b6000825111156126f55780826040516020016126dd929190614c85565b60405160208183030381529060405292505050612724565b806126ff856132f9565b604051602001612710929190614c85565b604051602081830303815290604052925050505b919050565b600e5481565b737cef0764ff117d09cdcfe9be4db0dab043211acc81565b734bc9c7d7f81504aa21c55d7e38e37197a817e3fc81565b612767612cff565b73ffffffffffffffffffffffffffffffffffffffff166127856122cf565b73ffffffffffffffffffffffffffffffffffffffff16146127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d290614fc2565b60405180910390fd5b6000600e5414612820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612817906150a2565b60405180910390fd5b6000600f541415612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614d62565b60405180910390fd5b600c54600f544060001c61287a9190615422565b600e8190555060ff612897600f54436134a690919063ffffffff16565b11156128c257600c546001436128ad91906152bd565b4060001c6128bb9190615422565b600e819055505b6000600e5414156128ea576128e36001600e5461311890919063ffffffff16565b600e819055505b565b600f5481565b73b8ae8f4c35b51153a4a3c392eea4c3bf88886da581565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b67011f0f2c01da000081565b600d60009054906101000a900460ff1681565b730590b861515afc4168168a52757444986bcf1ba681565b6129dd612cff565b73ffffffffffffffffffffffffffffffffffffffff166129fb6122cf565b73ffffffffffffffffffffffffffffffffffffffff1614612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4890614fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab890614e02565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b734868dbc4801282f5fab3759316fc182bda27cccc81565b7335ed04cf90249a285d190e7d39ad66a508ae38e081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c7c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c8c5750612c8b826134bc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d7a836116c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612dda828260405180602001604052806000815250613526565b5050565b6000612de982612c93565b612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f90614ea2565b60405180910390fd5b6000612e33836116c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ea257508373ffffffffffffffffffffffffffffffffffffffff16612e8a84610e21565b73ffffffffffffffffffffffffffffffffffffffff16145b80612eb35750612eb2818561290a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612edc826116c5565b73ffffffffffffffffffffffffffffffffffffffff1614612f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2990614fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9990614e62565b60405180910390fd5b612fad838383613581565b612fb8600082612d07565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300891906152bd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461305f91906151dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361312691906151dc565b905092915050565b6000818361313c9190615263565b905092915050565b600081836131529190615232565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161318090614ca9565b60006040518083038185875af1925050503d80600081146131bd576040519150601f19603f3d011682016040523d82523d6000602084013e6131c2565b606091505b5050905080613206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fd90615042565b60405180910390fd5b505050565b613216848484612ebc565b61322284848484613695565b613261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325890614de2565b60405180910390fd5b50505050565b606060108054613276906153a7565b80601f01602080910402602001604051908101604052809291908181526020018280546132a2906153a7565b80156132ef5780601f106132c4576101008083540402835291602001916132ef565b820191906000526020600020905b8154815290600101906020018083116132d257829003601f168201915b5050505050905090565b60606000821415613341576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134a1565b600082905060005b6000821461337357808061335c906153d9565b915050600a8261336c9190615232565b9150613349565b60008167ffffffffffffffff8111156133b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133e75781602001600182028036833780820191505090505b5090505b6000851461349a5760018261340091906152bd565b9150600a8561340f9190615422565b603061341b91906151dc565b60f81b818381518110613457577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134939190615232565b94506133eb565b8093505050505b919050565b600081836134b491906152bd565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613530838361382c565b61353d6000848484613695565b61357c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357390614de2565b60405180910390fd5b505050565b61358c8383836139fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135cf576135ca816139ff565b61360e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461360d5761360c8382613a48565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136515761364c81613bb5565b613690565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461368f5761368e8282613cf8565b5b5b505050565b60006136b68473ffffffffffffffffffffffffffffffffffffffff16613d77565b1561381f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136df612cff565b8786866040518563ffffffff1660e01b81526004016137019493929190614cd9565b602060405180830381600087803b15801561371b57600080fd5b505af192505050801561374c57506040513d601f19601f820116820180604052508101906137499190614136565b60015b6137cf573d806000811461377c576040519150601f19603f3d011682016040523d82523d6000602084013e613781565b606091505b506000815114156137c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137be90614de2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613824565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561389c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389390614f82565b60405180910390fd5b6138a581612c93565b156138e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dc90614e22565b60405180910390fd5b6138f160008383613581565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461394191906151dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a5584611952565b613a5f91906152bd565b9050600060076000848152602001908152602001600020549050818114613b44576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613bc991906152bd565b9050600060096000848152602001908152602001600020549050600060088381548110613c1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613c67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613cdc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d0383611952565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613d96906153a7565b90600052602060002090601f016020900481019282613db85760008555613dff565b82601f10613dd157805160ff1916838001178555613dff565b82800160010185558215613dff579182015b82811115613dfe578251825591602001919060010190613de3565b5b509050613e0c9190613e10565b5090565b5b80821115613e29576000816000905550600101613e11565b5090565b6000613e40613e3b8461512e565b6150fd565b905082815260208101848484011115613e5857600080fd5b613e63848285615365565b509392505050565b6000613e7e613e798461515e565b6150fd565b905082815260208101848484011115613e9657600080fd5b613ea1848285615365565b509392505050565b600081359050613eb881615520565b92915050565b600081359050613ecd81615537565b92915050565b600081359050613ee28161554e565b92915050565b600081519050613ef78161554e565b92915050565b600082601f830112613f0e57600080fd5b8135613f1e848260208601613e2d565b91505092915050565b600082601f830112613f3857600080fd5b8135613f48848260208601613e6b565b91505092915050565b600081359050613f6081615565565b92915050565b600060208284031215613f7857600080fd5b6000613f8684828501613ea9565b91505092915050565b60008060408385031215613fa257600080fd5b6000613fb085828601613ea9565b9250506020613fc185828601613ea9565b9150509250929050565b600080600060608486031215613fe057600080fd5b6000613fee86828701613ea9565b9350506020613fff86828701613ea9565b925050604061401086828701613f51565b9150509250925092565b6000806000806080858703121561403057600080fd5b600061403e87828801613ea9565b945050602061404f87828801613ea9565b935050604061406087828801613f51565b925050606085013567ffffffffffffffff81111561407d57600080fd5b61408987828801613efd565b91505092959194509250565b600080604083850312156140a857600080fd5b60006140b685828601613ea9565b92505060206140c785828601613ebe565b9150509250929050565b600080604083850312156140e457600080fd5b60006140f285828601613ea9565b925050602061410385828601613f51565b9150509250929050565b60006020828403121561411f57600080fd5b600061412d84828501613ed3565b91505092915050565b60006020828403121561414857600080fd5b600061415684828501613ee8565b91505092915050565b60006020828403121561417157600080fd5b600082013567ffffffffffffffff81111561418b57600080fd5b61419784828501613f27565b91505092915050565b6000602082840312156141b257600080fd5b60006141c084828501613f51565b91505092915050565b6141d2816152f1565b82525050565b6141e181615303565b82525050565b60006141f28261518e565b6141fc81856151a4565b935061420c818560208601615374565b6142158161550f565b840191505092915050565b600061422b82615199565b61423581856151c0565b9350614245818560208601615374565b61424e8161550f565b840191505092915050565b600061426482615199565b61426e81856151d1565b935061427e818560208601615374565b80840191505092915050565b60006142976023836151c0565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142fd601a836151c0565b91507f5265736572766520616d6f756e74206973206e656761746976650000000000006000830152602082019050919050565b600061433d6033836151c0565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b60006143a3602b836151c0565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006144096032836151c0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061446f6026836151c0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144d5601c836151c0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006145156028836151c0565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662047656d730000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457b6024836151c0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e16019836151c0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614621602c836151c0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614687601d836151c0565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006146c76023836151c0565b91507f43616e206f6e6c79206d696e7420757020746f2032302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061472d6038836151c0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614793602a836151c0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006147f96029836151c0565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061485f601d836151c0565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b600061489f6020836151c0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006148df602c836151c0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149456020836151c0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149856029836151c0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149eb602f836151c0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614a516021836151c0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ab76000836151b5565b9150600082019050919050565b6000614ad16010836151c0565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000614b116031836151c0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614b77602c836151c0565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614bdd6023836151c0565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c436020836151c0565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b614c7f8161535b565b82525050565b6000614c918285614259565b9150614c9d8284614259565b91508190509392505050565b6000614cb482614aaa565b9150819050919050565b6000602082019050614cd360008301846141c9565b92915050565b6000608082019050614cee60008301876141c9565b614cfb60208301866141c9565b614d086040830185614c76565b8181036060830152614d1a81846141e7565b905095945050505050565b6000602082019050614d3a60008301846141d8565b92915050565b60006020820190508181036000830152614d5a8184614220565b905092915050565b60006020820190508181036000830152614d7b8161428a565b9050919050565b60006020820190508181036000830152614d9b816142f0565b9050919050565b60006020820190508181036000830152614dbb81614330565b9050919050565b60006020820190508181036000830152614ddb81614396565b9050919050565b60006020820190508181036000830152614dfb816143fc565b9050919050565b60006020820190508181036000830152614e1b81614462565b9050919050565b60006020820190508181036000830152614e3b816144c8565b9050919050565b60006020820190508181036000830152614e5b81614508565b9050919050565b60006020820190508181036000830152614e7b8161456e565b9050919050565b60006020820190508181036000830152614e9b816145d4565b9050919050565b60006020820190508181036000830152614ebb81614614565b9050919050565b60006020820190508181036000830152614edb8161467a565b9050919050565b60006020820190508181036000830152614efb816146ba565b9050919050565b60006020820190508181036000830152614f1b81614720565b9050919050565b60006020820190508181036000830152614f3b81614786565b9050919050565b60006020820190508181036000830152614f5b816147ec565b9050919050565b60006020820190508181036000830152614f7b81614852565b9050919050565b60006020820190508181036000830152614f9b81614892565b9050919050565b60006020820190508181036000830152614fbb816148d2565b9050919050565b60006020820190508181036000830152614fdb81614938565b9050919050565b60006020820190508181036000830152614ffb81614978565b9050919050565b6000602082019050818103600083015261501b816149de565b9050919050565b6000602082019050818103600083015261503b81614a44565b9050919050565b6000602082019050818103600083015261505b81614ac4565b9050919050565b6000602082019050818103600083015261507b81614b04565b9050919050565b6000602082019050818103600083015261509b81614b6a565b9050919050565b600060208201905081810360008301526150bb81614bd0565b9050919050565b600060208201905081810360008301526150db81614c36565b9050919050565b60006020820190506150f76000830184614c76565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615124576151236154e0565b5b8060405250919050565b600067ffffffffffffffff821115615149576151486154e0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615179576151786154e0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006151e78261535b565b91506151f28361535b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561522757615226615453565b5b828201905092915050565b600061523d8261535b565b91506152488361535b565b92508261525857615257615482565b5b828204905092915050565b600061526e8261535b565b91506152798361535b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b2576152b1615453565b5b828202905092915050565b60006152c88261535b565b91506152d38361535b565b9250828210156152e6576152e5615453565b5b828203905092915050565b60006152fc8261533b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615392578082015181840152602081019050615377565b838111156153a1576000848401525b50505050565b600060028204905060018216806153bf57607f821691505b602082108114156153d3576153d26154b1565b5b50919050565b60006153e48261535b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561541757615416615453565b5b600182019050919050565b600061542d8261535b565b91506154388361535b565b92508261544857615447615482565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615529816152f1565b811461553457600080fd5b50565b61554081615303565b811461554b57600080fd5b50565b6155578161530f565b811461556257600080fd5b50565b61556e8161535b565b811461557957600080fd5b5056fea26469706673582212205272f40ba8ade26113a0e60e4d5b535361ad6adf57ab2816b467f3ee86e3ab9d64736f6c63430008000033

Deployed Bytecode Sourcemap

48956:7789:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42800:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49226:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50277:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31087:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32547:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32084:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53484:465;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55306:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50361:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43453:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50109:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33437:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51201:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50193;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53117:362;;;;;;;;;;;;;:::i;:::-;;49605:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50781;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43121:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49275:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51447:89;;;;;;;;;;;;;:::i;:::-;;49111:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33813:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43643:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49773:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55832:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51033:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30781:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53957:636;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50613:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30511:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28339:148;;;;;;;;;;;;;:::i;:::-;;50025:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55438:182;;;;;;;;;;;;;:::i;:::-;;51544:1377;;;:::i;:::-;;50445:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27688:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31256:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32840:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49689:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49941;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34035:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49521:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55949:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49356:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49857:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50529;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54601:697;;;;;;;;;;;;;:::i;:::-;;49391:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50697:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33206:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49153:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49315:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50949:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28642:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50865:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49437;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42800:237;42902:4;42941:35;42926:50;;;:11;:50;;;;:103;;;;42993:36;43017:11;42993:23;:36::i;:::-;42926:103;42919:110;;42800:237;;;:::o;49226:42::-;49266:2;49226:42;:::o;50277:77::-;50312:42;50277:77;:::o;31087:100::-;31141:13;31174:5;31167:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31087:100;:::o;32547:221::-;32623:7;32651:16;32659:7;32651;:16::i;:::-;32643:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32736:15;:24;32752:7;32736:24;;;;;;;;;;;;;;;;;;;;;32729:31;;32547:221;;;:::o;32084:397::-;32165:13;32181:23;32196:7;32181:14;:23::i;:::-;32165:39;;32229:5;32223:11;;:2;:11;;;;32215:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32309:5;32293:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32318:37;32335:5;32342:12;:10;:12::i;:::-;32318:16;:37::i;:::-;32293:62;32285:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32452:21;32461:2;32465:7;32452:8;:21::i;:::-;32084:397;;;:::o;53484:465::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53578:11:::1;53592:13;:11;:13::i;:::-;53578:27;;53641:1;53624:14;:18;53616:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53689:6;53684:156;53705:14;53701:1;:18;53684:156;;;53760:10;;53755:1;53746:6;:10;;;;:::i;:::-;53745:25;53741:88;;;53787:26;53797:3;53811:1;53802:6;:10;;;;:::i;:::-;53787:9;:26::i;:::-;53741:88;53721:3;;;;;:::i;:::-;;;;53684:156;;;;53879:1;53857:18;;:23;53853:89;;;53918:12;53897:18;:33;;;;53853:89;27979:1;53484:465:::0;;:::o;55306:124::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55408:14:::1;55391;:31;;;;;;;;;;;;:::i;:::-;;55306:124:::0;:::o;50361:77::-;50396:42;50361:77;:::o;43453:113::-;43514:7;43541:10;:17;;;;43534:24;;43453:113;:::o;50109:77::-;50144:42;50109:77;:::o;33437:305::-;33598:41;33617:12;:10;:12::i;:::-;33631:7;33598:18;:41::i;:::-;33590:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33706:28;33716:4;33722:2;33726:7;33706:9;:28::i;:::-;33437:305;;;:::o;51201:77::-;51236:42;51201:77;:::o;50193:::-;50228:42;50193:77;:::o;53117:362::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53170:11:::1;53184:13;:11;:13::i;:::-;53170:27;;53208:6;53225:146;53241:2;53237:1;:6;53225:146;;;53284:10;;53279:1;53270:6;:10;;;;:::i;:::-;53269:25;53265:95;;;53311:33;53321:10;53342:1;53333:6;:10;;;;:::i;:::-;53311:9;:33::i;:::-;53265:95;53245:3;;;;;:::i;:::-;;;;53225:146;;;53409:1;53387:18;;:23;53383:89;;;53448:12;53427:18;:33;;;;53383:89;27979:1;;53117:362::o:0;49605:77::-;49640:42;49605:77;:::o;50781:::-;50816:42;50781:77;:::o;43121:256::-;43218:7;43254:23;43271:5;43254:16;:23::i;:::-;43246:5;:31;43238:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43343:12;:19;43356:5;43343:19;;;;;;;;;;;;;;;:26;43363:5;43343:26;;;;;;;;;;;;43336:33;;43121:256;;;;:::o;49275:33::-;;;;:::o;51447:89::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51516:12:::1;;;;;;;;;;;51515:13;51500:12;;:28;;;;;;;;;;;;;;;;;;51447:89::o:0;49111:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33813:151::-;33917:39;33934:4;33940:2;33944:7;33917:39;;;;;;;;;;;;:16;:39::i;:::-;33813:151;;;:::o;43643:233::-;43718:7;43754:30;:28;:30::i;:::-;43746:5;:38;43738:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43851:10;43862:5;43851:17;;;;;;;;;;;;;;;;;;;;;;;;43844:24;;43643:233;;;:::o;49773:77::-;49808:42;49773:77;:::o;55832:109::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55925:8:::1;55906:16;:27;;;;;;;;;;;;:::i;:::-;;55832:109:::0;:::o;51033:77::-;51068:42;51033:77;:::o;30781:239::-;30853:7;30873:13;30889:7;:16;30897:7;30889:16;;;;;;;;;;;;;;;;;;;;;30873:32;;30941:1;30924:19;;:5;:19;;;;30916:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31007:5;31000:12;;;30781:239;;;:::o;53957:636::-;54029:12;;;;;;;;;;;54021:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54114:1;54097:14;:18;54089:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;54227:10;;54190:33;54208:14;54190:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;54182:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;49266:2;54301:14;:34;;54293:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54425:9;54393:28;54406:14;49188:17;54393:12;;:28;;;;:::i;:::-;:41;54385:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54486:6;54481:105;54502:14;54498:1;:18;54481:105;;;54538:36;54548:10;54560:13;:11;:13::i;:::-;54538:9;:36::i;:::-;54518:3;;;;;:::i;:::-;;;;54481:105;;;;53957:636;:::o;50613:77::-;50648:42;50613:77;:::o;30511:208::-;30583:7;30628:1;30611:19;;:5;:19;;;;30603:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30695:9;:16;30705:5;30695:16;;;;;;;;;;;;;;;;30688:23;;30511:208;;;:::o;28339:148::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28446:1:::1;28409:40;;28430:6;;;;;;;;;;;28409:40;;;;;;;;;;;;28477:1;28460:6;;:19;;;;;;;;;;;;;;;;;;28339:148::o:0;50025:77::-;50060:42;50025:77;:::o;55438:182::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55533:1:::1;55516:13;;:18;55508:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55600:12;55579:18;:33;;;;55438:182::o:0;51544:1377::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51603:15:::1;51621:21;51603:39;;51673:1;51663:7;:11;51655:20;;;::::0;::::1;;51686:47;49472:42;51706:26;51727:4;51706:16;51718:3;51706:7;:11;;:16;;;;:::i;:::-;:20;;:26;;;;:::i;:::-;51686:9;:47::i;:::-;51744:44;49556:42;51764:23;51783:3;51764:14;51776:1;51764:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;51744:9;:44::i;:::-;51799;49640:42;51819:23;51838:3;51819:14;51831:1;51819:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;51799:9;:44::i;:::-;51854;49724:42;51874:23;51893:3;51874:14;51886:1;51874:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;51854:9;:44::i;:::-;51909:45;49808:42;51929:24;51948:4;51929:14;51941:1;51929:7;:11;;:14;;;;:::i;:::-;:18;;:24;;;;:::i;:::-;51909:9;:45::i;:::-;51965:44;49892:42;51985:23;52004:3;51985:14;51997:1;51985:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;51965:9;:44::i;:::-;52020;49976:42;52040:23;52059:3;52040:14;52052:1;52040:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52020:9;:44::i;:::-;52075;50060:42;52095:23;52114:3;52095:14;52107:1;52095:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52075:9;:44::i;:::-;52130;50144:42;52150:23;52169:3;52150:14;52162:1;52150:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52130:9;:44::i;:::-;52185:45;50228:42;52205:24;52224:4;52205:14;52217:1;52205:7;:11;;:14;;;;:::i;:::-;:18;;:24;;;;:::i;:::-;52185:9;:45::i;:::-;52241:48;50312:42;52261:27;52282:5;52261:16;52273:3;52261:7;:11;;:16;;;;:::i;:::-;:20;;:27;;;;:::i;:::-;52241:9;:48::i;:::-;52300:44;50396:42;52320:23;52339:3;52320:14;52332:1;52320:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52300:9;:44::i;:::-;52355:45;50480:42;52375:24;52394:4;52375:14;52387:1;52375:7;:11;;:14;;;;:::i;:::-;:18;;:24;;;;:::i;:::-;52355:9;:45::i;:::-;52411:44;50564:42;52431:23;52450:3;52431:14;52443:1;52431:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52411:9;:44::i;:::-;52466:45;50648:42;52486:24;52505:4;52486:14;52498:1;52486:7;:11;;:14;;;;:::i;:::-;:18;;:24;;;;:::i;:::-;52466:9;:45::i;:::-;52522:48;50732:42;52542:27;52563:5;52542:16;52554:3;52542:7;:11;;:16;;;;:::i;:::-;:20;;:27;;;;:::i;:::-;52522:9;:48::i;:::-;52581:44;50816:42;52601:23;52620:3;52601:14;52613:1;52601:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52581:9;:44::i;:::-;52636:46;50900:42;52656:25;52676:4;52656:15;52668:2;52656:7;:11;;:15;;;;:::i;:::-;:19;;:25;;;;:::i;:::-;52636:9;:46::i;:::-;52693;50984:42;52713:25;52733:4;52713:15;52725:2;52713:7;:11;;:15;;;;:::i;:::-;:19;;:25;;;;:::i;:::-;52693:9;:46::i;:::-;52750:47;51068:42;52770:26;52790:5;52770:15;52782:2;52770:7;:11;;:15;;;;:::i;:::-;:19;;:26;;;;:::i;:::-;52750:9;:47::i;:::-;52808;51152:42;52828:26;52848:5;52828:15;52840:2;52828:7;:11;;:15;;;;:::i;:::-;:19;;:26;;;;:::i;:::-;52808:9;:47::i;:::-;52866:45;51236:42;52886:24;52905:4;52886:14;52898:1;52886:7;:11;;:14;;;;:::i;:::-;:18;;:24;;;;:::i;:::-;52866:9;:45::i;:::-;27979:1;51544:1377::o:0;50445:77::-;50480:42;50445:77;:::o;51117:::-;51152:42;51117:77;:::o;27688:87::-;27734:7;27761:6;;;;;;;;;;;27754:13;;27688:87;:::o;31256:104::-;31312:13;31345:7;31338:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31256:104;:::o;32840:295::-;32955:12;:10;:12::i;:::-;32943:24;;:8;:24;;;;32935:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33055:8;33010:18;:32;33029:12;:10;:12::i;:::-;33010:32;;;;;;;;;;;;;;;:42;33043:8;33010:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33108:8;33079:48;;33094:12;:10;:12::i;:::-;33079:48;;;33118:8;33079:48;;;;;;:::i;:::-;;;;;;;;32840:295;;:::o;49689:77::-;49724:42;49689:77;:::o;49941:::-;49976:42;49941:77;:::o;34035:285::-;34167:41;34186:12;:10;:12::i;:::-;34200:7;34167:18;:41::i;:::-;34159:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34273:39;34287:4;34293:2;34297:7;34306:5;34273:13;:39::i;:::-;34035:285;;;;:::o;49521:77::-;49556:42;49521:77;:::o;55949:793::-;56022:13;56056:16;56064:7;56056;:16::i;:::-;56048:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56137:23;56163:10;:19;56174:7;56163:19;;;;;;;;;;;56137:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56193:18;56214:10;:8;:10::i;:::-;56193:31;;56322:1;56306:4;56300:18;:23;56296:72;;;56347:9;56340:16;;;;;;56296:72;56498:1;56478:9;56472:23;:27;56468:108;;;56547:4;56553:9;56530:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56516:48;;;;;;56468:108;56708:4;56714:18;:7;:16;:18::i;:::-;56691:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56677:57;;;;55949:793;;;;:::o;49356:28::-;;;;:::o;49857:77::-;49892:42;49857:77;:::o;50529:::-;50564:42;50529:77;:::o;54601:697::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54683:1:::1;54666:13;;:18;54658:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54765:1;54743:18;;:23;;54735:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54873:10;;54850:18;;54840:29;54835:35;;:48;;;;:::i;:::-;54819:13;:64;;;;55057:3;55018:36;55035:18;;55018:12;:16;;:36;;;;:::i;:::-;:42;55015:136;;;55129:10;;55123:1;55108:12;:16;;;;:::i;:::-;55098:27;55093:33;;:46;;;;:::i;:::-;55077:13;:62;;;;55015:136;55225:1;55208:13;;:18;55204:87;;;55259:20;55277:1;55259:13;;:17;;:20;;;;:::i;:::-;55243:13;:36;;;;55204:87;54601:697::o:0;49391:33::-;;;;:::o;50697:77::-;50732:42;50697:77;:::o;33206:164::-;33303:4;33327:18;:25;33346:5;33327:25;;;;;;;;;;;;;;;:35;33353:8;33327:35;;;;;;;;;;;;;;;;;;;;;;;;;33320:42;;33206:164;;;;:::o;49153:52::-;49188:17;49153:52;:::o;49315:32::-;;;;;;;;;;;;;:::o;50949:77::-;50984:42;50949:77;:::o;28642:244::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28751:1:::1;28731:22;;:8;:22;;;;28723:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28841:8;28812:38;;28833:6;;;;;;;;;;;28812:38;;;;;;;;;;;;28870:8;28861:6;;:17;;;;;;;;;;;;;;;;;;28642:244:::0;:::o;50865:77::-;50900:42;50865:77;:::o;49437:::-;49472:42;49437:77;:::o;30155:292::-;30257:4;30296:25;30281:40;;;:11;:40;;;;:105;;;;30353:33;30338:48;;;:11;:48;;;;30281:105;:158;;;;30403:36;30427:11;30403:23;:36::i;:::-;30281:158;30274:165;;30155:292;;;:::o;35787:127::-;35852:4;35904:1;35876:30;;:7;:16;35884:7;35876:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35869:37;;35787:127;;;:::o;26305:98::-;26358:7;26385:10;26378:17;;26305:98;:::o;39664:174::-;39766:2;39739:15;:24;39755:7;39739:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39822:7;39818:2;39784:46;;39793:23;39808:7;39793:14;:23::i;:::-;39784:46;;;;;;;;;;;;39664:174;;:::o;36771:110::-;36847:26;36857:2;36861:7;36847:26;;;;;;;;;;;;:9;:26::i;:::-;36771:110;;:::o;36081:348::-;36174:4;36199:16;36207:7;36199;:16::i;:::-;36191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36275:13;36291:23;36306:7;36291:14;:23::i;:::-;36275:39;;36344:5;36333:16;;:7;:16;;;:51;;;;36377:7;36353:31;;:20;36365:7;36353:11;:20::i;:::-;:31;;;36333:51;:87;;;;36388:32;36405:5;36412:7;36388:16;:32::i;:::-;36333:87;36325:96;;;36081:348;;;;:::o;39002:544::-;39127:4;39100:31;;:23;39115:7;39100:14;:23::i;:::-;:31;;;39092:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39210:1;39196:16;;:2;:16;;;;39188:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39266:39;39287:4;39293:2;39297:7;39266:20;:39::i;:::-;39370:29;39387:1;39391:7;39370:8;:29::i;:::-;39431:1;39412:9;:15;39422:4;39412:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39460:1;39443:9;:13;39453:2;39443:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39491:2;39472:7;:16;39480:7;39472:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39530:7;39526:2;39511:27;;39520:4;39511:27;;;;;;;;;;;;39002:544;;;:::o;2763:98::-;2821:7;2852:1;2848;:5;;;;:::i;:::-;2841:12;;2763:98;;;;:::o;3501:::-;3559:7;3590:1;3586;:5;;;;:::i;:::-;3579:12;;3501:98;;;;:::o;3900:::-;3958:7;3989:1;3985;:5;;;;:::i;:::-;3978:12;;3900:98;;;;:::o;52929:180::-;53003:12;53021:8;:13;;53042:7;53021:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53002:52;;;53073:7;53065:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52929:180;;;:::o;35202:272::-;35316:28;35326:4;35332:2;35336:7;35316:9;:28::i;:::-;35363:48;35386:4;35392:2;35396:7;35405:5;35363:22;:48::i;:::-;35355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35202:272;;;;:::o;55628:117::-;55688:13;55721:16;55714:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55628:117;:::o;7304:723::-;7360:13;7590:1;7581:5;:10;7577:53;;;7608:10;;;;;;;;;;;;;;;;;;;;;7577:53;7640:12;7655:5;7640:20;;7671:14;7696:78;7711:1;7703:4;:9;7696:78;;7729:8;;;;;:::i;:::-;;;;7760:2;7752:10;;;;;:::i;:::-;;;7696:78;;;7784:19;7816:6;7806:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7784:39;;7834:154;7850:1;7841:5;:10;7834:154;;7878:1;7868:11;;;;;:::i;:::-;;;7945:2;7937:5;:10;;;;:::i;:::-;7924:2;:24;;;;:::i;:::-;7911:39;;7894:6;7901;7894:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7974:2;7965:11;;;;;:::i;:::-;;;7834:154;;;8012:6;7998:21;;;;;7304:723;;;;:::o;3144:98::-;3202:7;3233:1;3229;:5;;;;:::i;:::-;3222:12;;3144:98;;;;:::o;19378:157::-;19463:4;19502:25;19487:40;;;:11;:40;;;;19480:47;;19378:157;;;:::o;37108:250::-;37204:18;37210:2;37214:7;37204:5;:18::i;:::-;37241:54;37272:1;37276:2;37280:7;37289:5;37241:22;:54::i;:::-;37233:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37108:250;;;:::o;44489:555::-;44599:45;44626:4;44632:2;44636:7;44599:26;:45::i;:::-;44677:1;44661:18;;:4;:18;;;44657:187;;;44696:40;44728:7;44696:31;:40::i;:::-;44657:187;;;44766:2;44758:10;;:4;:10;;;44754:90;;44785:47;44818:4;44824:7;44785:32;:47::i;:::-;44754:90;44657:187;44872:1;44858:16;;:2;:16;;;44854:183;;;44891:45;44928:7;44891:36;:45::i;:::-;44854:183;;;44964:4;44958:10;;:2;:10;;;44954:83;;44985:40;45013:2;45017:7;44985:27;:40::i;:::-;44954:83;44854:183;44489:555;;;:::o;40403:843::-;40524:4;40550:15;:2;:13;;;:15::i;:::-;40546:693;;;40602:2;40586:36;;;40623:12;:10;:12::i;:::-;40637:4;40643:7;40652:5;40586:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40582:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40849:1;40832:6;:13;:18;40828:341;;;40875:60;;;;;;;;;;:::i;:::-;;;;;;;;40828:341;41119:6;41113:13;41104:6;41100:2;41096:15;41089:38;40582:602;40719:45;;;40709:55;;;:6;:55;;;;40702:62;;;;;40546:693;41223:4;41216:11;;40403:843;;;;;;;:::o;37694:382::-;37788:1;37774:16;;:2;:16;;;;37766:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37847:16;37855:7;37847;:16::i;:::-;37846:17;37838:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37909:45;37938:1;37942:2;37946:7;37909:20;:45::i;:::-;37984:1;37967:9;:13;37977:2;37967:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38015:2;37996:7;:16;38004:7;37996:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38060:7;38056:2;38035:33;;38052:1;38035:33;;;;;;;;;;;;37694:382;;:::o;41859:93::-;;;;:::o;45767:164::-;45871:10;:17;;;;45844:15;:24;45860:7;45844:24;;;;;;;;;;;:44;;;;45899:10;45915:7;45899:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45767:164;:::o;46558:988::-;46824:22;46874:1;46849:22;46866:4;46849:16;:22::i;:::-;:26;;;;:::i;:::-;46824:51;;46886:18;46907:17;:26;46925:7;46907:26;;;;;;;;;;;;46886:47;;47054:14;47040:10;:28;47036:328;;47085:19;47107:12;:18;47120:4;47107:18;;;;;;;;;;;;;;;:34;47126:14;47107:34;;;;;;;;;;;;47085:56;;47191:11;47158:12;:18;47171:4;47158:18;;;;;;;;;;;;;;;:30;47177:10;47158:30;;;;;;;;;;;:44;;;;47308:10;47275:17;:30;47293:11;47275:30;;;;;;;;;;;:43;;;;47036:328;;47460:17;:26;47478:7;47460:26;;;;;;;;;;;47453:33;;;47504:12;:18;47517:4;47504:18;;;;;;;;;;;;;;;:34;47523:14;47504:34;;;;;;;;;;;47497:41;;;46558:988;;;;:::o;47841:1079::-;48094:22;48139:1;48119:10;:17;;;;:21;;;;:::i;:::-;48094:46;;48151:18;48172:15;:24;48188:7;48172:24;;;;;;;;;;;;48151:45;;48523:19;48545:10;48556:14;48545:26;;;;;;;;;;;;;;;;;;;;;;;;48523:48;;48609:11;48584:10;48595;48584:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48720:10;48689:15;:28;48705:11;48689:28;;;;;;;;;;;:41;;;;48861:15;:24;48877:7;48861:24;;;;;;;;;;;48854:31;;;48896:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47841:1079;;;;:::o;45345:221::-;45430:14;45447:20;45464:2;45447:16;:20::i;:::-;45430:37;;45505:7;45478:12;:16;45491:2;45478:16;;;;;;;;;;;;;;;:24;45495:6;45478:24;;;;;;;;;;;:34;;;;45552:6;45523:17;:26;45541:7;45523:26;;;;;;;;;;;:35;;;;45345:221;;;:::o;9769:422::-;9829:4;10037:12;10148:7;10136:20;10128:28;;10182:1;10175:4;:8;10168:15;;;9769:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:367::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:34;7698:1;7693:3;7689:11;7682:55;7768:5;7763:2;7758:3;7754:12;7747:27;7800:2;7795:3;7791:12;7784:19;;7588:221;;;:::o;7815:324::-;;7978:67;8042:2;8037:3;7978:67;:::i;:::-;7971:74;;8075:28;8071:1;8066:3;8062:11;8055:49;8130:2;8125:3;8121:12;8114:19;;7961:178;;;:::o;8145:383::-;;8308:67;8372:2;8367:3;8308:67;:::i;:::-;8301:74;;8405:34;8401:1;8396:3;8392:11;8385:55;8471:21;8466:2;8461:3;8457:12;8450:43;8519:2;8514:3;8510:12;8503:19;;8291:237;;;:::o;8534:375::-;;8697:67;8761:2;8756:3;8697:67;:::i;:::-;8690:74;;8794:34;8790:1;8785:3;8781:11;8774:55;8860:13;8855:2;8850:3;8846:12;8839:35;8900:2;8895:3;8891:12;8884:19;;8680:229;;;:::o;8915:382::-;;9078:67;9142:2;9137:3;9078:67;:::i;:::-;9071:74;;9175:34;9171:1;9166:3;9162:11;9155:55;9241:20;9236:2;9231:3;9227:12;9220:42;9288:2;9283:3;9279:12;9272:19;;9061:236;;;:::o;9303:370::-;;9466:67;9530:2;9525:3;9466:67;:::i;:::-;9459:74;;9563:34;9559:1;9554:3;9550:11;9543:55;9629:8;9624:2;9619:3;9615:12;9608:30;9664:2;9659:3;9655:12;9648:19;;9449:224;;;:::o;9679:326::-;;9842:67;9906:2;9901:3;9842:67;:::i;:::-;9835:74;;9939:30;9935:1;9930:3;9926:11;9919:51;9996:2;9991:3;9987:12;9980:19;;9825:180;;;:::o;10011:372::-;;10174:67;10238:2;10233:3;10174:67;:::i;:::-;10167:74;;10271:34;10267:1;10262:3;10258:11;10251:55;10337:10;10332:2;10327:3;10323:12;10316:32;10374:2;10369:3;10365:12;10358:19;;10157:226;;;:::o;10389:368::-;;10552:67;10616:2;10611:3;10552:67;:::i;:::-;10545:74;;10649:34;10645:1;10640:3;10636:11;10629:55;10715:6;10710:2;10705:3;10701:12;10694:28;10748:2;10743:3;10739:12;10732:19;;10535:222;;;:::o;10763:323::-;;10926:67;10990:2;10985:3;10926:67;:::i;:::-;10919:74;;11023:27;11019:1;11014:3;11010:11;11003:48;11077:2;11072:3;11068:12;11061:19;;10909:177;;;:::o;11092:376::-;;11255:67;11319:2;11314:3;11255:67;:::i;:::-;11248:74;;11352:34;11348:1;11343:3;11339:11;11332:55;11418:14;11413:2;11408:3;11404:12;11397:36;11459:2;11454:3;11450:12;11443:19;;11238:230;;;:::o;11474:327::-;;11637:67;11701:2;11696:3;11637:67;:::i;:::-;11630:74;;11734:31;11730:1;11725:3;11721:11;11714:52;11792:2;11787:3;11783:12;11776:19;;11620:181;;;:::o;11807:367::-;;11970:67;12034:2;12029:3;11970:67;:::i;:::-;11963:74;;12067:34;12063:1;12058:3;12054:11;12047:55;12133:5;12128:2;12123:3;12119:12;12112:27;12165:2;12160:3;12156:12;12149:19;;11953:221;;;:::o;12180:388::-;;12343:67;12407:2;12402:3;12343:67;:::i;:::-;12336:74;;12440:34;12436:1;12431:3;12427:11;12420:55;12506:26;12501:2;12496:3;12492:12;12485:48;12559:2;12554:3;12550:12;12543:19;;12326:242;;;:::o;12574:374::-;;12737:67;12801:2;12796:3;12737:67;:::i;:::-;12730:74;;12834:34;12830:1;12825:3;12821:11;12814:55;12900:12;12895:2;12890:3;12886:12;12879:34;12939:2;12934:3;12930:12;12923:19;;12720:228;;;:::o;12954:373::-;;13117:67;13181:2;13176:3;13117:67;:::i;:::-;13110:74;;13214:34;13210:1;13205:3;13201:11;13194:55;13280:11;13275:2;13270:3;13266:12;13259:33;13318:2;13313:3;13309:12;13302:19;;13100:227;;;:::o;13333:327::-;;13496:67;13560:2;13555:3;13496:67;:::i;:::-;13489:74;;13593:31;13589:1;13584:3;13580:11;13573:52;13651:2;13646:3;13642:12;13635:19;;13479:181;;;:::o;13666:330::-;;13829:67;13893:2;13888:3;13829:67;:::i;:::-;13822:74;;13926:34;13922:1;13917:3;13913:11;13906:55;13987:2;13982:3;13978:12;13971:19;;13812:184;;;:::o;14002:376::-;;14165:67;14229:2;14224:3;14165:67;:::i;:::-;14158:74;;14262:34;14258:1;14253:3;14249:11;14242:55;14328:14;14323:2;14318:3;14314:12;14307:36;14369:2;14364:3;14360:12;14353:19;;14148:230;;;:::o;14384:330::-;;14547:67;14611:2;14606:3;14547:67;:::i;:::-;14540:74;;14644:34;14640:1;14635:3;14631:11;14624:55;14705:2;14700:3;14696:12;14689:19;;14530:184;;;:::o;14720:373::-;;14883:67;14947:2;14942:3;14883:67;:::i;:::-;14876:74;;14980:34;14976:1;14971:3;14967:11;14960:55;15046:11;15041:2;15036:3;15032:12;15025:33;15084:2;15079:3;15075:12;15068:19;;14866:227;;;:::o;15099:379::-;;15262:67;15326:2;15321:3;15262:67;:::i;:::-;15255:74;;15359:34;15355:1;15350:3;15346:11;15339:55;15425:17;15420:2;15415:3;15411:12;15404:39;15469:2;15464:3;15460:12;15453:19;;15245:233;;;:::o;15484:365::-;;15647:67;15711:2;15706:3;15647:67;:::i;:::-;15640:74;;15744:34;15740:1;15735:3;15731:11;15724:55;15810:3;15805:2;15800:3;15796:12;15789:25;15840:2;15835:3;15831:12;15824:19;;15630:219;;;:::o;15855:297::-;;16035:83;16116:1;16111:3;16035:83;:::i;:::-;16028:90;;16144:1;16139:3;16135:11;16128:18;;16018:134;;;:::o;16158:314::-;;16321:67;16385:2;16380:3;16321:67;:::i;:::-;16314:74;;16418:18;16414:1;16409:3;16405:11;16398:39;16463:2;16458:3;16454:12;16447:19;;16304:168;;;:::o;16478:381::-;;16641:67;16705:2;16700:3;16641:67;:::i;:::-;16634:74;;16738:34;16734:1;16729:3;16725:11;16718:55;16804:19;16799:2;16794:3;16790:12;16783:41;16850:2;16845:3;16841:12;16834:19;;16624:235;;;:::o;16865:376::-;;17028:67;17092:2;17087:3;17028:67;:::i;:::-;17021:74;;17125:34;17121:1;17116:3;17112:11;17105:55;17191:14;17186:2;17181:3;17177:12;17170:36;17232:2;17227:3;17223:12;17216:19;;17011:230;;;:::o;17247:367::-;;17410:67;17474:2;17469:3;17410:67;:::i;:::-;17403:74;;17507:34;17503:1;17498:3;17494:11;17487:55;17573:5;17568:2;17563:3;17559:12;17552:27;17605:2;17600:3;17596:12;17589:19;;17393:221;;;:::o;17620:330::-;;17783:67;17847:2;17842:3;17783:67;:::i;:::-;17776:74;;17880:34;17876:1;17871:3;17867:11;17860:55;17941:2;17936:3;17932:12;17925:19;;17766:184;;;:::o;17956:118::-;18043:24;18061:5;18043:24;:::i;:::-;18038:3;18031:37;18021:53;;:::o;18080:435::-;;18282:95;18373:3;18364:6;18282:95;:::i;:::-;18275:102;;18394:95;18485:3;18476:6;18394:95;:::i;:::-;18387:102;;18506:3;18499:10;;18264:251;;;;;:::o;18521:379::-;;18727:147;18870:3;18727:147;:::i;:::-;18720:154;;18891:3;18884:10;;18709:191;;;:::o;18906:222::-;;19037:2;19026:9;19022:18;19014:26;;19050:71;19118:1;19107:9;19103:17;19094:6;19050:71;:::i;:::-;19004:124;;;;:::o;19134:640::-;;19367:3;19356:9;19352:19;19344:27;;19381:71;19449:1;19438:9;19434:17;19425:6;19381:71;:::i;:::-;19462:72;19530:2;19519:9;19515:18;19506:6;19462:72;:::i;:::-;19544;19612:2;19601:9;19597:18;19588:6;19544:72;:::i;:::-;19663:9;19657:4;19653:20;19648:2;19637:9;19633:18;19626:48;19691:76;19762:4;19753:6;19691:76;:::i;:::-;19683:84;;19334:440;;;;;;;:::o;19780:210::-;;19905:2;19894:9;19890:18;19882:26;;19918:65;19980:1;19969:9;19965:17;19956:6;19918:65;:::i;:::-;19872:118;;;;:::o;19996:313::-;;20147:2;20136:9;20132:18;20124:26;;20196:9;20190:4;20186:20;20182:1;20171:9;20167:17;20160:47;20224:78;20297:4;20288:6;20224:78;:::i;:::-;20216:86;;20114:195;;;;:::o;20315:419::-;;20519:2;20508:9;20504:18;20496:26;;20568:9;20562:4;20558:20;20554:1;20543:9;20539:17;20532:47;20596:131;20722:4;20596:131;:::i;:::-;20588:139;;20486:248;;;:::o;20740:419::-;;20944:2;20933:9;20929:18;20921:26;;20993:9;20987:4;20983:20;20979:1;20968:9;20964:17;20957:47;21021:131;21147:4;21021:131;:::i;:::-;21013:139;;20911:248;;;:::o;21165:419::-;;21369:2;21358:9;21354:18;21346:26;;21418:9;21412:4;21408:20;21404:1;21393:9;21389:17;21382:47;21446:131;21572:4;21446:131;:::i;:::-;21438:139;;21336:248;;;:::o;21590:419::-;;21794:2;21783:9;21779:18;21771:26;;21843:9;21837:4;21833:20;21829:1;21818:9;21814:17;21807:47;21871:131;21997:4;21871:131;:::i;:::-;21863:139;;21761:248;;;:::o;22015:419::-;;22219:2;22208:9;22204:18;22196:26;;22268:9;22262:4;22258:20;22254:1;22243:9;22239:17;22232:47;22296:131;22422:4;22296:131;:::i;:::-;22288:139;;22186:248;;;:::o;22440:419::-;;22644:2;22633:9;22629:18;22621:26;;22693:9;22687:4;22683:20;22679:1;22668:9;22664:17;22657:47;22721:131;22847:4;22721:131;:::i;:::-;22713:139;;22611:248;;;:::o;22865:419::-;;23069:2;23058:9;23054:18;23046:26;;23118:9;23112:4;23108:20;23104:1;23093:9;23089:17;23082:47;23146:131;23272:4;23146:131;:::i;:::-;23138:139;;23036:248;;;:::o;23290:419::-;;23494:2;23483:9;23479:18;23471:26;;23543:9;23537:4;23533:20;23529:1;23518:9;23514:17;23507:47;23571:131;23697:4;23571:131;:::i;:::-;23563:139;;23461:248;;;:::o;23715:419::-;;23919:2;23908:9;23904:18;23896:26;;23968:9;23962:4;23958:20;23954:1;23943:9;23939:17;23932:47;23996:131;24122:4;23996:131;:::i;:::-;23988:139;;23886:248;;;:::o;24140:419::-;;24344:2;24333:9;24329:18;24321:26;;24393:9;24387:4;24383:20;24379:1;24368:9;24364:17;24357:47;24421:131;24547:4;24421:131;:::i;:::-;24413:139;;24311:248;;;:::o;24565:419::-;;24769:2;24758:9;24754:18;24746:26;;24818:9;24812:4;24808:20;24804:1;24793:9;24789:17;24782:47;24846:131;24972:4;24846:131;:::i;:::-;24838:139;;24736:248;;;:::o;24990:419::-;;25194:2;25183:9;25179:18;25171:26;;25243:9;25237:4;25233:20;25229:1;25218:9;25214:17;25207:47;25271:131;25397:4;25271:131;:::i;:::-;25263:139;;25161:248;;;:::o;25415:419::-;;25619:2;25608:9;25604:18;25596:26;;25668:9;25662:4;25658:20;25654:1;25643:9;25639:17;25632:47;25696:131;25822:4;25696:131;:::i;:::-;25688:139;;25586:248;;;:::o;25840:419::-;;26044:2;26033:9;26029:18;26021:26;;26093:9;26087:4;26083:20;26079:1;26068:9;26064:17;26057:47;26121:131;26247:4;26121:131;:::i;:::-;26113:139;;26011:248;;;:::o;26265:419::-;;26469:2;26458:9;26454:18;26446:26;;26518:9;26512:4;26508:20;26504:1;26493:9;26489:17;26482:47;26546:131;26672:4;26546:131;:::i;:::-;26538:139;;26436:248;;;:::o;26690:419::-;;26894:2;26883:9;26879:18;26871:26;;26943:9;26937:4;26933:20;26929:1;26918:9;26914:17;26907:47;26971:131;27097:4;26971:131;:::i;:::-;26963:139;;26861:248;;;:::o;27115:419::-;;27319:2;27308:9;27304:18;27296:26;;27368:9;27362:4;27358:20;27354:1;27343:9;27339:17;27332:47;27396:131;27522:4;27396:131;:::i;:::-;27388:139;;27286:248;;;:::o;27540:419::-;;27744:2;27733:9;27729:18;27721:26;;27793:9;27787:4;27783:20;27779:1;27768:9;27764:17;27757:47;27821:131;27947:4;27821:131;:::i;:::-;27813:139;;27711:248;;;:::o;27965:419::-;;28169:2;28158:9;28154:18;28146:26;;28218:9;28212:4;28208:20;28204:1;28193:9;28189:17;28182:47;28246:131;28372:4;28246:131;:::i;:::-;28238:139;;28136:248;;;:::o;28390:419::-;;28594:2;28583:9;28579:18;28571:26;;28643:9;28637:4;28633:20;28629:1;28618:9;28614:17;28607:47;28671:131;28797:4;28671:131;:::i;:::-;28663:139;;28561:248;;;:::o;28815:419::-;;29019:2;29008:9;29004:18;28996:26;;29068:9;29062:4;29058:20;29054:1;29043:9;29039:17;29032:47;29096:131;29222:4;29096:131;:::i;:::-;29088:139;;28986:248;;;:::o;29240:419::-;;29444:2;29433:9;29429:18;29421:26;;29493:9;29487:4;29483:20;29479:1;29468:9;29464:17;29457:47;29521:131;29647:4;29521:131;:::i;:::-;29513:139;;29411:248;;;:::o;29665:419::-;;29869:2;29858:9;29854:18;29846:26;;29918:9;29912:4;29908:20;29904:1;29893:9;29889:17;29882:47;29946:131;30072:4;29946:131;:::i;:::-;29938:139;;29836:248;;;:::o;30090:419::-;;30294:2;30283:9;30279:18;30271:26;;30343:9;30337:4;30333:20;30329:1;30318:9;30314:17;30307:47;30371:131;30497:4;30371:131;:::i;:::-;30363:139;;30261:248;;;:::o;30515:419::-;;30719:2;30708:9;30704:18;30696:26;;30768:9;30762:4;30758:20;30754:1;30743:9;30739:17;30732:47;30796:131;30922:4;30796:131;:::i;:::-;30788:139;;30686:248;;;:::o;30940:419::-;;31144:2;31133:9;31129:18;31121:26;;31193:9;31187:4;31183:20;31179:1;31168:9;31164:17;31157:47;31221:131;31347:4;31221:131;:::i;:::-;31213:139;;31111:248;;;:::o;31365:419::-;;31569:2;31558:9;31554:18;31546:26;;31618:9;31612:4;31608:20;31604:1;31593:9;31589:17;31582:47;31646:131;31772:4;31646:131;:::i;:::-;31638:139;;31536:248;;;:::o;31790:419::-;;31994:2;31983:9;31979:18;31971:26;;32043:9;32037:4;32033:20;32029:1;32018:9;32014:17;32007:47;32071:131;32197:4;32071:131;:::i;:::-;32063:139;;31961:248;;;:::o;32215:222::-;;32346:2;32335:9;32331:18;32323:26;;32359:71;32427:1;32416:9;32412:17;32403:6;32359:71;:::i;:::-;32313:124;;;;:::o;32443:283::-;;32509:2;32503:9;32493:19;;32551:4;32543:6;32539:17;32658:6;32646:10;32643:22;32622:18;32610:10;32607:34;32604:62;32601:2;;;32669:18;;:::i;:::-;32601:2;32709:10;32705:2;32698:22;32483:243;;;;:::o;32732:331::-;;32883:18;32875:6;32872:30;32869:2;;;32905:18;;:::i;:::-;32869:2;32990:4;32986:9;32979:4;32971:6;32967:17;32963:33;32955:41;;33051:4;33045;33041:15;33033:23;;32798:265;;;:::o;33069:332::-;;33221:18;33213:6;33210:30;33207:2;;;33243:18;;:::i;:::-;33207:2;33328:4;33324:9;33317:4;33309:6;33305:17;33301:33;33293:41;;33389:4;33383;33379:15;33371:23;;33136:265;;;:::o;33407:98::-;;33492:5;33486:12;33476:22;;33465:40;;;:::o;33511:99::-;;33597:5;33591:12;33581:22;;33570:40;;;:::o;33616:168::-;;33733:6;33728:3;33721:19;33773:4;33768:3;33764:14;33749:29;;33711:73;;;;:::o;33790:147::-;;33928:3;33913:18;;33903:34;;;;:::o;33943:169::-;;34061:6;34056:3;34049:19;34101:4;34096:3;34092:14;34077:29;;34039:73;;;;:::o;34118:148::-;;34257:3;34242:18;;34232:34;;;;:::o;34272:305::-;;34331:20;34349:1;34331:20;:::i;:::-;34326:25;;34365:20;34383:1;34365:20;:::i;:::-;34360:25;;34519:1;34451:66;34447:74;34444:1;34441:81;34438:2;;;34525:18;;:::i;:::-;34438:2;34569:1;34566;34562:9;34555:16;;34316:261;;;;:::o;34583:185::-;;34640:20;34658:1;34640:20;:::i;:::-;34635:25;;34674:20;34692:1;34674:20;:::i;:::-;34669:25;;34713:1;34703:2;;34718:18;;:::i;:::-;34703:2;34760:1;34757;34753:9;34748:14;;34625:143;;;;:::o;34774:348::-;;34837:20;34855:1;34837:20;:::i;:::-;34832:25;;34871:20;34889:1;34871:20;:::i;:::-;34866:25;;35059:1;34991:66;34987:74;34984:1;34981:81;34976:1;34969:9;34962:17;34958:105;34955:2;;;35066:18;;:::i;:::-;34955:2;35114:1;35111;35107:9;35096:20;;34822:300;;;;:::o;35128:191::-;;35188:20;35206:1;35188:20;:::i;:::-;35183:25;;35222:20;35240:1;35222:20;:::i;:::-;35217:25;;35261:1;35258;35255:8;35252:2;;;35266:18;;:::i;:::-;35252:2;35311:1;35308;35304:9;35296:17;;35173:146;;;;:::o;35325:96::-;;35391:24;35409:5;35391:24;:::i;:::-;35380:35;;35370:51;;;:::o;35427:90::-;;35504:5;35497:13;35490:21;35479:32;;35469:48;;;:::o;35523:149::-;;35599:66;35592:5;35588:78;35577:89;;35567:105;;;:::o;35678:126::-;;35755:42;35748:5;35744:54;35733:65;;35723:81;;;:::o;35810:77::-;;35876:5;35865:16;;35855:32;;;:::o;35893:154::-;35977:6;35972:3;35967;35954:30;36039:1;36030:6;36025:3;36021:16;36014:27;35944:103;;;:::o;36053:307::-;36121:1;36131:113;36145:6;36142:1;36139:13;36131:113;;;36230:1;36225:3;36221:11;36215:18;36211:1;36206:3;36202:11;36195:39;36167:2;36164:1;36160:10;36155:15;;36131:113;;;36262:6;36259:1;36256:13;36253:2;;;36342:1;36333:6;36328:3;36324:16;36317:27;36253:2;36102:258;;;;:::o;36366:320::-;;36447:1;36441:4;36437:12;36427:22;;36494:1;36488:4;36484:12;36515:18;36505:2;;36571:4;36563:6;36559:17;36549:27;;36505:2;36633;36625:6;36622:14;36602:18;36599:38;36596:2;;;36652:18;;:::i;:::-;36596:2;36417:269;;;;:::o;36692:233::-;;36754:24;36772:5;36754:24;:::i;:::-;36745:33;;36800:66;36793:5;36790:77;36787:2;;;36870:18;;:::i;:::-;36787:2;36917:1;36910:5;36906:13;36899:20;;36735:190;;;:::o;36931:176::-;;36980:20;36998:1;36980:20;:::i;:::-;36975:25;;37014:20;37032:1;37014:20;:::i;:::-;37009:25;;37053:1;37043:2;;37058:18;;:::i;:::-;37043:2;37099:1;37096;37092:9;37087:14;;36965:142;;;;:::o;37113:180::-;37161:77;37158:1;37151:88;37258:4;37255:1;37248:15;37282:4;37279:1;37272:15;37299:180;37347:77;37344:1;37337:88;37444:4;37441:1;37434:15;37468:4;37465:1;37458:15;37485:180;37533:77;37530:1;37523:88;37630:4;37627:1;37620:15;37654:4;37651:1;37644:15;37671:180;37719:77;37716:1;37709:88;37816:4;37813:1;37806:15;37840:4;37837:1;37830:15;37857:102;;37949:2;37945:7;37940:2;37933:5;37929:14;37925:28;37915:38;;37905:54;;;:::o;37965:122::-;38038:24;38056:5;38038:24;:::i;:::-;38031:5;38028:35;38018:2;;38077:1;38074;38067:12;38018:2;38008:79;:::o;38093:116::-;38163:21;38178:5;38163:21;:::i;:::-;38156:5;38153:32;38143:2;;38199:1;38196;38189:12;38143:2;38133:76;:::o;38215:120::-;38287:23;38304:5;38287:23;:::i;:::-;38280:5;38277:34;38267:2;;38325:1;38322;38315:12;38267:2;38257:78;:::o;38341:122::-;38414:24;38432:5;38414:24;:::i;:::-;38407:5;38404:35;38394:2;;38453:1;38450;38443:12;38394:2;38384:79;:::o

Swarm Source

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