ETH Price: $3,339.97 (-0.71%)

Token

Viento en Contra (VEC)
 

Overview

Max Total Supply

155 VEC

Holders

81

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bilbomaximus.eth
Balance
1 VEC
0x728f1973c71f7567de2a34fa2838d4f0fb7f9765
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:
Viento

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

pragma solidity ^0.8.0;



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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.3;

contract SodaPassNFT is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable {
   using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    uint16 public constant maxSupply = 5100;
    string private _baseTokenURI;
    
    uint256 public _startDate = 1634850000000;
    uint256 public _whitelistStartDate = 1634677200000;
    
    mapping (address => bool) private _whitelisted;

    constructor() ERC721("Soda Pass", "SODA") {
         for (uint8 i = 0; i < 100; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }
    
    function setStartDate(uint256 startDate) public onlyOwner {
        _startDate = startDate;
    }
    
    function setWhitelistStartDate(uint256 whitelistStartDate) public onlyOwner {
        _whitelistStartDate = whitelistStartDate;
    }

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

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


    function setBaseURI(string memory _newbaseTokenURI) public onlyOwner {
        _baseTokenURI = _newbaseTokenURI;
    }

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

    // Get minting limit (for a single transaction) based on current token supply
    function getCurrentMintLimit() public view returns (uint8) {
        return block.timestamp >= _startDate ? 20 : 4;
    }

    // Get ether price based on current token supply
    function getCurrentPrice() public pure returns (uint64) {
        return 100_000_000_000_000_000;
    }
    
    function addUserToWhitelist(address wallet) public onlyOwner {
        _whitelisted[wallet] = true;
    }
    
    function removeUserFromWhitelist(address wallet) public onlyOwner {
        _whitelisted[wallet] = false;
    }
    
    // Mint new token(s)
    function mint(uint8 _quantityToMint) public payable {
        require(_startDate <= block.timestamp || (block.timestamp >= _whitelistStartDate && _whitelisted[msg.sender] == true), block.timestamp <= _whitelistStartDate ? "Sale is not open" : "Not whitelisted");
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(block.timestamp >= _whitelistStartDate && block.timestamp <= _startDate ? (_quantityToMint + balanceOf(msg.sender) <= 4) : true, "Whitelisted mints are limited to 4 per wallet");
        require(
            _quantityToMint <= getCurrentMintLimit(),
            "Maximum current buy limit for individual transaction exceeded"
        );
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        require(
            msg.value == (getCurrentPrice() * _quantityToMint),
            "Ether submitted does not match current price"
        );

        for (uint8 i = 0; i < _quantityToMint; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }
    
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    // Withdraw ether from contract
    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        
        uint256 _balance = address(this).balance;
        address _coldWallet = 0x9781F65af8324b40Ee9Ca421ea963642Bc8a8C2b;
        payable(_coldWallet).transfer((_balance * 9)/10);
        
        address _devWallet = 0x3097617CbA85A26AdC214A1F87B680bE4b275cD0;
        payable(_devWallet).transfer((_balance * 1)/10);
    }
}

pragma solidity 0.8.3;

contract Viento is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable {
   using Counters for Counters.Counter;
    Counters.Counter public _tokenIds;
    
    uint16 public constant maxSupply = 1052;
    string private _baseTokenURI;
    
    uint256 public _startDate; // start 
    uint256 public _next48hour = 86400;
    uint256 public _next24hour = 86400;           // 86400 24 hour
    
    uint256 public _privateSalePrice =  6E16;   // 6E16 0.06 ETH per NFT
    uint256 public _publicSalePrice =  7E16;   //7E16 0.07 ETH per NFT
    bool public sale_started = false;
    event ReturnEvent(uint _amount);
    
    SodaPassNFT  soda_contract;
    
    address sodaContract = 0x3b553Fc51A63298E2E44d8ecd3b1ea01d22cA459;
        
    mapping(uint256 => bool) public _tokenIDused;
    uint[] public idTOKENs ;


    constructor() ERC721("Viento en Contra", "VEC") {
        soda_contract = SodaPassNFT(sodaContract);
        
        //30 for team
        for (uint8 i = 0; i < 30; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }

    }
    
    function StartSale() public onlyOwner{
        _startDate = block.timestamp;
        sale_started = true;
    }

    function setIdtrue(uint256 _id) private {
        _tokenIDused[_id] = true;

    }

    function getIdtrue(uint256 _id) public view returns (bool val){
        return _tokenIDused[_id];
    }
    
    function StopSale() public onlyOwner{
        sale_started = false;
    }
    
    function getSodaPassBalance(address _zz) public view returns (uint256 balance) {
       return soda_contract.balanceOf(_zz);
    }
    
     function getnow() public view returns (uint256) {
       return block.timestamp;
    }
    
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
    
    function setStartDate(uint256 startDate) public onlyOwner {
        _startDate = startDate;
    }
    
    function setPrivateSalePrice(uint256 privateSalePrice) public onlyOwner {
        _privateSalePrice = privateSalePrice;
    }
    
    function setPublicSalePrice(uint256 publicSalePrice) public onlyOwner {
        _publicSalePrice = publicSalePrice;
    }

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

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


    function setBaseURI(string memory _newbaseTokenURI) public onlyOwner {
        _baseTokenURI = _newbaseTokenURI;
    }

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

    function getsodaPassTokenID(address owner,uint256 _index) public view returns (uint256 tokenID){
        return soda_contract.tokenOfOwnerByIndex(owner,_index);
    }
    
     // Mint new token(s)
    function mint(uint8 _quantityToMint) public payable {
        
        delete idTOKENs;

       require(_quantityToMint <= 10, 'can mint only 10 max at a time');
       require((_quantityToMint + totalSupply()) <= maxSupply,"Exceeds maximum supply");
       require(sale_started == true,"Sale Not Started");
       
              // for next 24 hours after presale started by owner
        if(block.timestamp <= (_startDate + _next48hour))
        {
            require(getSodaPassBalance(msg.sender) > 0 , "Needs to have SodaPass");
            require(msg.value == (_privateSalePrice * _quantityToMint),"Ether submitted does not match current price 0.06 ETH per token");

        for(uint256 j = 0; j < getSodaPassBalance(msg.sender); j++){
                
                uint256 tokenID = getsodaPassTokenID(msg.sender,j);
                        if(_tokenIDused[tokenID] !=true){
                             idTOKENs.push(j);
                        }
                        if(idTOKENs.length == _quantityToMint)
                        {
                            break;
                        }             
                }
                 require(idTOKENs.length == _quantityToMint, "Soda pass used");
                 {
                for(uint8 j = 0; j < idTOKENs.length; j++){
                uint256 tokenID = getsodaPassTokenID(msg.sender,idTOKENs[j]);

                    setIdtrue(tokenID);
                    _tokenIds.increment();
                    uint256 newItemId = _tokenIds.current();
                    emit ReturnEvent(newItemId);
                    _mint(msg.sender, newItemId);
                }
                }    
        }
        if(block.timestamp > (_startDate + _next48hour) && block.timestamp <= (_startDate + _next48hour + _next24hour)){
            require(getSodaPassBalance(msg.sender) > 0 , "Needs to have SodaPass");
            require(msg.value == (_privateSalePrice * _quantityToMint),"Ether submitted does not match current price 0.06 ETH per token");
             for (uint8 i = 0; i < _quantityToMint; i++) {
              _tokenIds.increment();
              uint256 newItemId = _tokenIds.current();
              emit ReturnEvent(newItemId);
              _mint(msg.sender, newItemId);
          }
         }
        if(block.timestamp > (_startDate + _next48hour + _next24hour)) {
             require(msg.value == (_publicSalePrice * _quantityToMint),"Ether submitted does not match current price 0.07 ETH per token");
             for (uint8 i = 0; i < _quantityToMint; i++) {
             _tokenIds.increment();
             uint256 newItemId = _tokenIds.current();
             emit ReturnEvent(newItemId);
             _mint(msg.sender, newItemId);
             }
         }

    }

    function getidtokenlength() public view returns(uint256)
    {
        return idTOKENs.length;
    }

    
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    // Withdraw ether from contract
    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        
        uint256 _balance = address(this).balance;
        address _coldWallet = 0x344fbA0aBEa40E22d536FD023Dd514757ee98FD1;
        payable(_coldWallet).transfer((_balance * 7)/10);
        
        address _devWallet = 0xe101872F6b17850609A28909c8ac9F4720b3E373;
        payable(_devWallet).transfer((_balance * 2)/10);
        
        address _devWallet2 = 0x3097617CbA85A26AdC214A1F87B680bE4b275cD0;
        payable(_devWallet2).transfer((_balance * 1)/10);

    }
}

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":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReturnEvent","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":"StartSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"StopSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_next24hour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_next48hour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_privateSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenIDused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getIdtrue","outputs":[{"internalType":"bool","name":"val","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_zz","type":"address"}],"name":"getSodaPassBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getidtokenlength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getnow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getsodaPassTokenID","outputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idTOKENs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sale_started","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":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"privateSalePrice","type":"uint256"}],"name":"setPrivateSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSalePrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405262015180600f556201518060105566d529ae9e86000060115566f8b0a10e4700006012556000601360006101000a81548160ff021916908315150217905550733b553fc51a63298e2e44d8ecd3b1ea01d22ca459601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000a557600080fd5b506040518060400160405280601081526020017f5669656e746f20656e20436f6e747261000000000000000000000000000000008152506040518060400160405280600381526020017f564543000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012a92919062000b3d565b5080600190805190602001906200014392919062000b3d565b505050620001666200015a6200023b60201b60201c565b6200024360201b60201c565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b601e8160ff1610156200023457620001f0600c6200030960201b620021b61760201c565b600062000209600c6200031f60201b620021cc1760201c565b90506200021d33826200032d60201b60201c565b5080806200022b9062000dbe565b915050620001cc565b5062000eec565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003979062000ca6565b60405180910390fd5b620003b1816200051360201b60201c565b15620003f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003eb9062000c62565b60405180910390fd5b62000408600083836200057f60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200045a919062000cd9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620005978383836200059c60201b620021da1760201c565b505050565b620005b4838383620006e360201b620022ee1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200060157620005fb81620006e860201b60201c565b62000649565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000648576200064783826200073160201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000696576200069081620008ae60201b60201c565b620006de565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620006dd57620006dc8282620009f660201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016200074b8462000a8260201b620018c91760201c565b62000757919062000d36565b90506000600760008481526020019081526020016000205490508181146200083d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050620008c4919062000d36565b90506000600960008481526020019081526020016000205490506000600883815481106200091b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000964577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480620009da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000a0e8362000a8260201b620018c91760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000af6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000aed9062000c84565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000b4b9062000d88565b90600052602060002090601f01602090048101928262000b6f576000855562000bbb565b82601f1062000b8a57805160ff191683800117855562000bbb565b8280016001018555821562000bbb579182015b8281111562000bba57825182559160200191906001019062000b9d565b5b50905062000bca919062000bce565b5090565b5b8082111562000be957600081600090555060010162000bcf565b5090565b600062000bfc601c8362000cc8565b915062000c098262000e4b565b602082019050919050565b600062000c23602a8362000cc8565b915062000c308262000e74565b604082019050919050565b600062000c4a60208362000cc8565b915062000c578262000ec3565b602082019050919050565b6000602082019050818103600083015262000c7d8162000bed565b9050919050565b6000602082019050818103600083015262000c9f8162000c14565b9050919050565b6000602082019050818103600083015262000cc18162000c3b565b9050919050565b600082825260208201905092915050565b600062000ce68262000d71565b915062000cf38362000d71565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d2b5762000d2a62000ded565b5b828201905092915050565b600062000d438262000d71565b915062000d508362000d71565b92508282101562000d665762000d6562000ded565b5b828203905092915050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000da157607f821691505b6020821081141562000db85762000db762000e1c565b5b50919050565b600062000dcb8262000d7b565b915060ff82141562000de25762000de162000ded565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b614fa28062000efc6000396000f3fe6080604052600436106102515760003560e01c806370a0823111610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610893578063d5abeb01146108d0578063d60dfeeb146108fb578063e985e9c514610938578063f2fde38b14610975578063f60dd7e31461099e57610251565b8063a22cb465146107ae578063aa46a400146107d7578063ac8daba014610802578063b86e94a61461082d578063b88d4fde1461086a57610251565b806382d95df5116100fd57806382d95df5146106c7578063881cf122146106f05780638da5cb5b1461071b5780639052eaaf1461074657806395d89b411461078357610251565b806370a082311461060a578063715018a614610647578063791a25191461065e5780637944875b146106875780637bc36e041461069e57610251565b80632a0d65d6116101d257806342842e0e1161019657806342842e0e146104f75780634f6ccce71461052057806355f804b31461055d5780635abc9622146105865780636352211e146105b15780636ecd2306146105ee57610251565b80632a0d65d6146104105780632f745c591461043b578063318aed89146104785780633a517e0b146104b55780633ccfd60b146104e057610251565b806318160ddd1161021957806318160ddd1461033b578063190445e1146103665780631f5065021461039157806323b872dd146103bc57806326d89e70146103e557610251565b806301ffc9a71461025657806303225f4c1461029357806306fdde03146102aa578063081812fc146102d5578063095ea7b314610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613977565b6109db565b60405161028a9190613fc9565b60405180910390f35b34801561029f57600080fd5b506102a86109ed565b005b3480156102b657600080fd5b506102bf610a8d565b6040516102cc9190613fe4565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613a0a565b610b1f565b6040516103099190613f39565b60405180910390f35b34801561031e57600080fd5b506103396004803603810190610334919061393b565b610ba4565b005b34801561034757600080fd5b50610350610cbc565b60405161035d9190614381565b60405180910390f35b34801561037257600080fd5b5061037b610cc9565b6040516103889190614381565b60405180910390f35b34801561039d57600080fd5b506103a6610ccf565b6040516103b39190614381565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190613835565b610cd5565b005b3480156103f157600080fd5b506103fa610d35565b6040516104079190614381565b60405180910390f35b34801561041c57600080fd5b50610425610d3b565b6040516104329190614381565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d919061393b565b610d41565b60405161046f9190614381565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a91906137d0565b610de6565b6040516104ac9190614381565b60405180910390f35b3480156104c157600080fd5b506104ca610e9a565b6040516104d79190614381565b60405180910390f35b3480156104ec57600080fd5b506104f5610ea7565b005b34801561050357600080fd5b5061051e60048036038101906105199190613835565b6110d9565b005b34801561052c57600080fd5b5061054760048036038101906105429190613a0a565b6110f9565b6040516105549190614381565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f91906139c9565b611190565b005b34801561059257600080fd5b5061059b611226565b6040516105a89190613fc9565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613a0a565b611239565b6040516105e59190613f39565b60405180910390f35b61060860048036038101906106039190613a5c565b6112eb565b005b34801561061657600080fd5b50610631600480360381019061062c91906137d0565b6118c9565b60405161063e9190614381565b60405180910390f35b34801561065357600080fd5b5061065c611981565b005b34801561066a57600080fd5b5061068560048036038101906106809190613a0a565b611a09565b005b34801561069357600080fd5b5061069c611a8f565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613a0a565b611b28565b005b3480156106d357600080fd5b506106ee60048036038101906106e99190613a0a565b611bae565b005b3480156106fc57600080fd5b50610705611c34565b6040516107129190614381565b60405180910390f35b34801561072757600080fd5b50610730611c3c565b60405161073d9190613f39565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613a0a565b611c66565b60405161077a9190614381565b60405180910390f35b34801561078f57600080fd5b50610798611c8a565b6040516107a59190613fe4565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d091906138ff565b611d1c565b005b3480156107e357600080fd5b506107ec611e9d565b6040516107f99190614381565b60405180910390f35b34801561080e57600080fd5b50610817611ea9565b6040516108249190614381565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190613a0a565b611eaf565b6040516108619190613fc9565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613884565b611ed9565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613a0a565b611f3b565b6040516108c79190613fe4565b60405180910390f35b3480156108dc57600080fd5b506108e5611f4d565b6040516108f29190614366565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d9190613a0a565b611f53565b60405161092f9190613fc9565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a91906137f9565b611f73565b60405161096c9190613fc9565b60405180910390f35b34801561098157600080fd5b5061099c600480360381019061099791906137d0565b612007565b005b3480156109aa57600080fd5b506109c560048036038101906109c0919061393b565b6120ff565b6040516109d29190614381565b60405180910390f35b60006109e6826122f3565b9050919050565b6109f561236d565b73ffffffffffffffffffffffffffffffffffffffff16610a13611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090614266565b60405180910390fd5b42600e819055506001601360006101000a81548160ff021916908315150217905550565b606060008054610a9c9061464c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac89061464c565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b5050505050905090565b6000610b2a82612375565b610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090614246565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610baf82611239565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c17906142c6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3f61236d565b73ffffffffffffffffffffffffffffffffffffffff161480610c6e5750610c6d81610c6861236d565b611f73565b5b610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca490614186565b60405180910390fd5b610cb783836123e1565b505050565b6000600880549050905090565b60125481565b60105481565b610ce6610ce061236d565b8261249a565b610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90614306565b60405180910390fd5b610d30838383612578565b505050565b60115481565b600f5481565b6000610d4c836118c9565b8210610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490614006565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610e439190613f39565b60206040518083038186803b158015610e5b57600080fd5b505afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190613a33565b9050919050565b6000601680549050905090565b610eaf61236d565b73ffffffffffffffffffffffffffffffffffffffff16610ecd611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90614266565b60405180910390fd5b60004711610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d906140c6565b60405180910390fd5b6000479050600073344fba0abea40e22d536fd023dd514757ee98fd190508073ffffffffffffffffffffffffffffffffffffffff166108fc600a600785610fad91906144ed565b610fb791906144bc565b9081150290604051600060405180830381858888f19350505050158015610fe2573d6000803e3d6000fd5b50600073e101872f6b17850609a28909c8ac9f4720b3e37390508073ffffffffffffffffffffffffffffffffffffffff166108fc600a60028661102591906144ed565b61102f91906144bc565b9081150290604051600060405180830381858888f1935050505015801561105a573d6000803e3d6000fd5b506000733097617cba85a26adc214a1f87b680be4b275cd090508073ffffffffffffffffffffffffffffffffffffffff166108fc600a60018761109d91906144ed565b6110a791906144bc565b9081150290604051600060405180830381858888f193505050501580156110d2573d6000803e3d6000fd5b5050505050565b6110f483838360405180602001604052806000815250611ed9565b505050565b6000611103610cbc565b8210611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90614326565b60405180910390fd5b6008828154811061117e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61119861236d565b73ffffffffffffffffffffffffffffffffffffffff166111b6611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614266565b60405180910390fd5b80600d90805190602001906112229291906135a9565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906141c6565b60405180910390fd5b80915050919050565b601660006112f9919061362f565b600a8160ff161115611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614046565b60405180910390fd5b61041c61ffff1661134f610cbc565b8260ff1661135d9190614466565b111561139e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611395906142e6565b60405180910390fd5b60011515601360009054906101000a900460ff161515146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90614206565b60405180910390fd5b600f54600e546114049190614466565b421161167457600061141533610de6565b11611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614126565b60405180910390fd5b8060ff1660115461146691906144ed565b34146114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90614346565b60405180910390fd5b60005b6114b333610de6565b8110156115485760006114c633836120ff565b9050600115156015600083815260200190815260200160002060009054906101000a900460ff1615151461151e5760168290806001815401808255809150506001900390600052602060002001600090919091909150555b8260ff1660168054905014156115345750611548565b508080611540906146af565b9150506114aa565b508060ff1660168054905014611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614086565b60405180910390fd5b60005b6016805490508160ff1610156116725760006115f93360168460ff16815481106115e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546120ff565b9050611604816127d4565b61160e600c6121b6565b600061161a600c6121cc565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a2858160405161164b9190614381565b60405180910390a161165d3382612803565b5050808061166a906146f8565b915050611596565b505b600f54600e546116849190614466565b421180156116ae5750601054600f54600e546116a09190614466565b6116aa9190614466565b4211155b156117d05760006116be33610de6565b116116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590614126565b60405180910390fd5b8060ff1660115461170f91906144ed565b3414611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614346565b60405180910390fd5b60005b8160ff168160ff1610156117ce5761176b600c6121b6565b6000611777600c6121cc565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a285816040516117a89190614381565b60405180910390a16117ba3382612803565b5080806117c6906146f8565b915050611753565b505b601054600f54600e546117e39190614466565b6117ed9190614466565b4211156118c6578060ff1660125461180591906144ed565b3414611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90614166565b60405180910390fd5b60005b8160ff168160ff1610156118c457611861600c6121b6565b600061186d600c6121cc565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a2858160405161189e9190614381565b60405180910390a16118b03382612803565b5080806118bc906146f8565b915050611849565b505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906141a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61198961236d565b73ffffffffffffffffffffffffffffffffffffffff166119a7611c3c565b73ffffffffffffffffffffffffffffffffffffffff16146119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f490614266565b60405180910390fd5b611a0760006129d1565b565b611a1161236d565b73ffffffffffffffffffffffffffffffffffffffff16611a2f611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90614266565b60405180910390fd5b8060128190555050565b611a9761236d565b73ffffffffffffffffffffffffffffffffffffffff16611ab5611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0290614266565b60405180910390fd5b6000601360006101000a81548160ff021916908315150217905550565b611b3061236d565b73ffffffffffffffffffffffffffffffffffffffff16611b4e611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90614266565b60405180910390fd5b8060118190555050565b611bb661236d565b73ffffffffffffffffffffffffffffffffffffffff16611bd4611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2190614266565b60405180910390fd5b80600e8190555050565b600042905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60168181548110611c7657600080fd5b906000526020600020016000915090505481565b606060018054611c999061464c565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc59061464c565b8015611d125780601f10611ce757610100808354040283529160200191611d12565b820191906000526020600020905b815481529060010190602001808311611cf557829003601f168201915b5050505050905090565b611d2461236d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990614106565b60405180910390fd5b8060056000611d9f61236d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e4c61236d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e919190613fc9565b60405180910390a35050565b600c8060000154905081565b600e5481565b60006015600083815260200190815260200160002060009054906101000a900460ff169050919050565b611eea611ee461236d565b8361249a565b611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090614306565b60405180910390fd5b611f3584848484612a97565b50505050565b6060611f4682612af3565b9050919050565b61041c81565b60156020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61200f61236d565b73ffffffffffffffffffffffffffffffffffffffff1661202d611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90614266565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90614066565b60405180910390fd5b6120fc816129d1565b50565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984846040518363ffffffff1660e01b815260040161215e929190613fa0565b60206040518083038186803b15801561217657600080fd5b505afa15801561218a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ae9190613a33565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6121e58383836122ee565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122285761222381612c45565b612267565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612266576122658382612c8e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122aa576122a581612dfb565b6122e9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122e8576122e78282612f3e565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612366575061236582612fbd565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661245483611239565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124a582612375565b6124e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124db90614146565b60405180910390fd5b60006124ef83611239565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061255e57508373ffffffffffffffffffffffffffffffffffffffff1661254684610b1f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061256f575061256e8185611f73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661259882611239565b73ffffffffffffffffffffffffffffffffffffffff16146125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590614286565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561265e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612655906140e6565b60405180910390fd5b61266983838361309f565b6126746000826123e1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126c49190614547565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271b9190614466565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60016015600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286a906141e6565b60405180910390fd5b61287c81612375565b156128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906140a6565b60405180910390fd5b6128c86000838361309f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129189190614466565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa2848484612578565b612aae848484846130af565b612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614026565b60405180910390fd5b50505050565b6060612afe82612375565b612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3490614226565b60405180910390fd5b6000600a60008481526020019081526020016000208054612b5d9061464c565b80601f0160208091040260200160405190810160405280929190818152602001828054612b899061464c565b8015612bd65780601f10612bab57610100808354040283529160200191612bd6565b820191906000526020600020905b815481529060010190602001808311612bb957829003601f168201915b505050505090506000612be7613246565b9050600081511415612bfd578192505050612c40565b600082511115612c32578082604051602001612c1a929190613f15565b60405160208183030381529060405292505050612c40565b612c3b846132d8565b925050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9b846118c9565b612ca59190614547565b9050600060076000848152602001908152602001600020549050818114612d8a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e0f9190614547565b9050600060096000848152602001908152602001600020549050600060088381548110612e65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612ead577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f49836118c9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061308857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061309857506130978261337f565b5b9050919050565b6130aa8383836121da565b505050565b60006130d08473ffffffffffffffffffffffffffffffffffffffff166133e9565b15613239578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130f961236d565b8786866040518563ffffffff1660e01b815260040161311b9493929190613f54565b602060405180830381600087803b15801561313557600080fd5b505af192505050801561316657506040513d601f19601f8201168201806040525081019061316391906139a0565b60015b6131e9573d8060008114613196576040519150601f19603f3d011682016040523d82523d6000602084013e61319b565b606091505b506000815114156131e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d890614026565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061323e565b600190505b949350505050565b6060600d80546132559061464c565b80601f01602080910402602001604051908101604052809291908181526020018280546132819061464c565b80156132ce5780601f106132a3576101008083540402835291602001916132ce565b820191906000526020600020905b8154815290600101906020018083116132b157829003601f168201915b5050505050905090565b60606132e382612375565b613322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613319906142a6565b60405180910390fd5b600061332c613246565b9050600081511161334c5760405180602001604052806000815250613377565b80613356846133fc565b604051602001613367929190613f15565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080823b905060008111915050919050565b60606000821415613444576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135a4565b600082905060005b6000821461347657808061345f906146af565b915050600a8261346f91906144bc565b915061344c565b60008167ffffffffffffffff8111156134b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134ea5781602001600182028036833780820191505090505b5090505b6000851461359d576001826135039190614547565b9150600a856135129190614722565b603061351e9190614466565b60f81b81838151811061355a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561359691906144bc565b94506134ee565b8093505050505b919050565b8280546135b59061464c565b90600052602060002090601f0160209004810192826135d7576000855561361e565b82601f106135f057805160ff191683800117855561361e565b8280016001018555821561361e579182015b8281111561361d578251825591602001919060010190613602565b5b50905061362b9190613650565b5090565b508054600082559060005260206000209081019061364d9190613650565b50565b5b80821115613669576000816000905550600101613651565b5090565b600061368061367b846143c1565b61439c565b90508281526020810184848401111561369857600080fd5b6136a384828561460a565b509392505050565b60006136be6136b9846143f2565b61439c565b9050828152602081018484840111156136d657600080fd5b6136e184828561460a565b509392505050565b6000813590506136f881614ef9565b92915050565b60008135905061370d81614f10565b92915050565b60008135905061372281614f27565b92915050565b60008151905061373781614f27565b92915050565b600082601f83011261374e57600080fd5b813561375e84826020860161366d565b91505092915050565b600082601f83011261377857600080fd5b81356137888482602086016136ab565b91505092915050565b6000813590506137a081614f3e565b92915050565b6000815190506137b581614f3e565b92915050565b6000813590506137ca81614f55565b92915050565b6000602082840312156137e257600080fd5b60006137f0848285016136e9565b91505092915050565b6000806040838503121561380c57600080fd5b600061381a858286016136e9565b925050602061382b858286016136e9565b9150509250929050565b60008060006060848603121561384a57600080fd5b6000613858868287016136e9565b9350506020613869868287016136e9565b925050604061387a86828701613791565b9150509250925092565b6000806000806080858703121561389a57600080fd5b60006138a8878288016136e9565b94505060206138b9878288016136e9565b93505060406138ca87828801613791565b925050606085013567ffffffffffffffff8111156138e757600080fd5b6138f38782880161373d565b91505092959194509250565b6000806040838503121561391257600080fd5b6000613920858286016136e9565b9250506020613931858286016136fe565b9150509250929050565b6000806040838503121561394e57600080fd5b600061395c858286016136e9565b925050602061396d85828601613791565b9150509250929050565b60006020828403121561398957600080fd5b600061399784828501613713565b91505092915050565b6000602082840312156139b257600080fd5b60006139c084828501613728565b91505092915050565b6000602082840312156139db57600080fd5b600082013567ffffffffffffffff8111156139f557600080fd5b613a0184828501613767565b91505092915050565b600060208284031215613a1c57600080fd5b6000613a2a84828501613791565b91505092915050565b600060208284031215613a4557600080fd5b6000613a53848285016137a6565b91505092915050565b600060208284031215613a6e57600080fd5b6000613a7c848285016137bb565b91505092915050565b613a8e8161457b565b82525050565b613a9d8161458d565b82525050565b6000613aae82614423565b613ab88185614439565b9350613ac8818560208601614619565b613ad18161480f565b840191505092915050565b6000613ae78261442e565b613af1818561444a565b9350613b01818560208601614619565b613b0a8161480f565b840191505092915050565b6000613b208261442e565b613b2a818561445b565b9350613b3a818560208601614619565b80840191505092915050565b6000613b53602b8361444a565b9150613b5e82614820565b604082019050919050565b6000613b7660328361444a565b9150613b818261486f565b604082019050919050565b6000613b99601e8361444a565b9150613ba4826148be565b602082019050919050565b6000613bbc60268361444a565b9150613bc7826148e7565b604082019050919050565b6000613bdf600e8361444a565b9150613bea82614936565b602082019050919050565b6000613c02601c8361444a565b9150613c0d8261495f565b602082019050919050565b6000613c2560188361444a565b9150613c3082614988565b602082019050919050565b6000613c4860248361444a565b9150613c53826149b1565b604082019050919050565b6000613c6b60198361444a565b9150613c7682614a00565b602082019050919050565b6000613c8e60168361444a565b9150613c9982614a29565b602082019050919050565b6000613cb1602c8361444a565b9150613cbc82614a52565b604082019050919050565b6000613cd4603f8361444a565b9150613cdf82614aa1565b604082019050919050565b6000613cf760388361444a565b9150613d0282614af0565b604082019050919050565b6000613d1a602a8361444a565b9150613d2582614b3f565b604082019050919050565b6000613d3d60298361444a565b9150613d4882614b8e565b604082019050919050565b6000613d6060208361444a565b9150613d6b82614bdd565b602082019050919050565b6000613d8360108361444a565b9150613d8e82614c06565b602082019050919050565b6000613da660318361444a565b9150613db182614c2f565b604082019050919050565b6000613dc9602c8361444a565b9150613dd482614c7e565b604082019050919050565b6000613dec60208361444a565b9150613df782614ccd565b602082019050919050565b6000613e0f60298361444a565b9150613e1a82614cf6565b604082019050919050565b6000613e32602f8361444a565b9150613e3d82614d45565b604082019050919050565b6000613e5560218361444a565b9150613e6082614d94565b604082019050919050565b6000613e7860168361444a565b9150613e8382614de3565b602082019050919050565b6000613e9b60318361444a565b9150613ea682614e0c565b604082019050919050565b6000613ebe602c8361444a565b9150613ec982614e5b565b604082019050919050565b6000613ee1603f8361444a565b9150613eec82614eaa565b604082019050919050565b613f00816145c5565b82525050565b613f0f816145f3565b82525050565b6000613f218285613b15565b9150613f2d8284613b15565b91508190509392505050565b6000602082019050613f4e6000830184613a85565b92915050565b6000608082019050613f696000830187613a85565b613f766020830186613a85565b613f836040830185613f06565b8181036060830152613f958184613aa3565b905095945050505050565b6000604082019050613fb56000830185613a85565b613fc26020830184613f06565b9392505050565b6000602082019050613fde6000830184613a94565b92915050565b60006020820190508181036000830152613ffe8184613adc565b905092915050565b6000602082019050818103600083015261401f81613b46565b9050919050565b6000602082019050818103600083015261403f81613b69565b9050919050565b6000602082019050818103600083015261405f81613b8c565b9050919050565b6000602082019050818103600083015261407f81613baf565b9050919050565b6000602082019050818103600083015261409f81613bd2565b9050919050565b600060208201905081810360008301526140bf81613bf5565b9050919050565b600060208201905081810360008301526140df81613c18565b9050919050565b600060208201905081810360008301526140ff81613c3b565b9050919050565b6000602082019050818103600083015261411f81613c5e565b9050919050565b6000602082019050818103600083015261413f81613c81565b9050919050565b6000602082019050818103600083015261415f81613ca4565b9050919050565b6000602082019050818103600083015261417f81613cc7565b9050919050565b6000602082019050818103600083015261419f81613cea565b9050919050565b600060208201905081810360008301526141bf81613d0d565b9050919050565b600060208201905081810360008301526141df81613d30565b9050919050565b600060208201905081810360008301526141ff81613d53565b9050919050565b6000602082019050818103600083015261421f81613d76565b9050919050565b6000602082019050818103600083015261423f81613d99565b9050919050565b6000602082019050818103600083015261425f81613dbc565b9050919050565b6000602082019050818103600083015261427f81613ddf565b9050919050565b6000602082019050818103600083015261429f81613e02565b9050919050565b600060208201905081810360008301526142bf81613e25565b9050919050565b600060208201905081810360008301526142df81613e48565b9050919050565b600060208201905081810360008301526142ff81613e6b565b9050919050565b6000602082019050818103600083015261431f81613e8e565b9050919050565b6000602082019050818103600083015261433f81613eb1565b9050919050565b6000602082019050818103600083015261435f81613ed4565b9050919050565b600060208201905061437b6000830184613ef7565b92915050565b60006020820190506143966000830184613f06565b92915050565b60006143a66143b7565b90506143b2828261467e565b919050565b6000604051905090565b600067ffffffffffffffff8211156143dc576143db6147e0565b5b6143e58261480f565b9050602081019050919050565b600067ffffffffffffffff82111561440d5761440c6147e0565b5b6144168261480f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614471826145f3565b915061447c836145f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144b1576144b0614753565b5b828201905092915050565b60006144c7826145f3565b91506144d2836145f3565b9250826144e2576144e1614782565b5b828204905092915050565b60006144f8826145f3565b9150614503836145f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561453c5761453b614753565b5b828202905092915050565b6000614552826145f3565b915061455d836145f3565b9250828210156145705761456f614753565b5b828203905092915050565b6000614586826145d3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561463757808201518184015260208101905061461c565b83811115614646576000848401525b50505050565b6000600282049050600182168061466457607f821691505b60208210811415614678576146776147b1565b5b50919050565b6146878261480f565b810181811067ffffffffffffffff821117156146a6576146a56147e0565b5b80604052505050565b60006146ba826145f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146ed576146ec614753565b5b600182019050919050565b6000614703826145fd565b915060ff82141561471757614716614753565b5b600182019050919050565b600061472d826145f3565b9150614738836145f3565b92508261474857614747614782565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f63616e206d696e74206f6e6c79203130206d617820617420612074696d650000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f646120706173732075736564000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6565647320746f206861766520536f64615061737300000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3037204554482070657220746f6b656e00602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c65204e6f74205374617274656400000000000000000000000000000000600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3036204554482070657220746f6b656e00602082015250565b614f028161457b565b8114614f0d57600080fd5b50565b614f198161458d565b8114614f2457600080fd5b50565b614f3081614599565b8114614f3b57600080fd5b50565b614f47816145f3565b8114614f5257600080fd5b50565b614f5e816145fd565b8114614f6957600080fd5b5056fea264697066735822122041f060275aeb583df00924d45b25adff4ebfd971015fbf8946e663f4dd72548f64736f6c63430008030033

