ERC-721
Overview
Max Total Supply
211 21L
Holders
25
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 21LLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TwentyTwoLinesNFT
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-04 */ // File: @openzeppelin/contracts/utils/Counters.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } pragma solidity 0.8.3; contract TwentyTwoLinesNFT is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; uint16 public constant maxSupply = 4444; string private _baseTokenURI; uint256 public _mintForAllStartDate = 1630674582;//1630684800; mapping(uint256 => bool) private _freeMinted; constructor() ERC721("21 Lines NFT", "21L") { } function setMintForAllStartDate(uint256 startDate) public onlyOwner { _mintForAllStartDate = startDate; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory _newbaseTokenURI) public onlyOwner { _baseTokenURI = _newbaseTokenURI; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } // Get minting limit (for a single transaction) based on current token supply function getCurrentMintLimit() public pure returns (uint8) { return 44; } // Get ether price based on current token supply function getCurrentPrice() public pure returns (uint64) { return 44_000_000_000_000_000; } // Mint new token(s) function mint(uint8 _quantityToMint) public payable { require(_mintForAllStartDate <= block.timestamp, "Sale is not open"); require(_quantityToMint >= 1, "Must mint at least 1"); require( _quantityToMint <= getCurrentMintLimit(), "Maximum current buy limit for individual transaction exceeded" ); require( (_quantityToMint + totalSupply()) <= maxSupply, "Exceeds maximum supply" ); require( msg.value == (getCurrentPrice() * _quantityToMint), "Ether submitted does not match current price" ); for (uint8 i = 0; i < _quantityToMint; i++) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(msg.sender, newItemId); } for(uint i=1;i<_tokenIds.current();i++) { address _user = ownerOf(i); payable(_user).transfer(((msg.value * 5)/100) / (_tokenIds.current() - 1)); } } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } // Withdraw ether from contract function withdraw() public onlyOwner { require(address(this).balance > 0, "Balance must be positive"); (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success == true, "Failed to withdraw ether"); } }
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":[],"name":"_mintForAllStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMintLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setMintForAllStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526361321e96600e553480156200001957600080fd5b506040518060400160405280600c81526020017f3231204c696e6573204e465400000000000000000000000000000000000000008152506040518060400160405280600381526020017f32314c000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009e929190620001ae565b508060019080519060200190620000b7929190620001ae565b505050620000da620000ce620000e060201b60201c565b620000e860201b60201c565b620002c3565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001bc906200025e565b90600052602060002090601f016020900481019282620001e057600085556200022c565b82601f10620001fb57805160ff19168380011785556200022c565b828001600101855582156200022c579182015b828111156200022b5782518255916020019190600101906200020e565b5b5090506200023b91906200023f565b5090565b5b808211156200025a57600081600090555060010162000240565b5090565b600060028204905060018216806200027757607f821691505b602082108114156200028e576200028d62000294565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6143b980620002d36000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec578063a22cb4651161008a578063d5abeb0111610064578063d5abeb01146105b7578063e985e9c5146105e2578063eb91d37e1461061f578063f2fde38b1461064a5761019c565b8063a22cb46514610528578063b88d4fde14610551578063c87b56dd1461057a5761019c565b8063715018a6116100c6578063715018a6146104925780638da5cb5b146104a957806395d89b41146104d45780639d12006a146104ff5761019c565b80636352211e146103fc5780636ecd23061461043957806370a08231146104555761019c565b80632f745c59116101595780633ccfd60b116101335780633ccfd60b1461035657806342842e0e1461036d5780634f6ccce71461039657806355f804b3146103d35761019c565b80632f745c59146102c3578063339181d9146103005780633cc420941461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612d5c565b610673565b6040516101d5919061338f565b60405180910390f35b3480156101ea57600080fd5b506101f3610685565b60405161020091906133aa565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612def565b610717565b60405161023d9190613328565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612d20565b61079c565b005b34801561027b57600080fd5b506102846108b4565b6040516102919190613727565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612c1a565b6108c1565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612d20565b610921565b6040516102f79190613727565b60405180910390f35b34801561030c57600080fd5b506103156109c6565b604051610322919061375d565b60405180910390f35b34801561033757600080fd5b506103406109cf565b60405161034d9190613727565b60405180910390f35b34801561036257600080fd5b5061036b6109d5565b005b34801561037957600080fd5b50610394600480360381019061038f9190612c1a565b610b4a565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612def565b610b6a565b6040516103ca9190613727565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190612dae565b610c01565b005b34801561040857600080fd5b50610423600480360381019061041e9190612def565b610c97565b6040516104309190613328565b60405180910390f35b610453600480360381019061044e9190612e18565b610d49565b005b34801561046157600080fd5b5061047c60048036038101906104779190612bb5565b610fe8565b6040516104899190613727565b60405180910390f35b34801561049e57600080fd5b506104a76110a0565b005b3480156104b557600080fd5b506104be611128565b6040516104cb9190613328565b60405180910390f35b3480156104e057600080fd5b506104e9611152565b6040516104f691906133aa565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190612def565b6111e4565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612ce4565b61126a565b005b34801561055d57600080fd5b5061057860048036038101906105739190612c69565b6113eb565b005b34801561058657600080fd5b506105a1600480360381019061059c9190612def565b61144d565b6040516105ae91906133aa565b60405180910390f35b3480156105c357600080fd5b506105cc61145f565b6040516105d9919061370c565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612bde565b611465565b604051610616919061338f565b60405180910390f35b34801561062b57600080fd5b506106346114f9565b6040516106419190613742565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612bb5565b611508565b005b600061067e82611600565b9050919050565b60606000805461069490613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613a89565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b5050505050905090565b60006107228261167a565b610761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610758906135ac565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a782610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f9061364c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108376116e6565b73ffffffffffffffffffffffffffffffffffffffff1614806108665750610865816108606116e6565b611465565b5b6108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c9061350c565b60405180910390fd5b6108af83836116ee565b505050565b6000600880549050905090565b6108d26108cc6116e6565b826117a7565b610911576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610908906136cc565b60405180910390fd5b61091c838383611885565b505050565b600061092c83610fe8565b821061096d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610964906133cc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000602c905090565b600e5481565b6109dd6116e6565b73ffffffffffffffffffffffffffffffffffffffff166109fb611128565b73ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a48906135cc565b60405180910390fd5b60004711610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b9061346c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610aba90613313565b60006040518083038185875af1925050503d8060008114610af7576040519150601f19603f3d011682016040523d82523d6000602084013e610afc565b606091505b505090506001151581151514610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e9061362c565b60405180910390fd5b50565b610b65838383604051806020016040528060008152506113eb565b505050565b6000610b746108b4565b8210610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac906136ec565b60405180910390fd5b60088281548110610bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c096116e6565b73ffffffffffffffffffffffffffffffffffffffff16610c27611128565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c74906135cc565b60405180910390fd5b80600d9080519060200190610c939291906129c4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d379061354c565b60405180910390fd5b80915050919050565b42600e541115610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d85906136ac565b60405180910390fd5b60018160ff161015610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc9061368c565b60405180910390fd5b610ddd6109c6565b60ff168160ff161115610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c9061348c565b60405180910390fd5b61115c61ffff16610e346108b4565b8260ff16610e42919061384d565b1115610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a9061366c565b60405180910390fd5b8060ff16610e8f6114f9565b610e99919061392e565b67ffffffffffffffff163414610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb906133ec565b60405180910390fd5b60005b8160ff168160ff161015610f2b57610eff600c611ae1565b6000610f0b600c611af7565b9050610f173382611b05565b508080610f2390613b35565b915050610ee7565b506000600190505b610f3d600c611af7565b811015610fe4576000610f4f82610c97565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc6001610f77600c611af7565b610f819190613970565b6064600534610f9091906138d4565b610f9a91906138a3565b610fa491906138a3565b9081150290604051600060405180830381858888f19350505050158015610fcf573d6000803e3d6000fd5b50508080610fdc90613aec565b915050610f33565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611059576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110509061352c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a86116e6565b73ffffffffffffffffffffffffffffffffffffffff166110c6611128565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611113906135cc565b60405180910390fd5b6111266000611cd3565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116190613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461118d90613a89565b80156111da5780601f106111af576101008083540402835291602001916111da565b820191906000526020600020905b8154815290600101906020018083116111bd57829003601f168201915b5050505050905090565b6111ec6116e6565b73ffffffffffffffffffffffffffffffffffffffff1661120a611128565b73ffffffffffffffffffffffffffffffffffffffff1614611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906135cc565b60405180910390fd5b80600e8190555050565b6112726116e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906134cc565b60405180910390fd5b80600560006112ed6116e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661139a6116e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113df919061338f565b60405180910390a35050565b6113fc6113f66116e6565b836117a7565b61143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906136cc565b60405180910390fd5b61144784848484611d99565b50505050565b606061145882611df5565b9050919050565b61115c81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000669c51c4521e0000905090565b6115106116e6565b73ffffffffffffffffffffffffffffffffffffffff1661152e611128565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906135cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb9061342c565b60405180910390fd5b6115fd81611cd3565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611673575061167282611f47565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661176183610c97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117b28261167a565b6117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e8906134ec565b60405180910390fd5b60006117fc83610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061186b57508373ffffffffffffffffffffffffffffffffffffffff1661185384610717565b73ffffffffffffffffffffffffffffffffffffffff16145b8061187c575061187b8185611465565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118a582610c97565b73ffffffffffffffffffffffffffffffffffffffff16146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f2906135ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611962906134ac565b60405180910390fd5b611976838383612029565b6119816000826116ee565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119d19190613970565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a28919061384d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c9061356c565b60405180910390fd5b611b7e8161167a565b15611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb59061344c565b60405180910390fd5b611bca60008383612029565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c1a919061384d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611da4848484611885565b611db084848484612039565b611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de69061340c565b60405180910390fd5b50505050565b6060611e008261167a565b611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e369061358c565b60405180910390fd5b6000600a60008481526020019081526020016000208054611e5f90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8b90613a89565b8015611ed85780601f10611ead57610100808354040283529160200191611ed8565b820191906000526020600020905b815481529060010190602001808311611ebb57829003601f168201915b505050505090506000611ee96121d0565b9050600081511415611eff578192505050611f42565b600082511115611f34578082604051602001611f1c9291906132ef565b60405160208183030381529060405292505050611f42565b611f3d84612262565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612022575061202182612309565b5b9050919050565b612034838383612373565b505050565b600061205a8473ffffffffffffffffffffffffffffffffffffffff16612487565b156121c3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120836116e6565b8786866040518563ffffffff1660e01b81526004016120a59493929190613343565b602060405180830381600087803b1580156120bf57600080fd5b505af19250505080156120f057506040513d601f19601f820116820180604052508101906120ed9190612d85565b60015b612173573d8060008114612120576040519150601f19603f3d011682016040523d82523d6000602084013e612125565b606091505b5060008151141561216b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121629061340c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c8565b600190505b949350505050565b6060600d80546121df90613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461220b90613a89565b80156122585780601f1061222d57610100808354040283529160200191612258565b820191906000526020600020905b81548152906001019060200180831161223b57829003601f168201915b5050505050905090565b606061226d8261167a565b6122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a39061360c565b60405180910390fd5b60006122b66121d0565b905060008151116122d65760405180602001604052806000815250612301565b806122e08461249a565b6040516020016122f19291906132ef565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61237e838383612647565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c1576123bc8161264c565b612400565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123ff576123fe8382612695565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124435761243e81612802565b612482565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612481576124808282612945565b5b5b505050565b600080823b905060008111915050919050565b606060008214156124e2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612642565b600082905060005b600082146125145780806124fd90613aec565b915050600a8261250d91906138a3565b91506124ea565b60008167ffffffffffffffff811115612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125885781602001600182028036833780820191505090505b5090505b6000851461263b576001826125a19190613970565b9150600a856125b09190613b5f565b60306125bc919061384d565b60f81b8183815181106125f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561263491906138a3565b945061258c565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126a284610fe8565b6126ac9190613970565b9050600060076000848152602001908152602001600020549050818114612791576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128169190613970565b905060006009600084815260200190815260200160002054905060006008838154811061286c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106128b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612929577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061295083610fe8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546129d090613a89565b90600052602060002090601f0160209004810192826129f25760008555612a39565b82601f10612a0b57805160ff1916838001178555612a39565b82800160010185558215612a39579182015b82811115612a38578251825591602001919060010190612a1d565b5b509050612a469190612a4a565b5090565b5b80821115612a63576000816000905550600101612a4b565b5090565b6000612a7a612a758461379d565b613778565b905082815260208101848484011115612a9257600080fd5b612a9d848285613a47565b509392505050565b6000612ab8612ab3846137ce565b613778565b905082815260208101848484011115612ad057600080fd5b612adb848285613a47565b509392505050565b600081359050612af281614310565b92915050565b600081359050612b0781614327565b92915050565b600081359050612b1c8161433e565b92915050565b600081519050612b318161433e565b92915050565b600082601f830112612b4857600080fd5b8135612b58848260208601612a67565b91505092915050565b600082601f830112612b7257600080fd5b8135612b82848260208601612aa5565b91505092915050565b600081359050612b9a81614355565b92915050565b600081359050612baf8161436c565b92915050565b600060208284031215612bc757600080fd5b6000612bd584828501612ae3565b91505092915050565b60008060408385031215612bf157600080fd5b6000612bff85828601612ae3565b9250506020612c1085828601612ae3565b9150509250929050565b600080600060608486031215612c2f57600080fd5b6000612c3d86828701612ae3565b9350506020612c4e86828701612ae3565b9250506040612c5f86828701612b8b565b9150509250925092565b60008060008060808587031215612c7f57600080fd5b6000612c8d87828801612ae3565b9450506020612c9e87828801612ae3565b9350506040612caf87828801612b8b565b925050606085013567ffffffffffffffff811115612ccc57600080fd5b612cd887828801612b37565b91505092959194509250565b60008060408385031215612cf757600080fd5b6000612d0585828601612ae3565b9250506020612d1685828601612af8565b9150509250929050565b60008060408385031215612d3357600080fd5b6000612d4185828601612ae3565b9250506020612d5285828601612b8b565b9150509250929050565b600060208284031215612d6e57600080fd5b6000612d7c84828501612b0d565b91505092915050565b600060208284031215612d9757600080fd5b6000612da584828501612b22565b91505092915050565b600060208284031215612dc057600080fd5b600082013567ffffffffffffffff811115612dda57600080fd5b612de684828501612b61565b91505092915050565b600060208284031215612e0157600080fd5b6000612e0f84828501612b8b565b91505092915050565b600060208284031215612e2a57600080fd5b6000612e3884828501612ba0565b91505092915050565b612e4a816139a4565b82525050565b612e59816139b6565b82525050565b6000612e6a826137ff565b612e748185613815565b9350612e84818560208601613a56565b612e8d81613c4c565b840191505092915050565b6000612ea38261380a565b612ead8185613831565b9350612ebd818560208601613a56565b612ec681613c4c565b840191505092915050565b6000612edc8261380a565b612ee68185613842565b9350612ef6818560208601613a56565b80840191505092915050565b6000612f0f602b83613831565b9150612f1a82613c5d565b604082019050919050565b6000612f32602c83613831565b9150612f3d82613cac565b604082019050919050565b6000612f55603283613831565b9150612f6082613cfb565b604082019050919050565b6000612f78602683613831565b9150612f8382613d4a565b604082019050919050565b6000612f9b601c83613831565b9150612fa682613d99565b602082019050919050565b6000612fbe601883613831565b9150612fc982613dc2565b602082019050919050565b6000612fe1603d83613831565b9150612fec82613deb565b604082019050919050565b6000613004602483613831565b915061300f82613e3a565b604082019050919050565b6000613027601983613831565b915061303282613e89565b602082019050919050565b600061304a602c83613831565b915061305582613eb2565b604082019050919050565b600061306d603883613831565b915061307882613f01565b604082019050919050565b6000613090602a83613831565b915061309b82613f50565b604082019050919050565b60006130b3602983613831565b91506130be82613f9f565b604082019050919050565b60006130d6602083613831565b91506130e182613fee565b602082019050919050565b60006130f9603183613831565b915061310482614017565b604082019050919050565b600061311c602c83613831565b915061312782614066565b604082019050919050565b600061313f602083613831565b915061314a826140b5565b602082019050919050565b6000613162602983613831565b915061316d826140de565b604082019050919050565b6000613185602f83613831565b91506131908261412d565b604082019050919050565b60006131a8601883613831565b91506131b38261417c565b602082019050919050565b60006131cb602183613831565b91506131d6826141a5565b604082019050919050565b60006131ee601683613831565b91506131f9826141f4565b602082019050919050565b6000613211601483613831565b915061321c8261421d565b602082019050919050565b6000613234601083613831565b915061323f82614246565b602082019050919050565b6000613257600083613826565b91506132628261426f565b600082019050919050565b600061327a603183613831565b915061328582614272565b604082019050919050565b600061329d602c83613831565b91506132a8826142c1565b604082019050919050565b6132bc816139ee565b82525050565b6132cb81613a1c565b82525050565b6132da81613a26565b82525050565b6132e981613a3a565b82525050565b60006132fb8285612ed1565b91506133078284612ed1565b91508190509392505050565b600061331e8261324a565b9150819050919050565b600060208201905061333d6000830184612e41565b92915050565b60006080820190506133586000830187612e41565b6133656020830186612e41565b61337260408301856132c2565b81810360608301526133848184612e5f565b905095945050505050565b60006020820190506133a46000830184612e50565b92915050565b600060208201905081810360008301526133c48184612e98565b905092915050565b600060208201905081810360008301526133e581612f02565b9050919050565b6000602082019050818103600083015261340581612f25565b9050919050565b6000602082019050818103600083015261342581612f48565b9050919050565b6000602082019050818103600083015261344581612f6b565b9050919050565b6000602082019050818103600083015261346581612f8e565b9050919050565b6000602082019050818103600083015261348581612fb1565b9050919050565b600060208201905081810360008301526134a581612fd4565b9050919050565b600060208201905081810360008301526134c581612ff7565b9050919050565b600060208201905081810360008301526134e58161301a565b9050919050565b600060208201905081810360008301526135058161303d565b9050919050565b6000602082019050818103600083015261352581613060565b9050919050565b6000602082019050818103600083015261354581613083565b9050919050565b60006020820190508181036000830152613565816130a6565b9050919050565b60006020820190508181036000830152613585816130c9565b9050919050565b600060208201905081810360008301526135a5816130ec565b9050919050565b600060208201905081810360008301526135c58161310f565b9050919050565b600060208201905081810360008301526135e581613132565b9050919050565b6000602082019050818103600083015261360581613155565b9050919050565b6000602082019050818103600083015261362581613178565b9050919050565b600060208201905081810360008301526136458161319b565b9050919050565b60006020820190508181036000830152613665816131be565b9050919050565b60006020820190508181036000830152613685816131e1565b9050919050565b600060208201905081810360008301526136a581613204565b9050919050565b600060208201905081810360008301526136c581613227565b9050919050565b600060208201905081810360008301526136e58161326d565b9050919050565b6000602082019050818103600083015261370581613290565b9050919050565b600060208201905061372160008301846132b3565b92915050565b600060208201905061373c60008301846132c2565b92915050565b600060208201905061375760008301846132d1565b92915050565b600060208201905061377260008301846132e0565b92915050565b6000613782613793565b905061378e8282613abb565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b8576137b7613c1d565b5b6137c182613c4c565b9050602081019050919050565b600067ffffffffffffffff8211156137e9576137e8613c1d565b5b6137f282613c4c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061385882613a1c565b915061386383613a1c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561389857613897613b90565b5b828201905092915050565b60006138ae82613a1c565b91506138b983613a1c565b9250826138c9576138c8613bbf565b5b828204905092915050565b60006138df82613a1c565b91506138ea83613a1c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561392357613922613b90565b5b828202905092915050565b600061393982613a26565b915061394483613a26565b92508167ffffffffffffffff048311821515161561396557613964613b90565b5b828202905092915050565b600061397b82613a1c565b915061398683613a1c565b92508282101561399957613998613b90565b5b828203905092915050565b60006139af826139fc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a74578082015181840152602081019050613a59565b83811115613a83576000848401525b50505050565b60006002820490506001821680613aa157607f821691505b60208210811415613ab557613ab4613bee565b5b50919050565b613ac482613c4c565b810181811067ffffffffffffffff82111715613ae357613ae2613c1d565b5b80604052505050565b6000613af782613a1c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2a57613b29613b90565b5b600182019050919050565b6000613b4082613a3a565b915060ff821415613b5457613b53613b90565b5b600182019050919050565b6000613b6a82613a1c565b9150613b7583613a1c565b925082613b8557613b84613bbf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614319816139a4565b811461432457600080fd5b50565b614330816139b6565b811461433b57600080fd5b50565b614347816139c2565b811461435257600080fd5b50565b61435e81613a1c565b811461436957600080fd5b50565b61437581613a3a565b811461438057600080fd5b5056fea264697066735822122094b4a51074c36e633ddd1e9bce7f7b9f81fc5448d754a537a7316008b6f6d6da64736f6c63430008030033
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80636352211e116100ec578063a22cb4651161008a578063d5abeb0111610064578063d5abeb01146105b7578063e985e9c5146105e2578063eb91d37e1461061f578063f2fde38b1461064a5761019c565b8063a22cb46514610528578063b88d4fde14610551578063c87b56dd1461057a5761019c565b8063715018a6116100c6578063715018a6146104925780638da5cb5b146104a957806395d89b41146104d45780639d12006a146104ff5761019c565b80636352211e146103fc5780636ecd23061461043957806370a08231146104555761019c565b80632f745c59116101595780633ccfd60b116101335780633ccfd60b1461035657806342842e0e1461036d5780634f6ccce71461039657806355f804b3146103d35761019c565b80632f745c59146102c3578063339181d9146103005780633cc420941461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612d5c565b610673565b6040516101d5919061338f565b60405180910390f35b3480156101ea57600080fd5b506101f3610685565b60405161020091906133aa565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612def565b610717565b60405161023d9190613328565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612d20565b61079c565b005b34801561027b57600080fd5b506102846108b4565b6040516102919190613727565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612c1a565b6108c1565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612d20565b610921565b6040516102f79190613727565b60405180910390f35b34801561030c57600080fd5b506103156109c6565b604051610322919061375d565b60405180910390f35b34801561033757600080fd5b506103406109cf565b60405161034d9190613727565b60405180910390f35b34801561036257600080fd5b5061036b6109d5565b005b34801561037957600080fd5b50610394600480360381019061038f9190612c1a565b610b4a565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612def565b610b6a565b6040516103ca9190613727565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190612dae565b610c01565b005b34801561040857600080fd5b50610423600480360381019061041e9190612def565b610c97565b6040516104309190613328565b60405180910390f35b610453600480360381019061044e9190612e18565b610d49565b005b34801561046157600080fd5b5061047c60048036038101906104779190612bb5565b610fe8565b6040516104899190613727565b60405180910390f35b34801561049e57600080fd5b506104a76110a0565b005b3480156104b557600080fd5b506104be611128565b6040516104cb9190613328565b60405180910390f35b3480156104e057600080fd5b506104e9611152565b6040516104f691906133aa565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190612def565b6111e4565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612ce4565b61126a565b005b34801561055d57600080fd5b5061057860048036038101906105739190612c69565b6113eb565b005b34801561058657600080fd5b506105a1600480360381019061059c9190612def565b61144d565b6040516105ae91906133aa565b60405180910390f35b3480156105c357600080fd5b506105cc61145f565b6040516105d9919061370c565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190612bde565b611465565b604051610616919061338f565b60405180910390f35b34801561062b57600080fd5b506106346114f9565b6040516106419190613742565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612bb5565b611508565b005b600061067e82611600565b9050919050565b60606000805461069490613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613a89565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b5050505050905090565b60006107228261167a565b610761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610758906135ac565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a782610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f9061364c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108376116e6565b73ffffffffffffffffffffffffffffffffffffffff1614806108665750610865816108606116e6565b611465565b5b6108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c9061350c565b60405180910390fd5b6108af83836116ee565b505050565b6000600880549050905090565b6108d26108cc6116e6565b826117a7565b610911576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610908906136cc565b60405180910390fd5b61091c838383611885565b505050565b600061092c83610fe8565b821061096d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610964906133cc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000602c905090565b600e5481565b6109dd6116e6565b73ffffffffffffffffffffffffffffffffffffffff166109fb611128565b73ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a48906135cc565b60405180910390fd5b60004711610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b9061346c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610aba90613313565b60006040518083038185875af1925050503d8060008114610af7576040519150601f19603f3d011682016040523d82523d6000602084013e610afc565b606091505b505090506001151581151514610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e9061362c565b60405180910390fd5b50565b610b65838383604051806020016040528060008152506113eb565b505050565b6000610b746108b4565b8210610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac906136ec565b60405180910390fd5b60088281548110610bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c096116e6565b73ffffffffffffffffffffffffffffffffffffffff16610c27611128565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c74906135cc565b60405180910390fd5b80600d9080519060200190610c939291906129c4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d379061354c565b60405180910390fd5b80915050919050565b42600e541115610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d85906136ac565b60405180910390fd5b60018160ff161015610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc9061368c565b60405180910390fd5b610ddd6109c6565b60ff168160ff161115610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c9061348c565b60405180910390fd5b61115c61ffff16610e346108b4565b8260ff16610e42919061384d565b1115610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a9061366c565b60405180910390fd5b8060ff16610e8f6114f9565b610e99919061392e565b67ffffffffffffffff163414610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb906133ec565b60405180910390fd5b60005b8160ff168160ff161015610f2b57610eff600c611ae1565b6000610f0b600c611af7565b9050610f173382611b05565b508080610f2390613b35565b915050610ee7565b506000600190505b610f3d600c611af7565b811015610fe4576000610f4f82610c97565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc6001610f77600c611af7565b610f819190613970565b6064600534610f9091906138d4565b610f9a91906138a3565b610fa491906138a3565b9081150290604051600060405180830381858888f19350505050158015610fcf573d6000803e3d6000fd5b50508080610fdc90613aec565b915050610f33565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611059576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110509061352c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a86116e6565b73ffffffffffffffffffffffffffffffffffffffff166110c6611128565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611113906135cc565b60405180910390fd5b6111266000611cd3565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116190613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461118d90613a89565b80156111da5780601f106111af576101008083540402835291602001916111da565b820191906000526020600020905b8154815290600101906020018083116111bd57829003601f168201915b5050505050905090565b6111ec6116e6565b73ffffffffffffffffffffffffffffffffffffffff1661120a611128565b73ffffffffffffffffffffffffffffffffffffffff1614611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906135cc565b60405180910390fd5b80600e8190555050565b6112726116e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906134cc565b60405180910390fd5b80600560006112ed6116e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661139a6116e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113df919061338f565b60405180910390a35050565b6113fc6113f66116e6565b836117a7565b61143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906136cc565b60405180910390fd5b61144784848484611d99565b50505050565b606061145882611df5565b9050919050565b61115c81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000669c51c4521e0000905090565b6115106116e6565b73ffffffffffffffffffffffffffffffffffffffff1661152e611128565b73ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906135cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb9061342c565b60405180910390fd5b6115fd81611cd3565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611673575061167282611f47565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661176183610c97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117b28261167a565b6117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e8906134ec565b60405180910390fd5b60006117fc83610c97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061186b57508373ffffffffffffffffffffffffffffffffffffffff1661185384610717565b73ffffffffffffffffffffffffffffffffffffffff16145b8061187c575061187b8185611465565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118a582610c97565b73ffffffffffffffffffffffffffffffffffffffff16146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f2906135ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611962906134ac565b60405180910390fd5b611976838383612029565b6119816000826116ee565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119d19190613970565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a28919061384d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c9061356c565b60405180910390fd5b611b7e8161167a565b15611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb59061344c565b60405180910390fd5b611bca60008383612029565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c1a919061384d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611da4848484611885565b611db084848484612039565b611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de69061340c565b60405180910390fd5b50505050565b6060611e008261167a565b611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e369061358c565b60405180910390fd5b6000600a60008481526020019081526020016000208054611e5f90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8b90613a89565b8015611ed85780601f10611ead57610100808354040283529160200191611ed8565b820191906000526020600020905b815481529060010190602001808311611ebb57829003601f168201915b505050505090506000611ee96121d0565b9050600081511415611eff578192505050611f42565b600082511115611f34578082604051602001611f1c9291906132ef565b60405160208183030381529060405292505050611f42565b611f3d84612262565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612022575061202182612309565b5b9050919050565b612034838383612373565b505050565b600061205a8473ffffffffffffffffffffffffffffffffffffffff16612487565b156121c3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120836116e6565b8786866040518563ffffffff1660e01b81526004016120a59493929190613343565b602060405180830381600087803b1580156120bf57600080fd5b505af19250505080156120f057506040513d601f19601f820116820180604052508101906120ed9190612d85565b60015b612173573d8060008114612120576040519150601f19603f3d011682016040523d82523d6000602084013e612125565b606091505b5060008151141561216b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121629061340c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c8565b600190505b949350505050565b6060600d80546121df90613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461220b90613a89565b80156122585780601f1061222d57610100808354040283529160200191612258565b820191906000526020600020905b81548152906001019060200180831161223b57829003601f168201915b5050505050905090565b606061226d8261167a565b6122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a39061360c565b60405180910390fd5b60006122b66121d0565b905060008151116122d65760405180602001604052806000815250612301565b806122e08461249a565b6040516020016122f19291906132ef565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61237e838383612647565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c1576123bc8161264c565b612400565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123ff576123fe8382612695565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124435761243e81612802565b612482565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612481576124808282612945565b5b5b505050565b600080823b905060008111915050919050565b606060008214156124e2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612642565b600082905060005b600082146125145780806124fd90613aec565b915050600a8261250d91906138a3565b91506124ea565b60008167ffffffffffffffff811115612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125885781602001600182028036833780820191505090505b5090505b6000851461263b576001826125a19190613970565b9150600a856125b09190613b5f565b60306125bc919061384d565b60f81b8183815181106125f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561263491906138a3565b945061258c565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126a284610fe8565b6126ac9190613970565b9050600060076000848152602001908152602001600020549050818114612791576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128169190613970565b905060006009600084815260200190815260200160002054905060006008838154811061286c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106128b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612929577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061295083610fe8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546129d090613a89565b90600052602060002090601f0160209004810192826129f25760008555612a39565b82601f10612a0b57805160ff1916838001178555612a39565b82800160010185558215612a39579182015b82811115612a38578251825591602001919060010190612a1d565b5b509050612a469190612a4a565b5090565b5b80821115612a63576000816000905550600101612a4b565b5090565b6000612a7a612a758461379d565b613778565b905082815260208101848484011115612a9257600080fd5b612a9d848285613a47565b509392505050565b6000612ab8612ab3846137ce565b613778565b905082815260208101848484011115612ad057600080fd5b612adb848285613a47565b509392505050565b600081359050612af281614310565b92915050565b600081359050612b0781614327565b92915050565b600081359050612b1c8161433e565b92915050565b600081519050612b318161433e565b92915050565b600082601f830112612b4857600080fd5b8135612b58848260208601612a67565b91505092915050565b600082601f830112612b7257600080fd5b8135612b82848260208601612aa5565b91505092915050565b600081359050612b9a81614355565b92915050565b600081359050612baf8161436c565b92915050565b600060208284031215612bc757600080fd5b6000612bd584828501612ae3565b91505092915050565b60008060408385031215612bf157600080fd5b6000612bff85828601612ae3565b9250506020612c1085828601612ae3565b9150509250929050565b600080600060608486031215612c2f57600080fd5b6000612c3d86828701612ae3565b9350506020612c4e86828701612ae3565b9250506040612c5f86828701612b8b565b9150509250925092565b60008060008060808587031215612c7f57600080fd5b6000612c8d87828801612ae3565b9450506020612c9e87828801612ae3565b9350506040612caf87828801612b8b565b925050606085013567ffffffffffffffff811115612ccc57600080fd5b612cd887828801612b37565b91505092959194509250565b60008060408385031215612cf757600080fd5b6000612d0585828601612ae3565b9250506020612d1685828601612af8565b9150509250929050565b60008060408385031215612d3357600080fd5b6000612d4185828601612ae3565b9250506020612d5285828601612b8b565b9150509250929050565b600060208284031215612d6e57600080fd5b6000612d7c84828501612b0d565b91505092915050565b600060208284031215612d9757600080fd5b6000612da584828501612b22565b91505092915050565b600060208284031215612dc057600080fd5b600082013567ffffffffffffffff811115612dda57600080fd5b612de684828501612b61565b91505092915050565b600060208284031215612e0157600080fd5b6000612e0f84828501612b8b565b91505092915050565b600060208284031215612e2a57600080fd5b6000612e3884828501612ba0565b91505092915050565b612e4a816139a4565b82525050565b612e59816139b6565b82525050565b6000612e6a826137ff565b612e748185613815565b9350612e84818560208601613a56565b612e8d81613c4c565b840191505092915050565b6000612ea38261380a565b612ead8185613831565b9350612ebd818560208601613a56565b612ec681613c4c565b840191505092915050565b6000612edc8261380a565b612ee68185613842565b9350612ef6818560208601613a56565b80840191505092915050565b6000612f0f602b83613831565b9150612f1a82613c5d565b604082019050919050565b6000612f32602c83613831565b9150612f3d82613cac565b604082019050919050565b6000612f55603283613831565b9150612f6082613cfb565b604082019050919050565b6000612f78602683613831565b9150612f8382613d4a565b604082019050919050565b6000612f9b601c83613831565b9150612fa682613d99565b602082019050919050565b6000612fbe601883613831565b9150612fc982613dc2565b602082019050919050565b6000612fe1603d83613831565b9150612fec82613deb565b604082019050919050565b6000613004602483613831565b915061300f82613e3a565b604082019050919050565b6000613027601983613831565b915061303282613e89565b602082019050919050565b600061304a602c83613831565b915061305582613eb2565b604082019050919050565b600061306d603883613831565b915061307882613f01565b604082019050919050565b6000613090602a83613831565b915061309b82613f50565b604082019050919050565b60006130b3602983613831565b91506130be82613f9f565b604082019050919050565b60006130d6602083613831565b91506130e182613fee565b602082019050919050565b60006130f9603183613831565b915061310482614017565b604082019050919050565b600061311c602c83613831565b915061312782614066565b604082019050919050565b600061313f602083613831565b915061314a826140b5565b602082019050919050565b6000613162602983613831565b915061316d826140de565b604082019050919050565b6000613185602f83613831565b91506131908261412d565b604082019050919050565b60006131a8601883613831565b91506131b38261417c565b602082019050919050565b60006131cb602183613831565b91506131d6826141a5565b604082019050919050565b60006131ee601683613831565b91506131f9826141f4565b602082019050919050565b6000613211601483613831565b915061321c8261421d565b602082019050919050565b6000613234601083613831565b915061323f82614246565b602082019050919050565b6000613257600083613826565b91506132628261426f565b600082019050919050565b600061327a603183613831565b915061328582614272565b604082019050919050565b600061329d602c83613831565b91506132a8826142c1565b604082019050919050565b6132bc816139ee565b82525050565b6132cb81613a1c565b82525050565b6132da81613a26565b82525050565b6132e981613a3a565b82525050565b60006132fb8285612ed1565b91506133078284612ed1565b91508190509392505050565b600061331e8261324a565b9150819050919050565b600060208201905061333d6000830184612e41565b92915050565b60006080820190506133586000830187612e41565b6133656020830186612e41565b61337260408301856132c2565b81810360608301526133848184612e5f565b905095945050505050565b60006020820190506133a46000830184612e50565b92915050565b600060208201905081810360008301526133c48184612e98565b905092915050565b600060208201905081810360008301526133e581612f02565b9050919050565b6000602082019050818103600083015261340581612f25565b9050919050565b6000602082019050818103600083015261342581612f48565b9050919050565b6000602082019050818103600083015261344581612f6b565b9050919050565b6000602082019050818103600083015261346581612f8e565b9050919050565b6000602082019050818103600083015261348581612fb1565b9050919050565b600060208201905081810360008301526134a581612fd4565b9050919050565b600060208201905081810360008301526134c581612ff7565b9050919050565b600060208201905081810360008301526134e58161301a565b9050919050565b600060208201905081810360008301526135058161303d565b9050919050565b6000602082019050818103600083015261352581613060565b9050919050565b6000602082019050818103600083015261354581613083565b9050919050565b60006020820190508181036000830152613565816130a6565b9050919050565b60006020820190508181036000830152613585816130c9565b9050919050565b600060208201905081810360008301526135a5816130ec565b9050919050565b600060208201905081810360008301526135c58161310f565b9050919050565b600060208201905081810360008301526135e581613132565b9050919050565b6000602082019050818103600083015261360581613155565b9050919050565b6000602082019050818103600083015261362581613178565b9050919050565b600060208201905081810360008301526136458161319b565b9050919050565b60006020820190508181036000830152613665816131be565b9050919050565b60006020820190508181036000830152613685816131e1565b9050919050565b600060208201905081810360008301526136a581613204565b9050919050565b600060208201905081810360008301526136c581613227565b9050919050565b600060208201905081810360008301526136e58161326d565b9050919050565b6000602082019050818103600083015261370581613290565b9050919050565b600060208201905061372160008301846132b3565b92915050565b600060208201905061373c60008301846132c2565b92915050565b600060208201905061375760008301846132d1565b92915050565b600060208201905061377260008301846132e0565b92915050565b6000613782613793565b905061378e8282613abb565b919050565b6000604051905090565b600067ffffffffffffffff8211156137b8576137b7613c1d565b5b6137c182613c4c565b9050602081019050919050565b600067ffffffffffffffff8211156137e9576137e8613c1d565b5b6137f282613c4c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061385882613a1c565b915061386383613a1c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561389857613897613b90565b5b828201905092915050565b60006138ae82613a1c565b91506138b983613a1c565b9250826138c9576138c8613bbf565b5b828204905092915050565b60006138df82613a1c565b91506138ea83613a1c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561392357613922613b90565b5b828202905092915050565b600061393982613a26565b915061394483613a26565b92508167ffffffffffffffff048311821515161561396557613964613b90565b5b828202905092915050565b600061397b82613a1c565b915061398683613a1c565b92508282101561399957613998613b90565b5b828203905092915050565b60006139af826139fc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a74578082015181840152602081019050613a59565b83811115613a83576000848401525b50505050565b60006002820490506001821680613aa157607f821691505b60208210811415613ab557613ab4613bee565b5b50919050565b613ac482613c4c565b810181811067ffffffffffffffff82111715613ae357613ae2613c1d565b5b80604052505050565b6000613af782613a1c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2a57613b29613b90565b5b600182019050919050565b6000613b4082613a3a565b915060ff821415613b5457613b53613b90565b5b600182019050919050565b6000613b6a82613a1c565b9150613b7583613a1c565b925082613b8557613b84613bbf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614319816139a4565b811461432457600080fd5b50565b614330816139b6565b811461433b57600080fd5b50565b614347816139c2565b811461435257600080fd5b50565b61435e81613a1c565b811461436957600080fd5b50565b61437581613a3a565b811461438057600080fd5b5056fea264697066735822122094b4a51074c36e633ddd1e9bce7f7b9f81fc5448d754a537a7316008b6f6d6da64736f6c63430008030033
Deployed Bytecode Sourcemap
46246:3339:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47191:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26235:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27794:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27317:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38873:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28684:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38541:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47738:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46509:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49322:260;;;;;;;;;;;;;:::i;:::-;;29094:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39063:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47413:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25929:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48025:1044;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25659:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3868:94;;;;;;;;;;;;;:::i;:::-;;3217:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26404:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46712:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28087:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29350:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49081:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46422:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28453:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47887:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4117:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47191:212;47330:4;47359:36;47383:11;47359:23;:36::i;:::-;47352:43;;47191:212;;;:::o;26235:100::-;26289:13;26322:5;26315:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26235:100;:::o;27794:221::-;27870:7;27898:16;27906:7;27898;:16::i;:::-;27890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:15;:24;27999:7;27983:24;;;;;;;;;;;;;;;;;;;;;27976:31;;27794:221;;;:::o;27317:411::-;27398:13;27414:23;27429:7;27414:14;:23::i;:::-;27398:39;;27462:5;27456:11;;:2;:11;;;;27448:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27556:5;27540:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27565:37;27582:5;27589:12;:10;:12::i;:::-;27565:16;:37::i;:::-;27540:62;27518:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27699:21;27708:2;27712:7;27699:8;:21::i;:::-;27317:411;;;:::o;38873:113::-;38934:7;38961:10;:17;;;;38954:24;;38873:113;:::o;28684:339::-;28879:41;28898:12;:10;:12::i;:::-;28912:7;28879:18;:41::i;:::-;28871:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28987:28;28997:4;29003:2;29007:7;28987:9;:28::i;:::-;28684:339;;;:::o;38541:256::-;38638:7;38674:23;38691:5;38674:16;:23::i;:::-;38666:5;:31;38658:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38763:12;:19;38776:5;38763:19;;;;;;;;;;;;;;;:26;38783:5;38763:26;;;;;;;;;;;;38756:33;;38541:256;;;;:::o;47738:87::-;47790:5;47815:2;47808:9;;47738:87;:::o;46509:48::-;;;;:::o;49322:260::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49402:1:::1;49378:21;:25;49370:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49444:12;49462:10;:15;;49485:21;49462:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49443:68;;;49541:4;49530:15;;:7;:15;;;49522:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3508:1;49322:260::o:0;29094:185::-;29232:39;29249:4;29255:2;29259:7;29232:39;;;;;;;;;;;;:16;:39::i;:::-;29094:185;;;:::o;39063:233::-;39138:7;39174:30;:28;:30::i;:::-;39166:5;:38;39158:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39271:10;39282:5;39271:17;;;;;;;;;;;;;;;;;;;;;;;;39264:24;;39063:233;;;:::o;47413:120::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47509:16:::1;47493:13;:32;;;;;;;;;;;;:::i;:::-;;47413:120:::0;:::o;25929:239::-;26001:7;26021:13;26037:7;:16;26045:7;26037:16;;;;;;;;;;;;;;;;;;;;;26021:32;;26089:1;26072:19;;:5;:19;;;;26064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26155:5;26148:12;;;25929:239;;;:::o;48025:1044::-;48120:15;48096:20;;:39;;48088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48194:1;48175:15;:20;;;;48167:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48272:21;:19;:21::i;:::-;48253:40;;:15;:40;;;;48231:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;46457:4;48415:46;;48434:13;:11;:13::i;:::-;48416:15;:31;;;;;;:::i;:::-;48415:46;;48393:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48578:15;48558:35;;:17;:15;:17::i;:::-;:35;;;;:::i;:::-;48544:50;;:9;:50;48522:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;48684:7;48679:191;48701:15;48697:19;;:1;:19;;;48679:191;;;48738:21;:9;:19;:21::i;:::-;48776:17;48796:19;:9;:17;:19::i;:::-;48776:39;;48830:28;48836:10;48848:9;48830:5;:28::i;:::-;48679:191;48718:3;;;;;:::i;:::-;;;;48679:191;;;;48884:6;48891:1;48884:8;;48880:182;48895:19;:9;:17;:19::i;:::-;48893:1;:21;48880:182;;;48935:13;48951:10;48959:1;48951:7;:10::i;:::-;48935:26;;48984:5;48976:23;;:74;49047:1;49025:19;:9;:17;:19::i;:::-;:23;;;;:::i;:::-;49017:3;49014:1;49002:9;:13;;;;:::i;:::-;49001:19;;;;:::i;:::-;49000:49;;;;:::i;:::-;48976:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48880:182;48915:3;;;;;:::i;:::-;;;;48880:182;;;;48025:1044;:::o;25659:208::-;25731:7;25776:1;25759:19;;:5;:19;;;;25751:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25843:9;:16;25853:5;25843:16;;;;;;;;;;;;;;;;25836:23;;25659:208;;;:::o;3868:94::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3933:21:::1;3951:1;3933:9;:21::i;:::-;3868:94::o:0;3217:87::-;3263:7;3290:6;;;;;;;;;;;3283:13;;3217:87;:::o;26404:104::-;26460:13;26493:7;26486:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:104;:::o;46712:119::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46814:9:::1;46791:20;:32;;;;46712:119:::0;:::o;28087:295::-;28202:12;:10;:12::i;:::-;28190:24;;:8;:24;;;;28182:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28302:8;28257:18;:32;28276:12;:10;:12::i;:::-;28257:32;;;;;;;;;;;;;;;:42;28290:8;28257:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28355:8;28326:48;;28341:12;:10;:12::i;:::-;28326:48;;;28365:8;28326:48;;;;;;:::i;:::-;;;;;;;;28087:295;;:::o;29350:328::-;29525:41;29544:12;:10;:12::i;:::-;29558:7;29525:18;:41::i;:::-;29517:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29631:39;29645:4;29651:2;29655:7;29664:5;29631:13;:39::i;:::-;29350:328;;;;:::o;49081:196::-;49208:13;49246:23;49261:7;49246:14;:23::i;:::-;49239:30;;49081:196;;;:::o;46422:39::-;46457:4;46422:39;:::o;28453:164::-;28550:4;28574:18;:25;28593:5;28574:25;;;;;;;;;;;;;;;:35;28600:8;28574:35;;;;;;;;;;;;;;;;;;;;;;;;;28567:42;;28453:164;;;;:::o;47887:104::-;47935:6;47961:22;47954:29;;47887:104;:::o;4117:192::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4226:1:::1;4206:22;;:8;:22;;;;4198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4282:19;4292:8;4282:9;:19::i;:::-;4117:192:::0;:::o;38233:224::-;38335:4;38374:35;38359:50;;;:11;:50;;;;:90;;;;38413:36;38437:11;38413:23;:36::i;:::-;38359:90;38352:97;;38233:224;;;:::o;31188:127::-;31253:4;31305:1;31277:30;;:7;:16;31285:7;31277:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31270:37;;31188:127;;;:::o;2062:98::-;2115:7;2142:10;2135:17;;2062:98;:::o;35170:174::-;35272:2;35245:15;:24;35261:7;35245:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35328:7;35324:2;35290:46;;35299:23;35314:7;35299:14;:23::i;:::-;35290:46;;;;;;;;;;;;35170:174;;:::o;31482:348::-;31575:4;31600:16;31608:7;31600;:16::i;:::-;31592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31676:13;31692:23;31707:7;31692:14;:23::i;:::-;31676:39;;31745:5;31734:16;;:7;:16;;;:51;;;;31778:7;31754:31;;:20;31766:7;31754:11;:20::i;:::-;:31;;;31734:51;:87;;;;31789:32;31806:5;31813:7;31789:16;:32::i;:::-;31734:87;31726:96;;;31482:348;;;;:::o;34474:578::-;34633:4;34606:31;;:23;34621:7;34606:14;:23::i;:::-;:31;;;34598:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34716:1;34702:16;;:2;:16;;;;34694:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34772:39;34793:4;34799:2;34803:7;34772:20;:39::i;:::-;34876:29;34893:1;34897:7;34876:8;:29::i;:::-;34937:1;34918:9;:15;34928:4;34918:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34966:1;34949:9;:13;34959:2;34949:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34997:2;34978:7;:16;34986:7;34978:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35036:7;35032:2;35017:27;;35026:4;35017:27;;;;;;;;;;;;34474:578;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;33166:382::-;33260:1;33246:16;;:2;:16;;;;33238:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33319:16;33327:7;33319;:16::i;:::-;33318:17;33310:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33381:45;33410:1;33414:2;33418:7;33381:20;:45::i;:::-;33456:1;33439:9;:13;33449:2;33439:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33487:2;33468:7;:16;33476:7;33468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33532:7;33528:2;33507:33;;33524:1;33507:33;;;;;;;;;;;;33166:382;;:::o;4317:173::-;4373:16;4392:6;;;;;;;;;;;4373:25;;4418:8;4409:6;;:17;;;;;;;;;;;;;;;;;;4473:8;4442:40;;4463:8;4442:40;;;;;;;;;;;;4317:173;;:::o;30560:315::-;30717:28;30727:4;30733:2;30737:7;30717:9;:28::i;:::-;30764:48;30787:4;30793:2;30797:7;30806:5;30764:22;:48::i;:::-;30756:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30560:315;;;;:::o;44726:679::-;44799:13;44833:16;44841:7;44833;:16::i;:::-;44825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44916:23;44942:10;:19;44953:7;44942:19;;;;;;;;;;;44916:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44972:18;44993:10;:8;:10::i;:::-;44972:31;;45101:1;45085:4;45079:18;:23;45075:72;;;45126:9;45119:16;;;;;;45075:72;45277:1;45257:9;45251:23;:27;45247:108;;;45326:4;45332:9;45309:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45295:48;;;;;;45247:108;45374:23;45389:7;45374:14;:23::i;:::-;45367:30;;;;44726:679;;;;:::o;25290:305::-;25392:4;25444:25;25429:40;;;:11;:40;;;;:105;;;;25501:33;25486:48;;;:11;:48;;;;25429:105;:158;;;;25551:36;25575:11;25551:23;:36::i;:::-;25429:158;25409:178;;25290:305;;;:::o;46841:215::-;47003:45;47030:4;47036:2;47040:7;47003:26;:45::i;:::-;46841:215;;;:::o;35909:803::-;36064:4;36085:15;:2;:13;;;:15::i;:::-;36081:624;;;36137:2;36121:36;;;36158:12;:10;:12::i;:::-;36172:4;36178:7;36187:5;36121:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36117:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36384:1;36367:6;:13;:18;36363:272;;;36410:60;;;;;;;;;;:::i;:::-;;;;;;;;36363:272;36585:6;36579:13;36570:6;36566:2;36562:15;36555:38;36117:533;36254:45;;;36244:55;;;:6;:55;;;;36237:62;;;;;36081:624;36689:4;36682:11;;35909:803;;;;;;;:::o;47541:106::-;47593:13;47626;47619:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47541:106;:::o;26579:334::-;26652:13;26686:16;26694:7;26686;:16::i;:::-;26678:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:21;26791:10;:8;:10::i;:::-;26767:34;;26843:1;26825:7;26819:21;:25;:86;;;;;;;;;;;;;;;;;26871:7;26880:18;:7;:16;:18::i;:::-;26854:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26819:86;26812:93;;;26579:334;;;:::o;6328:157::-;6413:4;6452:25;6437:40;;;:11;:40;;;;6430:47;;6328:157;;;:::o;39909:589::-;40053:45;40080:4;40086:2;40090:7;40053:26;:45::i;:::-;40131:1;40115:18;;:4;:18;;;40111:187;;;40150:40;40182:7;40150:31;:40::i;:::-;40111:187;;;40220:2;40212:10;;:4;:10;;;40208:90;;40239:47;40272:4;40278:7;40239:32;:47::i;:::-;40208:90;40111:187;40326:1;40312:16;;:2;:16;;;40308:183;;;40345:45;40382:7;40345:36;:45::i;:::-;40308:183;;;40418:4;40412:10;;:2;:10;;;40408:83;;40439:40;40467:2;40471:7;40439:27;:40::i;:::-;40408:83;40308:183;39909:589;;;:::o;9374:387::-;9434:4;9642:12;9709:7;9697:20;9689:28;;9752:1;9745:4;:8;9738:15;;;9374:387;;;:::o;6799:723::-;6855:13;7085:1;7076:5;:10;7072:53;;;7103:10;;;;;;;;;;;;;;;;;;;;;7072:53;7135:12;7150:5;7135:20;;7166:14;7191:78;7206:1;7198:4;:9;7191:78;;7224:8;;;;;:::i;:::-;;;;7255:2;7247:10;;;;;:::i;:::-;;;7191:78;;;7279:19;7311:6;7301:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:39;;7329:154;7345:1;7336:5;:10;7329:154;;7373:1;7363:11;;;;;:::i;:::-;;;7440:2;7432:5;:10;;;;:::i;:::-;7419:2;:24;;;;:::i;:::-;7406:39;;7389:6;7396;7389:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7469:2;7460:11;;;;;:::i;:::-;;;7329:154;;;7507:6;7493:21;;;;;6799:723;;;;:::o;37284:126::-;;;;:::o;41221:164::-;41325:10;:17;;;;41298:15;:24;41314:7;41298:24;;;;;;;;;;;:44;;;;41353:10;41369:7;41353:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41221:164;:::o;42012:988::-;42278:22;42328:1;42303:22;42320:4;42303:16;:22::i;:::-;:26;;;;:::i;:::-;42278:51;;42340:18;42361:17;:26;42379:7;42361:26;;;;;;;;;;;;42340:47;;42508:14;42494:10;:28;42490:328;;42539:19;42561:12;:18;42574:4;42561:18;;;;;;;;;;;;;;;:34;42580:14;42561:34;;;;;;;;;;;;42539:56;;42645:11;42612:12;:18;42625:4;42612:18;;;;;;;;;;;;;;;:30;42631:10;42612:30;;;;;;;;;;;:44;;;;42762:10;42729:17;:30;42747:11;42729:30;;;;;;;;;;;:43;;;;42490:328;;42914:17;:26;42932:7;42914:26;;;;;;;;;;;42907:33;;;42958:12;:18;42971:4;42958:18;;;;;;;;;;;;;;;:34;42977:14;42958:34;;;;;;;;;;;42951:41;;;42012:988;;;;:::o;43295:1079::-;43548:22;43593:1;43573:10;:17;;;;:21;;;;:::i;:::-;43548:46;;43605:18;43626:15;:24;43642:7;43626:24;;;;;;;;;;;;43605:45;;43977:19;43999:10;44010:14;43999:26;;;;;;;;;;;;;;;;;;;;;;;;43977:48;;44063:11;44038:10;44049;44038:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44174:10;44143:15;:28;44159:11;44143:28;;;;;;;;;;;:41;;;;44315:15;:24;44331:7;44315:24;;;;;;;;;;;44308:31;;;44350:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43295:1079;;;;:::o;40799:221::-;40884:14;40901:20;40918:2;40901:16;:20::i;:::-;40884:37;;40959:7;40932:12;:16;40945:2;40932:16;;;;;;;;;;;;;;;:24;40949:6;40932:24;;;;;;;;;;;:34;;;;41006:6;40977:17;:26;40995:7;40977:26;;;;;;;;;;;:35;;;;40799:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:135::-;;2091:6;2078:20;2069:29;;2107:31;2132:5;2107:31;:::i;:::-;2059:85;;;;:::o;2150:262::-;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;2274:1;2271;2264:12;2226:2;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2216:196;;;;:::o;2418:407::-;;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2501:324;;;;;:::o;2831:552::-;;;;2973:2;2961:9;2952:7;2948:23;2944:32;2941:2;;;2989:1;2986;2979:12;2941:2;3032:1;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3003:117;3159:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3130:118;3287:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;:::i;:::-;3303:63;;3258:118;2931:452;;;;;:::o;3389:809::-;;;;;3557:3;3545:9;3536:7;3532:23;3528:33;3525:2;;;3574:1;3571;3564:12;3525:2;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;4028:2;4017:9;4013:18;4000:32;4059:18;4051:6;4048:30;4045:2;;;4091:1;4088;4081:12;4045:2;4119:62;4173:7;4164:6;4153:9;4149:22;4119:62;:::i;:::-;4109:72;;3971:220;3515:683;;;;;;;:::o;4204:401::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4342:1;4339;4332:12;4294:2;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4512:2;4538:50;4580:7;4571:6;4560:9;4556:22;4538:50;:::i;:::-;4528:60;;4483:115;4284:321;;;;;:::o;4611:407::-;;;4736:2;4724:9;4715:7;4711:23;4707:32;4704:2;;;4752:1;4749;4742:12;4704:2;4795:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4766:117;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;4694:324;;;;;:::o;5024:260::-;;5131:2;5119:9;5110:7;5106:23;5102:32;5099:2;;;5147:1;5144;5137:12;5099:2;5190:1;5215:52;5259:7;5250:6;5239:9;5235:22;5215:52;:::i;:::-;5205:62;;5161:116;5089:195;;;;:::o;5290:282::-;;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5424:1;5421;5414:12;5376:2;5467:1;5492:63;5547:7;5538:6;5527:9;5523:22;5492:63;:::i;:::-;5482:73;;5438:127;5366:206;;;;:::o;5578:375::-;;5696:2;5684:9;5675:7;5671:23;5667:32;5664:2;;;5712:1;5709;5702:12;5664:2;5783:1;5772:9;5768:17;5755:31;5813:18;5805:6;5802:30;5799:2;;;5845:1;5842;5835:12;5799:2;5873:63;5928:7;5919:6;5908:9;5904:22;5873:63;:::i;:::-;5863:73;;5726:220;5654:299;;;;:::o;5959:262::-;;6067:2;6055:9;6046:7;6042:23;6038:32;6035:2;;;6083:1;6080;6073:12;6035:2;6126:1;6151:53;6196:7;6187:6;6176:9;6172:22;6151:53;:::i;:::-;6141:63;;6097:117;6025:196;;;;:::o;6227:258::-;;6333:2;6321:9;6312:7;6308:23;6304:32;6301:2;;;6349:1;6346;6339:12;6301:2;6392:1;6417:51;6460:7;6451:6;6440:9;6436:22;6417:51;:::i;:::-;6407:61;;6363:115;6291:194;;;;:::o;6491:118::-;6578:24;6596:5;6578:24;:::i;:::-;6573:3;6566:37;6556:53;;:::o;6615:109::-;6696:21;6711:5;6696:21;:::i;:::-;6691:3;6684:34;6674:50;;:::o;6730:360::-;;6844:38;6876:5;6844:38;:::i;:::-;6898:70;6961:6;6956:3;6898:70;:::i;:::-;6891:77;;6977:52;7022:6;7017:3;7010:4;7003:5;6999:16;6977:52;:::i;:::-;7054:29;7076:6;7054:29;:::i;:::-;7049:3;7045:39;7038:46;;6820:270;;;;;:::o;7096:364::-;;7212:39;7245:5;7212:39;:::i;:::-;7267:71;7331:6;7326:3;7267:71;:::i;:::-;7260:78;;7347:52;7392:6;7387:3;7380:4;7373:5;7369:16;7347:52;:::i;:::-;7424:29;7446:6;7424:29;:::i;:::-;7419:3;7415:39;7408:46;;7188:272;;;;;:::o;7466:377::-;;7600:39;7633:5;7600:39;:::i;:::-;7655:89;7737:6;7732:3;7655:89;:::i;:::-;7648:96;;7753:52;7798:6;7793:3;7786:4;7779:5;7775:16;7753:52;:::i;:::-;7830:6;7825:3;7821:16;7814:23;;7576:267;;;;;:::o;7849:366::-;;8012:67;8076:2;8071:3;8012:67;:::i;:::-;8005:74;;8088:93;8177:3;8088:93;:::i;:::-;8206:2;8201:3;8197:12;8190:19;;7995:220;;;:::o;8221:366::-;;8384:67;8448:2;8443:3;8384:67;:::i;:::-;8377:74;;8460:93;8549:3;8460:93;:::i;:::-;8578:2;8573:3;8569:12;8562:19;;8367:220;;;:::o;8593:366::-;;8756:67;8820:2;8815:3;8756:67;:::i;:::-;8749:74;;8832:93;8921:3;8832:93;:::i;:::-;8950:2;8945:3;8941:12;8934:19;;8739:220;;;:::o;8965:366::-;;9128:67;9192:2;9187:3;9128:67;:::i;:::-;9121:74;;9204:93;9293:3;9204:93;:::i;:::-;9322:2;9317:3;9313:12;9306:19;;9111:220;;;:::o;9337:366::-;;9500:67;9564:2;9559:3;9500:67;:::i;:::-;9493:74;;9576:93;9665:3;9576:93;:::i;:::-;9694:2;9689:3;9685:12;9678:19;;9483:220;;;:::o;9709:366::-;;9872:67;9936:2;9931:3;9872:67;:::i;:::-;9865:74;;9948:93;10037:3;9948:93;:::i;:::-;10066:2;10061:3;10057:12;10050:19;;9855:220;;;:::o;10081:366::-;;10244:67;10308:2;10303:3;10244:67;:::i;:::-;10237:74;;10320:93;10409:3;10320:93;:::i;:::-;10438:2;10433:3;10429:12;10422:19;;10227:220;;;:::o;10453:366::-;;10616:67;10680:2;10675:3;10616:67;:::i;:::-;10609:74;;10692:93;10781:3;10692:93;:::i;:::-;10810:2;10805:3;10801:12;10794:19;;10599:220;;;:::o;10825:366::-;;10988:67;11052:2;11047:3;10988:67;:::i;:::-;10981:74;;11064:93;11153:3;11064:93;:::i;:::-;11182:2;11177:3;11173:12;11166:19;;10971:220;;;:::o;11197:366::-;;11360:67;11424:2;11419:3;11360:67;:::i;:::-;11353:74;;11436:93;11525:3;11436:93;:::i;:::-;11554:2;11549:3;11545:12;11538:19;;11343:220;;;:::o;11569:366::-;;11732:67;11796:2;11791:3;11732:67;:::i;:::-;11725:74;;11808:93;11897:3;11808:93;:::i;:::-;11926:2;11921:3;11917:12;11910:19;;11715:220;;;:::o;11941:366::-;;12104:67;12168:2;12163:3;12104:67;:::i;:::-;12097:74;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;12087:220;;;:::o;12313:366::-;;12476:67;12540:2;12535:3;12476:67;:::i;:::-;12469:74;;12552:93;12641:3;12552:93;:::i;:::-;12670:2;12665:3;12661:12;12654:19;;12459:220;;;:::o;12685:366::-;;12848:67;12912:2;12907:3;12848:67;:::i;:::-;12841:74;;12924:93;13013:3;12924:93;:::i;:::-;13042:2;13037:3;13033:12;13026:19;;12831:220;;;:::o;13057:366::-;;13220:67;13284:2;13279:3;13220:67;:::i;:::-;13213:74;;13296:93;13385:3;13296:93;:::i;:::-;13414:2;13409:3;13405:12;13398:19;;13203:220;;;:::o;13429:366::-;;13592:67;13656:2;13651:3;13592:67;:::i;:::-;13585:74;;13668:93;13757:3;13668:93;:::i;:::-;13786:2;13781:3;13777:12;13770:19;;13575:220;;;:::o;13801:366::-;;13964:67;14028:2;14023:3;13964:67;:::i;:::-;13957:74;;14040:93;14129:3;14040:93;:::i;:::-;14158:2;14153:3;14149:12;14142:19;;13947:220;;;:::o;14173:366::-;;14336:67;14400:2;14395:3;14336:67;:::i;:::-;14329:74;;14412:93;14501:3;14412:93;:::i;:::-;14530:2;14525:3;14521:12;14514:19;;14319:220;;;:::o;14545:366::-;;14708:67;14772:2;14767:3;14708:67;:::i;:::-;14701:74;;14784:93;14873:3;14784:93;:::i;:::-;14902:2;14897:3;14893:12;14886:19;;14691:220;;;:::o;14917:366::-;;15080:67;15144:2;15139:3;15080:67;:::i;:::-;15073:74;;15156:93;15245:3;15156:93;:::i;:::-;15274:2;15269:3;15265:12;15258:19;;15063:220;;;:::o;15289:366::-;;15452:67;15516:2;15511:3;15452:67;:::i;:::-;15445:74;;15528:93;15617:3;15528:93;:::i;:::-;15646:2;15641:3;15637:12;15630:19;;15435:220;;;:::o;15661:366::-;;15824:67;15888:2;15883:3;15824:67;:::i;:::-;15817:74;;15900:93;15989:3;15900:93;:::i;:::-;16018:2;16013:3;16009:12;16002:19;;15807:220;;;:::o;16033:366::-;;16196:67;16260:2;16255:3;16196:67;:::i;:::-;16189:74;;16272:93;16361:3;16272:93;:::i;:::-;16390:2;16385:3;16381:12;16374:19;;16179:220;;;:::o;16405:366::-;;16568:67;16632:2;16627:3;16568:67;:::i;:::-;16561:74;;16644:93;16733:3;16644:93;:::i;:::-;16762:2;16757:3;16753:12;16746:19;;16551:220;;;:::o;16777:398::-;;16957:83;17038:1;17033:3;16957:83;:::i;:::-;16950:90;;17049:93;17138:3;17049:93;:::i;:::-;17167:1;17162:3;17158:11;17151:18;;16940:235;;;:::o;17181:366::-;;17344:67;17408:2;17403:3;17344:67;:::i;:::-;17337:74;;17420:93;17509:3;17420:93;:::i;:::-;17538:2;17533:3;17529:12;17522:19;;17327:220;;;:::o;17553:366::-;;17716:67;17780:2;17775:3;17716:67;:::i;:::-;17709:74;;17792:93;17881:3;17792:93;:::i;:::-;17910:2;17905:3;17901:12;17894:19;;17699:220;;;:::o;17925:115::-;18010:23;18027:5;18010:23;:::i;:::-;18005:3;17998:36;17988:52;;:::o;18046:118::-;18133:24;18151:5;18133:24;:::i;:::-;18128:3;18121:37;18111:53;;:::o;18170:115::-;18255:23;18272:5;18255:23;:::i;:::-;18250:3;18243:36;18233:52;;:::o;18291:112::-;18374:22;18390:5;18374:22;:::i;:::-;18369:3;18362:35;18352:51;;:::o;18409:435::-;;18611:95;18702:3;18693:6;18611:95;:::i;:::-;18604:102;;18723:95;18814:3;18805:6;18723:95;:::i;:::-;18716:102;;18835:3;18828:10;;18593:251;;;;;:::o;18850:379::-;;19056:147;19199:3;19056:147;:::i;:::-;19049:154;;19220:3;19213:10;;19038:191;;;:::o;19235:222::-;;19366:2;19355:9;19351:18;19343:26;;19379:71;19447:1;19436:9;19432:17;19423:6;19379:71;:::i;:::-;19333:124;;;;:::o;19463:640::-;;19696:3;19685:9;19681:19;19673:27;;19710:71;19778:1;19767:9;19763:17;19754:6;19710:71;:::i;:::-;19791:72;19859:2;19848:9;19844:18;19835:6;19791:72;:::i;:::-;19873;19941:2;19930:9;19926:18;19917:6;19873:72;:::i;:::-;19992:9;19986:4;19982:20;19977:2;19966:9;19962:18;19955:48;20020:76;20091:4;20082:6;20020:76;:::i;:::-;20012:84;;19663:440;;;;;;;:::o;20109:210::-;;20234:2;20223:9;20219:18;20211:26;;20247:65;20309:1;20298:9;20294:17;20285:6;20247:65;:::i;:::-;20201:118;;;;:::o;20325:313::-;;20476:2;20465:9;20461:18;20453:26;;20525:9;20519:4;20515:20;20511:1;20500:9;20496:17;20489:47;20553:78;20626:4;20617:6;20553:78;:::i;:::-;20545:86;;20443:195;;;;:::o;20644:419::-;;20848:2;20837:9;20833:18;20825:26;;20897:9;20891:4;20887:20;20883:1;20872:9;20868:17;20861:47;20925:131;21051:4;20925:131;:::i;:::-;20917:139;;20815:248;;;:::o;21069:419::-;;21273:2;21262:9;21258:18;21250:26;;21322:9;21316:4;21312:20;21308:1;21297:9;21293:17;21286:47;21350:131;21476:4;21350:131;:::i;:::-;21342:139;;21240:248;;;:::o;21494:419::-;;21698:2;21687:9;21683:18;21675:26;;21747:9;21741:4;21737:20;21733:1;21722:9;21718:17;21711:47;21775:131;21901:4;21775:131;:::i;:::-;21767:139;;21665:248;;;:::o;21919:419::-;;22123:2;22112:9;22108:18;22100:26;;22172:9;22166:4;22162:20;22158:1;22147:9;22143:17;22136:47;22200:131;22326:4;22200:131;:::i;:::-;22192:139;;22090:248;;;:::o;22344:419::-;;22548:2;22537:9;22533:18;22525:26;;22597:9;22591:4;22587:20;22583:1;22572:9;22568:17;22561:47;22625:131;22751:4;22625:131;:::i;:::-;22617:139;;22515:248;;;:::o;22769:419::-;;22973:2;22962:9;22958:18;22950:26;;23022:9;23016:4;23012:20;23008:1;22997:9;22993:17;22986:47;23050:131;23176:4;23050:131;:::i;:::-;23042:139;;22940:248;;;:::o;23194:419::-;;23398:2;23387:9;23383:18;23375:26;;23447:9;23441:4;23437:20;23433:1;23422:9;23418:17;23411:47;23475:131;23601:4;23475:131;:::i;:::-;23467:139;;23365:248;;;:::o;23619:419::-;;23823:2;23812:9;23808:18;23800:26;;23872:9;23866:4;23862:20;23858:1;23847:9;23843:17;23836:47;23900:131;24026:4;23900:131;:::i;:::-;23892:139;;23790:248;;;:::o;24044:419::-;;24248:2;24237:9;24233:18;24225:26;;24297:9;24291:4;24287:20;24283:1;24272:9;24268:17;24261:47;24325:131;24451:4;24325:131;:::i;:::-;24317:139;;24215:248;;;:::o;24469:419::-;;24673:2;24662:9;24658:18;24650:26;;24722:9;24716:4;24712:20;24708:1;24697:9;24693:17;24686:47;24750:131;24876:4;24750:131;:::i;:::-;24742:139;;24640:248;;;:::o;24894:419::-;;25098:2;25087:9;25083:18;25075:26;;25147:9;25141:4;25137:20;25133:1;25122:9;25118:17;25111:47;25175:131;25301:4;25175:131;:::i;:::-;25167:139;;25065:248;;;:::o;25319:419::-;;25523:2;25512:9;25508:18;25500:26;;25572:9;25566:4;25562:20;25558:1;25547:9;25543:17;25536:47;25600:131;25726:4;25600:131;:::i;:::-;25592:139;;25490:248;;;:::o;25744:419::-;;25948:2;25937:9;25933:18;25925:26;;25997:9;25991:4;25987:20;25983:1;25972:9;25968:17;25961:47;26025:131;26151:4;26025:131;:::i;:::-;26017:139;;25915:248;;;:::o;26169:419::-;;26373:2;26362:9;26358:18;26350:26;;26422:9;26416:4;26412:20;26408:1;26397:9;26393:17;26386:47;26450:131;26576:4;26450:131;:::i;:::-;26442:139;;26340:248;;;:::o;26594:419::-;;26798:2;26787:9;26783:18;26775:26;;26847:9;26841:4;26837:20;26833:1;26822:9;26818:17;26811:47;26875:131;27001:4;26875:131;:::i;:::-;26867:139;;26765:248;;;:::o;27019:419::-;;27223:2;27212:9;27208:18;27200:26;;27272:9;27266:4;27262:20;27258:1;27247:9;27243:17;27236:47;27300:131;27426:4;27300:131;:::i;:::-;27292:139;;27190:248;;;:::o;27444:419::-;;27648:2;27637:9;27633:18;27625:26;;27697:9;27691:4;27687:20;27683:1;27672:9;27668:17;27661:47;27725:131;27851:4;27725:131;:::i;:::-;27717:139;;27615:248;;;:::o;27869:419::-;;28073:2;28062:9;28058:18;28050:26;;28122:9;28116:4;28112:20;28108:1;28097:9;28093:17;28086:47;28150:131;28276:4;28150:131;:::i;:::-;28142:139;;28040:248;;;:::o;28294:419::-;;28498:2;28487:9;28483:18;28475:26;;28547:9;28541:4;28537:20;28533:1;28522:9;28518:17;28511:47;28575:131;28701:4;28575:131;:::i;:::-;28567:139;;28465:248;;;:::o;28719:419::-;;28923:2;28912:9;28908:18;28900:26;;28972:9;28966:4;28962:20;28958:1;28947:9;28943:17;28936:47;29000:131;29126:4;29000:131;:::i;:::-;28992:139;;28890:248;;;:::o;29144:419::-;;29348:2;29337:9;29333:18;29325:26;;29397:9;29391:4;29387:20;29383:1;29372:9;29368:17;29361:47;29425:131;29551:4;29425:131;:::i;:::-;29417:139;;29315:248;;;:::o;29569:419::-;;29773:2;29762:9;29758:18;29750:26;;29822:9;29816:4;29812:20;29808:1;29797:9;29793:17;29786:47;29850:131;29976:4;29850:131;:::i;:::-;29842:139;;29740:248;;;:::o;29994:419::-;;30198:2;30187:9;30183:18;30175:26;;30247:9;30241:4;30237:20;30233:1;30222:9;30218:17;30211:47;30275:131;30401:4;30275:131;:::i;:::-;30267:139;;30165:248;;;:::o;30419:419::-;;30623:2;30612:9;30608:18;30600:26;;30672:9;30666:4;30662:20;30658:1;30647:9;30643:17;30636:47;30700:131;30826:4;30700:131;:::i;:::-;30692:139;;30590:248;;;:::o;30844:419::-;;31048:2;31037:9;31033:18;31025:26;;31097:9;31091:4;31087:20;31083:1;31072:9;31068:17;31061:47;31125:131;31251:4;31125:131;:::i;:::-;31117:139;;31015:248;;;:::o;31269:419::-;;31473:2;31462:9;31458:18;31450:26;;31522:9;31516:4;31512:20;31508:1;31497:9;31493:17;31486:47;31550:131;31676:4;31550:131;:::i;:::-;31542:139;;31440:248;;;:::o;31694:218::-;;31823:2;31812:9;31808:18;31800:26;;31836:69;31902:1;31891:9;31887:17;31878:6;31836:69;:::i;:::-;31790:122;;;;:::o;31918:222::-;;32049:2;32038:9;32034:18;32026:26;;32062:71;32130:1;32119:9;32115:17;32106:6;32062:71;:::i;:::-;32016:124;;;;:::o;32146:218::-;;32275:2;32264:9;32260:18;32252:26;;32288:69;32354:1;32343:9;32339:17;32330:6;32288:69;:::i;:::-;32242:122;;;;:::o;32370:214::-;;32497:2;32486:9;32482:18;32474:26;;32510:67;32574:1;32563:9;32559:17;32550:6;32510:67;:::i;:::-;32464:120;;;;:::o;32590:129::-;;32651:20;;:::i;:::-;32641:30;;32680:33;32708:4;32700:6;32680:33;:::i;:::-;32631:88;;;:::o;32725:75::-;;32791:2;32785:9;32775:19;;32765:35;:::o;32806:307::-;;32957:18;32949:6;32946:30;32943:2;;;32979:18;;:::i;:::-;32943:2;33017:29;33039:6;33017:29;:::i;:::-;33009:37;;33101:4;33095;33091:15;33083:23;;32872:241;;;:::o;33119:308::-;;33271:18;33263:6;33260:30;33257:2;;;33293:18;;:::i;:::-;33257:2;33331:29;33353:6;33331:29;:::i;:::-;33323:37;;33415:4;33409;33405:15;33397:23;;33186:241;;;:::o;33433:98::-;;33518:5;33512:12;33502:22;;33491:40;;;:::o;33537:99::-;;33623:5;33617:12;33607:22;;33596:40;;;:::o;33642:168::-;;33759:6;33754:3;33747:19;33799:4;33794:3;33790:14;33775:29;;33737:73;;;;:::o;33816:147::-;;33954:3;33939:18;;33929:34;;;;:::o;33969:169::-;;34087:6;34082:3;34075:19;34127:4;34122:3;34118:14;34103:29;;34065:73;;;;:::o;34144:148::-;;34283:3;34268:18;;34258:34;;;;:::o;34298:305::-;;34357:20;34375:1;34357:20;:::i;:::-;34352:25;;34391:20;34409:1;34391:20;:::i;:::-;34386:25;;34545:1;34477:66;34473:74;34470:1;34467:81;34464:2;;;34551:18;;:::i;:::-;34464:2;34595:1;34592;34588:9;34581:16;;34342:261;;;;:::o;34609:185::-;;34666:20;34684:1;34666:20;:::i;:::-;34661:25;;34700:20;34718:1;34700:20;:::i;:::-;34695:25;;34739:1;34729:2;;34744:18;;:::i;:::-;34729:2;34786:1;34783;34779:9;34774:14;;34651:143;;;;:::o;34800:348::-;;34863:20;34881:1;34863:20;:::i;:::-;34858:25;;34897:20;34915:1;34897:20;:::i;:::-;34892:25;;35085:1;35017:66;35013:74;35010:1;35007:81;35002:1;34995:9;34988:17;34984:105;34981:2;;;35092:18;;:::i;:::-;34981:2;35140:1;35137;35133:9;35122:20;;34848:300;;;;:::o;35154:297::-;;35216:19;35233:1;35216:19;:::i;:::-;35211:24;;35249:19;35266:1;35249:19;:::i;:::-;35244:24;;35388:1;35368:18;35364:26;35361:1;35358:33;35353:1;35346:9;35339:17;35335:57;35332:2;;;35395:18;;:::i;:::-;35332:2;35443:1;35440;35436:9;35425:20;;35201:250;;;;:::o;35457:191::-;;35517:20;35535:1;35517:20;:::i;:::-;35512:25;;35551:20;35569:1;35551:20;:::i;:::-;35546:25;;35590:1;35587;35584:8;35581:2;;;35595:18;;:::i;:::-;35581:2;35640:1;35637;35633:9;35625:17;;35502:146;;;;:::o;35654:96::-;;35720:24;35738:5;35720:24;:::i;:::-;35709:35;;35699:51;;;:::o;35756:90::-;;35833:5;35826:13;35819:21;35808:32;;35798:48;;;:::o;35852:149::-;;35928:66;35921:5;35917:78;35906:89;;35896:105;;;:::o;36007:89::-;;36083:6;36076:5;36072:18;36061:29;;36051:45;;;:::o;36102:126::-;;36179:42;36172:5;36168:54;36157:65;;36147:81;;;:::o;36234:77::-;;36300:5;36289:16;;36279:32;;;:::o;36317:101::-;;36393:18;36386:5;36382:30;36371:41;;36361:57;;;:::o;36424:86::-;;36499:4;36492:5;36488:16;36477:27;;36467:43;;;:::o;36516:154::-;36600:6;36595:3;36590;36577:30;36662:1;36653:6;36648:3;36644:16;36637:27;36567:103;;;:::o;36676:307::-;36744:1;36754:113;36768:6;36765:1;36762:13;36754:113;;;36853:1;36848:3;36844:11;36838:18;36834:1;36829:3;36825:11;36818:39;36790:2;36787:1;36783:10;36778:15;;36754:113;;;36885:6;36882:1;36879:13;36876:2;;;36965:1;36956:6;36951:3;36947:16;36940:27;36876:2;36725:258;;;;:::o;36989:320::-;;37070:1;37064:4;37060:12;37050:22;;37117:1;37111:4;37107:12;37138:18;37128:2;;37194:4;37186:6;37182:17;37172:27;;37128:2;37256;37248:6;37245:14;37225:18;37222:38;37219:2;;;37275:18;;:::i;:::-;37219:2;37040:269;;;;:::o;37315:281::-;37398:27;37420:4;37398:27;:::i;:::-;37390:6;37386:40;37528:6;37516:10;37513:22;37492:18;37480:10;37477:34;37474:62;37471:2;;;37539:18;;:::i;:::-;37471:2;37579:10;37575:2;37568:22;37358:238;;;:::o;37602:233::-;;37664:24;37682:5;37664:24;:::i;:::-;37655:33;;37710:66;37703:5;37700:77;37697:2;;;37780:18;;:::i;:::-;37697:2;37827:1;37820:5;37816:13;37809:20;;37645:190;;;:::o;37841:167::-;;37901:22;37917:5;37901:22;:::i;:::-;37892:31;;37945:4;37938:5;37935:15;37932:2;;;37953:18;;:::i;:::-;37932:2;38000:1;37993:5;37989:13;37982:20;;37882:126;;;:::o;38014:176::-;;38063:20;38081:1;38063:20;:::i;:::-;38058:25;;38097:20;38115:1;38097:20;:::i;:::-;38092:25;;38136:1;38126:2;;38141:18;;:::i;:::-;38126:2;38182:1;38179;38175:9;38170:14;;38048:142;;;;:::o;38196:180::-;38244:77;38241:1;38234:88;38341:4;38338:1;38331:15;38365:4;38362:1;38355:15;38382:180;38430:77;38427:1;38420:88;38527:4;38524:1;38517:15;38551:4;38548:1;38541:15;38568:180;38616:77;38613:1;38606:88;38713:4;38710:1;38703:15;38737:4;38734:1;38727:15;38754:180;38802:77;38799:1;38792:88;38899:4;38896:1;38889:15;38923:4;38920:1;38913:15;38940:102;;39032:2;39028:7;39023:2;39016:5;39012:14;39008:28;38998:38;;38988:54;;;:::o;39048:230::-;39188:34;39184:1;39176:6;39172:14;39165:58;39257:13;39252:2;39244:6;39240:15;39233:38;39154:124;:::o;39284:231::-;39424:34;39420:1;39412:6;39408:14;39401:58;39493:14;39488:2;39480:6;39476:15;39469:39;39390:125;:::o;39521:237::-;39661:34;39657:1;39649:6;39645:14;39638:58;39730:20;39725:2;39717:6;39713:15;39706:45;39627:131;:::o;39764:225::-;39904:34;39900:1;39892:6;39888:14;39881:58;39973:8;39968:2;39960:6;39956:15;39949:33;39870:119;:::o;39995:178::-;40135:30;40131:1;40123:6;40119:14;40112:54;40101:72;:::o;40179:174::-;40319:26;40315:1;40307:6;40303:14;40296:50;40285:68;:::o;40359:248::-;40499:34;40495:1;40487:6;40483:14;40476:58;40568:31;40563:2;40555:6;40551:15;40544:56;40465:142;:::o;40613:223::-;40753:34;40749:1;40741:6;40737:14;40730:58;40822:6;40817:2;40809:6;40805:15;40798:31;40719:117;:::o;40842:175::-;40982:27;40978:1;40970:6;40966:14;40959:51;40948:69;:::o;41023:231::-;41163:34;41159:1;41151:6;41147:14;41140:58;41232:14;41227:2;41219:6;41215:15;41208:39;41129:125;:::o;41260:243::-;41400:34;41396:1;41388:6;41384:14;41377:58;41469:26;41464:2;41456:6;41452:15;41445:51;41366:137;:::o;41509:229::-;41649:34;41645:1;41637:6;41633:14;41626:58;41718:12;41713:2;41705:6;41701:15;41694:37;41615:123;:::o;41744:228::-;41884:34;41880:1;41872:6;41868:14;41861:58;41953:11;41948:2;41940:6;41936:15;41929:36;41850:122;:::o;41978:182::-;42118:34;42114:1;42106:6;42102:14;42095:58;42084:76;:::o;42166:236::-;42306:34;42302:1;42294:6;42290:14;42283:58;42375:19;42370:2;42362:6;42358:15;42351:44;42272:130;:::o;42408:231::-;42548:34;42544:1;42536:6;42532:14;42525:58;42617:14;42612:2;42604:6;42600:15;42593:39;42514:125;:::o;42645:182::-;42785:34;42781:1;42773:6;42769:14;42762:58;42751:76;:::o;42833:228::-;42973:34;42969:1;42961:6;42957:14;42950:58;43042:11;43037:2;43029:6;43025:15;43018:36;42939:122;:::o;43067:234::-;43207:34;43203:1;43195:6;43191:14;43184:58;43276:17;43271:2;43263:6;43259:15;43252:42;43173:128;:::o;43307:174::-;43447:26;43443:1;43435:6;43431:14;43424:50;43413:68;:::o;43487:220::-;43627:34;43623:1;43615:6;43611:14;43604:58;43696:3;43691:2;43683:6;43679:15;43672:28;43593:114;:::o;43713:172::-;43853:24;43849:1;43841:6;43837:14;43830:48;43819:66;:::o;43891:170::-;44031:22;44027:1;44019:6;44015:14;44008:46;43997:64;:::o;44067:166::-;44207:18;44203:1;44195:6;44191:14;44184:42;44173:60;:::o;44239:114::-;44345:8;:::o;44359:236::-;44499:34;44495:1;44487:6;44483:14;44476:58;44568:19;44563:2;44555:6;44551:15;44544:44;44465:130;:::o;44601:231::-;44741:34;44737:1;44729:6;44725:14;44718:58;44810:14;44805:2;44797:6;44793:15;44786:39;44707:125;:::o;44838:122::-;44911:24;44929:5;44911:24;:::i;:::-;44904:5;44901:35;44891:2;;44950:1;44947;44940:12;44891:2;44881:79;:::o;44966:116::-;45036:21;45051:5;45036:21;:::i;:::-;45029:5;45026:32;45016:2;;45072:1;45069;45062:12;45016:2;45006:76;:::o;45088:120::-;45160:23;45177:5;45160:23;:::i;:::-;45153:5;45150:34;45140:2;;45198:1;45195;45188:12;45140:2;45130:78;:::o;45214:122::-;45287:24;45305:5;45287:24;:::i;:::-;45280:5;45277:35;45267:2;;45326:1;45323;45316:12;45267:2;45257:79;:::o;45342:118::-;45413:22;45429:5;45413:22;:::i;:::-;45406:5;45403:33;45393:2;;45450:1;45447;45440:12;45393:2;45383:77;:::o
Swarm Source
ipfs://94b4a51074c36e633ddd1e9bce7f7b9f81fc5448d754a537a7316008b6f6d6da
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.