ERC-721
Overview
Max Total Supply
2,000 WSC
Holders
1,025
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 WSCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Token
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-02 */ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7 <0.9.0; //import "../../utils/Strings.sol"; /** * @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); } } //import "../../utils/Context.sol"; /** * @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; } } //import "@openzeppelin/contracts/access/Ownable.sol"; /** * @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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } //import "../../utils/introspection/IERC165.sol"; /** * @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); } //import "./IERC721.sol"; /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } //import "./IERC721Receiver.sol"; /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } //import "./extensions/IERC721Metadata.sol"; /** * @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); } //import "../../utils/Address.sol"; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } //import "../../utils/introspection/ERC165.sol"; /** * @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; } } /** * @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 overridden 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 { _setApprovalForAll(_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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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.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 Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } //import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } //import "./Common/IAirdrop.sol"; //-------------------------------------------- // AIRDROP intterface //-------------------------------------------- interface IAirdrop { //-------------------- // function //-------------------- function getTotal() external view returns (uint256); function getAt( uint256 at ) external view returns (address); } //import "./Common/IWhiteList.sol"; //-------------------------------------------- // WHITELIST intterface //-------------------------------------------- interface IWhiteList { //-------------------- // function //-------------------- function check( address target ) external view returns (bool); } //-------------------------------------------------------- // Token: WONDER SECRET CLUB //-------------------------------------------------------- contract Token is Ownable, ERC721, ReentrancyGuard { //-------------------------------------------------------- // constant //-------------------------------------------------------- string constant private TOKEN_NAME = "WONDER SECRET CLUB"; string constant private TOKEN_SYMBOL = "WSC"; uint256 constant private BLOCK_SEC_MARGIN = 30; //----------------------------------------- // mainnet //----------------------------------------- address constant private OWNER_ADDRESS = 0x8ee348062160811cba1c1A51E66c6A73214655F8; uint256 constant private RESERVED_TOKEN = 120; uint256 constant private AIRDROP_ADDRESS = 49; uint256 constant private AIRDROP_TOKEN_PER_ADDRESS = 2; uint256 constant private AIRDROP_TOKEN = AIRDROP_ADDRESS*AIRDROP_TOKEN_PER_ADDRESS; // enum uint256 constant private INFO_SALE_SUSPENDED = 0; uint256 constant private INFO_SALE_START = 1; uint256 constant private INFO_SALE_END = 2; uint256 constant private INFO_SALE_PRICE = 3; uint256 constant private INFO_SALE_WHITELISTED = 4; uint256 constant private INFO_SALE_MAX_MINT = 5; uint256 constant private INFO_SALE_USER_MINTED = 6; uint256 constant private INFO_MAX = 7; uint256 constant private USER_INFO_SALE = INFO_MAX; uint256 constant private USER_INFO_SUPPLY = INFO_MAX + 1; uint256 constant private USER_INFO_TOTAL = INFO_MAX + 2; uint256 constant private USER_INFO_MAX = INFO_MAX + 3; //-------------------------------------------------------- // storage //-------------------------------------------------------- address private _manager; string private _baseUriForHidden; string private _baseUriForRevealed; uint256 private _tokenMax; uint256 private _totalSupply; // AIRDROP IAirdrop private _AIRDROP_list; // MINTED IWhiteList private _MINTED_list; // WONDERLIST SALE bool private _WONDERLIST_SALE_isSuspended; uint256 private _WONDERLIST_SALE_start; uint256 private _WONDERLIST_SALE_end; uint256 private _WONDERLIST_SALE_price; uint256 private _WONDERLIST_SALE_quantity; IWhiteList[] private _WONDERLIST_SALE_arrWhiteList; mapping( address => uint256 ) private _WONDERLIST_SALE_mapMinted; // WONDERKIDS SALE bool private _WONDERKIDS_SALE_isSuspended; uint256 private _WONDERKIDS_SALE_start; uint256 private _WONDERKIDS_SALE_end; uint256 private _WONDERKIDS_SALE_price; uint256 private _WONDERKIDS_SALE_quantity; IWhiteList[] private _WONDERKIDS_SALE_arrWhiteList; mapping( address => uint256 ) private _WONDERKIDS_SALE_mapMinted; // PUBLIC SALE bool private _PUBLIC_SALE_isSuspended; uint256 private _PUBLIC_SALE_start; uint256 private _PUBLIC_SALE_end; uint256 private _PUBLIC_SALE_price; uint256 private _PUBLIC_SALE_quantity; IWhiteList[] private _PUBLIC_SALE_arrWhiteList; mapping( address => uint256 ) private _PUBLIC_SALE_mapMinted; // FINAL SALE bool private _FINAL_SALE_isSuspended; uint256 private _FINAL_SALE_start; uint256 private _FINAL_SALE_end; uint256 private _FINAL_SALE_price; uint256 private _FINAL_SALE_quantity; mapping( address => uint256 ) private _FINAL_SALE_mapMinted; //-------------------------------------------------------- // [modifier] onlyOwnerOrManager //-------------------------------------------------------- modifier onlyOwnerOrManager() { require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" ); _; } //-------------------------------------------------------- // constructor //-------------------------------------------------------- constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) { transferOwnership( OWNER_ADDRESS ); _manager = msg.sender; //----------------------- // mainnet //----------------------- _baseUriForHidden = "ipfs://QmZkJocmGRFCef9t2q2MGUQ4Z7kNH9KPASwEeD2kx11URw/"; _tokenMax = 5555; _AIRDROP_list = IAirdrop(0x2D44980Dda803827E756B5E4F4B0e1A3a824766E); // additional _MINTED_list = IWhiteList(0x801de38D7F3cF2f2f5B23814541C3351189951B5); // additional //======================= // WONDERLIST SALE //======================= _WONDERLIST_SALE_start = 1656946800; // 2022-07-04 15:00:00(UTC) _WONDERLIST_SALE_end = 1656954000; // 2022-07-04 17:00:00(UTC) _WONDERLIST_SALE_price = 40000000000000000; // 0.04 ETH _WONDERLIST_SALE_quantity = 1; _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x582b680e1b1c8aCAA9442E80b12CD0efAf1f3bd1) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x632ae52C10159fDb8f191F778f1aE9cA2ABFEeb3) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x7e72b15Cd97F08F7aE7a32C06Cca732eeb08C98c) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x06Dccb6EE7a900759CE426ef713120508f9C5036) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0xe1bAD705EC6710800B3fe507c66a20cbd895Fe8E) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x6B9cC7A4c3e7A4eB56f29D3B3556FeB9318D1446) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x174fF1E0136a1bd578D8e27f6C430963b342F59F) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0xD94e994c032fa5132f070D899703c19E686cFE3a) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x9be8f83f81291aacdB12f37a80A464d7Bfe4B8A1) ); // fixed: 6/13 _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0xB2ec8cde166f57a4E0D871d59610aa9ff30A6096) ); // additional //+++++++++++++++++++++++ // WONDERKIDS SALE //+++++++++++++++++++++++ _WONDERKIDS_SALE_start = 1656946800; // 2022-07-04 15:00:00(UTC) _WONDERKIDS_SALE_end = 1656954000; // 2022-07-04 17:00:00(UTC) _WONDERKIDS_SALE_price = 40000000000000000; // 0.04 ETH _WONDERKIDS_SALE_quantity = 2; _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x6452EBc37A790d8A5614bB3E30cf544eB5555796) ); // fixed: 6/13 _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x2B56E26E85a552Eaa2C8C332C96EE4A11B7B4cac) ); // additional //*********************** // PUBLIC SALE //*********************** _PUBLIC_SALE_start = 1656954000; // 2022-07-04 17:00:00(UTC) _PUBLIC_SALE_end = 1656961200; // 2022-07-04 19:00:00(UTC) _PUBLIC_SALE_price = 50000000000000000; // 0.05 ETH _PUBLIC_SALE_quantity = 1; _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x2821Dbf2685fCda10C64907637aF56c7f92C4dd6) ); // fixed: 6/13 _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x55E25eb0DbB1AA8a9b47e44fD27438B827D4A986) ); // fixed: 6/13 _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x62a2CC3889d65666A669533fE8f92a323FE2c9A8) ); // fixed: 6/13 _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x904f99D3646660096752e0Bc2fd5458962788F7B) ); // fixed: 6/13 _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x8336f23513c25c52775DB44624BA5B731C8BAE18) ); // fixed: 6/13 //~~~~~~~~~~~~~~~~~~~~~~~ // FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~ _FINAL_SALE_start = 1656961200; // 2022-07-04 19:00:00(UTC) _FINAL_SALE_end = 0; // no period _FINAL_SALE_price = 50000000000000000; // 0.05 ETH _FINAL_SALE_quantity = 2; } //-------------------------------------------------------- // [public] manager //-------------------------------------------------------- function manager() public view returns (address) { return( _manager ); } //-------------------------------------------------------- // [external/onlyOwner] setManager //-------------------------------------------------------- function setManager( address target ) external onlyOwner { _manager = target; } //-------------------------------------------------------- // [external] get //-------------------------------------------------------- function baseUriForHidden() external view returns (string memory) { return( _baseUriForHidden ); } function baseUriForRevealed() external view returns (string memory) { return( _baseUriForRevealed ); } function tokenMax() external view returns (uint256) { return( _tokenMax ); } function totalSupply() external view returns (uint256) { return( _totalSupply ); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] set //-------------------------------------------------------- function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager { _baseUriForHidden = uri; } function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager { _baseUriForRevealed = uri; } function setTokenMax( uint256 max ) external onlyOwnerOrManager { _tokenMax = max; } //-------------------------------------------------------- // [public/override] tokenURI //-------------------------------------------------------- function tokenURI( uint256 tokenId ) public view override returns (string memory) { require( _exists( tokenId ), "nonexistent token" ); if( bytes(_baseUriForRevealed).length > 0 ){ return( string( abi.encodePacked( _baseUriForRevealed, Strings.toString( tokenId ) ) ) ); } return( string( abi.encodePacked( _baseUriForHidden, Strings.toString( tokenId ) ) ) ); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] write - AIRDROP //-------------------------------------------------------- function AIRDROP_setList( address list ) external onlyOwnerOrManager { require( list != address(0), "AIRDROP: invalid list" ); _AIRDROP_list = IAirdrop(list); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] write - MINTED //-------------------------------------------------------- function MINTED_setList( address list ) external onlyOwnerOrManager { require( list != address(0), "MINTED: invalid list" ); _MINTED_list = IWhiteList(list); } //======================================================== // [public] getInfo - WONDERLIST SALE //======================================================== function WONDERLIST_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _WONDERLIST_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _WONDERLIST_SALE_start; arrRet[INFO_SALE_END] = _WONDERLIST_SALE_end; arrRet[INFO_SALE_PRICE] = _WONDERLIST_SALE_price; if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target, true ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; } arrRet[INFO_SALE_MAX_MINT] = _WONDERLIST_SALE_quantity; arrRet[INFO_SALE_USER_MINTED] = _WONDERLIST_SALE_mapMinted[target]; return( arrRet ); } //======================================================== // [external/onlyOwnerOrManager] write - WONDERLIST SALE //======================================================== // isSuspended function WONDERLIST_SALE_suspend( bool flag ) external onlyOwnerOrManager { _WONDERLIST_SALE_isSuspended = flag; } // start-end function WONDERLIST_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager { _WONDERLIST_SALE_start = start; _WONDERLIST_SALE_end = end; } // price function WONDERLIST_SALE_setPrice( uint256 price ) external onlyOwnerOrManager { _WONDERLIST_SALE_price = price; } // quantity function WONDERLIST_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager { _WONDERLIST_SALE_quantity = quantity; } // whitelist function WONDERLIST_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager { delete _WONDERLIST_SALE_arrWhiteList; for( uint256 i=0; i<lists.length; i++ ){ require( lists[i] != address(0), "WONDERLIST SALE: invalid list" ); _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(lists[i]) ); } } //======================================================== // [external/payable] mint - WONDERLIST SALE //======================================================== function WONDERLIST_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = WONDERLIST_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERLIST SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "WONDERLIST SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "WONDERLIST SALE: finished" ); require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERLIST SALE: not whitelisted" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERLIST SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _WONDERLIST_SALE_mapMinted[msg.sender] += num; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // [public] getInfo - WONDERKIDS SALE //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function WONDERKIDS_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _WONDERKIDS_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _WONDERKIDS_SALE_start; arrRet[INFO_SALE_END] = _WONDERKIDS_SALE_end; arrRet[INFO_SALE_PRICE] = _WONDERKIDS_SALE_price; if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target, true ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; } arrRet[INFO_SALE_MAX_MINT] = _WONDERKIDS_SALE_quantity; arrRet[INFO_SALE_USER_MINTED] = _WONDERKIDS_SALE_mapMinted[target]; return( arrRet ); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // [external/onlyOwnerOrManager] write - WONDERKIDS SALE //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // isSuspended function WONDERKIDS_SALE_suspend( bool flag ) external onlyOwnerOrManager { _WONDERKIDS_SALE_isSuspended = flag; } // start-end function WONDERKIDS_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager { _WONDERKIDS_SALE_start = start; _WONDERKIDS_SALE_end = end; } // price function WONDERKIDS_SALE_setPrice( uint256 price ) external onlyOwnerOrManager { _WONDERKIDS_SALE_price = price; } // quantity function WONDERKIDS_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager { _WONDERKIDS_SALE_quantity = quantity; } // whitelist function WONDERKIDS_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager { delete _WONDERKIDS_SALE_arrWhiteList; for( uint256 i=0; i<lists.length; i++ ){ require( lists[i] != address(0), "WONDERKIDS SALE: invalid list" ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(lists[i]) ); } } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // [external/payable] mint - WONDERKIDS SALE //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function WONDERKIDS_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = WONDERKIDS_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERKIDS SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "WONDERKIDS SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "WONDERKIDS SALE: finished" ); require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERKIDS SALE: not whitelisted" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERKIDS SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _WONDERKIDS_SALE_mapMinted[msg.sender] += num; } //******************************************************** // [public] getInfo - PUBLIC SALE //******************************************************** function PUBLIC_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _PUBLIC_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _PUBLIC_SALE_start; arrRet[INFO_SALE_END] = _PUBLIC_SALE_end; arrRet[INFO_SALE_PRICE] = _PUBLIC_SALE_price; if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target, false ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; } arrRet[INFO_SALE_MAX_MINT] = _PUBLIC_SALE_quantity; arrRet[INFO_SALE_USER_MINTED] = _PUBLIC_SALE_mapMinted[target]; return( arrRet ); } //******************************************************** // [external/onlyOwnerOrManager] write - PUBLIC SALE //******************************************************** // isSuspended function PUBLIC_SALE_suspend( bool flag ) external onlyOwnerOrManager { _PUBLIC_SALE_isSuspended = flag; } // start-end function PUBLIC_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager { _PUBLIC_SALE_start = start; _PUBLIC_SALE_end = end; } // price function PUBLIC_SALE_setPrice( uint256 price ) external onlyOwnerOrManager { _PUBLIC_SALE_price = price; } // quantity function PUBLIC_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager { _PUBLIC_SALE_quantity = quantity; } // whitelist function PUBLIC_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager { delete _PUBLIC_SALE_arrWhiteList; for( uint256 i=0; i<lists.length; i++ ){ require( lists[i] != address(0), "PUBLIC SALE: invalid list" ); _PUBLIC_SALE_arrWhiteList.push( IWhiteList(lists[i]) ); } } //******************************************************** // [external/payable] mint - PUBLIC SALE //******************************************************** function PUBLIC_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = PUBLIC_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PUBLIC SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "PUBLIC SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "PUBLIC SALE: finished" ); require( arrInfo[INFO_SALE_WHITELISTED] == 1, "PUBLIC SALE: not whitelisted" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PUBLIC SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _PUBLIC_SALE_mapMinted[msg.sender] += num; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [public] getInfo - FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function FINAL_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _FINAL_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _FINAL_SALE_start; arrRet[INFO_SALE_END] = _FINAL_SALE_end; arrRet[INFO_SALE_PRICE] = _FINAL_SALE_price; arrRet[INFO_SALE_WHITELISTED] = 1; arrRet[INFO_SALE_MAX_MINT] = _FINAL_SALE_quantity; arrRet[INFO_SALE_USER_MINTED] = _FINAL_SALE_mapMinted[target]; return( arrRet ); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [external/onlyOwnerOrManager] write - FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // isSuspended function FINAL_SALE_suspend( bool flag ) external onlyOwnerOrManager { _FINAL_SALE_isSuspended = flag; } // start-end function FINAL_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager { _FINAL_SALE_start = start; _FINAL_SALE_end = end; } // price function FINAL_SALE_setPrice( uint256 price ) external onlyOwnerOrManager { _FINAL_SALE_price = price; } // quantity function FINAL_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager { _FINAL_SALE_quantity = quantity; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [external/payable] mint - FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function FINAL_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = FINAL_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "FINAL SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "FINAL SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "FINAL SALE: finished" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "FINAL SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _FINAL_SALE_mapMinted[msg.sender] += num; } //-------------------------------------------------------- // [internal] _checkWhitelist //-------------------------------------------------------- function _checkWhitelist( IWhiteList[] storage lists, address target, bool checkMinted ) internal view returns (bool) { if( checkMinted ){ if( _MINTED_list.check( target ) ){ return( false ); } } for( uint256 i=0; i<lists.length; i++ ){ if( lists[i].check(target) ){ return( true); } } return( false ); } //-------------------------------------------------------- // [internal] _checkPayment //-------------------------------------------------------- function _checkPayment( address msgSender, uint256 price, uint256 payment ) internal { require( price <= payment, "insufficient value" ); // refund if overpaymented if( price < payment ){ uint256 change = payment - price; address payable target = payable( msgSender ); target.transfer( change ); } } //-------------------------------------------------------- // [internal] _mintTokens //-------------------------------------------------------- function _mintTokens( address to, uint256 num ) internal { require( _totalSupply >= (RESERVED_TOKEN+AIRDROP_TOKEN), "airdrop not finished" ); require( (_totalSupply+num) <= _tokenMax, "exceeded the supply range" ); for( uint256 i=0; i<num; i++ ){ _mint( to, _totalSupply+(i+1) ); } _totalSupply += num; } //-------------------------------------------------------- // [external/onlyOwnerOrManager] reserveTokens //-------------------------------------------------------- function reserveTokens( uint256 num ) external onlyOwnerOrManager { require( (_totalSupply+num) <= RESERVED_TOKEN, "exceeded the reservation range" ); for( uint256 i=0; i<num; i++ ){ _mint( owner(), _totalSupply+(i+1) ); } _totalSupply += num; } //-------------------------------------------------------- // [external/onlyOwnerOrManager] airdropTokens //-------------------------------------------------------- function airdropTokens() external onlyOwnerOrManager { require( _totalSupply == RESERVED_TOKEN, "could not airdrop" ); uint256 num = _AIRDROP_list.getTotal(); require( num == AIRDROP_ADDRESS, "invalid airdrop list" ); for( uint256 i=0; i<AIRDROP_ADDRESS; i++ ){ address target = _AIRDROP_list.getAt( i ); for( uint256 j=0; j<AIRDROP_TOKEN_PER_ADDRESS; j++ ){ _mint( target, _totalSupply+(1+AIRDROP_TOKEN_PER_ADDRESS*i+j) ); } } _totalSupply += AIRDROP_TOKEN; } //-------------------------------------------------------- // [external] getUserInfo //-------------------------------------------------------- function getUserInfo( address target ) external view returns (uint256[USER_INFO_MAX] memory) { uint256[USER_INFO_MAX] memory userInfo; uint256[INFO_MAX] memory info; // WONDERLIST if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target, true ) && (_WONDERLIST_SALE_end == 0 || _WONDERLIST_SALE_end > block.timestamp) ){ userInfo[USER_INFO_SALE] = 1; info = WONDERLIST_SALE_getInfo( target ); } // WONDERKIDS else if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target , true ) && (_WONDERKIDS_SALE_end == 0 || _WONDERKIDS_SALE_end > block.timestamp) ){ userInfo[USER_INFO_SALE] = 2; info = WONDERKIDS_SALE_getInfo( target ); } // PUBLIC else if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target, false ) && (_PUBLIC_SALE_end == 0 || _PUBLIC_SALE_end > block.timestamp) ){ userInfo[USER_INFO_SALE] = 3; info = PUBLIC_SALE_getInfo( target ); } // FINAL else{ userInfo[USER_INFO_SALE] = 4; info = FINAL_SALE_getInfo( target ); } for( uint256 i=0; i<INFO_MAX; i++ ){ userInfo[i] = info[i]; } userInfo[USER_INFO_SUPPLY] = _totalSupply; userInfo[USER_INFO_TOTAL] = _tokenMax; return( userInfo ); } //-------------------------------------------------------- // [external] checkBalance //-------------------------------------------------------- function checkBalance() external view returns (uint256) { return( address(this).balance ); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] withdraw //-------------------------------------------------------- function withdraw( uint256 amount ) external onlyOwnerOrManager nonReentrant { require( amount <= address(this).balance, "insufficient balance" ); address payable target = payable( owner() ); target.transfer( amount ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"list","type":"address"}],"name":"AIRDROP_setList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"FINAL_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"FINAL_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"FINAL_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"FINAL_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"FINAL_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"FINAL_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"list","type":"address"}],"name":"MINTED_setList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PUBLIC_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PUBLIC_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"PUBLIC_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"PUBLIC_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PUBLIC_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"PUBLIC_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PUBLIC_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERKIDS_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERKIDS_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"WONDERKIDS_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WONDERKIDS_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERKIDS_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERKIDS_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERKIDS_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERLIST_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERLIST_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"WONDERLIST_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WONDERLIST_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERLIST_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERLIST_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERLIST_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalance","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":"address","name":"target","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[10]","name":"","type":"uint256[10]"}],"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":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setTokenMax","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":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051806040016040528060128152602001712ba7a72222a91029a2a1a922aa1021a62aa160711b8152506040518060400160405280600381526020016257534360e81b815250620000736200006d620004b660201b60201c565b620004ba565b815162000088906001906020850190620005df565b5080516200009e906002906020840190620005df565b5050600160075550620000c5738ee348062160811cba1c1a51e66c6a73214655f86200050a565b600880546001600160a01b0319163317905560408051606081019091526036808252620046b9602083013980516200010691600991602090910190620005df565b506115b3600b55600d80546001600160a01b0319908116732d44980dda803827e756b5e4f4b0e1a3a824766e17909155600e8054821673801de38d7f3cf2f2f5b23814541c3351189951b51790556362c30070600f8190556362c31c906010819055668e1bc9bf0400006011819055600160128190556013805480830182557f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909081018054881673582b680e1b1c8acaa9442e80b12cd0efaf1f3bd11790558154808401835581018054881673632ae52c10159fdb8f191f778f1ae9ca2abfeeb317905581548084018355810180548816737e72b15cd97f08f7ae7a32c06cca732eeb08c98c179055815480840183558101805488167306dccb6ee7a900759ce426ef713120508f9c50361790558154808401835581018054881673e1bad705ec6710800b3fe507c66a20cbd895fe8e17905581548084018355810180548816736b9cc7a4c3e7a4eb56f29d3b3556feb9318d14461790558154808401835581018054881673174ff1e0136a1bd578d8e27f6c430963b342f59f1790558154808401835581018054881673d94e994c032fa5132f070d899703c19e686cfe3a17905581548084018355810180548816739be8f83f81291aacdb12f37a80a464d7bfe4b8a11790558154808401909255018054861673b2ec8cde166f57a4e0d871d59610aa9ff30a6096179055601693909355601782905560185560026019819055601a805480850182557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e90810180548716736452ebc37a790d8a5614bb3e30cf544eb555579617905581548086019092550180548516732b56e26e85a552eaa2c8c332c96ee4a11b7b4cac179055601d919091556362c338b0601e81905566b1a2bc2ec50000601f819055602084905560218054808601825560008281527f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57091820180548916732821dbf2685fcda10c64907637af56c7f92c4dd6179055825480880184558201805489167355e25eb0dbb1aa8a9b47e44fd27438b827d4a986179055825480880184558201805489167362a2cc3889d65666a669533fe8f92a323fe2c9a81790558254808801845582018054891673904f99d3646660096752e0bc2fd5458962788f7b1790558254968701909255949094018054909516738336f23513c25c52775db44624ba5b731c8bae1817909455602455602591909155602691909155602755620006c2565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146200056a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620005d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000561565b620005dc81620004ba565b50565b828054620005ed9062000685565b90600052602060002090601f0160209004810192826200061157600085556200065c565b82601f106200062c57805160ff19168380011785556200065c565b828001600101855582156200065c579182015b828111156200065c5782518255916020019190600101906200063f565b506200066a9291506200066e565b5090565b5b808211156200066a57600081556001016200066f565b600181811c908216806200069a57607f821691505b60208210811415620006bc57634e487b7160e01b600052602260045260246000fd5b50919050565b613fe780620006d26000396000f3fe60806040526004361061038c5760003560e01c8063715018a6116101dc578063c71daccb11610102578063e2257266116100a0578063f2fde38b1161006f578063f2fde38b14610a68578063f34e1ea114610a88578063f7ee706814610aa8578063ff4b629e14610abd57600080fd5b8063e2257266146109bf578063e3c61b02146109df578063e985e9c5146109ff578063ecb8dbac14610a4857600080fd5b8063d0ebdbe7116100dc578063d0ebdbe71461093f578063d7bec63d1461095f578063dd5db3aa1461097f578063de3bc79f1461099f57600080fd5b8063c71daccb146108ec578063c87b56dd146108ff578063d031370b1461091f57600080fd5b8063a22cb4651161017a578063b88d4fde11610149578063b88d4fde1461086c578063be900d401461088c578063c0ca970f146108ac578063c555fd64146108cc57600080fd5b8063a22cb465146107f9578063a3df2a0114610819578063a47cd7761461082c578063ac1349a11461084c57600080fd5b806391152c5c116101b657806391152c5c1461079a57806393b76bce146107af57806395d89b41146107cf578063a04e5f7f146107e457600080fd5b8063715018a614610747578063808312bc1461075c5780638da5cb5b1461077c57600080fd5b806337592618116102c157806352c0295f1161025f5780635e59da6b1161022e5780635e59da6b146106c75780636352211e146106da5780636386c1c7146106fa57806370a082311461072757600080fd5b806352c0295f1461065257806353db2af214610667578063568489c8146106875780635d8ceea9146106a757600080fd5b806342842e0e1161029b57806342842e0e146105d4578063481c6a75146105f45780634a213d2a14610612578063502ece241461063257600080fd5b806337592618146105815780633abe69b2146105a15780633b353842146105c157600080fd5b80631c58eec51161032e578063279b8b5a11610308578063279b8b5a146105015780632e1a7d4d146105215780632e4318101461054157806336e517dd1461055457600080fd5b80631c58eec5146104a157806322a42799146104c157806323b872dd146104e157600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630ff4231014610442578063138cfadc1461046257806318160ddd1461048257600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613a4b565b610add565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b2f565b6040516103bd9190613cbf565b3480156103f457600080fd5b50610408610403366004613ae5565b610bc1565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613970565b610c5b565b005b34801561044e57600080fd5b5061044061045d36600461399c565b610d71565b34801561046e57600080fd5b5061044061047d366004613b17565b610eb4565b34801561048e57600080fd5b50600c545b6040519081526020016103bd565b3480156104ad57600080fd5b506104406104bc366004613b17565b610efe565b3480156104cd57600080fd5b506104406104dc3660046137ae565b610f48565b3480156104ed57600080fd5b506104406104fc366004613821565b610ff6565b34801561050d57600080fd5b5061044061051c36600461399c565b611027565b34801561052d57600080fd5b5061044061053c366004613ae5565b61116a565b61044061054f366004613ae5565b61125e565b34801561056057600080fd5b5061057461056f3660046137ae565b6114cf565b6040516103bd9190613c97565b34801561058d57600080fd5b5061044061059c366004613ae5565b611544565b3480156105ad57600080fd5b506105746105bc3660046137ae565b611588565b6104406105cf366004613ae5565b61160a565b3480156105e057600080fd5b506104406105ef366004613821565b6117e4565b34801561060057600080fd5b506008546001600160a01b0316610408565b34801561061e57600080fd5b5061044061062d366004613b17565b6117ff565b34801561063e57600080fd5b5061044061064d366004613b17565b611849565b34801561065e57600080fd5b506103db611893565b34801561067357600080fd5b50610440610682366004613ae5565b6118a2565b34801561069357600080fd5b506104406106a2366004613ae5565b6118e6565b3480156106b357600080fd5b506104406106c2366004613a85565b61192a565b6104406106d5366004613ae5565b611975565b3480156106e657600080fd5b506104086106f5366004613ae5565b611ba6565b34801561070657600080fd5b5061071a6107153660046137ae565b611c1d565b6040516103bd9190613c65565b34801561073357600080fd5b506104936107423660046137ae565b611d98565b34801561075357600080fd5b50610440611e1f565b34801561076857600080fd5b50610440610777366004613a11565b611e55565b34801561078857600080fd5b506000546001600160a01b0316610408565b3480156107a657600080fd5b50610440611ea7565b3480156107bb57600080fd5b506104406107ca366004613ae5565b61210d565b3480156107db57600080fd5b506103db612151565b3480156107f057600080fd5b506103db612160565b34801561080557600080fd5b50610440610814366004613942565b61216f565b610440610827366004613ae5565b61217e565b34801561083857600080fd5b506104406108473660046137ae565b6123d0565b34801561085857600080fd5b50610440610867366004613a85565b61247f565b34801561087857600080fd5b50610440610887366004613862565b6124ca565b34801561089857600080fd5b506104406108a7366004613ae5565b612502565b3480156108b857600080fd5b506104406108c736600461399c565b612546565b3480156108d857600080fd5b506104406108e7366004613ae5565b612689565b3480156108f857600080fd5b5047610493565b34801561090b57600080fd5b506103db61091a366004613ae5565b6126cd565b34801561092b57600080fd5b5061044061093a366004613ae5565b61277c565b34801561094b57600080fd5b5061044061095a3660046137ae565b612869565b34801561096b57600080fd5b5061044061097a366004613ae5565b6128b5565b34801561098b57600080fd5b5061044061099a366004613ae5565b6128f9565b3480156109ab57600080fd5b506104406109ba366004613a11565b61293d565b3480156109cb57600080fd5b506105746109da3660046137ae565b61299a565b3480156109eb57600080fd5b506104406109fa366004613a11565b612a15565b348015610a0b57600080fd5b506103b1610a1a3660046137e8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a5457600080fd5b50610440610a63366004613ae5565b612a67565b348015610a7457600080fd5b50610440610a833660046137ae565b612aab565b348015610a9457600080fd5b50610440610aa3366004613a11565b612b46565b348015610ab457600080fd5b50600b54610493565b348015610ac957600080fd5b50610574610ad83660046137ae565b612b98565b60006001600160e01b031982166380ac58cd60e01b1480610b0e57506001600160e01b03198216635b5e139f60e01b145b80610b2957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610b3e90613eb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6a90613eb6565b8015610bb75780601f10610b8c57610100808354040283529160200191610bb7565b820191906000526020600020905b815481529060010190602001808311610b9a57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610c6682611ba6565b9050806001600160a01b0316836001600160a01b03161415610cd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c36565b336001600160a01b0382161480610cf05750610cf08133610a1a565b610d625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c36565b610d6c8383612c14565b505050565b6000546001600160a01b0316331480610d9457506008546001600160a01b031633145b610db05760405162461bcd60e51b8152600401610c3690613daa565b610dbc601360006136ba565b60005b81811015610d6c576000838383818110610ddb57610ddb613f4c565b9050602002016020810190610df091906137ae565b6001600160a01b03161415610e475760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b6013838383818110610e5b57610e5b613f4c565b9050602002016020810190610e7091906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610eac81613ef1565b915050610dbf565b6000546001600160a01b0316331480610ed757506008546001600160a01b031633145b610ef35760405162461bcd60e51b8152600401610c3690613daa565b602491909155602555565b6000546001600160a01b0316331480610f2157506008546001600160a01b031633145b610f3d5760405162461bcd60e51b8152600401610c3690613daa565b601d91909155601e55565b6000546001600160a01b0316331480610f6b57506008546001600160a01b031633145b610f875760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b038116610fd45760405162461bcd60e51b81526020600482015260146024820152731352539511510e881a5b9d985b1a59081b1a5cdd60621b6044820152606401610c36565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6110003382612c82565b61101c5760405162461bcd60e51b8152600401610c3690613d59565b610d6c838383612d79565b6000546001600160a01b031633148061104a57506008546001600160a01b031633145b6110665760405162461bcd60e51b8152600401610c3690613daa565b611072601a60006136ba565b60005b81811015610d6c57600083838381811061109157611091613f4c565b90506020020160208101906110a691906137ae565b6001600160a01b031614156110fd5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b601a83838381811061111157611111613f4c565b905060200201602081019061112691906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061116281613ef1565b915050611075565b6000546001600160a01b031633148061118d57506008546001600160a01b031633145b6111a95760405162461bcd60e51b8152600401610c3690613daa565b600260075414156111cc5760405162461bcd60e51b8152600401610c3690613df1565b6002600755478111156112185760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610c36565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015611254573d6000803e3d6000fd5b5050600160075550565b600260075414156112815760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061129133611588565b8051909150156112e35760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610c36565b6020810151158061130257506112fa601e42613e28565b602082015111155b61134e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061136c5750611365601e42613e73565b6040820151115b6113b85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461140c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161141c908390613e28565b60a0820151101561147a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b61149833838360035b60200201516114929190613e54565b34612f15565b6114a23383612fb1565b33600090815260146020526040812080548492906114c1908490613e28565b909155505060016007555050565b6114d76136d8565b6114df6136d8565b60235460ff16156114ef57600181525b60245460208083019190915260255460408084019190915260265460608401526001608084015260275460a08401526001600160a01b038516600090815260289092529020548160065b602002015292915050565b6000546001600160a01b031633148061156757506008546001600160a01b031633145b6115835760405162461bcd60e51b8152600401610c3690613daa565b600b55565b6115906136d8565b6115986136d8565b600e54600160a01b900460ff16156115af57600181525b600f546020820152601054604082015260115460608201526115d460138460016130b7565b156115e157600160808201525b60125460a08201526001600160a01b038316600090815260146020526040902054816006611539565b6002600754141561162d5760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061163d336114cf565b8051909150156116875760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610c36565b602081015115806116a6575061169e601e42613e28565b602082015111155b6116ea5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610c36565b604081015115806117085750611701601e42613e73565b6040820151115b61174b5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610c36565b60c081015161175b908390613e28565b60a082015110156117ae5760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610c36565b6117bb3383836003611483565b6117c53383612fb1565b33600090815260286020526040812080548492906114c1908490613e28565b610d6c838383604051806020016040528060008152506124ca565b6000546001600160a01b031633148061182257506008546001600160a01b031633145b61183e5760405162461bcd60e51b8152600401610c3690613daa565b600f91909155601055565b6000546001600160a01b031633148061186c57506008546001600160a01b031633145b6118885760405162461bcd60e51b8152600401610c3690613daa565b601691909155601755565b606060098054610b3e90613eb6565b6000546001600160a01b03163314806118c557506008546001600160a01b031633145b6118e15760405162461bcd60e51b8152600401610c3690613daa565b602755565b6000546001600160a01b031633148061190957506008546001600160a01b031633145b6119255760405162461bcd60e51b8152600401610c3690613daa565b601155565b6000546001600160a01b031633148061194d57506008546001600160a01b031633145b6119695760405162461bcd60e51b8152600401610c3690613daa565b610d6c600a83836136f6565b600260075414156119985760405162461bcd60e51b8152600401610c3690613df1565b600260075560006119a833612b98565b8051909150156119f35760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610c36565b60208101511580611a125750611a0a601e42613e28565b602082015111155b611a575760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610c36565b60408101511580611a755750611a6e601e42613e73565b6040820151115b611ab95760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610c36565b6080810151600114611b0d5760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610c36565b60c0810151611b1d908390613e28565b60a08201511015611b705760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610c36565b611b7d3383836003611483565b611b873383612fb1565b33600090815260226020526040812080548492906114c1908490613e28565b6000818152600360205260408120546001600160a01b031680610b295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c36565b611c2561377a565b611c2d61377a565b611c356136d8565b611c4260138560016130b7565b8015611c5957506010541580611c59575042601054115b15611c7557600160e0830152611c6e84611588565b9050611cfa565b611c82601a8560016130b7565b8015611c9957506017541580611c99575042601754115b15611cae57600260e0830152611c6e8461299a565b611cbb60218560006130b7565b8015611cd25750601e541580611cd2575042601e54115b15611ce757600360e0830152611c6e84612b98565b600460e0830152611cf7846114cf565b90505b60005b6007811015611d4657818160078110611d1857611d18613f4c565b60200201518382600a8110611d2f57611d2f613f4c565b602002015280611d3e81613ef1565b915050611cfd565b50600c5482611d5760076001613e28565b600a8110611d6757611d67613f4c565b6020020152600b5482611d7c60076002613e28565b600a8110611d8c57611d8c613f4c565b60200201525092915050565b60006001600160a01b038216611e035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c36565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e495760405162461bcd60e51b8152600401610c3690613d24565b611e53600061321b565b565b6000546001600160a01b0316331480611e7857506008546001600160a01b031633145b611e945760405162461bcd60e51b8152600401610c3690613daa565b6023805460ff1916911515919091179055565b6000546001600160a01b0316331480611eca57506008546001600160a01b031633145b611ee65760405162461bcd60e51b8152600401610c3690613daa565b6078600c5414611f2c5760405162461bcd60e51b81526020600482015260116024820152700636f756c64206e6f742061697264726f7607c1b6044820152606401610c36565b600d546040805163775a25e360e01b815290516000926001600160a01b03169163775a25e3916004808301926020929190829003018186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190613afe565b905060318114611ff25760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a5908185a5c991c9bdc081b1a5cdd60621b6044820152606401610c36565b60005b60318110156120e757600d5460405163303eaeed60e01b8152600481018390526000916001600160a01b03169063303eaeed9060240160206040518083038186803b15801561204357600080fd5b505afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b91906137cb565b905060005b60028110156120d2576120c08282612099866002613e54565b6120a4906001613e28565b6120ae9190613e28565b600c546120bb9190613e28565b61326b565b806120ca81613ef1565b915050612080565b505080806120df90613ef1565b915050611ff5565b506120f460026031613e54565b600c60008282546121059190613e28565b909155505050565b6000546001600160a01b031633148061213057506008546001600160a01b031633145b61214c5760405162461bcd60e51b8152600401610c3690613daa565b601255565b606060028054610b3e90613eb6565b6060600a8054610b3e90613eb6565b61217a3383836133ad565b5050565b600260075414156121a15760405162461bcd60e51b8152600401610c3690613df1565b600260075560006121b13361299a565b8051909150156122035760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610c36565b60208101511580612222575061221a601e42613e28565b602082015111155b61226e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061228c5750612285601e42613e73565b6040820151115b6122d85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461232c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161233c908390613e28565b60a0820151101561239a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b6123a73383836003611483565b6123b13383612fb1565b336000908152601b6020526040812080548492906114c1908490613e28565b6000546001600160a01b03163314806123f357506008546001600160a01b031633145b61240f5760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b03811661245d5760405162461bcd60e51b8152602060048201526015602482015274105254911493d40e881a5b9d985b1a59081b1a5cdd605a1b6044820152606401610c36565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806124a257506008546001600160a01b031633145b6124be5760405162461bcd60e51b8152600401610c3690613daa565b610d6c600983836136f6565b6124d43383612c82565b6124f05760405162461bcd60e51b8152600401610c3690613d59565b6124fc8484848461347c565b50505050565b6000546001600160a01b031633148061252557506008546001600160a01b031633145b6125415760405162461bcd60e51b8152600401610c3690613daa565b601f55565b6000546001600160a01b031633148061256957506008546001600160a01b031633145b6125855760405162461bcd60e51b8152600401610c3690613daa565b612591602160006136ba565b60005b81811015610d6c5760008383838181106125b0576125b0613f4c565b90506020020160208101906125c591906137ae565b6001600160a01b0316141561261c5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610c36565b602183838381811061263057612630613f4c565b905060200201602081019061264591906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061268181613ef1565b915050612594565b6000546001600160a01b03163314806126ac57506008546001600160a01b031633145b6126c85760405162461bcd60e51b8152600401610c3690613daa565b602655565b6000818152600360205260409020546060906001600160a01b03166127285760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c36565b6000600a805461273790613eb6565b9050111561277157600a61274a836134af565b60405160200161275b929190613b81565b6040516020818303038152906040529050919050565b600961274a836134af565b6000546001600160a01b031633148061279f57506008546001600160a01b031633145b6127bb5760405162461bcd60e51b8152600401610c3690613daa565b607881600c546127cb9190613e28565b11156128195760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610c36565b60005b81811015612856576128446128396000546001600160a01b031690565b6120ae836001613e28565b8061284e81613ef1565b91505061281c565b5080600c60008282546121059190613e28565b6000546001600160a01b031633146128935760405162461bcd60e51b8152600401610c3690613d24565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806128d857506008546001600160a01b031633145b6128f45760405162461bcd60e51b8152600401610c3690613daa565b602055565b6000546001600160a01b031633148061291c57506008546001600160a01b031633145b6129385760405162461bcd60e51b8152600401610c3690613daa565b601855565b6000546001600160a01b031633148061296057506008546001600160a01b031633145b61297c5760405162461bcd60e51b8152600401610c3690613daa565b600e8054911515600160a01b0260ff60a01b19909216919091179055565b6129a26136d8565b6129aa6136d8565b60155460ff16156129ba57600181525b6016546020820152601754604082015260185460608201526129df601a8460016130b7565b156129ec57600160808201525b60195460a08201526001600160a01b0383166000908152601b6020526040902054816006611539565b6000546001600160a01b0316331480612a3857506008546001600160a01b031633145b612a545760405162461bcd60e51b8152600401610c3690613daa565b6015805460ff1916911515919091179055565b6000546001600160a01b0316331480612a8a57506008546001600160a01b031633145b612aa65760405162461bcd60e51b8152600401610c3690613daa565b601955565b6000546001600160a01b03163314612ad55760405162461bcd60e51b8152600401610c3690613d24565b6001600160a01b038116612b3a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c36565b612b438161321b565b50565b6000546001600160a01b0316331480612b6957506008546001600160a01b031633145b612b855760405162461bcd60e51b8152600401610c3690613daa565b601c805460ff1916911515919091179055565b612ba06136d8565b612ba86136d8565b601c5460ff1615612bb857600181525b601d546020820152601e546040820152601f546060820152612bdd60218460006130b7565b15612bea57600160808201525b6020805460a08301526001600160a01b038416600090815260229091526040902054816006611539565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c4982611ba6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612cfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c36565b6000612d0683611ba6565b9050806001600160a01b0316846001600160a01b03161480612d4d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80612d715750836001600160a01b0316612d6684610bc1565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d8c82611ba6565b6001600160a01b031614612df05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c36565b6001600160a01b038216612e525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c36565b612e5d600082612c14565b6001600160a01b0383166000908152600460205260408120805460019290612e86908490613e73565b90915550506001600160a01b0382166000908152600460205260408120805460019290612eb4908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80821115612f5a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610c36565b80821015610d6c576000612f6e8383613e73565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612fa9573d6000803e3d6000fd5b505050505050565b612fbd60026031613e54565b612fc8906078613e28565b600c5410156130105760405162461bcd60e51b8152602060048201526014602482015273185a5c991c9bdc081b9bdd08199a5b9a5cda195960621b6044820152606401610c36565b600b5481600c546130219190613e28565b111561306f5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610c36565b60005b8181101561309b57613089836120ae836001613e28565b8061309381613ef1565b915050613072565b5080600c60008282546130ae9190613e28565b90915550505050565b6000811561314957600e54604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561310457600080fd5b505afa158015613118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313c9190613a2e565b1561314957506000613214565b60005b845481101561320e5784818154811061316757613167613f4c565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0386811660048301529091169063c23697a89060240160206040518083038186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613a2e565b156131fc576001915050613214565b8061320681613ef1565b91505061314c565b50600090505b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166132c15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c36565b6000818152600360205260409020546001600160a01b0316156133265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c36565b6001600160a01b038216600090815260046020526040812080546001929061334f908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561340f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c36565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613487848484612d79565b613493848484846135ad565b6124fc5760405162461bcd60e51b8152600401610c3690613cd2565b6060816134d35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156134fd57806134e781613ef1565b91506134f69050600a83613e40565b91506134d7565b60008167ffffffffffffffff81111561351857613518613f62565b6040519080825280601f01601f191660200182016040528015613542576020820181803683370190505b5090505b8415612d7157613557600183613e73565b9150613564600a86613f0c565b61356f906030613e28565b60f81b81838151811061358457613584613f4c565b60200101906001600160f81b031916908160001a9053506135a6600a86613e40565b9450613546565b60006001600160a01b0384163b156136af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135f1903390899088908890600401613c28565b602060405180830381600087803b15801561360b57600080fd5b505af192505050801561363b575060408051601f3d908101601f1916820190925261363891810190613a68565b60015b613695573d808015613669576040519150601f19603f3d011682016040523d82523d6000602084013e61366e565b606091505b50805161368d5760405162461bcd60e51b8152600401610c3690613cd2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d71565b506001949350505050565b5080546000825590600052602060002090810190612b439190613799565b6040518060e001604052806007906020820280368337509192915050565b82805461370290613eb6565b90600052602060002090601f016020900481019282613724576000855561376a565b82601f1061373d5782800160ff1982351617855561376a565b8280016001018555821561376a579182015b8281111561376a57823582559160200191906001019061374f565b50613776929150613799565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115613776576000815560010161379a565b6000602082840312156137c057600080fd5b813561321481613f78565b6000602082840312156137dd57600080fd5b815161321481613f78565b600080604083850312156137fb57600080fd5b823561380681613f78565b9150602083013561381681613f78565b809150509250929050565b60008060006060848603121561383657600080fd5b833561384181613f78565b9250602084013561385181613f78565b929592945050506040919091013590565b6000806000806080858703121561387857600080fd5b843561388381613f78565b9350602085013561389381613f78565b925060408501359150606085013567ffffffffffffffff808211156138b757600080fd5b818701915087601f8301126138cb57600080fd5b8135818111156138dd576138dd613f62565b604051601f8201601f19908116603f0116810190838211818310171561390557613905613f62565b816040528281528a602084870101111561391e57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561395557600080fd5b823561396081613f78565b9150602083013561381681613f8d565b6000806040838503121561398357600080fd5b823561398e81613f78565b946020939093013593505050565b600080602083850312156139af57600080fd5b823567ffffffffffffffff808211156139c757600080fd5b818501915085601f8301126139db57600080fd5b8135818111156139ea57600080fd5b8660208260051b85010111156139ff57600080fd5b60209290920196919550909350505050565b600060208284031215613a2357600080fd5b813561321481613f8d565b600060208284031215613a4057600080fd5b815161321481613f8d565b600060208284031215613a5d57600080fd5b813561321481613f9b565b600060208284031215613a7a57600080fd5b815161321481613f9b565b60008060208385031215613a9857600080fd5b823567ffffffffffffffff80821115613ab057600080fd5b818501915085601f830112613ac457600080fd5b813581811115613ad357600080fd5b8660208285010111156139ff57600080fd5b600060208284031215613af757600080fd5b5035919050565b600060208284031215613b1057600080fd5b5051919050565b60008060408385031215613b2a57600080fd5b50508035926020909101359150565b60008151808452613b51816020860160208601613e8a565b601f01601f19169290920160200192915050565b60008151613b77818560208601613e8a565b9290920192915050565b600080845481600182811c915080831680613b9d57607f831692505b6020808410821415613bbd57634e487b7160e01b86526022600452602486fd5b818015613bd15760018114613be257613c0f565b60ff19861689528489019650613c0f565b60008b81526020902060005b86811015613c075781548b820152908501908301613bee565b505084890196505b505050505050613c1f8185613b65565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c5b90830184613b39565b9695505050505050565b6101408101818360005b600a811015613c8e578151835260209283019290910190600101613c6f565b50505092915050565b60e08101818360005b6007811015613c8e578151835260209283019290910190600101613ca0565b6020815260006132146020830184613b39565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613e3b57613e3b613f20565b500190565b600082613e4f57613e4f613f36565b500490565b6000816000190483118215151615613e6e57613e6e613f20565b500290565b600082821015613e8557613e85613f20565b500390565b60005b83811015613ea5578181015183820152602001613e8d565b838111156124fc5750506000910152565b600181811c90821680613eca57607f821691505b60208210811415613eeb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f0557613f05613f20565b5060010190565b600082613f1b57613f1b613f36565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612b4357600080fd5b8015158114612b4357600080fd5b6001600160e01b031981168114612b4357600080fdfea26469706673582212208dd508cea19243cd269fa3f8389ff8ef979b5b1066f9a087a43f224222b33e3c64736f6c63430008070033697066733a2f2f516d5a6b4a6f636d47524643656639743271324d475551345a376b4e48394b50415377456544326b7831315552772f
Deployed Bytecode
0x60806040526004361061038c5760003560e01c8063715018a6116101dc578063c71daccb11610102578063e2257266116100a0578063f2fde38b1161006f578063f2fde38b14610a68578063f34e1ea114610a88578063f7ee706814610aa8578063ff4b629e14610abd57600080fd5b8063e2257266146109bf578063e3c61b02146109df578063e985e9c5146109ff578063ecb8dbac14610a4857600080fd5b8063d0ebdbe7116100dc578063d0ebdbe71461093f578063d7bec63d1461095f578063dd5db3aa1461097f578063de3bc79f1461099f57600080fd5b8063c71daccb146108ec578063c87b56dd146108ff578063d031370b1461091f57600080fd5b8063a22cb4651161017a578063b88d4fde11610149578063b88d4fde1461086c578063be900d401461088c578063c0ca970f146108ac578063c555fd64146108cc57600080fd5b8063a22cb465146107f9578063a3df2a0114610819578063a47cd7761461082c578063ac1349a11461084c57600080fd5b806391152c5c116101b657806391152c5c1461079a57806393b76bce146107af57806395d89b41146107cf578063a04e5f7f146107e457600080fd5b8063715018a614610747578063808312bc1461075c5780638da5cb5b1461077c57600080fd5b806337592618116102c157806352c0295f1161025f5780635e59da6b1161022e5780635e59da6b146106c75780636352211e146106da5780636386c1c7146106fa57806370a082311461072757600080fd5b806352c0295f1461065257806353db2af214610667578063568489c8146106875780635d8ceea9146106a757600080fd5b806342842e0e1161029b57806342842e0e146105d4578063481c6a75146105f45780634a213d2a14610612578063502ece241461063257600080fd5b806337592618146105815780633abe69b2146105a15780633b353842146105c157600080fd5b80631c58eec51161032e578063279b8b5a11610308578063279b8b5a146105015780632e1a7d4d146105215780632e4318101461054157806336e517dd1461055457600080fd5b80631c58eec5146104a157806322a42799146104c157806323b872dd146104e157600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630ff4231014610442578063138cfadc1461046257806318160ddd1461048257600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613a4b565b610add565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b2f565b6040516103bd9190613cbf565b3480156103f457600080fd5b50610408610403366004613ae5565b610bc1565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613970565b610c5b565b005b34801561044e57600080fd5b5061044061045d36600461399c565b610d71565b34801561046e57600080fd5b5061044061047d366004613b17565b610eb4565b34801561048e57600080fd5b50600c545b6040519081526020016103bd565b3480156104ad57600080fd5b506104406104bc366004613b17565b610efe565b3480156104cd57600080fd5b506104406104dc3660046137ae565b610f48565b3480156104ed57600080fd5b506104406104fc366004613821565b610ff6565b34801561050d57600080fd5b5061044061051c36600461399c565b611027565b34801561052d57600080fd5b5061044061053c366004613ae5565b61116a565b61044061054f366004613ae5565b61125e565b34801561056057600080fd5b5061057461056f3660046137ae565b6114cf565b6040516103bd9190613c97565b34801561058d57600080fd5b5061044061059c366004613ae5565b611544565b3480156105ad57600080fd5b506105746105bc3660046137ae565b611588565b6104406105cf366004613ae5565b61160a565b3480156105e057600080fd5b506104406105ef366004613821565b6117e4565b34801561060057600080fd5b506008546001600160a01b0316610408565b34801561061e57600080fd5b5061044061062d366004613b17565b6117ff565b34801561063e57600080fd5b5061044061064d366004613b17565b611849565b34801561065e57600080fd5b506103db611893565b34801561067357600080fd5b50610440610682366004613ae5565b6118a2565b34801561069357600080fd5b506104406106a2366004613ae5565b6118e6565b3480156106b357600080fd5b506104406106c2366004613a85565b61192a565b6104406106d5366004613ae5565b611975565b3480156106e657600080fd5b506104086106f5366004613ae5565b611ba6565b34801561070657600080fd5b5061071a6107153660046137ae565b611c1d565b6040516103bd9190613c65565b34801561073357600080fd5b506104936107423660046137ae565b611d98565b34801561075357600080fd5b50610440611e1f565b34801561076857600080fd5b50610440610777366004613a11565b611e55565b34801561078857600080fd5b506000546001600160a01b0316610408565b3480156107a657600080fd5b50610440611ea7565b3480156107bb57600080fd5b506104406107ca366004613ae5565b61210d565b3480156107db57600080fd5b506103db612151565b3480156107f057600080fd5b506103db612160565b34801561080557600080fd5b50610440610814366004613942565b61216f565b610440610827366004613ae5565b61217e565b34801561083857600080fd5b506104406108473660046137ae565b6123d0565b34801561085857600080fd5b50610440610867366004613a85565b61247f565b34801561087857600080fd5b50610440610887366004613862565b6124ca565b34801561089857600080fd5b506104406108a7366004613ae5565b612502565b3480156108b857600080fd5b506104406108c736600461399c565b612546565b3480156108d857600080fd5b506104406108e7366004613ae5565b612689565b3480156108f857600080fd5b5047610493565b34801561090b57600080fd5b506103db61091a366004613ae5565b6126cd565b34801561092b57600080fd5b5061044061093a366004613ae5565b61277c565b34801561094b57600080fd5b5061044061095a3660046137ae565b612869565b34801561096b57600080fd5b5061044061097a366004613ae5565b6128b5565b34801561098b57600080fd5b5061044061099a366004613ae5565b6128f9565b3480156109ab57600080fd5b506104406109ba366004613a11565b61293d565b3480156109cb57600080fd5b506105746109da3660046137ae565b61299a565b3480156109eb57600080fd5b506104406109fa366004613a11565b612a15565b348015610a0b57600080fd5b506103b1610a1a3660046137e8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a5457600080fd5b50610440610a63366004613ae5565b612a67565b348015610a7457600080fd5b50610440610a833660046137ae565b612aab565b348015610a9457600080fd5b50610440610aa3366004613a11565b612b46565b348015610ab457600080fd5b50600b54610493565b348015610ac957600080fd5b50610574610ad83660046137ae565b612b98565b60006001600160e01b031982166380ac58cd60e01b1480610b0e57506001600160e01b03198216635b5e139f60e01b145b80610b2957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610b3e90613eb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6a90613eb6565b8015610bb75780601f10610b8c57610100808354040283529160200191610bb7565b820191906000526020600020905b815481529060010190602001808311610b9a57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610c6682611ba6565b9050806001600160a01b0316836001600160a01b03161415610cd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c36565b336001600160a01b0382161480610cf05750610cf08133610a1a565b610d625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c36565b610d6c8383612c14565b505050565b6000546001600160a01b0316331480610d9457506008546001600160a01b031633145b610db05760405162461bcd60e51b8152600401610c3690613daa565b610dbc601360006136ba565b60005b81811015610d6c576000838383818110610ddb57610ddb613f4c565b9050602002016020810190610df091906137ae565b6001600160a01b03161415610e475760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b6013838383818110610e5b57610e5b613f4c565b9050602002016020810190610e7091906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610eac81613ef1565b915050610dbf565b6000546001600160a01b0316331480610ed757506008546001600160a01b031633145b610ef35760405162461bcd60e51b8152600401610c3690613daa565b602491909155602555565b6000546001600160a01b0316331480610f2157506008546001600160a01b031633145b610f3d5760405162461bcd60e51b8152600401610c3690613daa565b601d91909155601e55565b6000546001600160a01b0316331480610f6b57506008546001600160a01b031633145b610f875760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b038116610fd45760405162461bcd60e51b81526020600482015260146024820152731352539511510e881a5b9d985b1a59081b1a5cdd60621b6044820152606401610c36565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6110003382612c82565b61101c5760405162461bcd60e51b8152600401610c3690613d59565b610d6c838383612d79565b6000546001600160a01b031633148061104a57506008546001600160a01b031633145b6110665760405162461bcd60e51b8152600401610c3690613daa565b611072601a60006136ba565b60005b81811015610d6c57600083838381811061109157611091613f4c565b90506020020160208101906110a691906137ae565b6001600160a01b031614156110fd5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b601a83838381811061111157611111613f4c565b905060200201602081019061112691906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061116281613ef1565b915050611075565b6000546001600160a01b031633148061118d57506008546001600160a01b031633145b6111a95760405162461bcd60e51b8152600401610c3690613daa565b600260075414156111cc5760405162461bcd60e51b8152600401610c3690613df1565b6002600755478111156112185760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610c36565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015611254573d6000803e3d6000fd5b5050600160075550565b600260075414156112815760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061129133611588565b8051909150156112e35760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610c36565b6020810151158061130257506112fa601e42613e28565b602082015111155b61134e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061136c5750611365601e42613e73565b6040820151115b6113b85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461140c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161141c908390613e28565b60a0820151101561147a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b61149833838360035b60200201516114929190613e54565b34612f15565b6114a23383612fb1565b33600090815260146020526040812080548492906114c1908490613e28565b909155505060016007555050565b6114d76136d8565b6114df6136d8565b60235460ff16156114ef57600181525b60245460208083019190915260255460408084019190915260265460608401526001608084015260275460a08401526001600160a01b038516600090815260289092529020548160065b602002015292915050565b6000546001600160a01b031633148061156757506008546001600160a01b031633145b6115835760405162461bcd60e51b8152600401610c3690613daa565b600b55565b6115906136d8565b6115986136d8565b600e54600160a01b900460ff16156115af57600181525b600f546020820152601054604082015260115460608201526115d460138460016130b7565b156115e157600160808201525b60125460a08201526001600160a01b038316600090815260146020526040902054816006611539565b6002600754141561162d5760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061163d336114cf565b8051909150156116875760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610c36565b602081015115806116a6575061169e601e42613e28565b602082015111155b6116ea5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610c36565b604081015115806117085750611701601e42613e73565b6040820151115b61174b5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610c36565b60c081015161175b908390613e28565b60a082015110156117ae5760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610c36565b6117bb3383836003611483565b6117c53383612fb1565b33600090815260286020526040812080548492906114c1908490613e28565b610d6c838383604051806020016040528060008152506124ca565b6000546001600160a01b031633148061182257506008546001600160a01b031633145b61183e5760405162461bcd60e51b8152600401610c3690613daa565b600f91909155601055565b6000546001600160a01b031633148061186c57506008546001600160a01b031633145b6118885760405162461bcd60e51b8152600401610c3690613daa565b601691909155601755565b606060098054610b3e90613eb6565b6000546001600160a01b03163314806118c557506008546001600160a01b031633145b6118e15760405162461bcd60e51b8152600401610c3690613daa565b602755565b6000546001600160a01b031633148061190957506008546001600160a01b031633145b6119255760405162461bcd60e51b8152600401610c3690613daa565b601155565b6000546001600160a01b031633148061194d57506008546001600160a01b031633145b6119695760405162461bcd60e51b8152600401610c3690613daa565b610d6c600a83836136f6565b600260075414156119985760405162461bcd60e51b8152600401610c3690613df1565b600260075560006119a833612b98565b8051909150156119f35760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610c36565b60208101511580611a125750611a0a601e42613e28565b602082015111155b611a575760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610c36565b60408101511580611a755750611a6e601e42613e73565b6040820151115b611ab95760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610c36565b6080810151600114611b0d5760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610c36565b60c0810151611b1d908390613e28565b60a08201511015611b705760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610c36565b611b7d3383836003611483565b611b873383612fb1565b33600090815260226020526040812080548492906114c1908490613e28565b6000818152600360205260408120546001600160a01b031680610b295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c36565b611c2561377a565b611c2d61377a565b611c356136d8565b611c4260138560016130b7565b8015611c5957506010541580611c59575042601054115b15611c7557600160e0830152611c6e84611588565b9050611cfa565b611c82601a8560016130b7565b8015611c9957506017541580611c99575042601754115b15611cae57600260e0830152611c6e8461299a565b611cbb60218560006130b7565b8015611cd25750601e541580611cd2575042601e54115b15611ce757600360e0830152611c6e84612b98565b600460e0830152611cf7846114cf565b90505b60005b6007811015611d4657818160078110611d1857611d18613f4c565b60200201518382600a8110611d2f57611d2f613f4c565b602002015280611d3e81613ef1565b915050611cfd565b50600c5482611d5760076001613e28565b600a8110611d6757611d67613f4c565b6020020152600b5482611d7c60076002613e28565b600a8110611d8c57611d8c613f4c565b60200201525092915050565b60006001600160a01b038216611e035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c36565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e495760405162461bcd60e51b8152600401610c3690613d24565b611e53600061321b565b565b6000546001600160a01b0316331480611e7857506008546001600160a01b031633145b611e945760405162461bcd60e51b8152600401610c3690613daa565b6023805460ff1916911515919091179055565b6000546001600160a01b0316331480611eca57506008546001600160a01b031633145b611ee65760405162461bcd60e51b8152600401610c3690613daa565b6078600c5414611f2c5760405162461bcd60e51b81526020600482015260116024820152700636f756c64206e6f742061697264726f7607c1b6044820152606401610c36565b600d546040805163775a25e360e01b815290516000926001600160a01b03169163775a25e3916004808301926020929190829003018186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190613afe565b905060318114611ff25760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a5908185a5c991c9bdc081b1a5cdd60621b6044820152606401610c36565b60005b60318110156120e757600d5460405163303eaeed60e01b8152600481018390526000916001600160a01b03169063303eaeed9060240160206040518083038186803b15801561204357600080fd5b505afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b91906137cb565b905060005b60028110156120d2576120c08282612099866002613e54565b6120a4906001613e28565b6120ae9190613e28565b600c546120bb9190613e28565b61326b565b806120ca81613ef1565b915050612080565b505080806120df90613ef1565b915050611ff5565b506120f460026031613e54565b600c60008282546121059190613e28565b909155505050565b6000546001600160a01b031633148061213057506008546001600160a01b031633145b61214c5760405162461bcd60e51b8152600401610c3690613daa565b601255565b606060028054610b3e90613eb6565b6060600a8054610b3e90613eb6565b61217a3383836133ad565b5050565b600260075414156121a15760405162461bcd60e51b8152600401610c3690613df1565b600260075560006121b13361299a565b8051909150156122035760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610c36565b60208101511580612222575061221a601e42613e28565b602082015111155b61226e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061228c5750612285601e42613e73565b6040820151115b6122d85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461232c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161233c908390613e28565b60a0820151101561239a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b6123a73383836003611483565b6123b13383612fb1565b336000908152601b6020526040812080548492906114c1908490613e28565b6000546001600160a01b03163314806123f357506008546001600160a01b031633145b61240f5760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b03811661245d5760405162461bcd60e51b8152602060048201526015602482015274105254911493d40e881a5b9d985b1a59081b1a5cdd605a1b6044820152606401610c36565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806124a257506008546001600160a01b031633145b6124be5760405162461bcd60e51b8152600401610c3690613daa565b610d6c600983836136f6565b6124d43383612c82565b6124f05760405162461bcd60e51b8152600401610c3690613d59565b6124fc8484848461347c565b50505050565b6000546001600160a01b031633148061252557506008546001600160a01b031633145b6125415760405162461bcd60e51b8152600401610c3690613daa565b601f55565b6000546001600160a01b031633148061256957506008546001600160a01b031633145b6125855760405162461bcd60e51b8152600401610c3690613daa565b612591602160006136ba565b60005b81811015610d6c5760008383838181106125b0576125b0613f4c565b90506020020160208101906125c591906137ae565b6001600160a01b0316141561261c5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610c36565b602183838381811061263057612630613f4c565b905060200201602081019061264591906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061268181613ef1565b915050612594565b6000546001600160a01b03163314806126ac57506008546001600160a01b031633145b6126c85760405162461bcd60e51b8152600401610c3690613daa565b602655565b6000818152600360205260409020546060906001600160a01b03166127285760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c36565b6000600a805461273790613eb6565b9050111561277157600a61274a836134af565b60405160200161275b929190613b81565b6040516020818303038152906040529050919050565b600961274a836134af565b6000546001600160a01b031633148061279f57506008546001600160a01b031633145b6127bb5760405162461bcd60e51b8152600401610c3690613daa565b607881600c546127cb9190613e28565b11156128195760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610c36565b60005b81811015612856576128446128396000546001600160a01b031690565b6120ae836001613e28565b8061284e81613ef1565b91505061281c565b5080600c60008282546121059190613e28565b6000546001600160a01b031633146128935760405162461bcd60e51b8152600401610c3690613d24565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806128d857506008546001600160a01b031633145b6128f45760405162461bcd60e51b8152600401610c3690613daa565b602055565b6000546001600160a01b031633148061291c57506008546001600160a01b031633145b6129385760405162461bcd60e51b8152600401610c3690613daa565b601855565b6000546001600160a01b031633148061296057506008546001600160a01b031633145b61297c5760405162461bcd60e51b8152600401610c3690613daa565b600e8054911515600160a01b0260ff60a01b19909216919091179055565b6129a26136d8565b6129aa6136d8565b60155460ff16156129ba57600181525b6016546020820152601754604082015260185460608201526129df601a8460016130b7565b156129ec57600160808201525b60195460a08201526001600160a01b0383166000908152601b6020526040902054816006611539565b6000546001600160a01b0316331480612a3857506008546001600160a01b031633145b612a545760405162461bcd60e51b8152600401610c3690613daa565b6015805460ff1916911515919091179055565b6000546001600160a01b0316331480612a8a57506008546001600160a01b031633145b612aa65760405162461bcd60e51b8152600401610c3690613daa565b601955565b6000546001600160a01b03163314612ad55760405162461bcd60e51b8152600401610c3690613d24565b6001600160a01b038116612b3a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c36565b612b438161321b565b50565b6000546001600160a01b0316331480612b6957506008546001600160a01b031633145b612b855760405162461bcd60e51b8152600401610c3690613daa565b601c805460ff1916911515919091179055565b612ba06136d8565b612ba86136d8565b601c5460ff1615612bb857600181525b601d546020820152601e546040820152601f546060820152612bdd60218460006130b7565b15612bea57600160808201525b6020805460a08301526001600160a01b038416600090815260229091526040902054816006611539565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c4982611ba6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612cfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c36565b6000612d0683611ba6565b9050806001600160a01b0316846001600160a01b03161480612d4d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80612d715750836001600160a01b0316612d6684610bc1565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d8c82611ba6565b6001600160a01b031614612df05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c36565b6001600160a01b038216612e525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c36565b612e5d600082612c14565b6001600160a01b0383166000908152600460205260408120805460019290612e86908490613e73565b90915550506001600160a01b0382166000908152600460205260408120805460019290612eb4908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80821115612f5a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610c36565b80821015610d6c576000612f6e8383613e73565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612fa9573d6000803e3d6000fd5b505050505050565b612fbd60026031613e54565b612fc8906078613e28565b600c5410156130105760405162461bcd60e51b8152602060048201526014602482015273185a5c991c9bdc081b9bdd08199a5b9a5cda195960621b6044820152606401610c36565b600b5481600c546130219190613e28565b111561306f5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610c36565b60005b8181101561309b57613089836120ae836001613e28565b8061309381613ef1565b915050613072565b5080600c60008282546130ae9190613e28565b90915550505050565b6000811561314957600e54604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561310457600080fd5b505afa158015613118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313c9190613a2e565b1561314957506000613214565b60005b845481101561320e5784818154811061316757613167613f4c565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0386811660048301529091169063c23697a89060240160206040518083038186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613a2e565b156131fc576001915050613214565b8061320681613ef1565b91505061314c565b50600090505b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166132c15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c36565b6000818152600360205260409020546001600160a01b0316156133265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c36565b6001600160a01b038216600090815260046020526040812080546001929061334f908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561340f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c36565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613487848484612d79565b613493848484846135ad565b6124fc5760405162461bcd60e51b8152600401610c3690613cd2565b6060816134d35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156134fd57806134e781613ef1565b91506134f69050600a83613e40565b91506134d7565b60008167ffffffffffffffff81111561351857613518613f62565b6040519080825280601f01601f191660200182016040528015613542576020820181803683370190505b5090505b8415612d7157613557600183613e73565b9150613564600a86613f0c565b61356f906030613e28565b60f81b81838151811061358457613584613f4c565b60200101906001600160f81b031916908160001a9053506135a6600a86613e40565b9450613546565b60006001600160a01b0384163b156136af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135f1903390899088908890600401613c28565b602060405180830381600087803b15801561360b57600080fd5b505af192505050801561363b575060408051601f3d908101601f1916820190925261363891810190613a68565b60015b613695573d808015613669576040519150601f19603f3d011682016040523d82523d6000602084013e61366e565b606091505b50805161368d5760405162461bcd60e51b8152600401610c3690613cd2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d71565b506001949350505050565b5080546000825590600052602060002090810190612b439190613799565b6040518060e001604052806007906020820280368337509192915050565b82805461370290613eb6565b90600052602060002090601f016020900481019282613724576000855561376a565b82601f1061373d5782800160ff1982351617855561376a565b8280016001018555821561376a579182015b8281111561376a57823582559160200191906001019061374f565b50613776929150613799565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115613776576000815560010161379a565b6000602082840312156137c057600080fd5b813561321481613f78565b6000602082840312156137dd57600080fd5b815161321481613f78565b600080604083850312156137fb57600080fd5b823561380681613f78565b9150602083013561381681613f78565b809150509250929050565b60008060006060848603121561383657600080fd5b833561384181613f78565b9250602084013561385181613f78565b929592945050506040919091013590565b6000806000806080858703121561387857600080fd5b843561388381613f78565b9350602085013561389381613f78565b925060408501359150606085013567ffffffffffffffff808211156138b757600080fd5b818701915087601f8301126138cb57600080fd5b8135818111156138dd576138dd613f62565b604051601f8201601f19908116603f0116810190838211818310171561390557613905613f62565b816040528281528a602084870101111561391e57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561395557600080fd5b823561396081613f78565b9150602083013561381681613f8d565b6000806040838503121561398357600080fd5b823561398e81613f78565b946020939093013593505050565b600080602083850312156139af57600080fd5b823567ffffffffffffffff808211156139c757600080fd5b818501915085601f8301126139db57600080fd5b8135818111156139ea57600080fd5b8660208260051b85010111156139ff57600080fd5b60209290920196919550909350505050565b600060208284031215613a2357600080fd5b813561321481613f8d565b600060208284031215613a4057600080fd5b815161321481613f8d565b600060208284031215613a5d57600080fd5b813561321481613f9b565b600060208284031215613a7a57600080fd5b815161321481613f9b565b60008060208385031215613a9857600080fd5b823567ffffffffffffffff80821115613ab057600080fd5b818501915085601f830112613ac457600080fd5b813581811115613ad357600080fd5b8660208285010111156139ff57600080fd5b600060208284031215613af757600080fd5b5035919050565b600060208284031215613b1057600080fd5b5051919050565b60008060408385031215613b2a57600080fd5b50508035926020909101359150565b60008151808452613b51816020860160208601613e8a565b601f01601f19169290920160200192915050565b60008151613b77818560208601613e8a565b9290920192915050565b600080845481600182811c915080831680613b9d57607f831692505b6020808410821415613bbd57634e487b7160e01b86526022600452602486fd5b818015613bd15760018114613be257613c0f565b60ff19861689528489019650613c0f565b60008b81526020902060005b86811015613c075781548b820152908501908301613bee565b505084890196505b505050505050613c1f8185613b65565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c5b90830184613b39565b9695505050505050565b6101408101818360005b600a811015613c8e578151835260209283019290910190600101613c6f565b50505092915050565b60e08101818360005b6007811015613c8e578151835260209283019290910190600101613ca0565b6020815260006132146020830184613b39565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613e3b57613e3b613f20565b500190565b600082613e4f57613e4f613f36565b500490565b6000816000190483118215151615613e6e57613e6e613f20565b500290565b600082821015613e8557613e85613f20565b500390565b60005b83811015613ea5578181015183820152602001613e8d565b838111156124fc5750506000910152565b600181811c90821680613eca57607f821691505b60208210811415613eeb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f0557613f05613f20565b5060010190565b600082613f1b57613f1b613f36565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612b4357600080fd5b8015158114612b4357600080fd5b6001600160e01b031981168114612b4357600080fdfea26469706673582212208dd508cea19243cd269fa3f8389ff8ef979b5b1066f9a087a43f224222b33e3c64736f6c63430008070033
Deployed Bytecode Sourcemap
39615:28253:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22973:305;;;;;;;;;;-1:-1:-1;22973:305:0;;;;;:::i;:::-;;:::i;:::-;;;9697:14:1;;9690:22;9672:41;;9660:2;9645:18;22973:305:0;;;;;;;;23918:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25478:221::-;;;;;;;;;;-1:-1:-1;25478:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7993:32:1;;;7975:51;;7963:2;7948:18;25478:221:0;7829:203:1;25001:411:0;;;;;;;;;;-1:-1:-1;25001:411:0;;;;;:::i;:::-;;:::i;:::-;;52168:367;;;;;;;;;;-1:-1:-1;52168:367:0;;;;;:::i;:::-;;:::i;61163:166::-;;;;;;;;;;-1:-1:-1;61163:166:0;;;;;:::i;:::-;;:::i;48482:82::-;;;;;;;;;;-1:-1:-1;48547:12:0;;48482:82;;;28223:25:1;;;28211:2;28196:18;48482:82:0;28077:177:1;58113:169:0;;;;;;;;;;-1:-1:-1;58113:169:0;;;;;:::i;:::-;;:::i;50223:182::-;;;;;;;;;;-1:-1:-1;50223:182:0;;;;;:::i;:::-;;:::i;26228:339::-;;;;;;;;;;-1:-1:-1;26228:339:0;;;;;:::i;:::-;;:::i;55425:367::-;;;;;;;;;;-1:-1:-1;55425:367:0;;;;;:::i;:::-;;:::i;67609:254::-;;;;;;;;;;-1:-1:-1;67609:254:0;;;;;:::i;:::-;;:::i;52721:941::-;;;;;;:::i;:::-;;:::i;60223:583::-;;;;;;;;;;-1:-1:-1;60223:583:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48974:84::-;;;;;;;;;;-1:-1:-1;48974:84:0;;;;;:::i;:::-;;:::i;50584:690::-;;;;;;;;;;-1:-1:-1;50584:690:0;;;;;:::i;:::-;;:::i;61805:813::-;;;;;;:::i;:::-;;:::i;26638:185::-;;;;;;;;;;-1:-1:-1;26638:185:0;;;;;:::i;:::-;;:::i;47674:86::-;;;;;;;;;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;47674:86;;51646:181;;;;;;;;;;-1:-1:-1;51646:181:0;;;;;:::i;:::-;;:::i;54903:::-;;;;;;;;;;-1:-1:-1;54903:181:0;;;;;:::i;:::-;;:::i;48188:98::-;;;;;;;;;;;;;:::i;61494:130::-;;;;;;;;;;-1:-1:-1;61494:130:0;;;;;:::i;:::-;;:::i;51849:128::-;;;;;;;;;;-1:-1:-1;51849:128:0;;;;;:::i;:::-;;:::i;48856:112::-;;;;;;;;;;-1:-1:-1;48856:112:0;;;;;:::i;:::-;;:::i;59140:909::-;;;;;;:::i;:::-;;:::i;23612:239::-;;;;;;;;;;-1:-1:-1;23612:239:0;;;;;:::i;:::-;;:::i;65750:1402::-;;;;;;;;;;-1:-1:-1;65750:1402:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23342:208::-;;;;;;;;;;-1:-1:-1;23342:208:0;;;;;:::i;:::-;;:::i;4513:103::-;;;;;;;;;;;;;:::i;61019:118::-;;;;;;;;;;-1:-1:-1;61019:118:0;;;;;:::i;:::-;;:::i;3862:87::-;;;;;;;;;;-1:-1:-1;3908:7:0;3935:6;-1:-1:-1;;;;;3935:6:0;3862:87;;65004:579;;;;;;;;;;;;;:::i;52002:140::-;;;;;;;;;;-1:-1:-1;52002:140:0;;;;;:::i;:::-;;:::i;24087:104::-;;;;;;;;;;;;;:::i;48292:102::-;;;;;;;;;;;;;:::i;25771:155::-;;;;;;;;;;-1:-1:-1;25771:155:0;;;;;:::i;:::-;;:::i;55978:941::-;;;;;;:::i;:::-;;:::i;49851:183::-;;;;;;;;;;-1:-1:-1;49851:183:0;;;;;:::i;:::-;;:::i;48742:108::-;;;;;;;;;;-1:-1:-1;48742:108:0;;;;;:::i;:::-;;:::i;26894:328::-;;;;;;;;;;-1:-1:-1;26894:328:0;;;;;:::i;:::-;;:::i;58304:120::-;;;;;;;;;;-1:-1:-1;58304:120:0;;;;;:::i;:::-;;:::i;58607:351::-;;;;;;;;;;-1:-1:-1;58607:351:0;;;;;:::i;:::-;;:::i;61351:118::-;;;;;;;;;;-1:-1:-1;61351:118:0;;;;;:::i;:::-;;:::i;67320:106::-;;;;;;;;;;-1:-1:-1;67395:21:0;67320:106;;49229:432;;;;;;;;;;-1:-1:-1;49229:432:0;;;;;:::i;:::-;;:::i;64515:301::-;;;;;;;;;;-1:-1:-1;64515:301:0;;;;;:::i;:::-;;:::i;47936:93::-;;;;;;;;;;-1:-1:-1;47936:93:0;;;;;:::i;:::-;;:::i;58449:132::-;;;;;;;;;;-1:-1:-1;58449:132:0;;;;;:::i;:::-;;:::i;55106:128::-;;;;;;;;;;-1:-1:-1;55106:128:0;;;;;:::i;:::-;;:::i;51492:::-;;;;;;;;;;-1:-1:-1;51492:128:0;;;;;:::i;:::-;;:::i;53841:690::-;;;;;;;;;;-1:-1:-1;53841:690:0;;;;;:::i;:::-;;:::i;54749:128::-;;;;;;;;;;-1:-1:-1;54749:128:0;;;;;:::i;:::-;;:::i;25997:164::-;;;;;;;;;;-1:-1:-1;25997:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26118:25:0;;;26094:4;26118:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25997:164;55259:140;;;;;;;;;;-1:-1:-1;55259:140:0;;;;;:::i;:::-;;:::i;4771:201::-;;;;;;;;;;-1:-1:-1;4771:201:0;;;;;:::i;:::-;;:::i;57967:120::-;;;;;;;;;;-1:-1:-1;57967:120:0;;;;;:::i;:::-;;:::i;48400:76::-;;;;;;;;;;-1:-1:-1;48462:9:0;;48400:76;;57094:659;;;;;;;;;;-1:-1:-1;57094:659:0;;;;;:::i;:::-;;:::i;22973:305::-;23075:4;-1:-1:-1;;;;;;23112:40:0;;-1:-1:-1;;;23112:40:0;;:105;;-1:-1:-1;;;;;;;23169:48:0;;-1:-1:-1;;;23169:48:0;23112:105;:158;;;-1:-1:-1;;;;;;;;;;21689:40:0;;;23234:36;23092:178;22973:305;-1:-1:-1;;22973:305:0:o;23918:100::-;23972:13;24005:5;23998:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23918:100;:::o;25478:221::-;25554:7;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;25574:73;;;;-1:-1:-1;;;25574:73:0;;20628:2:1;25574:73:0;;;20610:21:1;20667:2;20647:18;;;20640:30;20706:34;20686:18;;;20679:62;-1:-1:-1;;;20757:18:1;;;20750:42;20809:19;;25574:73:0;;;;;;;;;-1:-1:-1;25667:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25667:24:0;;25478:221::o;25001:411::-;25082:13;25098:23;25113:7;25098:14;:23::i;:::-;25082:39;;25146:5;-1:-1:-1;;;;;25140:11:0;:2;-1:-1:-1;;;;;25140:11:0;;;25132:57;;;;-1:-1:-1;;;25132:57:0;;23866:2:1;25132:57:0;;;23848:21:1;23905:2;23885:18;;;23878:30;23944:34;23924:18;;;23917:62;-1:-1:-1;;;23995:18:1;;;23988:31;24036:19;;25132:57:0;23664:397:1;25132:57:0;2751:10;-1:-1:-1;;;;;25224:21:0;;;;:62;;-1:-1:-1;25249:37:0;25266:5;2751:10;25997:164;:::i;25249:37::-;25202:168;;;;-1:-1:-1;;;25202:168:0;;16897:2:1;25202:168:0;;;16879:21:1;16936:2;16916:18;;;16909:30;16975:34;16955:18;;;16948:62;17046:26;17026:18;;;17019:54;17090:19;;25202:168:0;16695:420:1;25202:168:0;25383:21;25392:2;25396:7;25383:8;:21::i;:::-;25071:341;25001:411;;:::o;52168:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;52273:36:::1;52280:29;;52273:36;:::i;:::-;52327:9;52322:206;52340:14:::0;;::::1;52322:206;;;52405:1;52385:5:::0;;52391:1;52385:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52385:22:0::1;;;52376:67;;;::::0;-1:-1:-1;;;52376:67:0;;27212:2:1;52376:67:0::1;::::0;::::1;27194:21:1::0;27251:2;27231:18;;;27224:30;27290:31;27270:18;;;27263:59;27339:18;;52376:67:0::1;27010:353:1::0;52376:67:0::1;52458:29;52505:5;;52511:1;52505:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52458:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;52458:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52458:58:0::1;-1:-1:-1::0;;;;;52458:58:0;;::::1;::::0;;;::::1;::::0;;52356:3;::::1;::::0;::::1;:::i;:::-;;;;52322:206;;61163:166:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61264:17:::1;:25:::0;;;;61300:15:::1;:21:::0;61163:166::o;58113:169::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58215:18:::1;:26:::0;;;;58252:16:::1;:22:::0;58113:169::o;50223:182::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50311:18:0;::::1;50302:53;;;::::0;-1:-1:-1;;;50302:53:0;;19210:2:1;50302:53:0::1;::::0;::::1;19192:21:1::0;19249:2;19229:18;;;19222:30;-1:-1:-1;;;19268:18:1;;;19261:50;19328:18;;50302:53:0::1;19008:344:1::0;50302:53:0::1;50366:12;:31:::0;;-1:-1:-1;;;;;;50366:31:0::1;-1:-1:-1::0;;;;;50366:31:0;;;::::1;::::0;;;::::1;::::0;;50223:182::o;26228:339::-;26423:41;2751:10;26456:7;26423:18;:41::i;:::-;26415:103;;;;-1:-1:-1;;;26415:103:0;;;;;;;:::i;:::-;26531:28;26541:4;26547:2;26551:7;26531:9;:28::i;55425:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55530:36:::1;55537:29;;55530:36;:::i;:::-;55584:9;55579:206;55597:14:::0;;::::1;55579:206;;;55662:1;55642:5:::0;;55648:1;55642:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55642:22:0::1;;;55633:67;;;::::0;-1:-1:-1;;;55633:67:0;;22097:2:1;55633:67:0::1;::::0;::::1;22079:21:1::0;22136:2;22116:18;;;22109:30;22175:31;22155:18;;;22148:59;22224:18;;55633:67:0::1;21895:353:1::0;55633:67:0::1;55715:29;55762:5;;55768:1;55762:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55715:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;55715:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;55715:58:0::1;-1:-1:-1::0;;;;;55715:58:0;;::::1;::::0;;;::::1;::::0;;55613:3;::::1;::::0;::::1;:::i;:::-;;;;55579:206;;67609:254:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;37807:1:::1;38405:7;;:19;;38397:63;;;;-1:-1:-1::0;;;38397:63:0::1;;;;;;;:::i;:::-;37807:1;38538:7;:18:::0;67716:21:::2;67706:31:::0;::::2;;67697:66;;;::::0;-1:-1:-1;;;67697:66:0;;21748:2:1;67697:66:0::2;::::0;::::2;21730:21:1::0;21787:2;21767:18;;;21760:30;-1:-1:-1;;;21806:18:1;;;21799:50;21866:18;;67697:66:0::2;21546:344:1::0;67697:66:0::2;67776:22;3935:6:::0;;67830:25:::2;::::0;-1:-1:-1;;;;;3935:6:0;;;;;;67830:25:::2;::::0;::::2;;::::0;;;;;67776:22;67830:25;;3935:6;67830:25;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;37763:1:0::1;38717:7;:22:::0;-1:-1:-1;67609:254:0:o;52721:941::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;52807:32:::1;52842:37;52867:10;52842:23;:37::i;:::-;52901:28:::0;;52807:72;;-1:-1:-1;52901:33:0;52892:74:::1;;;::::0;-1:-1:-1;;;52892:74:0;;11562:2:1;52892:74:0::1;::::0;::::1;11544:21:1::0;11601:2;11581:18;;;11574:30;11640:28;11620:18;;;11613:56;11686:18;;52892:74:0::1;11360:350:1::0;52892:74:0::1;52986:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;53048:32:0::1;39977:2;53048:15;:32;:::i;:::-;53019:24;::::0;::::1;::::0;:62:::1;;52986:95;52977:136;;;::::0;-1:-1:-1;;;52977:136:0;;24268:2:1;52977:136:0::1;::::0;::::1;24250:21:1::0;24307:2;24287:18;;;24280:30;24346:28;24326:18;;;24319:56;24392:18;;52977:136:0::1;24066:350:1::0;52977:136:0::1;53133:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;53190:32:0::1;39977:2;53190:15;:32;:::i;:::-;53164:22:::0;;::::1;::::0;:59:::1;53133:90;53124:130;;;::::0;-1:-1:-1;;;53124:130:0;;13867:2:1;53124:130:0::1;::::0;::::1;13849:21:1::0;13906:2;13886:18;;;13879:30;13945:27;13925:18;;;13918:55;13990:18;;53124:130:0::1;13665:349:1::0;53124:130:0::1;53274:30:::0;;::::1;::::0;53308:1:::1;53274:35;53265:82;;;::::0;-1:-1:-1;;;53265:82:0;;13149:2:1;53265:82:0::1;::::0;::::1;13131:21:1::0;;;13168:18;;;13161:30;13227:34;13207:18;;;13200:62;13279:18;;53265:82:0::1;12947:356:1::0;53265:82:0::1;53399:30:::0;;::::1;::::0;:34:::1;::::0;53430:3;;53399:34:::1;:::i;:::-;53367:27:::0;;::::1;::::0;:67:::1;;53358:116;;;::::0;-1:-1:-1;;;53358:116:0;;15678:2:1;53358:116:0::1;::::0;::::1;15660:21:1::0;15717:2;15697:18;;;15690:30;15756:34;15736:18;;;15729:62;-1:-1:-1;;;15807:18:1;;;15800:32;15849:19;;53358:116:0::1;15476:398:1::0;53358:116:0::1;53487:68;53502:10;53539:3:::0;53514:7;40659:1:::1;53514:24;;;;;:28;;;;:::i;:::-;53544:9;53487:13;:68::i;:::-;53568:30;53581:10;53593:3;53568:11;:30::i;:::-;53636:10;53609:38;::::0;;;:26:::1;:38;::::0;;;;:45;;53651:3;;53609:38;:45:::1;::::0;53651:3;;53609:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;37763:1:0;38717:7;:22;-1:-1:-1;;52721:941:0:o;60223:583::-;60290:24;;:::i;:::-;60327:31;;:::i;:::-;60375:23;;;;60371:65;;;60432:1;60402:31;;60371:65;60472:17;;60446:23;;;;:43;;;;60524:15;;60500:21;;;;:39;;;;60576:17;;60550:23;;;:43;40559:1;60604:29;;;:33;60677:20;;60648:26;;;:49;-1:-1:-1;;;;;60740:29:0;;-1:-1:-1;60740:29:0;;;:21;:29;;;;;;60446:6;40827:1;60708:29;;;;:61;60790:6;60223:583;-1:-1:-1;;60223:583:0:o;48974:84::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;49040:9:::1;:15:::0;48974:84::o;50584:690::-;50656:24;;:::i;:::-;50693:31;;:::i;:::-;50741:28;;-1:-1:-1;;;50741:28:0;;;;50737:70;;;50803:1;50773:31;;50737:70;50843:22;;50817:23;;;:48;50900:20;;50876:21;;;:44;50957:22;;50931:23;;;:48;50994:62;51011:29;51042:6;40559:1;50994:15;:62::i;:::-;50990:106;;;51092:1;51060:29;;;:33;50990:106;51135:25;;51106:26;;;:54;-1:-1:-1;;;;;51203:34:0;;;;;;:26;51106;51203:34;;;;;51106:6;40827:1;51171:29;;61805:813;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;61886:32:::1;61921;61941:10;61921:18;:32::i;:::-;61975:28:::0;;61886:67;;-1:-1:-1;61975:33:0;61966:69:::1;;;::::0;-1:-1:-1;;;61966:69:0;;24623:2:1;61966:69:0::1;::::0;::::1;24605:21:1::0;24662:2;24642:18;;;24635:30;-1:-1:-1;;;24681:18:1;;;24674:51;24742:18;;61966:69:0::1;24421:345:1::0;61966:69:0::1;62055:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;62117:32:0::1;39977:2;62117:15;:32;:::i;:::-;62088:24;::::0;::::1;::::0;:62:::1;;62055:95;62046:131;;;::::0;-1:-1:-1;;;62046:131:0;;23159:2:1;62046:131:0::1;::::0;::::1;23141:21:1::0;23198:2;23178:18;;;23171:30;-1:-1:-1;;;23217:18:1;;;23210:51;23278:18;;62046:131:0::1;22957:345:1::0;62046:131:0::1;62197:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;62254:32:0::1;39977:2;62254:15;:32;:::i;:::-;62228:22:::0;;::::1;::::0;:59:::1;62197:90;62188:125;;;::::0;-1:-1:-1;;;62188:125:0;;26154:2:1;62188:125:0::1;::::0;::::1;26136:21:1::0;26193:2;26173:18;;;26166:30;-1:-1:-1;;;26212:18:1;;;26205:50;26272:18;;62188:125:0::1;25952:344:1::0;62188:125:0::1;62365:30:::0;;::::1;::::0;:34:::1;::::0;62396:3;;62365:34:::1;:::i;:::-;62333:27:::0;;::::1;::::0;:67:::1;;62324:111;;;::::0;-1:-1:-1;;;62324:111:0;;19559:2:1;62324:111:0::1;::::0;::::1;19541:21:1::0;19598:2;19578:18;;;19571:30;19637:31;19617:18;;;19610:59;19686:18;;62324:111:0::1;19357:353:1::0;62324:111:0::1;62448:68;62463:10;62500:3:::0;62475:7;40659:1:::1;62475:24;::::0;62448:68:::1;62529:30;62542:10;62554:3;62529:11;:30::i;:::-;62592:10;62570:33;::::0;;;:21:::1;:33;::::0;;;;:40;;62607:3;;62570:33;:40:::1;::::0;62607:3;;62570:40:::1;:::i;26638:185::-:0;26776:39;26793:4;26799:2;26803:7;26776:39;;;;;;;;;;;;:16;:39::i;51646:181::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;51752:22:::1;:30:::0;;;;51793:20:::1;:26:::0;51646:181::o;54903:::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55009:22:::1;:30:::0;;;;55050:20:::1;:26:::0;54903:181::o;48188:98::-;48239:13;48264:17;48256:27;;;;;:::i;61494:130::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61585:20:::1;:31:::0;61494:130::o;51849:128::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;51939:22:::1;:30:::0;51849:128::o;48856:112::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;48940:25:::1;:19;48962:3:::0;;48940:25:::1;:::i;59140:909::-:0;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;59222:32:::1;59257:33;59278:10;59257:19;:33::i;:::-;59312:28:::0;;59222:68;;-1:-1:-1;59312:33:0;59303:70:::1;;;::::0;-1:-1:-1;;;59303:70:0;;15327:2:1;59303:70:0::1;::::0;::::1;15309:21:1::0;15366:2;15346:18;;;15339:30;-1:-1:-1;;;15385:18:1;;;15378:52;15447:18;;59303:70:0::1;15125:346:1::0;59303:70:0::1;59393:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;59455:32:0::1;39977:2;59455:15;:32;:::i;:::-;59426:24;::::0;::::1;::::0;:62:::1;;59393:95;59384:132;;;::::0;-1:-1:-1;;;59384:132:0;;10504:2:1;59384:132:0::1;::::0;::::1;10486:21:1::0;10543:2;10523:18;;;10516:30;-1:-1:-1;;;10562:18:1;;;10555:52;10624:18;;59384:132:0::1;10302:346:1::0;59384:132:0::1;59536:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;59593:32:0::1;39977:2;59593:15;:32;:::i;:::-;59567:22:::0;;::::1;::::0;:59:::1;59536:90;59527:126;;;::::0;-1:-1:-1;;;59527:126:0;;26862:2:1;59527:126:0::1;::::0;::::1;26844:21:1::0;26901:2;26881:18;;;26874:30;-1:-1:-1;;;26920:18:1;;;26913:51;26981:18;;59527:126:0::1;26660:345:1::0;59527:126:0::1;59673:30:::0;;::::1;::::0;59707:1:::1;59673:35;59664:78;;;::::0;-1:-1:-1;;;59664:78:0;;23509:2:1;59664:78:0::1;::::0;::::1;23491:21:1::0;23548:2;23528:18;;;23521:30;23587;23567:18;;;23560:58;23635:18;;59664:78:0::1;23307:352:1::0;59664:78:0::1;59794:30:::0;;::::1;::::0;:34:::1;::::0;59825:3;;59794:34:::1;:::i;:::-;59762:27:::0;;::::1;::::0;:67:::1;;59753:112;;;::::0;-1:-1:-1;;;59753:112:0;;26503:2:1;59753:112:0::1;::::0;::::1;26485:21:1::0;26542:2;26522:18;;;26515:30;26581:32;26561:18;;;26554:60;26631:18;;59753:112:0::1;26301:354:1::0;59753:112:0::1;59878:68;59893:10;59930:3:::0;59905:7;40659:1:::1;59905:24;::::0;59878:68:::1;59959:30;59972:10;59984:3;59959:11;:30::i;:::-;60023:10;60000:34;::::0;;;:22:::1;:34;::::0;;;;:41;;60038:3;;60000:34;:41:::1;::::0;60038:3;;60000:41:::1;:::i;23612:239::-:0;23684:7;23720:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23720:16:0;23755:19;23747:73;;;;-1:-1:-1;;;23747:73:0;;18800:2:1;23747:73:0;;;18782:21:1;18839:2;18819:18;;;18812:30;18878:34;18858:18;;;18851:62;-1:-1:-1;;;18929:18:1;;;18922:39;18978:19;;23747:73:0;18598:405:1;65750:1402:0;65812:29;;:::i;:::-;65854:38;;:::i;:::-;65903:29;;:::i;:::-;65972:62;65989:29;66020:6;66028:4;65972:15;:62::i;:::-;:135;;;;-1:-1:-1;66039:20:0;;:25;;:67;;;66091:15;66068:20;;:38;66039:67;65968:949;;;66151:1;66124:24;;;:28;66174:33;66199:6;66174:23;:33::i;:::-;66167:40;;65968:949;;;66261:63;66278:29;66309:6;66318:4;66261:15;:63::i;:::-;:136;;;;-1:-1:-1;66329:20:0;;:25;;:67;;;66381:15;66358:20;;:38;66329:67;66257:660;;;66441:1;66414:24;;;:28;66464:33;66489:6;66464:23;:33::i;66257:660::-;66547:60;66564:25;66591:6;66599:5;66547:15;:60::i;:::-;:125;;;;-1:-1:-1;66612:16:0;;:21;;:59;;;66656:15;66637:16;;:34;66612:59;66543:374;;;66716:1;66689:24;;;:28;66739:29;66760:6;66739:19;:29::i;66543:374::-;66854:1;66827:24;;;:28;66877;66897:6;66877:18;:28::i;:::-;66870:35;;66543:374;66934:9;66929:83;40871:1;66947;:10;66929:83;;;66993:4;66998:1;66993:7;;;;;;;:::i;:::-;;;;;66979:8;66988:1;66979:11;;;;;;;:::i;:::-;;;;:21;66959:3;;;;:::i;:::-;;;;66929:83;;;-1:-1:-1;67053:12:0;;67024:8;40980:12;40871:1;40991;40980:12;:::i;:::-;67024:26;;;;;;;:::i;:::-;;;;:41;67104:9;;67076:8;41042:12;40871:1;41053;41042:12;:::i;:::-;67076:25;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;67134:8:0;65750:1402;-1:-1:-1;;65750:1402:0:o;23342:208::-;23414:7;-1:-1:-1;;;;;23442:19:0;;23434:74;;;;-1:-1:-1;;;23434:74:0;;18389:2:1;23434:74:0;;;18371:21:1;18428:2;18408:18;;;18401:30;18467:34;18447:18;;;18440:62;-1:-1:-1;;;18518:18:1;;;18511:40;18568:19;;23434:74:0;18187:406:1;23434:74:0;-1:-1:-1;;;;;;23526:16:0;;;;;:9;:16;;;;;;;23342:208::o;4513:103::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;4578:30:::1;4605:1;4578:18;:30::i;:::-;4513:103::o:0;61019:118::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61099:23:::1;:30:::0;;-1:-1:-1;;61099:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61019:118::o;65004:579::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;40234:3:::1;65077:12;;:30;65068:62;;;::::0;-1:-1:-1;;;65068:62:0;;11216:2:1;65068:62:0::1;::::0;::::1;11198:21:1::0;11255:2;11235:18;;;11228:30;-1:-1:-1;;;11274:18:1;;;11267:47;11331:18;;65068:62:0::1;11014:341:1::0;65068:62:0::1;65157:13;::::0;:24:::1;::::0;;-1:-1:-1;;;65157:24:0;;;;65143:11:::1;::::0;-1:-1:-1;;;;;65157:13:0::1;::::0;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:13;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65143:38;;40287:2;65201:3;:22;65192:57;;;::::0;-1:-1:-1;;;65192:57:0;;27930:2:1;65192:57:0::1;::::0;::::1;27912:21:1::0;27969:2;27949:18;;;27942:30;-1:-1:-1;;;27988:18:1;;;27981:50;28048:18;;65192:57:0::1;27728:344:1::0;65192:57:0::1;65267:9;65262:274;40287:2;65280:1;:17;65262:274;;;65336:13;::::0;:24:::1;::::0;-1:-1:-1;;;65336:24:0;;::::1;::::0;::::1;28223:25:1::0;;;65319:14:0::1;::::0;-1:-1:-1;;;;;65336:13:0::1;::::0;:19:::1;::::0;28196:18:1;;65336:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65319:41;;65380:9;65375:150;40349:1;65393;:27;65375:150;;;65446:63;65453:6:::0;65505:1;65477:27:::1;65503:1:::0;40349::::1;65477:27;:::i;:::-;65475:29;::::0;:1:::1;:29;:::i;:::-;:31;;;;:::i;:::-;65461:12;;:46;;;;:::i;:::-;65446:5;:63::i;:::-;65422:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65375:150;;;;65304:232;65299:3;;;;;:::i;:::-;;;;65262:274;;;-1:-1:-1::0;40398:41:0::1;40349:1;40287:2;40398:41;:::i;:::-;65546:12;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;65004:579:0:o;52002:140::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;52098:25:::1;:36:::0;52002:140::o;24087:104::-;24143:13;24176:7;24169:14;;;;;:::i;48292:102::-;48345:13;48370:19;48362:29;;;;;:::i;25771:155::-;25866:52;2751:10;25899:8;25909;25866:18;:52::i;:::-;25771:155;;:::o;55978:941::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;56064:32:::1;56099:37;56124:10;56099:23;:37::i;:::-;56158:28:::0;;56064:72;;-1:-1:-1;56158:33:0;56149:74:::1;;;::::0;-1:-1:-1;;;56149:74:0;;24973:2:1;56149:74:0::1;::::0;::::1;24955:21:1::0;25012:2;24992:18;;;24985:30;25051:28;25031:18;;;25024:56;25097:18;;56149:74:0::1;24771:350:1::0;56149:74:0::1;56243:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;56305:32:0::1;39977:2;56305:15;:32;:::i;:::-;56276:24;::::0;::::1;::::0;:62:::1;;56243:95;56234:136;;;::::0;-1:-1:-1;;;56234:136:0;;22455:2:1;56234:136:0::1;::::0;::::1;22437:21:1::0;22494:2;22474:18;;;22467:30;22533:28;22513:18;;;22506:56;22579:18;;56234:136:0::1;22253:350:1::0;56234:136:0::1;56390:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;56447:32:0::1;39977:2;56447:15;:32;:::i;:::-;56421:22:::0;;::::1;::::0;:59:::1;56390:90;56381:130;;;::::0;-1:-1:-1;;;56381:130:0;;18035:2:1;56381:130:0::1;::::0;::::1;18017:21:1::0;18074:2;18054:18;;;18047:30;18113:27;18093:18;;;18086:55;18158:18;;56381:130:0::1;17833:349:1::0;56381:130:0::1;56531:30:::0;;::::1;::::0;56565:1:::1;56531:35;56522:82;;;::::0;-1:-1:-1;;;56522:82:0;;10855:2:1;56522:82:0::1;::::0;::::1;10837:21:1::0;;;10874:18;;;10867:30;10933:34;10913:18;;;10906:62;10985:18;;56522:82:0::1;10653:356:1::0;56522:82:0::1;56656:30:::0;;::::1;::::0;:34:::1;::::0;56687:3;;56656:34:::1;:::i;:::-;56624:27:::0;;::::1;::::0;:67:::1;;56615:116;;;::::0;-1:-1:-1;;;56615:116:0;;16494:2:1;56615:116:0::1;::::0;::::1;16476:21:1::0;16533:2;16513:18;;;16506:30;16572:34;16552:18;;;16545:62;-1:-1:-1;;;16623:18:1;;;16616:32;16665:19;;56615:116:0::1;16292:398:1::0;56615:116:0::1;56744:68;56759:10;56796:3:::0;56771:7;40659:1:::1;56771:24;::::0;56744:68:::1;56825:30;56838:10;56850:3;56825:11;:30::i;:::-;56893:10;56866:38;::::0;;;:26:::1;:38;::::0;;;;:45;;56908:3;;56866:38;:45:::1;::::0;56908:3;;56866:45:::1;:::i;49851:183::-:0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49940:18:0;::::1;49931:54;;;::::0;-1:-1:-1;;;49931:54:0;;19917:2:1;49931:54:0::1;::::0;::::1;19899:21:1::0;19956:2;19936:18;;;19929:30;-1:-1:-1;;;19975:18:1;;;19968:51;20036:18;;49931:54:0::1;19715:345:1::0;49931:54:0::1;49996:13;:30:::0;;-1:-1:-1;;;;;;49996:30:0::1;-1:-1:-1::0;;;;;49996:30:0;;;::::1;::::0;;;::::1;::::0;;49851:183::o;48742:108::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;48824:23:::1;:17;48844:3:::0;;48824:23:::1;:::i;26894:328::-:0;27069:41;2751:10;27102:7;27069:18;:41::i;:::-;27061:103;;;;-1:-1:-1;;;27061:103:0;;;;;;;:::i;:::-;27175:39;27189:4;27195:2;27199:7;27208:5;27175:13;:39::i;:::-;26894:328;;;;:::o;58304:120::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58390:18:::1;:26:::0;58304:120::o;58607:351::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58708:32:::1;58715:25;;58708:32;:::i;:::-;58758:9;58753:198;58771:14:::0;;::::1;58753:198;;;58836:1;58816:5:::0;;58822:1;58816:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58816:22:0::1;;;58807:63;;;::::0;-1:-1:-1;;;58807:63:0;;17322:2:1;58807:63:0::1;::::0;::::1;17304:21:1::0;17361:2;17341:18;;;17334:30;17400:27;17380:18;;;17373:55;17445:18;;58807:63:0::1;17120:349:1::0;58807:63:0::1;58885:25;58928:5;;58934:1;58928:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58885:54:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;58885:54:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;58885:54:0::1;-1:-1:-1::0;;;;;58885:54:0;;::::1;::::0;;;::::1;::::0;;58787:3;::::1;::::0;::::1;:::i;:::-;;;;58753:198;;61351:118:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61436:17:::1;:25:::0;61351:118::o;49229:432::-;28797:4;28821:16;;;:7;:16;;;;;;49296:13;;-1:-1:-1;;;;;28821:16:0;49322:50;;;;-1:-1:-1;;;49322:50:0;;21041:2:1;49322:50:0;;;21023:21:1;21080:2;21060:18;;;21053:30;-1:-1:-1;;;21099:18:1;;;21092:47;21156:18;;49322:50:0;20839:341:1;49322:50:0;49425:1;49395:19;49389:33;;;;;:::i;:::-;;;:37;49385:170;;;49477:19;49498:27;49516:7;49498:16;:27::i;:::-;49459:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49443:88;;49229:432;;;:::o;49385:170::-;49601:17;49620:27;49638:7;49620:16;:27::i;64515:301::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;40234:3:::1;64615;64602:12;;:16;;;;:::i;:::-;64601:36;;64592:81;;;::::0;-1:-1:-1;;;64592:81:0;;17676:2:1;64592:81:0::1;::::0;::::1;17658:21:1::0;17715:2;17695:18;;;17688:30;17754:32;17734:18;;;17727:60;17804:18;;64592:81:0::1;17474:354:1::0;64592:81:0::1;64691:9;64686:93;64706:3;64704:1;:5;64686:93;;;64731:36;64738:7;3908::::0;3935:6;-1:-1:-1;;;;;3935:6:0;;3862:87;64738:7:::1;64761:3;:1:::0;64763::::1;64761:3;:::i;64731:36::-;64711:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64686:93;;;;64805:3;64789:12;;:19;;;;;;;:::i;47936:93::-:0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;48004:8:::1;:17:::0;;-1:-1:-1;;;;;;48004:17:0::1;-1:-1:-1::0;;;;;48004:17:0;;;::::1;::::0;;;::::1;::::0;;47936:93::o;58449:132::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58541:21:::1;:32:::0;58449:132::o;55106:128::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55196:22:::1;:30:::0;55106:128::o;51492:::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;51577:28:::1;:35:::0;;;::::1;;-1:-1:-1::0;;;51577:35:0::1;-1:-1:-1::0;;;;51577:35:0;;::::1;::::0;;;::::1;::::0;;51492:128::o;53841:690::-;53913:24;;:::i;:::-;53950:31;;:::i;:::-;53998:28;;;;53994:70;;;54060:1;54030:31;;53994:70;54100:22;;54074:23;;;:48;54157:20;;54133:21;;;:44;54214:22;;54188:23;;;:48;54251:62;54268:29;54299:6;40559:1;54251:15;:62::i;:::-;54247:106;;;54349:1;54317:29;;;:33;54247:106;54392:25;;54363:26;;;:54;-1:-1:-1;;;;;54460:34:0;;;;;;:26;54363;54460:34;;;;;54363:6;40827:1;54428:29;;54749:128;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;54834:28:::1;:35:::0;;-1:-1:-1;;54834:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54749:128::o;55259:140::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55355:25:::1;:36:::0;55259:140::o;4771:201::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4860:22:0;::::1;4852:73;;;::::0;-1:-1:-1;;;4852:73:0;;12336:2:1;4852:73:0::1;::::0;::::1;12318:21:1::0;12375:2;12355:18;;;12348:30;12414:34;12394:18;;;12387:62;-1:-1:-1;;;12465:18:1;;;12458:36;12511:19;;4852:73:0::1;12134:402:1::0;4852:73:0::1;4936:28;4955:8;4936:18;:28::i;:::-;4771:201:::0;:::o;57967:120::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58048:24:::1;:31:::0;;-1:-1:-1;;58048:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57967:120::o;57094:659::-;57162:24;;:::i;:::-;57199:31;;:::i;:::-;57247:24;;;;57243:66;;;57305:1;57275:31;;57243:66;57345:18;;57319:23;;;:44;57398:16;;57374:21;;;:40;57451:18;;57425:23;;;:44;57484:59;57501:25;57528:6;-1:-1:-1;57484:15:0;:59::i;:::-;57480:103;;;57579:1;57547:29;;;:33;57480:103;57622:21;;;57593:26;;;:50;-1:-1:-1;;;;;57686:30:0;;;;;;:22;:30;;;;;;;57593:6;40827:1;57654:29;;32878:174;32953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32953:29:0;-1:-1:-1;;;;;32953:29:0;;;;;;;;:24;;33007:23;32953:24;33007:14;:23::i;:::-;-1:-1:-1;;;;;32998:46:0;;;;;;;;;;;32878:174;;:::o;29026:348::-;29119:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;29136:73;;;;-1:-1:-1;;;29136:73:0;;16081:2:1;29136:73:0;;;16063:21:1;16120:2;16100:18;;;16093:30;16159:34;16139:18;;;16132:62;-1:-1:-1;;;16210:18:1;;;16203:42;16262:19;;29136:73:0;15879:408:1;29136:73:0;29220:13;29236:23;29251:7;29236:14;:23::i;:::-;29220:39;;29289:5;-1:-1:-1;;;;;29278:16:0;:7;-1:-1:-1;;;;;29278:16:0;;:52;;;-1:-1:-1;;;;;;26118:25:0;;;26094:4;26118:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29298:32;29278:87;;;;29358:7;-1:-1:-1;;;;;29334:31:0;:20;29346:7;29334:11;:20::i;:::-;-1:-1:-1;;;;;29334:31:0;;29278:87;29270:96;29026:348;-1:-1:-1;;;;29026:348:0:o;32135:625::-;32294:4;-1:-1:-1;;;;;32267:31:0;:23;32282:7;32267:14;:23::i;:::-;-1:-1:-1;;;;;32267:31:0;;32259:81;;;;-1:-1:-1;;;32259:81:0;;12743:2:1;32259:81:0;;;12725:21:1;12782:2;12762:18;;;12755:30;12821:34;12801:18;;;12794:62;-1:-1:-1;;;12872:18:1;;;12865:35;12917:19;;32259:81:0;12541:401:1;32259:81:0;-1:-1:-1;;;;;32359:16:0;;32351:65;;;;-1:-1:-1;;;32351:65:0;;14568:2:1;32351:65:0;;;14550:21:1;14607:2;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;-1:-1:-1;;;14697:18:1;;;14690:34;14741:19;;32351:65:0;14366:400:1;32351:65:0;32533:29;32550:1;32554:7;32533:8;:29::i;:::-;-1:-1:-1;;;;;32575:15:0;;;;;;:9;:15;;;;;:20;;32594:1;;32575:15;:20;;32594:1;;32575:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32606:13:0;;;;;;:9;:13;;;;;:18;;32623:1;;32606:13;:18;;32623:1;;32606:18;:::i;:::-;;;;-1:-1:-1;;32635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32635:21:0;-1:-1:-1;;;;;32635:21:0;;;;;;;;;32674:27;;32635:16;;32674:27;;;;;;;25071:341;25001:411;;:::o;63410:381::-;63524:7;63515:5;:16;;63506:49;;;;-1:-1:-1;;;63506:49:0;;14221:2:1;63506:49:0;;;14203:21:1;14260:2;14240:18;;;14233:30;-1:-1:-1;;;14279:18:1;;;14272:48;14337:18;;63506:49:0;14019:342:1;63506:49:0;63616:7;63608:5;:15;63604:180;;;63640:14;63657:15;63667:5;63657:7;:15;:::i;:::-;63747:25;;63640:32;;-1:-1:-1;63721:9:0;;-1:-1:-1;;;;;63747:15:0;;;:25;;;;;63640:32;;63687:22;63747:25;63687:22;63747:25;63640:32;63747:15;:25;;;;;;;;;;;;;;;;;;;;;63625:159;;63410:381;;;:::o;63958:369::-;40398:41;40349:1;40287:2;40398:41;:::i;:::-;64052:28;;40234:3;64052:28;:::i;:::-;64035:12;;:46;;64026:81;;;;-1:-1:-1;;;64026:81:0;;22810:2:1;64026:81:0;;;22792:21:1;22849:2;22829:18;;;22822:30;-1:-1:-1;;;22868:18:1;;;22861:50;22928:18;;64026:81:0;22608:344:1;64026:81:0;64149:9;;64141:3;64128:12;;:16;;;;:::i;:::-;64127:31;;64118:71;;;;-1:-1:-1;;;64118:71:0;;10150:2:1;64118:71:0;;;10132:21:1;10189:2;10169:18;;;10162:30;10228:27;10208:18;;;10201:55;10273:18;;64118:71:0;9948:349:1;64118:71:0;64207:9;64202:88;64222:3;64220:1;:5;64202:88;;;64247:31;64254:2;64272:3;:1;64274;64272:3;:::i;64247:31::-;64227:3;;;;:::i;:::-;;;;64202:88;;;;64316:3;64300:12;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;63958:369:0:o;62789:452::-;62901:4;62922:11;62918:127;;;62954:12;;:28;;-1:-1:-1;;;62954:28:0;;-1:-1:-1;;;;;7993:32:1;;;62954:28:0;;;7975:51:1;62954:12:0;;;;:18;;7948::1;;62954:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62950:84;;;-1:-1:-1;63011:5:0;63003:15;;62950:84;63062:9;63057:141;63077:12;;63075:14;;63057:141;;;63115:5;63121:1;63115:8;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;-1:-1:-1;;;63115:22:0;;-1:-1:-1;;;;;7993:32:1;;;63115:22:0;;;7975:51:1;63115:8:0;;;;:14;;7948:18:1;;63115:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63111:76;;;63166:4;63158:13;;;;;63111:76;63091:3;;;;:::i;:::-;;;;63057:141;;;;63218:5;63210:15;;62789:452;;;;;;:::o;5132:191::-;5206:16;5225:6;;-1:-1:-1;;;;;5242:17:0;;;-1:-1:-1;;;;;;5242:17:0;;;;;;5275:40;;5225:6;;;;;;;5275:40;;5206:16;5275:40;5195:128;5132:191;:::o;30710:439::-;-1:-1:-1;;;;;30790:16:0;;30782:61;;;;-1:-1:-1;;;30782:61:0;;20267:2:1;30782:61:0;;;20249:21:1;;;20286:18;;;20279:30;20345:34;20325:18;;;20318:62;20397:18;;30782:61:0;20065:356:1;30782:61:0;28797:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;:30;30854:58;;;;-1:-1:-1;;;30854:58:0;;13510:2:1;30854:58:0;;;13492:21:1;13549:2;13529:18;;;13522:30;13588;13568:18;;;13561:58;13636:18;;30854:58:0;13308:352:1;30854:58:0;-1:-1:-1;;;;;30983:13:0;;;;;;:9;:13;;;;;:18;;31000:1;;30983:13;:18;;31000:1;;30983:18;:::i;:::-;;;;-1:-1:-1;;31012:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31012:21:0;-1:-1:-1;;;;;31012:21:0;;;;;;;;31051:33;;31012:16;;;31051:33;;31012:16;;31051:33;25771:155;;:::o;33194:315::-;33349:8;-1:-1:-1;;;;;33340:17:0;:5;-1:-1:-1;;;;;33340:17:0;;;33332:55;;;;-1:-1:-1;;;33332:55:0;;14973:2:1;33332:55:0;;;14955:21:1;15012:2;14992:18;;;14985:30;15051:27;15031:18;;;15024:55;15096:18;;33332:55:0;14771:349:1;33332:55:0;-1:-1:-1;;;;;33398:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33398:46:0;;;;;;;;;;33460:41;;9672::1;;;33460::0;;9645:18:1;33460:41:0;;;;;;;33194:315;;;:::o;28104:::-;28261:28;28271:4;28277:2;28281:7;28261:9;:28::i;:::-;28308:48;28331:4;28337:2;28341:7;28350:5;28308:22;:48::i;:::-;28300:111;;;;-1:-1:-1;;;28300:111:0;;;;;;;:::i;335:723::-;391:13;612:10;608:53;;-1:-1:-1;;639:10:0;;;;;;;;;;;;-1:-1:-1;;;639:10:0;;;;;335:723::o;608:53::-;686:5;671:12;727:78;734:9;;727:78;;760:8;;;;:::i;:::-;;-1:-1:-1;783:10:0;;-1:-1:-1;791:2:0;783:10;;:::i;:::-;;;727:78;;;815:19;847:6;837:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;837:17:0;;815:39;;865:154;872:10;;865:154;;899:11;909:1;899:11;;:::i;:::-;;-1:-1:-1;968:10:0;976:2;968:5;:10;:::i;:::-;955:24;;:2;:24;:::i;:::-;942:39;;925:6;932;925:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;925:56:0;;;;;;;;-1:-1:-1;996:11:0;1005:2;996:11;;:::i;:::-;;;865:154;;34074:799;34229:4;-1:-1:-1;;;;;34250:13:0;;13853:19;:23;34246:620;;34286:72;;-1:-1:-1;;;34286:72:0;;-1:-1:-1;;;;;34286:36:0;;;;;:72;;2751:10;;34337:4;;34343:7;;34352:5;;34286:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34286:72:0;;;;;;;;-1:-1:-1;;34286:72:0;;;;;;;;;;;;:::i;:::-;;;34282:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34528:13:0;;34524:272;;34571:60;;-1:-1:-1;;;34571:60:0;;;;;;;:::i;34524:272::-;34746:6;34740:13;34731:6;34727:2;34723:15;34716:38;34282:529;-1:-1:-1;;;;;;34409:51:0;-1:-1:-1;;;34409:51:0;;-1:-1:-1;34402:58:0;;34246:620;-1:-1:-1;34850:4:0;34074:799;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1266::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1730:2:1;1715:18;;1702:32;1743:33;1702:32;1743:33;:::i;:::-;1795:7;-1:-1:-1;1849:2:1;1834:18;;1821:32;;-1:-1:-1;1904:2:1;1889:18;;1876:32;1927:18;1957:14;;;1954:34;;;1984:1;1981;1974:12;1954:34;2022:6;2011:9;2007:22;1997:32;;2067:7;2060:4;2056:2;2052:13;2048:27;2038:55;;2089:1;2086;2079:12;2038:55;2125:2;2112:16;2147:2;2143;2140:10;2137:36;;;2153:18;;:::i;:::-;2228:2;2222:9;2196:2;2282:13;;-1:-1:-1;;2278:22:1;;;2302:2;2274:31;2270:40;2258:53;;;2326:18;;;2346:22;;;2323:46;2320:72;;;2372:18;;:::i;:::-;2412:10;2408:2;2401:22;2447:2;2439:6;2432:18;2487:7;2482:2;2477;2473;2469:11;2465:20;2462:33;2459:53;;;2508:1;2505;2498:12;2459:53;2564:2;2559;2555;2551:11;2546:2;2538:6;2534:15;2521:46;2609:1;2604:2;2599;2591:6;2587:15;2583:24;2576:35;2630:6;2620:16;;;;;;;1376:1266;;;;;;;:::o;2647:382::-;2712:6;2720;2773:2;2761:9;2752:7;2748:23;2744:32;2741:52;;;2789:1;2786;2779:12;2741:52;2828:9;2815:23;2847:31;2872:5;2847:31;:::i;:::-;2897:5;-1:-1:-1;2954:2:1;2939:18;;2926:32;2967:30;2926:32;2967:30;:::i;3034:315::-;3102:6;3110;3163:2;3151:9;3142:7;3138:23;3134:32;3131:52;;;3179:1;3176;3169:12;3131:52;3218:9;3205:23;3237:31;3262:5;3237:31;:::i;:::-;3287:5;3339:2;3324:18;;;;3311:32;;-1:-1:-1;;;3034:315:1:o;3354:615::-;3440:6;3448;3501:2;3489:9;3480:7;3476:23;3472:32;3469:52;;;3517:1;3514;3507:12;3469:52;3557:9;3544:23;3586:18;3627:2;3619:6;3616:14;3613:34;;;3643:1;3640;3633:12;3613:34;3681:6;3670:9;3666:22;3656:32;;3726:7;3719:4;3715:2;3711:13;3707:27;3697:55;;3748:1;3745;3738:12;3697:55;3788:2;3775:16;3814:2;3806:6;3803:14;3800:34;;;3830:1;3827;3820:12;3800:34;3883:7;3878:2;3868:6;3865:1;3861:14;3857:2;3853:23;3849:32;3846:45;3843:65;;;3904:1;3901;3894:12;3843:65;3935:2;3927:11;;;;;3957:6;;-1:-1:-1;3354:615:1;;-1:-1:-1;;;;3354:615:1:o;3974:241::-;4030:6;4083:2;4071:9;4062:7;4058:23;4054:32;4051:52;;;4099:1;4096;4089:12;4051:52;4138:9;4125:23;4157:28;4179:5;4157:28;:::i;4220:245::-;4287:6;4340:2;4328:9;4319:7;4315:23;4311:32;4308:52;;;4356:1;4353;4346:12;4308:52;4388:9;4382:16;4407:28;4429:5;4407:28;:::i;4470:245::-;4528:6;4581:2;4569:9;4560:7;4556:23;4552:32;4549:52;;;4597:1;4594;4587:12;4549:52;4636:9;4623:23;4655:30;4679:5;4655:30;:::i;4720:249::-;4789:6;4842:2;4830:9;4821:7;4817:23;4813:32;4810:52;;;4858:1;4855;4848:12;4810:52;4890:9;4884:16;4909:30;4933:5;4909:30;:::i;4974:592::-;5045:6;5053;5106:2;5094:9;5085:7;5081:23;5077:32;5074:52;;;5122:1;5119;5112:12;5074:52;5162:9;5149:23;5191:18;5232:2;5224:6;5221:14;5218:34;;;5248:1;5245;5238:12;5218:34;5286:6;5275:9;5271:22;5261:32;;5331:7;5324:4;5320:2;5316:13;5312:27;5302:55;;5353:1;5350;5343:12;5302:55;5393:2;5380:16;5419:2;5411:6;5408:14;5405:34;;;5435:1;5432;5425:12;5405:34;5480:7;5475:2;5466:6;5462:2;5458:15;5454:24;5451:37;5448:57;;;5501:1;5498;5491:12;5571:180;5630:6;5683:2;5671:9;5662:7;5658:23;5654:32;5651:52;;;5699:1;5696;5689:12;5651:52;-1:-1:-1;5722:23:1;;5571:180;-1:-1:-1;5571:180:1:o;5756:184::-;5826:6;5879:2;5867:9;5858:7;5854:23;5850:32;5847:52;;;5895:1;5892;5885:12;5847:52;-1:-1:-1;5918:16:1;;5756:184;-1:-1:-1;5756:184:1:o;5945:248::-;6013:6;6021;6074:2;6062:9;6053:7;6049:23;6045:32;6042:52;;;6090:1;6087;6080:12;6042:52;-1:-1:-1;;6113:23:1;;;6183:2;6168:18;;;6155:32;;-1:-1:-1;5945:248:1:o;6198:257::-;6239:3;6277:5;6271:12;6304:6;6299:3;6292:19;6320:63;6376:6;6369:4;6364:3;6360:14;6353:4;6346:5;6342:16;6320:63;:::i;:::-;6437:2;6416:15;-1:-1:-1;;6412:29:1;6403:39;;;;6444:4;6399:50;;6198:257;-1:-1:-1;;6198:257:1:o;6460:185::-;6502:3;6540:5;6534:12;6555:52;6600:6;6595:3;6588:4;6581:5;6577:16;6555:52;:::i;:::-;6623:16;;;;;6460:185;-1:-1:-1;;6460:185:1:o;6650:1174::-;6826:3;6855:1;6888:6;6882:13;6918:3;6940:1;6968:9;6964:2;6960:18;6950:28;;7028:2;7017:9;7013:18;7050;7040:61;;7094:4;7086:6;7082:17;7072:27;;7040:61;7120:2;7168;7160:6;7157:14;7137:18;7134:38;7131:165;;;-1:-1:-1;;;7195:33:1;;7251:4;7248:1;7241:15;7281:4;7202:3;7269:17;7131:165;7312:18;7339:104;;;;7457:1;7452:320;;;;7305:467;;7339:104;-1:-1:-1;;7372:24:1;;7360:37;;7417:16;;;;-1:-1:-1;7339:104:1;;7452:320;28332:1;28325:14;;;28369:4;28356:18;;7547:1;7561:165;7575:6;7572:1;7569:13;7561:165;;;7653:14;;7640:11;;;7633:35;7696:16;;;;7590:10;;7561:165;;;7565:3;;7755:6;7750:3;7746:16;7739:23;;7305:467;;;;;;;7788:30;7814:3;7806:6;7788:30;:::i;:::-;7781:37;6650:1174;-1:-1:-1;;;;;6650:1174:1:o;8037:488::-;-1:-1:-1;;;;;8306:15:1;;;8288:34;;8358:15;;8353:2;8338:18;;8331:43;8405:2;8390:18;;8383:34;;;8453:3;8448:2;8433:18;;8426:31;;;8231:4;;8474:45;;8499:19;;8491:6;8474:45;:::i;:::-;8466:53;8037:488;-1:-1:-1;;;;;;8037:488:1:o;8530:497::-;8712:3;8697:19;;8701:9;8793:6;8670:4;8827:194;8841:4;8838:1;8835:11;8827:194;;;8900:13;;8888:26;;8937:4;8961:12;;;;8996:15;;;;8861:1;8854:9;8827:194;;;8831:3;;;8530:497;;;;:::o;9032:495::-;9212:3;9197:19;;9201:9;9293:6;9170:4;9327:194;9341:4;9338:1;9335:11;9327:194;;;9400:13;;9388:26;;9437:4;9461:12;;;;9496:15;;;;9361:1;9354:9;9327:194;;9724:219;9873:2;9862:9;9855:21;9836:4;9893:44;9933:2;9922:9;9918:18;9910:6;9893:44;:::i;11715:414::-;11917:2;11899:21;;;11956:2;11936:18;;;11929:30;11995:34;11990:2;11975:18;;11968:62;-1:-1:-1;;;12061:2:1;12046:18;;12039:48;12119:3;12104:19;;11715:414::o;21185:356::-;21387:2;21369:21;;;21406:18;;;21399:30;21465:34;21460:2;21445:18;;21438:62;21532:2;21517:18;;21185:356::o;25126:413::-;25328:2;25310:21;;;25367:2;25347:18;;;25340:30;25406:34;25401:2;25386:18;;25379:62;-1:-1:-1;;;25472:2:1;25457:18;;25450:47;25529:3;25514:19;;25126:413::o;25544:403::-;25746:2;25728:21;;;25785:2;25765:18;;;25758:30;25824:34;25819:2;25804:18;;25797:62;-1:-1:-1;;;25890:2:1;25875:18;;25868:37;25937:3;25922:19;;25544:403::o;27368:355::-;27570:2;27552:21;;;27609:2;27589:18;;;27582:30;27648:33;27643:2;27628:18;;27621:61;27714:2;27699:18;;27368:355::o;28385:128::-;28425:3;28456:1;28452:6;28449:1;28446:13;28443:39;;;28462:18;;:::i;:::-;-1:-1:-1;28498:9:1;;28385:128::o;28518:120::-;28558:1;28584;28574:35;;28589:18;;:::i;:::-;-1:-1:-1;28623:9:1;;28518:120::o;28643:168::-;28683:7;28749:1;28745;28741:6;28737:14;28734:1;28731:21;28726:1;28719:9;28712:17;28708:45;28705:71;;;28756:18;;:::i;:::-;-1:-1:-1;28796:9:1;;28643:168::o;28816:125::-;28856:4;28884:1;28881;28878:8;28875:34;;;28889:18;;:::i;:::-;-1:-1:-1;28926:9:1;;28816:125::o;28946:258::-;29018:1;29028:113;29042:6;29039:1;29036:13;29028:113;;;29118:11;;;29112:18;29099:11;;;29092:39;29064:2;29057:10;29028:113;;;29159:6;29156:1;29153:13;29150:48;;;-1:-1:-1;;29194:1:1;29176:16;;29169:27;28946:258::o;29209:380::-;29288:1;29284:12;;;;29331;;;29352:61;;29406:4;29398:6;29394:17;29384:27;;29352:61;29459:2;29451:6;29448:14;29428:18;29425:38;29422:161;;;29505:10;29500:3;29496:20;29493:1;29486:31;29540:4;29537:1;29530:15;29568:4;29565:1;29558:15;29422:161;;29209:380;;;:::o;29594:135::-;29633:3;-1:-1:-1;;29654:17:1;;29651:43;;;29674:18;;:::i;:::-;-1:-1:-1;29721:1:1;29710:13;;29594:135::o;29734:112::-;29766:1;29792;29782:35;;29797:18;;:::i;:::-;-1:-1:-1;29831:9:1;;29734:112::o;29851:127::-;29912:10;29907:3;29903:20;29900:1;29893:31;29943:4;29940:1;29933:15;29967:4;29964:1;29957:15;29983:127;30044:10;30039:3;30035:20;30032:1;30025:31;30075:4;30072:1;30065:15;30099:4;30096:1;30089:15;30115:127;30176:10;30171:3;30167:20;30164:1;30157:31;30207:4;30204:1;30197:15;30231:4;30228:1;30221:15;30247:127;30308:10;30303:3;30299:20;30296:1;30289:31;30339:4;30336:1;30329:15;30363:4;30360:1;30353:15;30379:131;-1:-1:-1;;;;;30454:31:1;;30444:42;;30434:70;;30500:1;30497;30490:12;30515:118;30601:5;30594:13;30587:21;30580:5;30577:32;30567:60;;30623:1;30620;30613:12;30638:131;-1:-1:-1;;;;;;30712:32:1;;30702:43;;30692:71;;30759:1;30756;30749:12
Swarm Source
ipfs://8dd508cea19243cd269fa3f8389ff8ef979b5b1066f9a087a43f224222b33e3c
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.