Deployed Bytecode

0x6080604052600436106102515760003560e01c806370a0823111610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610893578063d5abeb01146108d0578063d60dfeeb146108fb578063e985e9c514610938578063f2fde38b14610975578063f60dd7e31461099e57610251565b8063a22cb465146107ae578063aa46a400146107d7578063ac8daba014610802578063b86e94a61461082d578063b88d4fde1461086a57610251565b806382d95df5116100fd57806382d95df5146106c7578063881cf122146106f05780638da5cb5b1461071b5780639052eaaf1461074657806395d89b411461078357610251565b806370a082311461060a578063715018a614610647578063791a25191461065e5780637944875b146106875780637bc36e041461069e57610251565b80632a0d65d6116101d257806342842e0e1161019657806342842e0e146104f75780634f6ccce71461052057806355f804b31461055d5780635abc9622146105865780636352211e146105b15780636ecd2306146105ee57610251565b80632a0d65d6146104105780632f745c591461043b578063318aed89146104785780633a517e0b146104b55780633ccfd60b146104e057610251565b806318160ddd1161021957806318160ddd1461033b578063190445e1146103665780631f5065021461039157806323b872dd146103bc57806326d89e70146103e557610251565b806301ffc9a71461025657806303225f4c1461029357806306fdde03146102aa578063081812fc146102d5578063095ea7b314610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613977565b6109db565b60405161028a9190613fc9565b60405180910390f35b34801561029f57600080fd5b506102a86109ed565b005b3480156102b657600080fd5b506102bf610a8d565b6040516102cc9190613fe4565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190613a0a565b610b1f565b6040516103099190613f39565b60405180910390f35b34801561031e57600080fd5b506103396004803603810190610334919061393b565b610ba4565b005b34801561034757600080fd5b50610350610cbc565b60405161035d9190614381565b60405180910390f35b34801561037257600080fd5b5061037b610cc9565b6040516103889190614381565b60405180910390f35b34801561039d57600080fd5b506103a6610ccf565b6040516103b39190614381565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190613835565b610cd5565b005b3480156103f157600080fd5b506103fa610d35565b6040516104079190614381565b60405180910390f35b34801561041c57600080fd5b50610425610d3b565b6040516104329190614381565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d919061393b565b610d41565b60405161046f9190614381565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a91906137d0565b610de6565b6040516104ac9190614381565b60405180910390f35b3480156104c157600080fd5b506104ca610e9a565b6040516104d79190614381565b60405180910390f35b3480156104ec57600080fd5b506104f5610ea7565b005b34801561050357600080fd5b5061051e60048036038101906105199190613835565b6110d9565b005b34801561052c57600080fd5b5061054760048036038101906105429190613a0a565b6110f9565b6040516105549190614381565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f91906139c9565b611190565b005b34801561059257600080fd5b5061059b611226565b6040516105a89190613fc9565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613a0a565b611239565b6040516105e59190613f39565b60405180910390f35b61060860048036038101906106039190613a5c565b6112eb565b005b34801561061657600080fd5b50610631600480360381019061062c91906137d0565b6118c9565b60405161063e9190614381565b60405180910390f35b34801561065357600080fd5b5061065c611981565b005b34801561066a57600080fd5b5061068560048036038101906106809190613a0a565b611a09565b005b34801561069357600080fd5b5061069c611a8f565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613a0a565b611b28565b005b3480156106d357600080fd5b506106ee60048036038101906106e99190613a0a565b611bae565b005b3480156106fc57600080fd5b50610705611c34565b6040516107129190614381565b60405180910390f35b34801561072757600080fd5b50610730611c3c565b60405161073d9190613f39565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613a0a565b611c66565b60405161077a9190614381565b60405180910390f35b34801561078f57600080fd5b50610798611c8a565b6040516107a59190613fe4565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d091906138ff565b611d1c565b005b3480156107e357600080fd5b506107ec611e9d565b6040516107f99190614381565b60405180910390f35b34801561080e57600080fd5b50610817611ea9565b6040516108249190614381565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190613a0a565b611eaf565b6040516108619190613fc9565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613884565b611ed9565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613a0a565b611f3b565b6040516108c79190613fe4565b60405180910390f35b3480156108dc57600080fd5b506108e5611f4d565b6040516108f29190614366565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d9190613a0a565b611f53565b60405161092f9190613fc9565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a91906137f9565b611f73565b60405161096c9190613fc9565b60405180910390f35b34801561098157600080fd5b5061099c600480360381019061099791906137d0565b612007565b005b3480156109aa57600080fd5b506109c560048036038101906109c0919061393b565b6120ff565b6040516109d29190614381565b60405180910390f35b60006109e6826122f3565b9050919050565b6109f561236d565b73ffffffffffffffffffffffffffffffffffffffff16610a13611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090614266565b60405180910390fd5b42600e819055506001601360006101000a81548160ff021916908315150217905550565b606060008054610a9c9061464c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac89061464c565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b5050505050905090565b6000610b2a82612375565b610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090614246565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610baf82611239565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c17906142c6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3f61236d565b73ffffffffffffffffffffffffffffffffffffffff161480610c6e5750610c6d81610c6861236d565b611f73565b5b610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca490614186565b60405180910390fd5b610cb783836123e1565b505050565b6000600880549050905090565b60125481565b60105481565b610ce6610ce061236d565b8261249a565b610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90614306565b60405180910390fd5b610d30838383612578565b505050565b60115481565b600f5481565b6000610d4c836118c9565b8210610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490614006565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610e439190613f39565b60206040518083038186803b158015610e5b57600080fd5b505afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190613a33565b9050919050565b6000601680549050905090565b610eaf61236d565b73ffffffffffffffffffffffffffffffffffffffff16610ecd611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90614266565b60405180910390fd5b60004711610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d906140c6565b60405180910390fd5b6000479050600073344fba0abea40e22d536fd023dd514757ee98fd190508073ffffffffffffffffffffffffffffffffffffffff166108fc600a600785610fad91906144ed565b610fb791906144bc565b9081150290604051600060405180830381858888f19350505050158015610fe2573d6000803e3d6000fd5b50600073e101872f6b17850609a28909c8ac9f4720b3e37390508073ffffffffffffffffffffffffffffffffffffffff166108fc600a60028661102591906144ed565b61102f91906144bc565b9081150290604051600060405180830381858888f1935050505015801561105a573d6000803e3d6000fd5b506000733097617cba85a26adc214a1f87b680be4b275cd090508073ffffffffffffffffffffffffffffffffffffffff166108fc600a60018761109d91906144ed565b6110a791906144bc565b9081150290604051600060405180830381858888f193505050501580156110d2573d6000803e3d6000fd5b5050505050565b6110f483838360405180602001604052806000815250611ed9565b505050565b6000611103610cbc565b8210611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90614326565b60405180910390fd5b6008828154811061117e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61119861236d565b73ffffffffffffffffffffffffffffffffffffffff166111b6611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614266565b60405180910390fd5b80600d90805190602001906112229291906135a9565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906141c6565b60405180910390fd5b80915050919050565b601660006112f9919061362f565b600a8160ff161115611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614046565b60405180910390fd5b61041c61ffff1661134f610cbc565b8260ff1661135d9190614466565b111561139e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611395906142e6565b60405180910390fd5b60011515601360009054906101000a900460ff161515146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90614206565b60405180910390fd5b600f54600e546114049190614466565b421161167457600061141533610de6565b11611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614126565b60405180910390fd5b8060ff1660115461146691906144ed565b34146114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90614346565b60405180910390fd5b60005b6114b333610de6565b8110156115485760006114c633836120ff565b9050600115156015600083815260200190815260200160002060009054906101000a900460ff1615151461151e5760168290806001815401808255809150506001900390600052602060002001600090919091909150555b8260ff1660168054905014156115345750611548565b508080611540906146af565b9150506114aa565b508060ff1660168054905014611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614086565b60405180910390fd5b60005b6016805490508160ff1610156116725760006115f93360168460ff16815481106115e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546120ff565b9050611604816127d4565b61160e600c6121b6565b600061161a600c6121cc565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a2858160405161164b9190614381565b60405180910390a161165d3382612803565b5050808061166a906146f8565b915050611596565b505b600f54600e546116849190614466565b421180156116ae5750601054600f54600e546116a09190614466565b6116aa9190614466565b4211155b156117d05760006116be33610de6565b116116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590614126565b60405180910390fd5b8060ff1660115461170f91906144ed565b3414611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614346565b60405180910390fd5b60005b8160ff168160ff1610156117ce5761176b600c6121b6565b6000611777600c6121cc565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a285816040516117a89190614381565b60405180910390a16117ba3382612803565b5080806117c6906146f8565b915050611753565b505b601054600f54600e546117e39190614466565b6117ed9190614466565b4211156118c6578060ff1660125461180591906144ed565b3414611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90614166565b60405180910390fd5b60005b8160ff168160ff1610156118c457611861600c6121b6565b600061186d600c6121cc565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a2858160405161189e9190614381565b60405180910390a16118b03382612803565b5080806118bc906146f8565b915050611849565b505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906141a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61198961236d565b73ffffffffffffffffffffffffffffffffffffffff166119a7611c3c565b73ffffffffffffffffffffffffffffffffffffffff16146119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f490614266565b60405180910390fd5b611a0760006129d1565b565b611a1161236d565b73ffffffffffffffffffffffffffffffffffffffff16611a2f611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90614266565b60405180910390fd5b8060128190555050565b611a9761236d565b73ffffffffffffffffffffffffffffffffffffffff16611ab5611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0290614266565b60405180910390fd5b6000601360006101000a81548160ff021916908315150217905550565b611b3061236d565b73ffffffffffffffffffffffffffffffffffffffff16611b4e611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90614266565b60405180910390fd5b8060118190555050565b611bb661236d565b73ffffffffffffffffffffffffffffffffffffffff16611bd4611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2190614266565b60405180910390fd5b80600e8190555050565b600042905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60168181548110611c7657600080fd5b906000526020600020016000915090505481565b606060018054611c999061464c565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc59061464c565b8015611d125780601f10611ce757610100808354040283529160200191611d12565b820191906000526020600020905b815481529060010190602001808311611cf557829003601f168201915b5050505050905090565b611d2461236d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990614106565b60405180910390fd5b8060056000611d9f61236d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e4c61236d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e919190613fc9565b60405180910390a35050565b600c8060000154905081565b600e5481565b60006015600083815260200190815260200160002060009054906101000a900460ff169050919050565b611eea611ee461236d565b8361249a565b611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090614306565b60405180910390fd5b611f3584848484612a97565b50505050565b6060611f4682612af3565b9050919050565b61041c81565b60156020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61200f61236d565b73ffffffffffffffffffffffffffffffffffffffff1661202d611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90614266565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90614066565b60405180910390fd5b6120fc816129d1565b50565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984846040518363ffffffff1660e01b815260040161215e929190613fa0565b60206040518083038186803b15801561217657600080fd5b505afa15801561218a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ae9190613a33565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6121e58383836122ee565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122285761222381612c45565b612267565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612266576122658382612c8e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122aa576122a581612dfb565b6122e9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122e8576122e78282612f3e565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612366575061236582612fbd565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661245483611239565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124a582612375565b6124e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124db90614146565b60405180910390fd5b60006124ef83611239565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061255e57508373ffffffffffffffffffffffffffffffffffffffff1661254684610b1f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061256f575061256e8185611f73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661259882611239565b73ffffffffffffffffffffffffffffffffffffffff16146125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590614286565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561265e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612655906140e6565b60405180910390fd5b61266983838361309f565b6126746000826123e1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126c49190614547565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271b9190614466565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60016015600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286a906141e6565b60405180910390fd5b61287c81612375565b156128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906140a6565b60405180910390fd5b6128c86000838361309f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129189190614466565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa2848484612578565b612aae848484846130af565b612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614026565b60405180910390fd5b50505050565b6060612afe82612375565b612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3490614226565b60405180910390fd5b6000600a60008481526020019081526020016000208054612b5d9061464c565b80601f0160208091040260200160405190810160405280929190818152602001828054612b899061464c565b8015612bd65780601f10612bab57610100808354040283529160200191612bd6565b820191906000526020600020905b815481529060010190602001808311612bb957829003601f168201915b505050505090506000612be7613246565b9050600081511415612bfd578192505050612c40565b600082511115612c32578082604051602001612c1a929190613f15565b60405160208183030381529060405292505050612c40565b612c3b846132d8565b925050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9b846118c9565b612ca59190614547565b9050600060076000848152602001908152602001600020549050818114612d8a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e0f9190614547565b9050600060096000848152602001908152602001600020549050600060088381548110612e65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612ead577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f49836118c9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061308857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061309857506130978261337f565b5b9050919050565b6130aa8383836121da565b505050565b60006130d08473ffffffffffffffffffffffffffffffffffffffff166133e9565b15613239578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130f961236d565b8786866040518563ffffffff1660e01b815260040161311b9493929190613f54565b602060405180830381600087803b15801561313557600080fd5b505af192505050801561316657506040513d601f19601f8201168201806040525081019061316391906139a0565b60015b6131e9573d8060008114613196576040519150601f19603f3d011682016040523d82523d6000602084013e61319b565b606091505b506000815114156131e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d890614026565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061323e565b600190505b949350505050565b6060600d80546132559061464c565b80601f01602080910402602001604051908101604052809291908181526020018280546132819061464c565b80156132ce5780601f106132a3576101008083540402835291602001916132ce565b820191906000526020600020905b8154815290600101906020018083116132b157829003601f168201915b5050505050905090565b60606132e382612375565b613322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613319906142a6565b60405180910390fd5b600061332c613246565b9050600081511161334c5760405180602001604052806000815250613377565b80613356846133fc565b604051602001613367929190613f15565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080823b905060008111915050919050565b60606000821415613444576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135a4565b600082905060005b6000821461347657808061345f906146af565b915050600a8261346f91906144bc565b915061344c565b60008167ffffffffffffffff8111156134b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134ea5781602001600182028036833780820191505090505b5090505b6000851461359d576001826135039190614547565b9150600a856135129190614722565b603061351e9190614466565b60f81b81838151811061355a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561359691906144bc565b94506134ee565b8093505050505b919050565b8280546135b59061464c565b90600052602060002090601f0160209004810192826135d7576000855561361e565b82601f106135f057805160ff191683800117855561361e565b8280016001018555821561361e579182015b8281111561361d578251825591602001919060010190613602565b5b50905061362b9190613650565b5090565b508054600082559060005260206000209081019061364d9190613650565b50565b5b80821115613669576000816000905550600101613651565b5090565b600061368061367b846143c1565b61439c565b90508281526020810184848401111561369857600080fd5b6136a384828561460a565b509392505050565b60006136be6136b9846143f2565b61439c565b9050828152602081018484840111156136d657600080fd5b6136e184828561460a565b509392505050565b6000813590506136f881614ef9565b92915050565b60008135905061370d81614f10565b92915050565b60008135905061372281614f27565b92915050565b60008151905061373781614f27565b92915050565b600082601f83011261374e57600080fd5b813561375e84826020860161366d565b91505092915050565b600082601f83011261377857600080fd5b81356137888482602086016136ab565b91505092915050565b6000813590506137a081614f3e565b92915050565b6000815190506137b581614f3e565b92915050565b6000813590506137ca81614f55565b92915050565b6000602082840312156137e257600080fd5b60006137f0848285016136e9565b91505092915050565b6000806040838503121561380c57600080fd5b600061381a858286016136e9565b925050602061382b858286016136e9565b9150509250929050565b60008060006060848603121561384a57600080fd5b6000613858868287016136e9565b9350506020613869868287016136e9565b925050604061387a86828701613791565b9150509250925092565b6000806000806080858703121561389a57600080fd5b60006138a8878288016136e9565b94505060206138b9878288016136e9565b93505060406138ca87828801613791565b925050606085013567ffffffffffffffff8111156138e757600080fd5b6138f38782880161373d565b91505092959194509250565b6000806040838503121561391257600080fd5b6000613920858286016136e9565b9250506020613931858286016136fe565b9150509250929050565b6000806040838503121561394e57600080fd5b600061395c858286016136e9565b925050602061396d85828601613791565b9150509250929050565b60006020828403121561398957600080fd5b600061399784828501613713565b91505092915050565b6000602082840312156139b257600080fd5b60006139c084828501613728565b91505092915050565b6000602082840312156139db57600080fd5b600082013567ffffffffffffffff8111156139f557600080fd5b613a0184828501613767565b91505092915050565b600060208284031215613a1c57600080fd5b6000613a2a84828501613791565b91505092915050565b600060208284031215613a4557600080fd5b6000613a53848285016137a6565b91505092915050565b600060208284031215613a6e57600080fd5b6000613a7c848285016137bb565b91505092915050565b613a8e8161457b565b82525050565b613a9d8161458d565b82525050565b6000613aae82614423565b613ab88185614439565b9350613ac8818560208601614619565b613ad18161480f565b840191505092915050565b6000613ae78261442e565b613af1818561444a565b9350613b01818560208601614619565b613b0a8161480f565b840191505092915050565b6000613b208261442e565b613b2a818561445b565b9350613b3a818560208601614619565b80840191505092915050565b6000613b53602b8361444a565b9150613b5e82614820565b604082019050919050565b6000613b7660328361444a565b9150613b818261486f565b604082019050919050565b6000613b99601e8361444a565b9150613ba4826148be565b602082019050919050565b6000613bbc60268361444a565b9150613bc7826148e7565b604082019050919050565b6000613bdf600e8361444a565b9150613bea82614936565b602082019050919050565b6000613c02601c8361444a565b9150613c0d8261495f565b602082019050919050565b6000613c2560188361444a565b9150613c3082614988565b602082019050919050565b6000613c4860248361444a565b9150613c53826149b1565b604082019050919050565b6000613c6b60198361444a565b9150613c7682614a00565b602082019050919050565b6000613c8e60168361444a565b9150613c9982614a29565b602082019050919050565b6000613cb1602c8361444a565b9150613cbc82614a52565b604082019050919050565b6000613cd4603f8361444a565b9150613cdf82614aa1565b604082019050919050565b6000613cf760388361444a565b9150613d0282614af0565b604082019050919050565b6000613d1a602a8361444a565b9150613d2582614b3f565b604082019050919050565b6000613d3d60298361444a565b9150613d4882614b8e565b604082019050919050565b6000613d6060208361444a565b9150613d6b82614bdd565b602082019050919050565b6000613d8360108361444a565b9150613d8e82614c06565b602082019050919050565b6000613da660318361444a565b9150613db182614c2f565b604082019050919050565b6000613dc9602c8361444a565b9150613dd482614c7e565b604082019050919050565b6000613dec60208361444a565b9150613df782614ccd565b602082019050919050565b6000613e0f60298361444a565b9150613e1a82614cf6565b604082019050919050565b6000613e32602f8361444a565b9150613e3d82614d45565b604082019050919050565b6000613e5560218361444a565b9150613e6082614d94565b604082019050919050565b6000613e7860168361444a565b9150613e8382614de3565b602082019050919050565b6000613e9b60318361444a565b9150613ea682614e0c565b604082019050919050565b6000613ebe602c8361444a565b9150613ec982614e5b565b604082019050919050565b6000613ee1603f8361444a565b9150613eec82614eaa565b604082019050919050565b613f00816145c5565b82525050565b613f0f816145f3565b82525050565b6000613f218285613b15565b9150613f2d8284613b15565b91508190509392505050565b6000602082019050613f4e6000830184613a85565b92915050565b6000608082019050613f696000830187613a85565b613f766020830186613a85565b613f836040830185613f06565b8181036060830152613f958184613aa3565b905095945050505050565b6000604082019050613fb56000830185613a85565b613fc26020830184613f06565b9392505050565b6000602082019050613fde6000830184613a94565b92915050565b60006020820190508181036000830152613ffe8184613adc565b905092915050565b6000602082019050818103600083015261401f81613b46565b9050919050565b6000602082019050818103600083015261403f81613b69565b9050919050565b6000602082019050818103600083015261405f81613b8c565b9050919050565b6000602082019050818103600083015261407f81613baf565b9050919050565b6000602082019050818103600083015261409f81613bd2565b9050919050565b600060208201905081810360008301526140bf81613bf5565b9050919050565b600060208201905081810360008301526140df81613c18565b9050919050565b600060208201905081810360008301526140ff81613c3b565b9050919050565b6000602082019050818103600083015261411f81613c5e565b9050919050565b6000602082019050818103600083015261413f81613c81565b9050919050565b6000602082019050818103600083015261415f81613ca4565b9050919050565b6000602082019050818103600083015261417f81613cc7565b9050919050565b6000602082019050818103600083015261419f81613cea565b9050919050565b600060208201905081810360008301526141bf81613d0d565b9050919050565b600060208201905081810360008301526141df81613d30565b9050919050565b600060208201905081810360008301526141ff81613d53565b9050919050565b6000602082019050818103600083015261421f81613d76565b9050919050565b6000602082019050818103600083015261423f81613d99565b9050919050565b6000602082019050818103600083015261425f81613dbc565b9050919050565b6000602082019050818103600083015261427f81613ddf565b9050919050565b6000602082019050818103600083015261429f81613e02565b9050919050565b600060208201905081810360008301526142bf81613e25565b9050919050565b600060208201905081810360008301526142df81613e48565b9050919050565b600060208201905081810360008301526142ff81613e6b565b9050919050565b6000602082019050818103600083015261431f81613e8e565b9050919050565b6000602082019050818103600083015261433f81613eb1565b9050919050565b6000602082019050818103600083015261435f81613ed4565b9050919050565b600060208201905061437b6000830184613ef7565b92915050565b60006020820190506143966000830184613f06565b92915050565b60006143a66143b7565b90506143b2828261467e565b919050565b6000604051905090565b600067ffffffffffffffff8211156143dc576143db6147e0565b5b6143e58261480f565b9050602081019050919050565b600067ffffffffffffffff82111561440d5761440c6147e0565b5b6144168261480f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614471826145f3565b915061447c836145f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144b1576144b0614753565b5b828201905092915050565b60006144c7826145f3565b91506144d2836145f3565b9250826144e2576144e1614782565b5b828204905092915050565b60006144f8826145f3565b9150614503836145f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561453c5761453b614753565b5b828202905092915050565b6000614552826145f3565b915061455d836145f3565b9250828210156145705761456f614753565b5b828203905092915050565b6000614586826145d3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561463757808201518184015260208101905061461c565b83811115614646576000848401525b50505050565b6000600282049050600182168061466457607f821691505b60208210811415614678576146776147b1565b5b50919050565b6146878261480f565b810181811067ffffffffffffffff821117156146a6576146a56147e0565b5b80604052505050565b60006146ba826145f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146ed576146ec614753565b5b600182019050919050565b6000614703826145fd565b915060ff82141561471757614716614753565b5b600182019050919050565b600061472d826145f3565b9150614738836145f3565b92508261474857614747614782565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f63616e206d696e74206f6e6c79203130206d617820617420612074696d650000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f646120706173732075736564000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6565647320746f206861766520536f64615061737300000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3037204554482070657220746f6b656e00602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c65204e6f74205374617274656400000000000000000000000000000000600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3036204554482070657220746f6b656e00602082015250565b614f028161457b565b8114614f0d57600080fd5b50565b614f198161458d565b8114614f2457600080fd5b50565b614f3081614599565b8114614f3b57600080fd5b50565b614f47816145f3565b8114614f5257600080fd5b50565b614f5e816145fd565b8114614f6957600080fd5b5056fea264697066735822122041f060275aeb583df00924d45b25adff4ebfd971015fbf8946e663f4dd72548f64736f6c63430008030033

Deployed Bytecode Sourcemap

50519:7034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53100:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51705:114;;;;;;;;;;;;;:::i;:::-;;26145:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27704:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27227:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38783:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51001:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50853:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28594:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50927:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50812:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38451:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52124:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56591:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56949:601;;;;;;;;;;;;;:::i;:::-;;29004:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38973:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53322:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51073:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25839:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53771:2812;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25569:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3778:94;;;;;;;;;;;;;:::i;:::-;;52746:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52037:75;;;;;;;;;;;;;:::i;:::-;;52607:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52496:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52269:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3127:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51328:22;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26314:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27997:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50637:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50770:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51920:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29260:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56708:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50683:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51277:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28363:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4027:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53564:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53100:212;53239:4;53268:36;53292:11;53268:23;:36::i;:::-;53261:43;;53100:212;;;:::o;51705:114::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51766:15:::1;51753:10;:28;;;;51807:4;51792:12;;:19;;;;;;;;;;;;;;;;;;51705:114::o:0;26145:100::-;26199:13;26232:5;26225:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26145:100;:::o;27704:221::-;27780:7;27808:16;27816:7;27808;:16::i;:::-;27800:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27893:15;:24;27909:7;27893:24;;;;;;;;;;;;;;;;;;;;;27886:31;;27704:221;;;:::o;27227:411::-;27308:13;27324:23;27339:7;27324:14;:23::i;:::-;27308:39;;27372:5;27366:11;;:2;:11;;;;27358:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27466:5;27450:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27475:37;27492:5;27499:12;:10;:12::i;:::-;27475:16;:37::i;:::-;27450:62;27428:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27609:21;27618:2;27622:7;27609:8;:21::i;:::-;27227:411;;;:::o;38783:113::-;38844:7;38871:10;:17;;;;38864:24;;38783:113;:::o;51001:39::-;;;;:::o;50853:34::-;;;;:::o;28594:339::-;28789:41;28808:12;:10;:12::i;:::-;28822:7;28789:18;:41::i;:::-;28781:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28897:28;28907:4;28913:2;28917:7;28897:9;:28::i;:::-;28594:339;;;:::o;50927:40::-;;;;:::o;50812:34::-;;;;:::o;38451:256::-;38548:7;38584:23;38601:5;38584:16;:23::i;:::-;38576:5;:31;38568:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38673:12;:19;38686:5;38673:19;;;;;;;;;;;;;;;:26;38693:5;38673:26;;;;;;;;;;;;38666:33;;38451:256;;;;:::o;52124:132::-;52186:15;52220:13;;;;;;;;;;;:23;;;52244:3;52220:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52213:35;;52124:132;;;:::o;56591:103::-;56639:7;56671:8;:15;;;;56664:22;;56591:103;:::o;56949:601::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57029:1:::1;57005:21;:25;56997:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57080:16;57099:21;57080:40;;57131:19;57153:42;57131:64;;57214:11;57206:29;;:48;57251:2;57248:1;57237:8;:12;;;;:::i;:::-;57236:17;;;;:::i;:::-;57206:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57275:18;57296:42;57275:63;;57357:10;57349:28;;:47;57393:2;57390:1;57379:8;:12;;;;:::i;:::-;57378:17;;;;:::i;:::-;57349:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57417:19;57439:42;57417:64;;57500:11;57492:29;;:48;57537:2;57534:1;57523:8;:12;;;;:::i;:::-;57522:17;;;;:::i;:::-;57492:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3418:1;;;;56949:601::o:0;29004:185::-;29142:39;29159:4;29165:2;29169:7;29142:39;;;;;;;;;;;;:16;:39::i;:::-;29004:185;;;:::o;38973:233::-;39048:7;39084:30;:28;:30::i;:::-;39076:5;:38;39068:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39181:10;39192:5;39181:17;;;;;;;;;;;;;;;;;;;;;;;;39174:24;;38973:233;;;:::o;53322:120::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53418:16:::1;53402:13;:32;;;;;;;;;;;;:::i;:::-;;53322:120:::0;:::o;51073:32::-;;;;;;;;;;;;;:::o;25839:239::-;25911:7;25931:13;25947:7;:16;25955:7;25947:16;;;;;;;;;;;;;;;;;;;;;25931:32;;25999:1;25982:19;;:5;:19;;;;25974:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26065:5;26058:12;;;25839:239;;;:::o;53771:2812::-;53851:8;;53844:15;;;;:::i;:::-;53898:2;53879:15;:21;;;;53871:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50718:4;53953:46;;53972:13;:11;:13::i;:::-;53954:15;:31;;;;;;:::i;:::-;53953:46;;53945:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;54059:4;54043:20;;:12;;;;;;;;;;;:20;;;54035:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;54206:11;;54193:10;;:24;;;;:::i;:::-;54173:15;:45;54170:1308;;54285:1;54252:30;54271:10;54252:18;:30::i;:::-;:34;54244:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54371:15;54351:35;;:17;;:35;;;;:::i;:::-;54337:9;:50;54329:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;54471:9;54467:467;54490:30;54509:10;54490:18;:30::i;:::-;54486:1;:34;54467:467;;;54563:15;54581:32;54600:10;54611:1;54581:18;:32::i;:::-;54563:50;;54667:4;54643:28;;:12;:21;54656:7;54643:21;;;;;;;;;;;;;;;;;;;;;:28;;;54640:108;;54704:8;54718:1;54704:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54640:108;54796:15;54777:34;;:8;:15;;;;:34;54774:128;;;54869:5;;;54774:128;54467:467;54522:3;;;;;:::i;:::-;;;;54467:467;;;;54980:15;54961:34;;:8;:15;;;;:34;54953:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55057:7;55053:391;55074:8;:15;;;;55070:1;:19;;;55053:391;;;55114:15;55132:42;55151:10;55162:8;55171:1;55162:11;;;;;;;;;;;;;;;;;;;;;;;;;;55132:18;:42::i;:::-;55114:60;;55199:18;55209:7;55199:9;:18::i;:::-;55240:21;:9;:19;:21::i;:::-;55284:17;55304:19;:9;:17;:19::i;:::-;55284:39;;55351:22;55363:9;55351:22;;;;;;:::i;:::-;;;;;;;;55396:28;55402:10;55414:9;55396:5;:28::i;:::-;55053:391;;55091:3;;;;;:::i;:::-;;;;55053:391;;;;54170:1308;55523:11;;55510:10;;:24;;;;:::i;:::-;55491:15;:44;:107;;;;;55586:11;;55572;;55559:10;;:24;;;;:::i;:::-;:38;;;;:::i;:::-;55539:15;:59;;55491:107;55488:605;;;55655:1;55622:30;55641:10;55622:18;:30::i;:::-;:34;55614:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55741:15;55721:35;;:17;;:35;;;;:::i;:::-;55707:9;:50;55699:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;55845:7;55840:241;55862:15;55858:19;;:1;:19;;;55840:241;;;55901:21;:9;:19;:21::i;:::-;55939:17;55959:19;:9;:17;:19::i;:::-;55939:39;;56000:22;56012:9;56000:22;;;;;;:::i;:::-;;;;;;;;56039:28;56045:10;56057:9;56039:5;:28::i;:::-;55840:241;55879:3;;;;;:::i;:::-;;;;55840:241;;;;55488:605;56152:11;;56138;;56125:10;;:24;;;;:::i;:::-;:38;;;;:::i;:::-;56106:15;:58;56103:471;;;56223:15;56204:34;;:16;;:34;;;;:::i;:::-;56190:9;:49;56182:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;56327:7;56322:240;56344:15;56340:19;;:1;:19;;;56322:240;;;56382:21;:9;:19;:21::i;:::-;56419:17;56439:19;:9;:17;:19::i;:::-;56419:39;;56479:22;56491:9;56479:22;;;;;;:::i;:::-;;;;;;;;56517:28;56523:10;56535:9;56517:5;:28::i;:::-;56322:240;56361:3;;;;;:::i;:::-;;;;56322:240;;;;56103:471;53771:2812;:::o;25569:208::-;25641:7;25686:1;25669:19;;:5;:19;;;;25661:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25753:9;:16;25763:5;25753:16;;;;;;;;;;;;;;;;25746:23;;25569:208;;;:::o;3778:94::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3843:21:::1;3861:1;3843:9;:21::i;:::-;3778:94::o:0;52746:123::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52846:15:::1;52827:16;:34;;;;52746:123:::0;:::o;52037:75::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52099:5:::1;52084:12;;:20;;;;;;;;;;;;;;;;;;52037:75::o:0;52607:127::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52710:16:::1;52690:17;:36;;;;52607:127:::0;:::o;52496:99::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52578:9:::1;52565:10;:22;;;;52496:99:::0;:::o;52269:88::-;52308:7;52334:15;52327:22;;52269:88;:::o;3127:87::-;3173:7;3200:6;;;;;;;;;;;3193:13;;3127:87;:::o;51328:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26314:104::-;26370:13;26403:7;26396:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26314:104;:::o;27997:295::-;28112:12;:10;:12::i;:::-;28100:24;;:8;:24;;;;28092:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28212:8;28167:18;:32;28186:12;:10;:12::i;:::-;28167:32;;;;;;;;;;;;;;;:42;28200:8;28167:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28265:8;28236:48;;28251:12;:10;:12::i;:::-;28236:48;;;28275:8;28236:48;;;;;;:::i;:::-;;;;;;;;27997:295;;:::o;50637:33::-;;;;;;;;;:::o;50770:25::-;;;;:::o;51920:105::-;51973:8;52000:12;:17;52013:3;52000:17;;;;;;;;;;;;;;;;;;;;;51993:24;;51920:105;;;:::o;29260:328::-;29435:41;29454:12;:10;:12::i;:::-;29468:7;29435:18;:41::i;:::-;29427:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29541:39;29555:4;29561:2;29565:7;29574:5;29541:13;:39::i;:::-;29260:328;;;;:::o;56708:196::-;56835:13;56873:23;56888:7;56873:14;:23::i;:::-;56866:30;;56708:196;;;:::o;50683:39::-;50718:4;50683:39;:::o;51277:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;28363:164::-;28460:4;28484:18;:25;28503:5;28484:25;;;;;;;;;;;;;;;:35;28510:8;28484:35;;;;;;;;;;;;;;;;;;;;;;;;;28477:42;;28363:164;;;;:::o;4027:192::-;3358:12;:10;:12::i;:::-;3347:23;;:7;:5;:7::i;:::-;:23;;;3339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4136:1:::1;4116:22;;:8;:22;;;;4108:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4192:19;4202:8;4192:9;:19::i;:::-;4027:192:::0;:::o;53564:168::-;53643:15;53677:13;;;;;;;;;;;:33;;;53711:5;53717:6;53677:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53670:54;;53564:168;;;;:::o;880:127::-;987:1;969:7;:14;;;:19;;;;;;;;;;;880:127;:::o;758:114::-;823:7;850;:14;;;843:21;;758:114;;;:::o;39819:589::-;39963:45;39990:4;39996:2;40000:7;39963:26;:45::i;:::-;40041:1;40025:18;;:4;:18;;;40021:187;;;40060:40;40092:7;40060:31;:40::i;:::-;40021:187;;;40130:2;40122:10;;:4;:10;;;40118:90;;40149:47;40182:4;40188:7;40149:32;:47::i;:::-;40118:90;40021:187;40236:1;40222:16;;:2;:16;;;40218:183;;;40255:45;40292:7;40255:36;:45::i;:::-;40218:183;;;40328:4;40322:10;;:2;:10;;;40318:83;;40349:40;40377:2;40381:7;40349:27;:40::i;:::-;40318:83;40218:183;39819:589;;;:::o;37194:126::-;;;;:::o;38143:224::-;38245:4;38284:35;38269:50;;;:11;:50;;;;:90;;;;38323:36;38347:11;38323:23;:36::i;:::-;38269:90;38262:97;;38143:224;;;:::o;1972:98::-;2025:7;2052:10;2045:17;;1972:98;:::o;31098:127::-;31163:4;31215:1;31187:30;;:7;:16;31195:7;31187:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31180:37;;31098:127;;;:::o;35080:174::-;35182:2;35155:15;:24;35171:7;35155:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35238:7;35234:2;35200:46;;35209:23;35224:7;35209:14;:23::i;:::-;35200:46;;;;;;;;;;;;35080:174;;:::o;31392:348::-;31485:4;31510:16;31518:7;31510;:16::i;:::-;31502:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31586:13;31602:23;31617:7;31602:14;:23::i;:::-;31586:39;;31655:5;31644:16;;:7;:16;;;:51;;;;31688:7;31664:31;;:20;31676:7;31664:11;:20::i;:::-;:31;;;31644:51;:87;;;;31699:32;31716:5;31723:7;31699:16;:32::i;:::-;31644:87;31636:96;;;31392:348;;;;:::o;34384:578::-;34543:4;34516:31;;:23;34531:7;34516:14;:23::i;:::-;:31;;;34508:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34626:1;34612:16;;:2;:16;;;;34604:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34682:39;34703:4;34709:2;34713:7;34682:20;:39::i;:::-;34786:29;34803:1;34807:7;34786:8;:29::i;:::-;34847:1;34828:9;:15;34838:4;34828:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34876:1;34859:9;:13;34869:2;34859:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34907:2;34888:7;:16;34896:7;34888:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34946:7;34942:2;34927:27;;34936:4;34927:27;;;;;;;;;;;;34384:578;;;:::o;51827:85::-;51898:4;51878:12;:17;51891:3;51878:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;51827:85;:::o;33076:382::-;33170:1;33156:16;;:2;:16;;;;33148:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33229:16;33237:7;33229;:16::i;:::-;33228:17;33220:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33291:45;33320:1;33324:2;33328:7;33291:20;:45::i;:::-;33366:1;33349:9;:13;33359:2;33349:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33397:2;33378:7;:16;33386:7;33378:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33442:7;33438:2;33417:33;;33434:1;33417:33;;;;;;;;;;;;33076:382;;:::o;4227:173::-;4283:16;4302:6;;;;;;;;;;;4283:25;;4328:8;4319:6;;:17;;;;;;;;;;;;;;;;;;4383:8;4352:40;;4373:8;4352:40;;;;;;;;;;;;4227:173;;:::o;30470:315::-;30627:28;30637:4;30643:2;30647:7;30627:9;:28::i;:::-;30674:48;30697:4;30703:2;30707:7;30716:5;30674:22;:48::i;:::-;30666:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30470:315;;;;:::o;44636:679::-;44709:13;44743:16;44751:7;44743;:16::i;:::-;44735:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44826:23;44852:10;:19;44863:7;44852:19;;;;;;;;;;;44826:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44882:18;44903:10;:8;:10::i;:::-;44882:31;;45011:1;44995:4;44989:18;:23;44985:72;;;45036:9;45029:16;;;;;;44985:72;45187:1;45167:9;45161:23;:27;45157:108;;;45236:4;45242:9;45219:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45205:48;;;;;;45157:108;45284:23;45299:7;45284:14;:23::i;:::-;45277:30;;;;44636:679;;;;:::o;41131:164::-;41235:10;:17;;;;41208:15;:24;41224:7;41208:24;;;;;;;;;;;:44;;;;41263:10;41279:7;41263:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41131:164;:::o;41922:988::-;42188:22;42238:1;42213:22;42230:4;42213:16;:22::i;:::-;:26;;;;:::i;:::-;42188:51;;42250:18;42271:17;:26;42289:7;42271:26;;;;;;;;;;;;42250:47;;42418:14;42404:10;:28;42400:328;;42449:19;42471:12;:18;42484:4;42471:18;;;;;;;;;;;;;;;:34;42490:14;42471:34;;;;;;;;;;;;42449:56;;42555:11;42522:12;:18;42535:4;42522:18;;;;;;;;;;;;;;;:30;42541:10;42522:30;;;;;;;;;;;:44;;;;42672:10;42639:17;:30;42657:11;42639:30;;;;;;;;;;;:43;;;;42400:328;;42824:17;:26;42842:7;42824:26;;;;;;;;;;;42817:33;;;42868:12;:18;42881:4;42868:18;;;;;;;;;;;;;;;:34;42887:14;42868:34;;;;;;;;;;;42861:41;;;41922:988;;;;:::o;43205:1079::-;43458:22;43503:1;43483:10;:17;;;;:21;;;;:::i;:::-;43458:46;;43515:18;43536:15;:24;43552:7;43536:24;;;;;;;;;;;;43515:45;;43887:19;43909:10;43920:14;43909:26;;;;;;;;;;;;;;;;;;;;;;;;43887:48;;43973:11;43948:10;43959;43948:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44084:10;44053:15;:28;44069:11;44053:28;;;;;;;;;;;:41;;;;44225:15;:24;44241:7;44225:24;;;;;;;;;;;44218:31;;;44260:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43205:1079;;;;:::o;40709:221::-;40794:14;40811:20;40828:2;40811:16;:20::i;:::-;40794:37;;40869:7;40842:12;:16;40855:2;40842:16;;;;;;;;;;;;;;;:24;40859:6;40842:24;;;;;;;;;;;:34;;;;40916:6;40887:17;:26;40905:7;40887:26;;;;;;;;;;;:35;;;;40709:221;;;:::o;25200:305::-;25302:4;25354:25;25339:40;;;:11;:40;;;;:105;;;;25411:33;25396:48;;;:11;:48;;;;25339:105;:158;;;;25461:36;25485:11;25461:23;:36::i;:::-;25339:158;25319:178;;25200:305;;;:::o;52877:215::-;53039:45;53066:4;53072:2;53076:7;53039:26;:45::i;:::-;52877:215;;;:::o;35819:803::-;35974:4;35995:15;:2;:13;;;:15::i;:::-;35991:624;;;36047:2;36031:36;;;36068:12;:10;:12::i;:::-;36082:4;36088:7;36097:5;36031:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36027:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36294:1;36277:6;:13;:18;36273:272;;;36320:60;;;;;;;;;;:::i;:::-;;;;;;;;36273:272;36495:6;36489:13;36480:6;36476:2;36472:15;36465:38;36027:533;36164:45;;;36154:55;;;:6;:55;;;;36147:62;;;;;35991:624;36599:4;36592:11;;35819:803;;;;;;;:::o;53450:106::-;53502:13;53535;53528:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53450:106;:::o;26489:334::-;26562:13;26596:16;26604:7;26596;:16::i;:::-;26588:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26677:21;26701:10;:8;:10::i;:::-;26677:34;;26753:1;26735:7;26729:21;:25;:86;;;;;;;;;;;;;;;;;26781:7;26790:18;:7;:16;:18::i;:::-;26764:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26729:86;26722:93;;;26489:334;;;:::o;6238:157::-;6323:4;6362:25;6347:40;;;:11;:40;;;;6340:47;;6238:157;;;:::o;9284:387::-;9344:4;9552:12;9619:7;9607:20;9599:28;;9662:1;9655:4;:8;9648:15;;;9284:387;;;:::o;6709:723::-;6765:13;6995:1;6986:5;:10;6982:53;;;7013:10;;;;;;;;;;;;;;;;;;;;;6982:53;7045:12;7060:5;7045:20;;7076:14;7101:78;7116:1;7108:4;:9;7101:78;;7134:8;;;;;:::i;:::-;;;;7165:2;7157:10;;;;;:::i;:::-;;;7101:78;;;7189:19;7221:6;7211:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7189:39;;7239:154;7255:1;7246:5;:10;7239:154;;7283:1;7273:11;;;;;:::i;:::-;;;7350:2;7342:5;:10;;;;:::i;:::-;7329:2;:24;;;;:::i;:::-;7316:39;;7299:6;7306;7299:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7379:2;7370:11;;;;;:::i;:::-;;;7239:154;;;7417:6;7403:21;;;;;6709:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:143::-;;2097:6;2091:13;2082:22;;2113:33;2140:5;2113:33;:::i;:::-;2072:80;;;;:::o;2158:135::-;;2240:6;2227:20;2218:29;;2256:31;2281:5;2256:31;:::i;:::-;2208:85;;;;:::o;2299:262::-;;2407:2;2395:9;2386:7;2382:23;2378:32;2375:2;;;2423:1;2420;2413:12;2375:2;2466:1;2491:53;2536:7;2527:6;2516:9;2512:22;2491:53;:::i;:::-;2481:63;;2437:117;2365:196;;;;:::o;2567:407::-;;;2692:2;2680:9;2671:7;2667:23;2663:32;2660:2;;;2708:1;2705;2698:12;2660:2;2751:1;2776:53;2821:7;2812:6;2801:9;2797:22;2776:53;:::i;:::-;2766:63;;2722:117;2878:2;2904:53;2949:7;2940:6;2929:9;2925:22;2904:53;:::i;:::-;2894:63;;2849:118;2650:324;;;;;:::o;2980:552::-;;;;3122:2;3110:9;3101:7;3097:23;3093:32;3090:2;;;3138:1;3135;3128:12;3090:2;3181:1;3206:53;3251:7;3242:6;3231:9;3227:22;3206:53;:::i;:::-;3196:63;;3152:117;3308:2;3334:53;3379:7;3370:6;3359:9;3355:22;3334:53;:::i;:::-;3324:63;;3279:118;3436:2;3462:53;3507:7;3498:6;3487:9;3483:22;3462:53;:::i;:::-;3452:63;;3407:118;3080:452;;;;;:::o;3538:809::-;;;;;3706:3;3694:9;3685:7;3681:23;3677:33;3674:2;;;3723:1;3720;3713:12;3674:2;3766:1;3791:53;3836:7;3827:6;3816:9;3812:22;3791:53;:::i;:::-;3781:63;;3737:117;3893:2;3919:53;3964:7;3955:6;3944:9;3940:22;3919:53;:::i;:::-;3909:63;;3864:118;4021:2;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3992:118;4177:2;4166:9;4162:18;4149:32;4208:18;4200:6;4197:30;4194:2;;;4240:1;4237;4230:12;4194:2;4268:62;4322:7;4313:6;4302:9;4298:22;4268:62;:::i;:::-;4258:72;;4120:220;3664:683;;;;;;;:::o;4353:401::-;;;4475:2;4463:9;4454:7;4450:23;4446:32;4443:2;;;4491:1;4488;4481:12;4443:2;4534:1;4559:53;4604:7;4595:6;4584:9;4580:22;4559:53;:::i;:::-;4549:63;;4505:117;4661:2;4687:50;4729:7;4720:6;4709:9;4705:22;4687:50;:::i;:::-;4677:60;;4632:115;4433:321;;;;;:::o;4760:407::-;;;4885:2;4873:9;4864:7;4860:23;4856:32;4853:2;;;4901:1;4898;4891:12;4853:2;4944:1;4969:53;5014:7;5005:6;4994:9;4990:22;4969:53;:::i;:::-;4959:63;;4915:117;5071:2;5097:53;5142:7;5133:6;5122:9;5118:22;5097:53;:::i;:::-;5087:63;;5042:118;4843:324;;;;;:::o;5173:260::-;;5280:2;5268:9;5259:7;5255:23;5251:32;5248:2;;;5296:1;5293;5286:12;5248:2;5339:1;5364:52;5408:7;5399:6;5388:9;5384:22;5364:52;:::i;:::-;5354:62;;5310:116;5238:195;;;;:::o;5439:282::-;;5557:2;5545:9;5536:7;5532:23;5528:32;5525:2;;;5573:1;5570;5563:12;5525:2;5616:1;5641:63;5696:7;5687:6;5676:9;5672:22;5641:63;:::i;:::-;5631:73;;5587:127;5515:206;;;;:::o;5727:375::-;;5845:2;5833:9;5824:7;5820:23;5816:32;5813:2;;;5861:1;5858;5851:12;5813:2;5932:1;5921:9;5917:17;5904:31;5962:18;5954:6;5951:30;5948:2;;;5994:1;5991;5984:12;5948:2;6022:63;6077:7;6068:6;6057:9;6053:22;6022:63;:::i;:::-;6012:73;;5875:220;5803:299;;;;:::o;6108:262::-;;6216:2;6204:9;6195:7;6191:23;6187:32;6184:2;;;6232:1;6229;6222:12;6184:2;6275:1;6300:53;6345:7;6336:6;6325:9;6321:22;6300:53;:::i;:::-;6290:63;;6246:117;6174:196;;;;:::o;6376:284::-;;6495:2;6483:9;6474:7;6470:23;6466:32;6463:2;;;6511:1;6508;6501:12;6463:2;6554:1;6579:64;6635:7;6626:6;6615:9;6611:22;6579:64;:::i;:::-;6569:74;;6525:128;6453:207;;;;:::o;6666:258::-;;6772:2;6760:9;6751:7;6747:23;6743:32;6740:2;;;6788:1;6785;6778:12;6740:2;6831:1;6856:51;6899:7;6890:6;6879:9;6875:22;6856:51;:::i;:::-;6846:61;;6802:115;6730:194;;;;:::o;6930:118::-;7017:24;7035:5;7017:24;:::i;:::-;7012:3;7005:37;6995:53;;:::o;7054:109::-;7135:21;7150:5;7135:21;:::i;:::-;7130:3;7123:34;7113:50;;:::o;7169:360::-;;7283:38;7315:5;7283:38;:::i;:::-;7337:70;7400:6;7395:3;7337:70;:::i;:::-;7330:77;;7416:52;7461:6;7456:3;7449:4;7442:5;7438:16;7416:52;:::i;:::-;7493:29;7515:6;7493:29;:::i;:::-;7488:3;7484:39;7477:46;;7259:270;;;;;:::o;7535:364::-;;7651:39;7684:5;7651:39;:::i;:::-;7706:71;7770:6;7765:3;7706:71;:::i;:::-;7699:78;;7786:52;7831:6;7826:3;7819:4;7812:5;7808:16;7786:52;:::i;:::-;7863:29;7885:6;7863:29;:::i;:::-;7858:3;7854:39;7847:46;;7627:272;;;;;:::o;7905:377::-;;8039:39;8072:5;8039:39;:::i;:::-;8094:89;8176:6;8171:3;8094:89;:::i;:::-;8087:96;;8192:52;8237:6;8232:3;8225:4;8218:5;8214:16;8192:52;:::i;:::-;8269:6;8264:3;8260:16;8253:23;;8015:267;;;;;:::o;8288:366::-;;8451:67;8515:2;8510:3;8451:67;:::i;:::-;8444:74;;8527:93;8616:3;8527:93;:::i;:::-;8645:2;8640:3;8636:12;8629:19;;8434:220;;;:::o;8660:366::-;;8823:67;8887:2;8882:3;8823:67;:::i;:::-;8816:74;;8899:93;8988:3;8899:93;:::i;:::-;9017:2;9012:3;9008:12;9001:19;;8806:220;;;:::o;9032:366::-;;9195:67;9259:2;9254:3;9195:67;:::i;:::-;9188:74;;9271:93;9360:3;9271:93;:::i;:::-;9389:2;9384:3;9380:12;9373:19;;9178:220;;;:::o;9404:366::-;;9567:67;9631:2;9626:3;9567:67;:::i;:::-;9560:74;;9643:93;9732:3;9643:93;:::i;:::-;9761:2;9756:3;9752:12;9745:19;;9550:220;;;:::o;9776:366::-;;9939:67;10003:2;9998:3;9939:67;:::i;:::-;9932:74;;10015:93;10104:3;10015:93;:::i;:::-;10133:2;10128:3;10124:12;10117:19;;9922:220;;;:::o;10148:366::-;;10311:67;10375:2;10370:3;10311:67;:::i;:::-;10304:74;;10387:93;10476:3;10387:93;:::i;:::-;10505:2;10500:3;10496:12;10489:19;;10294:220;;;:::o;10520:366::-;;10683:67;10747:2;10742:3;10683:67;:::i;:::-;10676:74;;10759:93;10848:3;10759:93;:::i;:::-;10877:2;10872:3;10868:12;10861:19;;10666:220;;;:::o;10892:366::-;;11055:67;11119:2;11114:3;11055:67;:::i;:::-;11048:74;;11131:93;11220:3;11131:93;:::i;:::-;11249:2;11244:3;11240:12;11233:19;;11038:220;;;:::o;11264:366::-;;11427:67;11491:2;11486:3;11427:67;:::i;:::-;11420:74;;11503:93;11592:3;11503:93;:::i;:::-;11621:2;11616:3;11612:12;11605:19;;11410:220;;;:::o;11636:366::-;;11799:67;11863:2;11858:3;11799:67;:::i;:::-;11792:74;;11875:93;11964:3;11875:93;:::i;:::-;11993:2;11988:3;11984:12;11977:19;;11782:220;;;:::o;12008:366::-;;12171:67;12235:2;12230:3;12171:67;:::i;:::-;12164:74;;12247:93;12336:3;12247:93;:::i;:::-;12365:2;12360:3;12356:12;12349:19;;12154:220;;;:::o;12380:366::-;;12543:67;12607:2;12602:3;12543:67;:::i;:::-;12536:74;;12619:93;12708:3;12619:93;:::i;:::-;12737:2;12732:3;12728:12;12721:19;;12526:220;;;:::o;12752:366::-;;12915:67;12979:2;12974:3;12915:67;:::i;:::-;12908:74;;12991:93;13080:3;12991:93;:::i;:::-;13109:2;13104:3;13100:12;13093:19;;12898:220;;;:::o;13124:366::-;;13287:67;13351:2;13346:3;13287:67;:::i;:::-;13280:74;;13363:93;13452:3;13363:93;:::i;:::-;13481:2;13476:3;13472:12;13465:19;;13270:220;;;:::o;13496:366::-;;13659:67;13723:2;13718:3;13659:67;:::i;:::-;13652:74;;13735:93;13824:3;13735:93;:::i;:::-;13853:2;13848:3;13844:12;13837:19;;13642:220;;;:::o;13868:366::-;;14031:67;14095:2;14090:3;14031:67;:::i;:::-;14024:74;;14107:93;14196:3;14107:93;:::i;:::-;14225:2;14220:3;14216:12;14209:19;;14014:220;;;:::o;14240:366::-;;14403:67;14467:2;14462:3;14403:67;:::i;:::-;14396:74;;14479:93;14568:3;14479:93;:::i;:::-;14597:2;14592:3;14588:12;14581:19;;14386:220;;;:::o;14612:366::-;;14775:67;14839:2;14834:3;14775:67;:::i;:::-;14768:74;;14851:93;14940:3;14851:93;:::i;:::-;14969:2;14964:3;14960:12;14953:19;;14758:220;;;:::o;14984:366::-;;15147:67;15211:2;15206:3;15147:67;:::i;:::-;15140:74;;15223:93;15312:3;15223:93;:::i;:::-;15341:2;15336:3;15332:12;15325:19;;15130:220;;;:::o;15356:366::-;;15519:67;15583:2;15578:3;15519:67;:::i;:::-;15512:74;;15595:93;15684:3;15595:93;:::i;:::-;15713:2;15708:3;15704:12;15697:19;;15502:220;;;:::o;15728:366::-;;15891:67;15955:2;15950:3;15891:67;:::i;:::-;15884:74;;15967:93;16056:3;15967:93;:::i;:::-;16085:2;16080:3;16076:12;16069:19;;15874:220;;;:::o;16100:366::-;;16263:67;16327:2;16322:3;16263:67;:::i;:::-;16256:74;;16339:93;16428:3;16339:93;:::i;:::-;16457:2;16452:3;16448:12;16441:19;;16246:220;;;:::o;16472:366::-;;16635:67;16699:2;16694:3;16635:67;:::i;:::-;16628:74;;16711:93;16800:3;16711:93;:::i;:::-;16829:2;16824:3;16820:12;16813:19;;16618:220;;;:::o;16844:366::-;;17007:67;17071:2;17066:3;17007:67;:::i;:::-;17000:74;;17083:93;17172:3;17083:93;:::i;:::-;17201:2;17196:3;17192:12;17185:19;;16990:220;;;:::o;17216:366::-;;17379:67;17443:2;17438:3;17379:67;:::i;:::-;17372:74;;17455:93;17544:3;17455:93;:::i;:::-;17573:2;17568:3;17564:12;17557:19;;17362:220;;;:::o;17588:366::-;;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17734:220;;;:::o;17960:366::-;;18123:67;18187:2;18182:3;18123:67;:::i;:::-;18116:74;;18199:93;18288:3;18199:93;:::i;:::-;18317:2;18312:3;18308:12;18301:19;;18106:220;;;:::o;18332:115::-;18417:23;18434:5;18417:23;:::i;:::-;18412:3;18405:36;18395:52;;:::o;18453:118::-;18540:24;18558:5;18540:24;:::i;:::-;18535:3;18528:37;18518:53;;:::o;18577:435::-;;18779:95;18870:3;18861:6;18779:95;:::i;:::-;18772:102;;18891:95;18982:3;18973:6;18891:95;:::i;:::-;18884:102;;19003:3;18996:10;;18761:251;;;;;:::o;19018:222::-;;19149:2;19138:9;19134:18;19126:26;;19162:71;19230:1;19219:9;19215:17;19206:6;19162:71;:::i;:::-;19116:124;;;;:::o;19246:640::-;;19479:3;19468:9;19464:19;19456:27;;19493:71;19561:1;19550:9;19546:17;19537:6;19493:71;:::i;:::-;19574:72;19642:2;19631:9;19627:18;19618:6;19574:72;:::i;:::-;19656;19724:2;19713:9;19709:18;19700:6;19656:72;:::i;:::-;19775:9;19769:4;19765:20;19760:2;19749:9;19745:18;19738:48;19803:76;19874:4;19865:6;19803:76;:::i;:::-;19795:84;;19446:440;;;;;;;:::o;19892:332::-;;20051:2;20040:9;20036:18;20028:26;;20064:71;20132:1;20121:9;20117:17;20108:6;20064:71;:::i;:::-;20145:72;20213:2;20202:9;20198:18;20189:6;20145:72;:::i;:::-;20018:206;;;;;:::o;20230:210::-;;20355:2;20344:9;20340:18;20332:26;;20368:65;20430:1;20419:9;20415:17;20406:6;20368:65;:::i;:::-;20322:118;;;;:::o;20446:313::-;;20597:2;20586:9;20582:18;20574:26;;20646:9;20640:4;20636:20;20632:1;20621:9;20617:17;20610:47;20674:78;20747:4;20738:6;20674:78;:::i;:::-;20666:86;;20564:195;;;;:::o;20765:419::-;;20969:2;20958:9;20954:18;20946:26;;21018:9;21012:4;21008:20;21004:1;20993:9;20989:17;20982:47;21046:131;21172:4;21046:131;:::i;:::-;21038:139;;20936:248;;;:::o;21190:419::-;;21394:2;21383:9;21379:18;21371:26;;21443:9;21437:4;21433:20;21429:1;21418:9;21414:17;21407:47;21471:131;21597:4;21471:131;:::i;:::-;21463:139;;21361:248;;;:::o;21615:419::-;;21819:2;21808:9;21804:18;21796:26;;21868:9;21862:4;21858:20;21854:1;21843:9;21839:17;21832:47;21896:131;22022:4;21896:131;:::i;:::-;21888:139;;21786:248;;;:::o;22040:419::-;;22244:2;22233:9;22229:18;22221:26;;22293:9;22287:4;22283:20;22279:1;22268:9;22264:17;22257:47;22321:131;22447:4;22321:131;:::i;:::-;22313:139;;22211:248;;;:::o;22465:419::-;;22669:2;22658:9;22654:18;22646:26;;22718:9;22712:4;22708:20;22704:1;22693:9;22689:17;22682:47;22746:131;22872:4;22746:131;:::i;:::-;22738:139;;22636:248;;;:::o;22890:419::-;;23094:2;23083:9;23079:18;23071:26;;23143:9;23137:4;23133:20;23129:1;23118:9;23114:17;23107:47;23171:131;23297:4;23171:131;:::i;:::-;23163:139;;23061:248;;;:::o;23315:419::-;;23519:2;23508:9;23504:18;23496:26;;23568:9;23562:4;23558:20;23554:1;23543:9;23539:17;23532:47;23596:131;23722:4;23596:131;:::i;:::-;23588:139;;23486:248;;;:::o;23740:419::-;;23944:2;23933:9;23929:18;23921:26;;23993:9;23987:4;23983:20;23979:1;23968:9;23964:17;23957:47;24021:131;24147:4;24021:131;:::i;:::-;24013:139;;23911:248;;;:::o;24165:419::-;;24369:2;24358:9;24354:18;24346:26;;24418:9;24412:4;24408:20;24404:1;24393:9;24389:17;24382:47;24446:131;24572:4;24446:131;:::i;:::-;24438:139;;24336:248;;;:::o;24590:419::-;;24794:2;24783:9;24779:18;24771:26;;24843:9;24837:4;24833:20;24829:1;24818:9;24814:17;24807:47;24871:131;24997:4;24871:131;:::i;:::-;24863:139;;24761:248;;;:::o;25015:419::-;;25219:2;25208:9;25204:18;25196:26;;25268:9;25262:4;25258:20;25254:1;25243:9;25239:17;25232:47;25296:131;25422:4;25296:131;:::i;:::-;25288:139;;25186:248;;;:::o;25440:419::-;;25644:2;25633:9;25629:18;25621:26;;25693:9;25687:4;25683:20;25679:1;25668:9;25664:17;25657:47;25721:131;25847:4;25721:131;:::i;:::-;25713:139;;25611:248;;;:::o;25865:419::-;;26069:2;26058:9;26054:18;26046:26;;26118:9;26112:4;26108:20;26104:1;26093:9;26089:17;26082:47;26146:131;26272:4;26146:131;:::i;:::-;26138:139;;26036:248;;;:::o;26290:419::-;;26494:2;26483:9;26479:18;26471:26;;26543:9;26537:4;26533:20;26529:1;26518:9;26514:17;26507:47;26571:131;26697:4;26571:131;:::i;:::-;26563:139;;26461:248;;;:::o;26715:419::-;;26919:2;26908:9;26904:18;26896:26;;26968:9;26962:4;26958:20;26954:1;26943:9;26939:17;26932:47;26996:131;27122:4;26996:131;:::i;:::-;26988:139;;26886:248;;;:::o;27140:419::-;;27344:2;27333:9;27329:18;27321:26;;27393:9;27387:4;27383:20;27379:1;27368:9;27364:17;27357:47;27421:131;27547:4;27421:131;:::i;:::-;27413:139;;27311:248;;;:::o;27565:419::-;;27769:2;27758:9;27754:18;27746:26;;27818:9;27812:4;27808:20;27804:1;27793:9;27789:17;27782:47;27846:131;27972:4;27846:131;:::i;:::-;27838:139;;27736:248;;;:::o;27990:419::-;;28194:2;28183:9;28179:18;28171:26;;28243:9;28237:4;28233:20;28229:1;28218:9;28214:17;28207:47;28271:131;28397:4;28271:131;:::i;:::-;28263:139;;28161:248;;;:::o;28415:419::-;;28619:2;28608:9;28604:18;28596:26;;28668:9;28662:4;28658:20;28654:1;28643:9;28639:17;28632:47;28696:131;28822:4;28696:131;:::i;:::-;28688:139;;28586:248;;;:::o;28840:419::-;;29044:2;29033:9;29029:18;29021:26;;29093:9;29087:4;29083:20;29079:1;29068:9;29064:17;29057:47;29121:131;29247:4;29121:131;:::i;:::-;29113:139;;29011:248;;;:::o;29265:419::-;;29469:2;29458:9;29454:18;29446:26;;29518:9;29512:4;29508:20;29504:1;29493:9;29489:17;29482:47;29546:131;29672:4;29546:131;:::i;:::-;29538:139;;29436:248;;;:::o;29690:419::-;;29894:2;29883:9;29879:18;29871:26;;29943:9;29937:4;29933:20;29929:1;29918:9;29914:17;29907:47;29971:131;30097:4;29971:131;:::i;:::-;29963:139;;29861:248;;;:::o;30115:419::-;;30319:2;30308:9;30304:18;30296:26;;30368:9;30362:4;30358:20;30354:1;30343:9;30339:17;30332:47;30396:131;30522:4;30396:131;:::i;:::-;30388:139;;30286:248;;;:::o;30540:419::-;;30744:2;30733:9;30729:18;30721:26;;30793:9;30787:4;30783:20;30779:1;30768:9;30764:17;30757:47;30821:131;30947:4;30821:131;:::i;:::-;30813:139;;30711:248;;;:::o;30965:419::-;;31169:2;31158:9;31154:18;31146:26;;31218:9;31212:4;31208:20;31204:1;31193:9;31189:17;31182:47;31246:131;31372:4;31246:131;:::i;:::-;31238:139;;31136:248;;;:::o;31390:419::-;;31594:2;31583:9;31579:18;31571:26;;31643:9;31637:4;31633:20;31629:1;31618:9;31614:17;31607:47;31671:131;31797:4;31671:131;:::i;:::-;31663:139;;31561:248;;;:::o;31815:419::-;;32019:2;32008:9;32004:18;31996:26;;32068:9;32062:4;32058:20;32054:1;32043:9;32039:17;32032:47;32096:131;32222:4;32096:131;:::i;:::-;32088:139;;31986:248;;;:::o;32240:218::-;;32369:2;32358:9;32354:18;32346:26;;32382:69;32448:1;32437:9;32433:17;32424:6;32382:69;:::i;:::-;32336:122;;;;:::o;32464:222::-;;32595:2;32584:9;32580:18;32572:26;;32608:71;32676:1;32665:9;32661:17;32652:6;32608:71;:::i;:::-;32562:124;;;;:::o;32692:129::-;;32753:20;;:::i;:::-;32743:30;;32782:33;32810:4;32802:6;32782:33;:::i;:::-;32733:88;;;:::o;32827:75::-;;32893:2;32887:9;32877:19;;32867:35;:::o;32908:307::-;;33059:18;33051:6;33048:30;33045:2;;;33081:18;;:::i;:::-;33045:2;33119:29;33141:6;33119:29;:::i;:::-;33111:37;;33203:4;33197;33193:15;33185:23;;32974:241;;;:::o;33221:308::-;;33373:18;33365:6;33362:30;33359:2;;;33395:18;;:::i;:::-;33359:2;33433:29;33455:6;33433:29;:::i;:::-;33425:37;;33517:4;33511;33507:15;33499:23;;33288:241;;;:::o;33535:98::-;;33620:5;33614:12;33604:22;;33593:40;;;:::o;33639:99::-;;33725:5;33719:12;33709:22;;33698:40;;;:::o;33744:168::-;;33861:6;33856:3;33849:19;33901:4;33896:3;33892:14;33877:29;;33839:73;;;;:::o;33918:169::-;;34036:6;34031:3;34024:19;34076:4;34071:3;34067:14;34052:29;;34014:73;;;;:::o;34093:148::-;;34232:3;34217:18;;34207:34;;;;:::o;34247:305::-;;34306:20;34324:1;34306:20;:::i;:::-;34301:25;;34340:20;34358:1;34340:20;:::i;:::-;34335:25;;34494:1;34426:66;34422:74;34419:1;34416:81;34413:2;;;34500:18;;:::i;:::-;34413:2;34544:1;34541;34537:9;34530:16;;34291:261;;;;:::o;34558:185::-;;34615:20;34633:1;34615:20;:::i;:::-;34610:25;;34649:20;34667:1;34649:20;:::i;:::-;34644:25;;34688:1;34678:2;;34693:18;;:::i;:::-;34678:2;34735:1;34732;34728:9;34723:14;;34600:143;;;;:::o;34749:348::-;;34812:20;34830:1;34812:20;:::i;:::-;34807:25;;34846:20;34864:1;34846:20;:::i;:::-;34841:25;;35034:1;34966:66;34962:74;34959:1;34956:81;34951:1;34944:9;34937:17;34933:105;34930:2;;;35041:18;;:::i;:::-;34930:2;35089:1;35086;35082:9;35071:20;;34797:300;;;;:::o;35103:191::-;;35163:20;35181:1;35163:20;:::i;:::-;35158:25;;35197:20;35215:1;35197:20;:::i;:::-;35192:25;;35236:1;35233;35230:8;35227:2;;;35241:18;;:::i;:::-;35227:2;35286:1;35283;35279:9;35271:17;;35148:146;;;;:::o;35300:96::-;;35366:24;35384:5;35366:24;:::i;:::-;35355:35;;35345:51;;;:::o;35402:90::-;;35479:5;35472:13;35465:21;35454:32;;35444:48;;;:::o;35498:149::-;;35574:66;35567:5;35563:78;35552:89;;35542:105;;;:::o;35653:89::-;;35729:6;35722:5;35718:18;35707:29;;35697:45;;;:::o;35748:126::-;;35825:42;35818:5;35814:54;35803:65;;35793:81;;;:::o;35880:77::-;;35946:5;35935:16;;35925:32;;;:::o;35963:86::-;;36038:4;36031:5;36027:16;36016:27;;36006:43;;;:::o;36055:154::-;36139:6;36134:3;36129;36116:30;36201:1;36192:6;36187:3;36183:16;36176:27;36106:103;;;:::o;36215:307::-;36283:1;36293:113;36307:6;36304:1;36301:13;36293:113;;;36392:1;36387:3;36383:11;36377:18;36373:1;36368:3;36364:11;36357:39;36329:2;36326:1;36322:10;36317:15;;36293:113;;;36424:6;36421:1;36418:13;36415:2;;;36504:1;36495:6;36490:3;36486:16;36479:27;36415:2;36264:258;;;;:::o;36528:320::-;;36609:1;36603:4;36599:12;36589:22;;36656:1;36650:4;36646:12;36677:18;36667:2;;36733:4;36725:6;36721:17;36711:27;;36667:2;36795;36787:6;36784:14;36764:18;36761:38;36758:2;;;36814:18;;:::i;:::-;36758:2;36579:269;;;;:::o;36854:281::-;36937:27;36959:4;36937:27;:::i;:::-;36929:6;36925:40;37067:6;37055:10;37052:22;37031:18;37019:10;37016:34;37013:62;37010:2;;;37078:18;;:::i;:::-;37010:2;37118:10;37114:2;37107:22;36897:238;;;:::o;37141:233::-;;37203:24;37221:5;37203:24;:::i;:::-;37194:33;;37249:66;37242:5;37239:77;37236:2;;;37319:18;;:::i;:::-;37236:2;37366:1;37359:5;37355:13;37348:20;;37184:190;;;:::o;37380:167::-;;37440:22;37456:5;37440:22;:::i;:::-;37431:31;;37484:4;37477:5;37474:15;37471:2;;;37492:18;;:::i;:::-;37471:2;37539:1;37532:5;37528:13;37521:20;;37421:126;;;:::o;37553:176::-;;37602:20;37620:1;37602:20;:::i;:::-;37597:25;;37636:20;37654:1;37636:20;:::i;:::-;37631:25;;37675:1;37665:2;;37680:18;;:::i;:::-;37665:2;37721:1;37718;37714:9;37709:14;;37587:142;;;;:::o;37735:180::-;37783:77;37780:1;37773:88;37880:4;37877:1;37870:15;37904:4;37901:1;37894:15;37921:180;37969:77;37966:1;37959:88;38066:4;38063:1;38056:15;38090:4;38087:1;38080:15;38107:180;38155:77;38152:1;38145:88;38252:4;38249:1;38242:15;38276:4;38273:1;38266:15;38293:180;38341:77;38338:1;38331:88;38438:4;38435:1;38428:15;38462:4;38459:1;38452:15;38479:102;;38571:2;38567:7;38562:2;38555:5;38551:14;38547:28;38537:38;;38527:54;;;:::o;38587:230::-;38727:34;38723:1;38715:6;38711:14;38704:58;38796:13;38791:2;38783:6;38779:15;38772:38;38693:124;:::o;38823:237::-;38963:34;38959:1;38951:6;38947:14;38940:58;39032:20;39027:2;39019:6;39015:15;39008:45;38929:131;:::o;39066:180::-;39206:32;39202:1;39194:6;39190:14;39183:56;39172:74;:::o;39252:225::-;39392:34;39388:1;39380:6;39376:14;39369:58;39461:8;39456:2;39448:6;39444:15;39437:33;39358:119;:::o;39483:164::-;39623:16;39619:1;39611:6;39607:14;39600:40;39589:58;:::o;39653:178::-;39793:30;39789:1;39781:6;39777:14;39770:54;39759:72;:::o;39837:174::-;39977:26;39973:1;39965:6;39961:14;39954:50;39943:68;:::o;40017:223::-;40157:34;40153:1;40145:6;40141:14;40134:58;40226:6;40221:2;40213:6;40209:15;40202:31;40123:117;:::o;40246:175::-;40386:27;40382:1;40374:6;40370:14;40363:51;40352:69;:::o;40427:172::-;40567:24;40563:1;40555:6;40551:14;40544:48;40533:66;:::o;40605:231::-;40745:34;40741:1;40733:6;40729:14;40722:58;40814:14;40809:2;40801:6;40797:15;40790:39;40711:125;:::o;40842:250::-;40982:34;40978:1;40970:6;40966:14;40959:58;41051:33;41046:2;41038:6;41034:15;41027:58;40948:144;:::o;41098:243::-;41238:34;41234:1;41226:6;41222:14;41215:58;41307:26;41302:2;41294:6;41290:15;41283:51;41204:137;:::o;41347:229::-;41487:34;41483:1;41475:6;41471:14;41464:58;41556:12;41551:2;41543:6;41539:15;41532:37;41453:123;:::o;41582:228::-;41722:34;41718:1;41710:6;41706:14;41699:58;41791:11;41786:2;41778:6;41774:15;41767:36;41688:122;:::o;41816:182::-;41956:34;41952:1;41944:6;41940:14;41933:58;41922:76;:::o;42004:166::-;42144:18;42140:1;42132:6;42128:14;42121:42;42110:60;:::o;42176:236::-;42316:34;42312:1;42304:6;42300:14;42293:58;42385:19;42380:2;42372:6;42368:15;42361:44;42282:130;:::o;42418:231::-;42558:34;42554:1;42546:6;42542:14;42535:58;42627:14;42622:2;42614:6;42610:15;42603:39;42524:125;:::o;42655:182::-;42795:34;42791:1;42783:6;42779:14;42772:58;42761:76;:::o;42843:228::-;42983:34;42979:1;42971:6;42967:14;42960:58;43052:11;43047:2;43039:6;43035:15;43028:36;42949:122;:::o;43077:234::-;43217:34;43213:1;43205:6;43201:14;43194:58;43286:17;43281:2;43273:6;43269:15;43262:42;43183:128;:::o;43317:220::-;43457:34;43453:1;43445:6;43441:14;43434:58;43526:3;43521:2;43513:6;43509:15;43502:28;43423:114;:::o;43543:172::-;43683:24;43679:1;43671:6;43667:14;43660:48;43649:66;:::o;43721:236::-;43861:34;43857:1;43849:6;43845:14;43838:58;43930:19;43925:2;43917:6;43913:15;43906:44;43827:130;:::o;43963:231::-;44103:34;44099:1;44091:6;44087:14;44080:58;44172:14;44167:2;44159:6;44155:15;44148:39;44069:125;:::o;44200:250::-;44340:34;44336:1;44328:6;44324:14;44317:58;44409:33;44404:2;44396:6;44392:15;44385:58;44306:144;:::o;44456:122::-;44529:24;44547:5;44529:24;:::i;:::-;44522:5;44519:35;44509:2;;44568:1;44565;44558:12;44509:2;44499:79;:::o;44584:116::-;44654:21;44669:5;44654:21;:::i;:::-;44647:5;44644:32;44634:2;;44690:1;44687;44680:12;44634:2;44624:76;:::o;44706:120::-;44778:23;44795:5;44778:23;:::i;:::-;44771:5;44768:34;44758:2;;44816:1;44813;44806:12;44758:2;44748:78;:::o;44832:122::-;44905:24;44923:5;44905:24;:::i;:::-;44898:5;44895:35;44885:2;;44944:1;44941;44934:12;44885:2;44875:79;:::o;44960:118::-;45031:22;45047:5;45031:22;:::i;:::-;45024:5;45021:33;45011:2;;45068:1;45065;45058:12;45011:2;45001:77;:::o

Swarm Source

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