ERC-721
Overview
Max Total Supply
79 FNS
Holders
56
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
1 FNSLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FantomsArtBasicNameSystem
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-01-15 */ pragma solidity >=0.8.0 <0.9.0; //SPDX-License-Identifier: Unlisence //IERC20 interface interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom( address sender, address recipient, uint amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } 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); } } 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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } 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); } } 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); } 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; } } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } abstract contract ERC165Storage is ERC165 { /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } 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; } 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); } 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); } interface IWrappedFantom { // deposit wraps received FTM tokens as wFTM in 1:1 ratio by minting // the received amount of FTMs in wFTM on the sender's address. function deposit() external payable returns (uint256); } 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); } 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.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 {} } 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(); } } contract FantomsArtBasicNameSystem is ERC721Enumerable, ERC165Storage, Ownable { using Counters for Counters.Counter; using Address for address; Counters.Counter private _tokenIdCounter; address private constant wFTMa = 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83; IWrappedFantom private constant wFTMc = IWrappedFantom(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); IERC20 private constant wFTM = IERC20(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); address private constant MULTISIG_TREASURY = 0x87f385d152944689f92Ed523e9e5E9Bd58Ea62ef; uint256 public FEE_AMT = 5 ether; // bytes4 constants for ERC165 bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; event UpdatedFees(uint256 _newFee); event UpdatedURI(string _newURI); string private base = ""; //just in case constructor() ERC721("fantoms.art Basic Fantom Name System", "FNS") { // ERC165 Interfaces Supported _registerInterface(_INTERFACE_ID_ERC721); } struct FantomsArtName { string _name; uint256 _tokenId; address _owner; } mapping(uint256 => FantomsArtName) private _tokenIdToStruct; mapping(string => uint256) private _reverseSearch; mapping(address => string) private _search; function changeFee(uint256 _newFee) public onlyOwner { FEE_AMT = _newFee; emit UpdatedFees(_newFee); } function registerName(string memory _name) public payable { require(msg.value == FEE_AMT, "FNS: You need to pay the right amount >:(");// VvV require(keccak256(abi.encodePacked(_search[msg.sender])) != keccak256(abi.encodePacked(uint(0))), "FNS: You cant own more than one name"); // the answer is --> NO <-- wFTMc.deposit{value: msg.value}(); // /\ wFTM.transfer(MULTISIG_TREASURY, wFTM.balanceOf(address(this))); FantomsArtName memory _tempName = FantomsArtName(_name,_tokenIdCounter.current(),msg.sender); _search[msg.sender] = _name; _tokenIdToStruct[_tokenIdCounter.current()] = _tempName; _reverseSearch[_name] = _tokenIdCounter.current(); _safeMint(msg.sender, _tokenIdCounter.current()); _tokenIdCounter.increment(); } function getNameFromOwner(address _owner) public view returns(string memory) { return _search[_owner]; } function getOwnerOfName(string memory _name) public view returns(address) { uint256 _searchFor = _reverseSearch[_name]; return ownerOf(_searchFor); } function getOwnerOfTokenId(uint256 _tokenID) public view returns(address) { return ownerOf(_tokenID); } function setBaseURI(string memory _newURI) public onlyOwner { base = _newURI; emit UpdatedURI(_newURI); } function _baseURI() internal view override returns (string memory) { return base; } //idk why function sendFTMToName(string memory _name) public payable { payable(getOwnerOfName(_name)).transfer(msg.value); } function sendERC20ToName(address _token, uint256 _amount, string memory _name) public { IERC20(_token).transferFrom(msg.sender,getOwnerOfName(_name),_amount); } function sendERC721ToName(address _token, uint256 _tokenId, string memory _name) public { IERC721(_token).safeTransferFrom(msg.sender,getOwnerOfName(_name),_tokenId); } function transferName(address _from, address _to, string memory _name) public { require(keccak256(abi.encodePacked(_search[_to])) != keccak256(abi.encodePacked(uint(0))),"FNS: You cant overwrite someones name, idiot"); string memory _searchFromOld = _search[_from]; uint256 _reverseFromOld = _reverseSearch[_searchFromOld]; FantomsArtName memory _idk = _tokenIdToStruct[_reverseFromOld]; _search[_to] = _search[_from]; _search[_from] = string(abi.encodePacked(uint(0))); _reverseSearch[_search[_to]] = _reverseSearch[_searchFromOld]; _reverseSearch[_searchFromOld] = uint256(0); _tokenIdToStruct[_reverseSearch[_search[_to]]] = _tokenIdToStruct[_reverseFromOld]; _tokenIdToStruct[_reverseFromOld] = FantomsArtName(string(abi.encodePacked(uint(0))),0,address(0)); safeTransferFrom(_from,_to,_reverseFromOld); } // @notice solidity required override for supportsInterface(bytes4) function supportsInterface(bytes4 interfaceId) public view override(ERC165Storage,ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"UpdatedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_newURI","type":"string"}],"name":"UpdatedURI","type":"event"},{"inputs":[],"name":"FEE_AMT","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":"_newFee","type":"uint256"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getNameFromOwner","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getOwnerOfName","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"getOwnerOfTokenId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"string","name":"_name","type":"string"}],"name":"registerName","outputs":[],"stateMutability":"payable","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":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"sendERC20ToName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"sendERC721ToName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"sendFTMToName","outputs":[],"stateMutability":"payable","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":"_newURI","type":"string"}],"name":"setBaseURI","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":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"transferName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052674563918244f40000600d5560405180602001604052806000815250600e908051906020019062000037929190620002af565b503480156200004557600080fd5b5060405180606001604052806024815260200162005196602491396040518060400160405280600381526020017f464e5300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ae929190620002af565b508060019080519060200190620000c7929190620002af565b505050620000ea620000de6200010860201b60201c565b6200011060201b60201c565b620001026380ac58cd60e01b620001d660201b60201c565b62000447565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002399062000386565b60405180910390fd5b6001600a6000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054620002bd90620003b9565b90600052602060002090601f016020900481019282620002e157600085556200032d565b82601f10620002fc57805160ff19168380011785556200032d565b828001600101855582156200032d579182015b828111156200032c5782518255916020019190600101906200030f565b5b5090506200033c919062000340565b5090565b5b808211156200035b57600081600090555060010162000341565b5090565b60006200036e601c83620003a8565b91506200037b826200041e565b602082019050919050565b60006020820190508181036000830152620003a1816200035f565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620003d257607f821691505b60208210811415620003e957620003e8620003ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b614d3f80620004576000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f757806395d89b4111610095578063b88d4fde11610064578063b88d4fde1461068e578063c87b56dd146106b7578063e985e9c5146106f4578063f2fde38b14610731576101cd565b806395d89b41146105d4578063a22cb465146105ff578063ace4ee2814610628578063b465fe7e14610651576101cd565b806370a08231116100d157806370a0823114610518578063715018a614610555578063817581291461056c5780638da5cb5b146105a9576101cd565b80636352211e14610487578063635740d6146104c45780636a1db1bf146104ef576101cd565b806318160ddd1161016f57806342842e0e1161013e57806342842e0e146103bb57806348688b3c146103e45780634f6ccce71461042157806355f804b31461045e576101cd565b806318160ddd1461030157806323b872dd1461032c5780632f745c59146103555780633706da3d14610392576101cd565b80630830602b116101ab5780630830602b14610277578063095ea7b3146102935780630b6476c4146102bc5780631309de15146102e5576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906138e6565b61075a565b6040516102069190613f5c565b60405180910390f35b34801561021b57600080fd5b5061022461076c565b6040516102319190613f77565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613989565b6107fe565b60405161026e9190613e95565b60405180910390f35b610291600480360381019061028c9190613940565b610883565b005b34801561029f57600080fd5b506102ba60048036038101906102b5919061380a565b610cea565b005b3480156102c857600080fd5b506102e360048036038101906102de919061384a565b610e02565b005b6102ff60048036038101906102fa9190613940565b610e9f565b005b34801561030d57600080fd5b50610316610ef1565b6040516103239190614239565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906136f4565b610efe565b005b34801561036157600080fd5b5061037c6004803603810190610377919061380a565b610f5e565b6040516103899190614239565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190613685565b611003565b005b3480156103c757600080fd5b506103e260048036038101906103dd91906136f4565b611681565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613989565b6116a1565b6040516104189190613e95565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613989565b6116b3565b6040516104559190614239565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613940565b611724565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613989565b6117f1565b6040516104bb9190613e95565b60405180910390f35b3480156104d057600080fd5b506104d96118a3565b6040516104e69190614239565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190613989565b6118a9565b005b34801561052457600080fd5b5061053f600480360381019061053a9190613618565b611966565b60405161054c9190614239565b60405180910390f35b34801561056157600080fd5b5061056a611a1e565b005b34801561057857600080fd5b50610593600480360381019061058e9190613618565b611aa6565b6040516105a09190613f77565b60405180910390f35b3480156105b557600080fd5b506105be611b77565b6040516105cb9190613e95565b60405180910390f35b3480156105e057600080fd5b506105e9611ba1565b6040516105f69190613f77565b60405180910390f35b34801561060b57600080fd5b50610626600480360381019061062191906137ca565b611c33565b005b34801561063457600080fd5b5061064f600480360381019061064a919061384a565b611db4565b005b34801561065d57600080fd5b5061067860048036038101906106739190613940565b611e30565b6040516106859190613e95565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613747565b611e65565b005b3480156106c357600080fd5b506106de60048036038101906106d99190613989565b611ec7565b6040516106eb9190613f77565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190613645565b611f6e565b6040516107289190613f5c565b60405180910390f35b34801561073d57600080fd5b5061075860048036038101906107539190613618565b612002565b005b6000610765826120fa565b9050919050565b60606000805461077b906144a4565b80601f01602080910402602001604051908101604052809291908181526020018280546107a7906144a4565b80156107f45780601f106107c9576101008083540402835291602001916107f4565b820191906000526020600020905b8154815290600101906020018083116107d757829003601f168201915b5050505050905090565b600061080982612172565b610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614139565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d5434146108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be90614079565b60405180910390fd5b60006040516020016108d99190613e7a565b60405160208183030381529060405280519060200120601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405160200161093e9190613e63565b604051602081830303815290604052805190602001201415610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90614119565b60405180910390fd5b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b1580156109f157600080fd5b505af1158015610a05573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a2a91906139b6565b507321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7387f385d152944689f92ed523e9e5e9bd58ea62ef7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610abd9190613e95565b60206040518083038186803b158015610ad557600080fd5b505afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906139b6565b6040518363ffffffff1660e01b8152600401610b2a929190613f33565b602060405180830381600087803b158015610b4457600080fd5b505af1158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c91906138b9565b5060006040518060600160405280838152602001610b9a600c6121de565b81526020013373ffffffffffffffffffffffffffffffffffffffff16815250905081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610c0e9291906132e8565b5080600f6000610c1e600c6121de565b81526020019081526020016000206000820151816000019080519060200190610c489291906132e8565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050610ca7600c6121de565b601083604051610cb79190613e28565b908152602001604051809103902081905550610cdc33610cd7600c6121de565b6121ec565b610ce6600c61220a565b5050565b6000610cf5826117f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906141b9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d85612220565b73ffffffffffffffffffffffffffffffffffffffff161480610db45750610db381610dae612220565b611f6e565b5b610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea90614099565b60405180910390fd5b610dfd8383612228565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd33610e2884611e30565b856040518463ffffffff1660e01b8152600401610e4793929190613eb0565b602060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9991906138b9565b50505050565b610ea881611e30565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610eed573d6000803e3d6000fd5b5050565b6000600880549050905090565b610f0f610f09612220565b826122e1565b610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906141d9565b60405180910390fd5b610f598383836123bf565b505050565b6000610f6983611966565b8210610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190613f99565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006040516020016110159190613e7a565b60405160208183030381529060405280519060200120601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405160200161107a9190613e63565b6040516020818303038152906040528051906020012014156110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890614219565b60405180910390fd5b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805461111d906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611149906144a4565b80156111965780601f1061116b57610100808354040283529160200191611196565b820191906000526020600020905b81548152906001019060200180831161117957829003601f168201915b5050505050905060006010826040516111af9190613e28565b90815260200160405180910390205490506000600f60008381526020019081526020016000206040518060600160405290816000820180546111f0906144a4565b80601f016020809104026020016040519081016040528092919081815260200182805461121c906144a4565b80156112695780601f1061123e57610100808354040283529160200191611269565b820191906000526020600020905b81548152906001019060200180831161124c57829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090805461135e906144a4565b61136992919061336e565b50600060405160200161137c9190613e7a565b604051602081830303815290604052601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090805190602001906113dd9291906132e8565b506010836040516113ee9190613e28565b9081526020016040518091039020546010601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405161144b9190613e63565b908152602001604051809103902081905550600060108460405161146f9190613e28565b908152602001604051809103902081905550600f6000838152602001908152602001600020600f60006010601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040516114e69190613e63565b90815260200160405180910390205481526020019081526020016000206000820181600001908054611517906144a4565b6115229291906133fb565b50600182015481600101556002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050604051806060016040528060006040516020016115b49190613e7a565b604051602081830303815290604052815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600f600084815260200190815260200160002060008201518160000190805190602001906116199291906132e8565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050611679868684611681565b505050505050565b61169c83838360405180602001604052806000815250611e65565b505050565b60006116ac826117f1565b9050919050565b60006116bd610ef1565b82106116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f5906141f9565b60405180910390fd5b6008828154811061171257611711614647565b5b90600052602060002001549050919050565b61172c612220565b73ffffffffffffffffffffffffffffffffffffffff1661174a611b77565b73ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179790614159565b60405180910390fd5b80600e90805190602001906117b69291906132e8565b507fbabd00c52f3ac8b66511ad0c5d9680f0417ad32bf6c8fede4cb2d45820353bc5816040516117e69190613f77565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906140d9565b60405180910390fd5b80915050919050565b600d5481565b6118b1612220565b73ffffffffffffffffffffffffffffffffffffffff166118cf611b77565b73ffffffffffffffffffffffffffffffffffffffff1614611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614159565b60405180910390fd5b80600d819055507f23992233fdf8aa7c4d439beeb9b02b4afbd958297af2b04893df54fcb731aae58160405161195b9190614239565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce906140b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a26612220565b73ffffffffffffffffffffffffffffffffffffffff16611a44611b77565b73ffffffffffffffffffffffffffffffffffffffff1614611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614159565b60405180910390fd5b611aa4600061261b565b565b6060601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054611af2906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1e906144a4565b8015611b6b5780601f10611b4057610100808354040283529160200191611b6b565b820191906000526020600020905b815481529060010190602001808311611b4e57829003601f168201915b50505050509050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611bb0906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdc906144a4565b8015611c295780601f10611bfe57610100808354040283529160200191611c29565b820191906000526020600020905b815481529060010190602001808311611c0c57829003601f168201915b5050505050905090565b611c3b612220565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614039565b60405180910390fd5b8060056000611cb6612220565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d63612220565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da89190613f5c565b60405180910390a35050565b8273ffffffffffffffffffffffffffffffffffffffff166342842e0e33611dda84611e30565b856040518463ffffffff1660e01b8152600401611df993929190613eb0565b600060405180830381600087803b158015611e1357600080fd5b505af1158015611e27573d6000803e3d6000fd5b50505050505050565b600080601083604051611e439190613e28565b9081526020016040518091039020549050611e5d816117f1565b915050919050565b611e76611e70612220565b836122e1565b611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac906141d9565b60405180910390fd5b611ec1848484846126e1565b50505050565b6060611ed282612172565b611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614199565b60405180910390fd5b6000611f1b61273d565b90506000815111611f3b5760405180602001604052806000815250611f66565b80611f45846127cf565b604051602001611f56929190613e3f565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61200a612220565b73ffffffffffffffffffffffffffffffffffffffff16612028611b77565b73ffffffffffffffffffffffffffffffffffffffff161461207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614159565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e590613fd9565b60405180910390fd5b6120f78161261b565b50565b600061210582612930565b8061216b5750600a6000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600081600001549050919050565b6122068282604051806020016040528060008152506129aa565b5050565b6001816000016000828254019250508190555050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661229b836117f1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122ec82612172565b61232b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232290614059565b60405180910390fd5b6000612336836117f1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a557508373ffffffffffffffffffffffffffffffffffffffff1661238d846107fe565b73ffffffffffffffffffffffffffffffffffffffff16145b806123b657506123b58185611f6e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123df826117f1565b73ffffffffffffffffffffffffffffffffffffffff1614612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c90614179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c90614019565b60405180910390fd5b6124b0838383612a05565b6124bb600082612228565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461250b91906143ba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125629190614333565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126ec8484846123bf565b6126f884848484612b19565b612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e90613fb9565b60405180910390fd5b50505050565b6060600e805461274c906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054612778906144a4565b80156127c55780601f1061279a576101008083540402835291602001916127c5565b820191906000526020600020905b8154815290600101906020018083116127a857829003601f168201915b5050505050905090565b60606000821415612817576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061292b565b600082905060005b6000821461284957808061283290614507565b915050600a826128429190614389565b915061281f565b60008167ffffffffffffffff81111561286557612864614676565b5b6040519080825280601f01601f1916602001820160405280156128975781602001600182028036833780820191505090505b5090505b60008514612924576001826128b091906143ba565b9150600a856128bf919061455a565b60306128cb9190614333565b60f81b8183815181106128e1576128e0614647565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561291d9190614389565b945061289b565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129a357506129a282612cb0565b5b9050919050565b6129b48383612d92565b6129c16000848484612b19565b612a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f790613fb9565b60405180910390fd5b505050565b612a10838383612f60565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a5357612a4e81612f65565b612a92565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a9157612a908382612fae565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad557612ad08161311b565b612b14565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1357612b1282826131ec565b5b5b505050565b6000612b3a8473ffffffffffffffffffffffffffffffffffffffff1661326b565b15612ca3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b63612220565b8786866040518563ffffffff1660e01b8152600401612b859493929190613ee7565b602060405180830381600087803b158015612b9f57600080fd5b505af1925050508015612bd057506040513d601f19601f82011682018060405250810190612bcd9190613913565b60015b612c53573d8060008114612c00576040519150601f19603f3d011682016040523d82523d6000602084013e612c05565b606091505b50600081511415612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290613fb9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ca8565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d8b5750612d8a8261327e565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df9906140f9565b60405180910390fd5b612e0b81612172565b15612e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4290613ff9565b60405180910390fd5b612e5760008383612a05565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ea79190614333565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fbb84611966565b612fc591906143ba565b90506000600760008481526020019081526020016000205490508181146130aa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061312f91906143ba565b905060006009600084815260200190815260200160002054905060006008838154811061315f5761315e614647565b5b90600052602060002001549050806008838154811061318157613180614647565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131d0576131cf614618565b5b6001900381819060005260206000200160009055905550505050565b60006131f783611966565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546132f4906144a4565b90600052602060002090601f016020900481019282613316576000855561335d565b82601f1061332f57805160ff191683800117855561335d565b8280016001018555821561335d579182015b8281111561335c578251825591602001919060010190613341565b5b50905061336a9190613488565b5090565b82805461337a906144a4565b90600052602060002090601f01602090048101928261339c57600085556133ea565b82601f106133ad57805485556133ea565b828001600101855582156133ea57600052602060002091601f016020900482015b828111156133e95782548255916001019190600101906133ce565b5b5090506133f79190613488565b5090565b828054613407906144a4565b90600052602060002090601f0160209004810192826134295760008555613477565b82601f1061343a5780548555613477565b8280016001018555821561347757600052602060002091601f016020900482015b8281111561347657825482559160010191906001019061345b565b5b5090506134849190613488565b5090565b5b808211156134a1576000816000905550600101613489565b5090565b60006134b86134b384614279565b614254565b9050828152602081018484840111156134d4576134d36146aa565b5b6134df848285614462565b509392505050565b60006134fa6134f5846142aa565b614254565b905082815260208101848484011115613516576135156146aa565b5b613521848285614462565b509392505050565b60008135905061353881614cad565b92915050565b60008135905061354d81614cc4565b92915050565b60008151905061356281614cc4565b92915050565b60008135905061357781614cdb565b92915050565b60008151905061358c81614cdb565b92915050565b600082601f8301126135a7576135a66146a5565b5b81356135b78482602086016134a5565b91505092915050565b600082601f8301126135d5576135d46146a5565b5b81356135e58482602086016134e7565b91505092915050565b6000813590506135fd81614cf2565b92915050565b60008151905061361281614cf2565b92915050565b60006020828403121561362e5761362d6146b4565b5b600061363c84828501613529565b91505092915050565b6000806040838503121561365c5761365b6146b4565b5b600061366a85828601613529565b925050602061367b85828601613529565b9150509250929050565b60008060006060848603121561369e5761369d6146b4565b5b60006136ac86828701613529565b93505060206136bd86828701613529565b925050604084013567ffffffffffffffff8111156136de576136dd6146af565b5b6136ea868287016135c0565b9150509250925092565b60008060006060848603121561370d5761370c6146b4565b5b600061371b86828701613529565b935050602061372c86828701613529565b925050604061373d868287016135ee565b9150509250925092565b60008060008060808587031215613761576137606146b4565b5b600061376f87828801613529565b945050602061378087828801613529565b9350506040613791878288016135ee565b925050606085013567ffffffffffffffff8111156137b2576137b16146af565b5b6137be87828801613592565b91505092959194509250565b600080604083850312156137e1576137e06146b4565b5b60006137ef85828601613529565b92505060206138008582860161353e565b9150509250929050565b60008060408385031215613821576138206146b4565b5b600061382f85828601613529565b9250506020613840858286016135ee565b9150509250929050565b600080600060608486031215613863576138626146b4565b5b600061387186828701613529565b9350506020613882868287016135ee565b925050604084013567ffffffffffffffff8111156138a3576138a26146af565b5b6138af868287016135c0565b9150509250925092565b6000602082840312156138cf576138ce6146b4565b5b60006138dd84828501613553565b91505092915050565b6000602082840312156138fc576138fb6146b4565b5b600061390a84828501613568565b91505092915050565b600060208284031215613929576139286146b4565b5b60006139378482850161357d565b91505092915050565b600060208284031215613956576139556146b4565b5b600082013567ffffffffffffffff811115613974576139736146af565b5b613980848285016135c0565b91505092915050565b60006020828403121561399f5761399e6146b4565b5b60006139ad848285016135ee565b91505092915050565b6000602082840312156139cc576139cb6146b4565b5b60006139da84828501613603565b91505092915050565b6139ec816143ee565b82525050565b6139fb81614400565b82525050565b6000613a0c826142f0565b613a168185614306565b9350613a26818560208601614471565b613a2f816146b9565b840191505092915050565b6000613a45826142fb565b613a4f8185614317565b9350613a5f818560208601614471565b613a68816146b9565b840191505092915050565b6000613a7e826142fb565b613a888185614328565b9350613a98818560208601614471565b80840191505092915050565b60008154613ab1816144a4565b613abb8186614328565b94506001821660008114613ad65760018114613ae757613b1a565b60ff19831686528186019350613b1a565b613af0856142db565b60005b83811015613b1257815481890152600182019150602081019050613af3565b838801955050505b50505092915050565b6000613b30602b83614317565b9150613b3b826146ca565b604082019050919050565b6000613b53603283614317565b9150613b5e82614719565b604082019050919050565b6000613b76602683614317565b9150613b8182614768565b604082019050919050565b6000613b99601c83614317565b9150613ba4826147b7565b602082019050919050565b6000613bbc602483614317565b9150613bc7826147e0565b604082019050919050565b6000613bdf601983614317565b9150613bea8261482f565b602082019050919050565b6000613c02602c83614317565b9150613c0d82614858565b604082019050919050565b6000613c25602983614317565b9150613c30826148a7565b604082019050919050565b6000613c48603883614317565b9150613c53826148f6565b604082019050919050565b6000613c6b602a83614317565b9150613c7682614945565b604082019050919050565b6000613c8e602983614317565b9150613c9982614994565b604082019050919050565b6000613cb1602083614317565b9150613cbc826149e3565b602082019050919050565b6000613cd4602483614317565b9150613cdf82614a0c565b604082019050919050565b6000613cf7602c83614317565b9150613d0282614a5b565b604082019050919050565b6000613d1a602083614317565b9150613d2582614aaa565b602082019050919050565b6000613d3d602983614317565b9150613d4882614ad3565b604082019050919050565b6000613d60602f83614317565b9150613d6b82614b22565b604082019050919050565b6000613d83602183614317565b9150613d8e82614b71565b604082019050919050565b6000613da6603183614317565b9150613db182614bc0565b604082019050919050565b6000613dc9602c83614317565b9150613dd482614c0f565b604082019050919050565b6000613dec602c83614317565b9150613df782614c5e565b604082019050919050565b613e0b81614458565b82525050565b613e22613e1d82614458565b614550565b82525050565b6000613e348284613a73565b915081905092915050565b6000613e4b8285613a73565b9150613e578284613a73565b91508190509392505050565b6000613e6f8284613aa4565b915081905092915050565b6000613e868284613e11565b60208201915081905092915050565b6000602082019050613eaa60008301846139e3565b92915050565b6000606082019050613ec560008301866139e3565b613ed260208301856139e3565b613edf6040830184613e02565b949350505050565b6000608082019050613efc60008301876139e3565b613f0960208301866139e3565b613f166040830185613e02565b8181036060830152613f288184613a01565b905095945050505050565b6000604082019050613f4860008301856139e3565b613f556020830184613e02565b9392505050565b6000602082019050613f7160008301846139f2565b92915050565b60006020820190508181036000830152613f918184613a3a565b905092915050565b60006020820190508181036000830152613fb281613b23565b9050919050565b60006020820190508181036000830152613fd281613b46565b9050919050565b60006020820190508181036000830152613ff281613b69565b9050919050565b6000602082019050818103600083015261401281613b8c565b9050919050565b6000602082019050818103600083015261403281613baf565b9050919050565b6000602082019050818103600083015261405281613bd2565b9050919050565b6000602082019050818103600083015261407281613bf5565b9050919050565b6000602082019050818103600083015261409281613c18565b9050919050565b600060208201905081810360008301526140b281613c3b565b9050919050565b600060208201905081810360008301526140d281613c5e565b9050919050565b600060208201905081810360008301526140f281613c81565b9050919050565b6000602082019050818103600083015261411281613ca4565b9050919050565b6000602082019050818103600083015261413281613cc7565b9050919050565b6000602082019050818103600083015261415281613cea565b9050919050565b6000602082019050818103600083015261417281613d0d565b9050919050565b6000602082019050818103600083015261419281613d30565b9050919050565b600060208201905081810360008301526141b281613d53565b9050919050565b600060208201905081810360008301526141d281613d76565b9050919050565b600060208201905081810360008301526141f281613d99565b9050919050565b6000602082019050818103600083015261421281613dbc565b9050919050565b6000602082019050818103600083015261423281613ddf565b9050919050565b600060208201905061424e6000830184613e02565b92915050565b600061425e61426f565b905061426a82826144d6565b919050565b6000604051905090565b600067ffffffffffffffff82111561429457614293614676565b5b61429d826146b9565b9050602081019050919050565b600067ffffffffffffffff8211156142c5576142c4614676565b5b6142ce826146b9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061433e82614458565b915061434983614458565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561437e5761437d61458b565b5b828201905092915050565b600061439482614458565b915061439f83614458565b9250826143af576143ae6145ba565b5b828204905092915050565b60006143c582614458565b91506143d083614458565b9250828210156143e3576143e261458b565b5b828203905092915050565b60006143f982614438565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561448f578082015181840152602081019050614474565b8381111561449e576000848401525b50505050565b600060028204905060018216806144bc57607f821691505b602082108114156144d0576144cf6145e9565b5b50919050565b6144df826146b9565b810181811067ffffffffffffffff821117156144fe576144fd614676565b5b80604052505050565b600061451282614458565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145455761454461458b565b5b600182019050919050565b6000819050919050565b600061456582614458565b915061457083614458565b9250826145805761457f6145ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f464e533a20596f75206e65656420746f2070617920746865207269676874206160008201527f6d6f756e74203e3a280000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f464e533a20596f752063616e74206f776e206d6f7265207468616e206f6e652060008201527f6e616d6500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f464e533a20596f752063616e74206f766572777269746520736f6d656f6e657360008201527f206e616d652c206964696f740000000000000000000000000000000000000000602082015250565b614cb6816143ee565b8114614cc157600080fd5b50565b614ccd81614400565b8114614cd857600080fd5b50565b614ce48161440c565b8114614cef57600080fd5b50565b614cfb81614458565b8114614d0657600080fd5b5056fea264697066735822122014903971e6056bf1c2215c55b19c4516dc81bcefdf52c1ce4b747ca4024a0d1664736f6c6343000807003366616e746f6d732e6172742042617369632046616e746f6d204e616d652053797374656d
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636352211e116100f757806395d89b4111610095578063b88d4fde11610064578063b88d4fde1461068e578063c87b56dd146106b7578063e985e9c5146106f4578063f2fde38b14610731576101cd565b806395d89b41146105d4578063a22cb465146105ff578063ace4ee2814610628578063b465fe7e14610651576101cd565b806370a08231116100d157806370a0823114610518578063715018a614610555578063817581291461056c5780638da5cb5b146105a9576101cd565b80636352211e14610487578063635740d6146104c45780636a1db1bf146104ef576101cd565b806318160ddd1161016f57806342842e0e1161013e57806342842e0e146103bb57806348688b3c146103e45780634f6ccce71461042157806355f804b31461045e576101cd565b806318160ddd1461030157806323b872dd1461032c5780632f745c59146103555780633706da3d14610392576101cd565b80630830602b116101ab5780630830602b14610277578063095ea7b3146102935780630b6476c4146102bc5780631309de15146102e5576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906138e6565b61075a565b6040516102069190613f5c565b60405180910390f35b34801561021b57600080fd5b5061022461076c565b6040516102319190613f77565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613989565b6107fe565b60405161026e9190613e95565b60405180910390f35b610291600480360381019061028c9190613940565b610883565b005b34801561029f57600080fd5b506102ba60048036038101906102b5919061380a565b610cea565b005b3480156102c857600080fd5b506102e360048036038101906102de919061384a565b610e02565b005b6102ff60048036038101906102fa9190613940565b610e9f565b005b34801561030d57600080fd5b50610316610ef1565b6040516103239190614239565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906136f4565b610efe565b005b34801561036157600080fd5b5061037c6004803603810190610377919061380a565b610f5e565b6040516103899190614239565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190613685565b611003565b005b3480156103c757600080fd5b506103e260048036038101906103dd91906136f4565b611681565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613989565b6116a1565b6040516104189190613e95565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613989565b6116b3565b6040516104559190614239565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613940565b611724565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613989565b6117f1565b6040516104bb9190613e95565b60405180910390f35b3480156104d057600080fd5b506104d96118a3565b6040516104e69190614239565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190613989565b6118a9565b005b34801561052457600080fd5b5061053f600480360381019061053a9190613618565b611966565b60405161054c9190614239565b60405180910390f35b34801561056157600080fd5b5061056a611a1e565b005b34801561057857600080fd5b50610593600480360381019061058e9190613618565b611aa6565b6040516105a09190613f77565b60405180910390f35b3480156105b557600080fd5b506105be611b77565b6040516105cb9190613e95565b60405180910390f35b3480156105e057600080fd5b506105e9611ba1565b6040516105f69190613f77565b60405180910390f35b34801561060b57600080fd5b50610626600480360381019061062191906137ca565b611c33565b005b34801561063457600080fd5b5061064f600480360381019061064a919061384a565b611db4565b005b34801561065d57600080fd5b5061067860048036038101906106739190613940565b611e30565b6040516106859190613e95565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190613747565b611e65565b005b3480156106c357600080fd5b506106de60048036038101906106d99190613989565b611ec7565b6040516106eb9190613f77565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190613645565b611f6e565b6040516107289190613f5c565b60405180910390f35b34801561073d57600080fd5b5061075860048036038101906107539190613618565b612002565b005b6000610765826120fa565b9050919050565b60606000805461077b906144a4565b80601f01602080910402602001604051908101604052809291908181526020018280546107a7906144a4565b80156107f45780601f106107c9576101008083540402835291602001916107f4565b820191906000526020600020905b8154815290600101906020018083116107d757829003601f168201915b5050505050905090565b600061080982612172565b610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614139565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d5434146108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be90614079565b60405180910390fd5b60006040516020016108d99190613e7a565b60405160208183030381529060405280519060200120601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405160200161093e9190613e63565b604051602081830303815290604052805190602001201415610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90614119565b60405180910390fd5b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b1580156109f157600080fd5b505af1158015610a05573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a2a91906139b6565b507321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7387f385d152944689f92ed523e9e5e9bd58ea62ef7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610abd9190613e95565b60206040518083038186803b158015610ad557600080fd5b505afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906139b6565b6040518363ffffffff1660e01b8152600401610b2a929190613f33565b602060405180830381600087803b158015610b4457600080fd5b505af1158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c91906138b9565b5060006040518060600160405280838152602001610b9a600c6121de565b81526020013373ffffffffffffffffffffffffffffffffffffffff16815250905081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610c0e9291906132e8565b5080600f6000610c1e600c6121de565b81526020019081526020016000206000820151816000019080519060200190610c489291906132e8565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050610ca7600c6121de565b601083604051610cb79190613e28565b908152602001604051809103902081905550610cdc33610cd7600c6121de565b6121ec565b610ce6600c61220a565b5050565b6000610cf5826117f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906141b9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d85612220565b73ffffffffffffffffffffffffffffffffffffffff161480610db45750610db381610dae612220565b611f6e565b5b610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea90614099565b60405180910390fd5b610dfd8383612228565b505050565b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd33610e2884611e30565b856040518463ffffffff1660e01b8152600401610e4793929190613eb0565b602060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9991906138b9565b50505050565b610ea881611e30565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610eed573d6000803e3d6000fd5b5050565b6000600880549050905090565b610f0f610f09612220565b826122e1565b610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906141d9565b60405180910390fd5b610f598383836123bf565b505050565b6000610f6983611966565b8210610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190613f99565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006040516020016110159190613e7a565b60405160208183030381529060405280519060200120601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405160200161107a9190613e63565b6040516020818303038152906040528051906020012014156110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890614219565b60405180910390fd5b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805461111d906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611149906144a4565b80156111965780601f1061116b57610100808354040283529160200191611196565b820191906000526020600020905b81548152906001019060200180831161117957829003601f168201915b5050505050905060006010826040516111af9190613e28565b90815260200160405180910390205490506000600f60008381526020019081526020016000206040518060600160405290816000820180546111f0906144a4565b80601f016020809104026020016040519081016040528092919081815260200182805461121c906144a4565b80156112695780601f1061123e57610100808354040283529160200191611269565b820191906000526020600020905b81548152906001019060200180831161124c57829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090805461135e906144a4565b61136992919061336e565b50600060405160200161137c9190613e7a565b604051602081830303815290604052601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090805190602001906113dd9291906132e8565b506010836040516113ee9190613e28565b9081526020016040518091039020546010601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405161144b9190613e63565b908152602001604051809103902081905550600060108460405161146f9190613e28565b908152602001604051809103902081905550600f6000838152602001908152602001600020600f60006010601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040516114e69190613e63565b90815260200160405180910390205481526020019081526020016000206000820181600001908054611517906144a4565b6115229291906133fb565b50600182015481600101556002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050604051806060016040528060006040516020016115b49190613e7a565b604051602081830303815290604052815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600f600084815260200190815260200160002060008201518160000190805190602001906116199291906132e8565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050611679868684611681565b505050505050565b61169c83838360405180602001604052806000815250611e65565b505050565b60006116ac826117f1565b9050919050565b60006116bd610ef1565b82106116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f5906141f9565b60405180910390fd5b6008828154811061171257611711614647565b5b90600052602060002001549050919050565b61172c612220565b73ffffffffffffffffffffffffffffffffffffffff1661174a611b77565b73ffffffffffffffffffffffffffffffffffffffff16146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179790614159565b60405180910390fd5b80600e90805190602001906117b69291906132e8565b507fbabd00c52f3ac8b66511ad0c5d9680f0417ad32bf6c8fede4cb2d45820353bc5816040516117e69190613f77565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906140d9565b60405180910390fd5b80915050919050565b600d5481565b6118b1612220565b73ffffffffffffffffffffffffffffffffffffffff166118cf611b77565b73ffffffffffffffffffffffffffffffffffffffff1614611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614159565b60405180910390fd5b80600d819055507f23992233fdf8aa7c4d439beeb9b02b4afbd958297af2b04893df54fcb731aae58160405161195b9190614239565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce906140b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a26612220565b73ffffffffffffffffffffffffffffffffffffffff16611a44611b77565b73ffffffffffffffffffffffffffffffffffffffff1614611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614159565b60405180910390fd5b611aa4600061261b565b565b6060601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054611af2906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1e906144a4565b8015611b6b5780601f10611b4057610100808354040283529160200191611b6b565b820191906000526020600020905b815481529060010190602001808311611b4e57829003601f168201915b50505050509050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611bb0906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdc906144a4565b8015611c295780601f10611bfe57610100808354040283529160200191611c29565b820191906000526020600020905b815481529060010190602001808311611c0c57829003601f168201915b5050505050905090565b611c3b612220565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614039565b60405180910390fd5b8060056000611cb6612220565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d63612220565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da89190613f5c565b60405180910390a35050565b8273ffffffffffffffffffffffffffffffffffffffff166342842e0e33611dda84611e30565b856040518463ffffffff1660e01b8152600401611df993929190613eb0565b600060405180830381600087803b158015611e1357600080fd5b505af1158015611e27573d6000803e3d6000fd5b50505050505050565b600080601083604051611e439190613e28565b9081526020016040518091039020549050611e5d816117f1565b915050919050565b611e76611e70612220565b836122e1565b611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac906141d9565b60405180910390fd5b611ec1848484846126e1565b50505050565b6060611ed282612172565b611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614199565b60405180910390fd5b6000611f1b61273d565b90506000815111611f3b5760405180602001604052806000815250611f66565b80611f45846127cf565b604051602001611f56929190613e3f565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61200a612220565b73ffffffffffffffffffffffffffffffffffffffff16612028611b77565b73ffffffffffffffffffffffffffffffffffffffff161461207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614159565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e590613fd9565b60405180910390fd5b6120f78161261b565b50565b600061210582612930565b8061216b5750600a6000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600081600001549050919050565b6122068282604051806020016040528060008152506129aa565b5050565b6001816000016000828254019250508190555050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661229b836117f1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122ec82612172565b61232b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232290614059565b60405180910390fd5b6000612336836117f1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a557508373ffffffffffffffffffffffffffffffffffffffff1661238d846107fe565b73ffffffffffffffffffffffffffffffffffffffff16145b806123b657506123b58185611f6e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123df826117f1565b73ffffffffffffffffffffffffffffffffffffffff1614612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c90614179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c90614019565b60405180910390fd5b6124b0838383612a05565b6124bb600082612228565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461250b91906143ba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125629190614333565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126ec8484846123bf565b6126f884848484612b19565b612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e90613fb9565b60405180910390fd5b50505050565b6060600e805461274c906144a4565b80601f0160208091040260200160405190810160405280929190818152602001828054612778906144a4565b80156127c55780601f1061279a576101008083540402835291602001916127c5565b820191906000526020600020905b8154815290600101906020018083116127a857829003601f168201915b5050505050905090565b60606000821415612817576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061292b565b600082905060005b6000821461284957808061283290614507565b915050600a826128429190614389565b915061281f565b60008167ffffffffffffffff81111561286557612864614676565b5b6040519080825280601f01601f1916602001820160405280156128975781602001600182028036833780820191505090505b5090505b60008514612924576001826128b091906143ba565b9150600a856128bf919061455a565b60306128cb9190614333565b60f81b8183815181106128e1576128e0614647565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561291d9190614389565b945061289b565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129a357506129a282612cb0565b5b9050919050565b6129b48383612d92565b6129c16000848484612b19565b612a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f790613fb9565b60405180910390fd5b505050565b612a10838383612f60565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a5357612a4e81612f65565b612a92565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a9157612a908382612fae565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad557612ad08161311b565b612b14565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1357612b1282826131ec565b5b5b505050565b6000612b3a8473ffffffffffffffffffffffffffffffffffffffff1661326b565b15612ca3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b63612220565b8786866040518563ffffffff1660e01b8152600401612b859493929190613ee7565b602060405180830381600087803b158015612b9f57600080fd5b505af1925050508015612bd057506040513d601f19601f82011682018060405250810190612bcd9190613913565b60015b612c53573d8060008114612c00576040519150601f19603f3d011682016040523d82523d6000602084013e612c05565b606091505b50600081511415612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290613fb9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ca8565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d8b5750612d8a8261327e565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df9906140f9565b60405180910390fd5b612e0b81612172565b15612e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4290613ff9565b60405180910390fd5b612e5760008383612a05565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ea79190614333565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fbb84611966565b612fc591906143ba565b90506000600760008481526020019081526020016000205490508181146130aa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061312f91906143ba565b905060006009600084815260200190815260200160002054905060006008838154811061315f5761315e614647565b5b90600052602060002001549050806008838154811061318157613180614647565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131d0576131cf614618565b5b6001900381819060005260206000200160009055905550505050565b60006131f783611966565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546132f4906144a4565b90600052602060002090601f016020900481019282613316576000855561335d565b82601f1061332f57805160ff191683800117855561335d565b8280016001018555821561335d579182015b8281111561335c578251825591602001919060010190613341565b5b50905061336a9190613488565b5090565b82805461337a906144a4565b90600052602060002090601f01602090048101928261339c57600085556133ea565b82601f106133ad57805485556133ea565b828001600101855582156133ea57600052602060002091601f016020900482015b828111156133e95782548255916001019190600101906133ce565b5b5090506133f79190613488565b5090565b828054613407906144a4565b90600052602060002090601f0160209004810192826134295760008555613477565b82601f1061343a5780548555613477565b8280016001018555821561347757600052602060002091601f016020900482015b8281111561347657825482559160010191906001019061345b565b5b5090506134849190613488565b5090565b5b808211156134a1576000816000905550600101613489565b5090565b60006134b86134b384614279565b614254565b9050828152602081018484840111156134d4576134d36146aa565b5b6134df848285614462565b509392505050565b60006134fa6134f5846142aa565b614254565b905082815260208101848484011115613516576135156146aa565b5b613521848285614462565b509392505050565b60008135905061353881614cad565b92915050565b60008135905061354d81614cc4565b92915050565b60008151905061356281614cc4565b92915050565b60008135905061357781614cdb565b92915050565b60008151905061358c81614cdb565b92915050565b600082601f8301126135a7576135a66146a5565b5b81356135b78482602086016134a5565b91505092915050565b600082601f8301126135d5576135d46146a5565b5b81356135e58482602086016134e7565b91505092915050565b6000813590506135fd81614cf2565b92915050565b60008151905061361281614cf2565b92915050565b60006020828403121561362e5761362d6146b4565b5b600061363c84828501613529565b91505092915050565b6000806040838503121561365c5761365b6146b4565b5b600061366a85828601613529565b925050602061367b85828601613529565b9150509250929050565b60008060006060848603121561369e5761369d6146b4565b5b60006136ac86828701613529565b93505060206136bd86828701613529565b925050604084013567ffffffffffffffff8111156136de576136dd6146af565b5b6136ea868287016135c0565b9150509250925092565b60008060006060848603121561370d5761370c6146b4565b5b600061371b86828701613529565b935050602061372c86828701613529565b925050604061373d868287016135ee565b9150509250925092565b60008060008060808587031215613761576137606146b4565b5b600061376f87828801613529565b945050602061378087828801613529565b9350506040613791878288016135ee565b925050606085013567ffffffffffffffff8111156137b2576137b16146af565b5b6137be87828801613592565b91505092959194509250565b600080604083850312156137e1576137e06146b4565b5b60006137ef85828601613529565b92505060206138008582860161353e565b9150509250929050565b60008060408385031215613821576138206146b4565b5b600061382f85828601613529565b9250506020613840858286016135ee565b9150509250929050565b600080600060608486031215613863576138626146b4565b5b600061387186828701613529565b9350506020613882868287016135ee565b925050604084013567ffffffffffffffff8111156138a3576138a26146af565b5b6138af868287016135c0565b9150509250925092565b6000602082840312156138cf576138ce6146b4565b5b60006138dd84828501613553565b91505092915050565b6000602082840312156138fc576138fb6146b4565b5b600061390a84828501613568565b91505092915050565b600060208284031215613929576139286146b4565b5b60006139378482850161357d565b91505092915050565b600060208284031215613956576139556146b4565b5b600082013567ffffffffffffffff811115613974576139736146af565b5b613980848285016135c0565b91505092915050565b60006020828403121561399f5761399e6146b4565b5b60006139ad848285016135ee565b91505092915050565b6000602082840312156139cc576139cb6146b4565b5b60006139da84828501613603565b91505092915050565b6139ec816143ee565b82525050565b6139fb81614400565b82525050565b6000613a0c826142f0565b613a168185614306565b9350613a26818560208601614471565b613a2f816146b9565b840191505092915050565b6000613a45826142fb565b613a4f8185614317565b9350613a5f818560208601614471565b613a68816146b9565b840191505092915050565b6000613a7e826142fb565b613a888185614328565b9350613a98818560208601614471565b80840191505092915050565b60008154613ab1816144a4565b613abb8186614328565b94506001821660008114613ad65760018114613ae757613b1a565b60ff19831686528186019350613b1a565b613af0856142db565b60005b83811015613b1257815481890152600182019150602081019050613af3565b838801955050505b50505092915050565b6000613b30602b83614317565b9150613b3b826146ca565b604082019050919050565b6000613b53603283614317565b9150613b5e82614719565b604082019050919050565b6000613b76602683614317565b9150613b8182614768565b604082019050919050565b6000613b99601c83614317565b9150613ba4826147b7565b602082019050919050565b6000613bbc602483614317565b9150613bc7826147e0565b604082019050919050565b6000613bdf601983614317565b9150613bea8261482f565b602082019050919050565b6000613c02602c83614317565b9150613c0d82614858565b604082019050919050565b6000613c25602983614317565b9150613c30826148a7565b604082019050919050565b6000613c48603883614317565b9150613c53826148f6565b604082019050919050565b6000613c6b602a83614317565b9150613c7682614945565b604082019050919050565b6000613c8e602983614317565b9150613c9982614994565b604082019050919050565b6000613cb1602083614317565b9150613cbc826149e3565b602082019050919050565b6000613cd4602483614317565b9150613cdf82614a0c565b604082019050919050565b6000613cf7602c83614317565b9150613d0282614a5b565b604082019050919050565b6000613d1a602083614317565b9150613d2582614aaa565b602082019050919050565b6000613d3d602983614317565b9150613d4882614ad3565b604082019050919050565b6000613d60602f83614317565b9150613d6b82614b22565b604082019050919050565b6000613d83602183614317565b9150613d8e82614b71565b604082019050919050565b6000613da6603183614317565b9150613db182614bc0565b604082019050919050565b6000613dc9602c83614317565b9150613dd482614c0f565b604082019050919050565b6000613dec602c83614317565b9150613df782614c5e565b604082019050919050565b613e0b81614458565b82525050565b613e22613e1d82614458565b614550565b82525050565b6000613e348284613a73565b915081905092915050565b6000613e4b8285613a73565b9150613e578284613a73565b91508190509392505050565b6000613e6f8284613aa4565b915081905092915050565b6000613e868284613e11565b60208201915081905092915050565b6000602082019050613eaa60008301846139e3565b92915050565b6000606082019050613ec560008301866139e3565b613ed260208301856139e3565b613edf6040830184613e02565b949350505050565b6000608082019050613efc60008301876139e3565b613f0960208301866139e3565b613f166040830185613e02565b8181036060830152613f288184613a01565b905095945050505050565b6000604082019050613f4860008301856139e3565b613f556020830184613e02565b9392505050565b6000602082019050613f7160008301846139f2565b92915050565b60006020820190508181036000830152613f918184613a3a565b905092915050565b60006020820190508181036000830152613fb281613b23565b9050919050565b60006020820190508181036000830152613fd281613b46565b9050919050565b60006020820190508181036000830152613ff281613b69565b9050919050565b6000602082019050818103600083015261401281613b8c565b9050919050565b6000602082019050818103600083015261403281613baf565b9050919050565b6000602082019050818103600083015261405281613bd2565b9050919050565b6000602082019050818103600083015261407281613bf5565b9050919050565b6000602082019050818103600083015261409281613c18565b9050919050565b600060208201905081810360008301526140b281613c3b565b9050919050565b600060208201905081810360008301526140d281613c5e565b9050919050565b600060208201905081810360008301526140f281613c81565b9050919050565b6000602082019050818103600083015261411281613ca4565b9050919050565b6000602082019050818103600083015261413281613cc7565b9050919050565b6000602082019050818103600083015261415281613cea565b9050919050565b6000602082019050818103600083015261417281613d0d565b9050919050565b6000602082019050818103600083015261419281613d30565b9050919050565b600060208201905081810360008301526141b281613d53565b9050919050565b600060208201905081810360008301526141d281613d76565b9050919050565b600060208201905081810360008301526141f281613d99565b9050919050565b6000602082019050818103600083015261421281613dbc565b9050919050565b6000602082019050818103600083015261423281613ddf565b9050919050565b600060208201905061424e6000830184613e02565b92915050565b600061425e61426f565b905061426a82826144d6565b919050565b6000604051905090565b600067ffffffffffffffff82111561429457614293614676565b5b61429d826146b9565b9050602081019050919050565b600067ffffffffffffffff8211156142c5576142c4614676565b5b6142ce826146b9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061433e82614458565b915061434983614458565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561437e5761437d61458b565b5b828201905092915050565b600061439482614458565b915061439f83614458565b9250826143af576143ae6145ba565b5b828204905092915050565b60006143c582614458565b91506143d083614458565b9250828210156143e3576143e261458b565b5b828203905092915050565b60006143f982614438565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561448f578082015181840152602081019050614474565b8381111561449e576000848401525b50505050565b600060028204905060018216806144bc57607f821691505b602082108114156144d0576144cf6145e9565b5b50919050565b6144df826146b9565b810181811067ffffffffffffffff821117156144fe576144fd614676565b5b80604052505050565b600061451282614458565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145455761454461458b565b5b600182019050919050565b6000819050919050565b600061456582614458565b915061457083614458565b9250826145805761457f6145ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f464e533a20596f75206e65656420746f2070617920746865207269676874206160008201527f6d6f756e74203e3a280000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f464e533a20596f752063616e74206f776e206d6f7265207468616e206f6e652060008201527f6e616d6500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f464e533a20596f752063616e74206f766572777269746520736f6d656f6e657360008201527f206e616d652c206964696f740000000000000000000000000000000000000000602082015250565b614cb6816143ee565b8114614cc157600080fd5b50565b614ccd81614400565b8114614cd857600080fd5b50565b614ce48161440c565b8114614cef57600080fd5b50565b614cfb81614458565b8114614d0657600080fd5b5056fea264697066735822122014903971e6056bf1c2215c55b19c4516dc81bcefdf52c1ce4b747ca4024a0d1664736f6c63430008070033
Deployed Bytecode Sourcemap
42059:4482:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46367:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24122:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25681:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43436:855;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25204:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45059:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44931:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36551:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26571:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36219:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45415:875;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26981:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44583:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36741:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44700:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23816:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42627:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43315:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23546:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11977:94;;;;;;;;;;;;;:::i;:::-;;44297:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11326:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24291:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25974:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45233:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44415:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27237:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24466:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26340:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12226:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46367:171;46476:4;46496:36;46520:11;46496:23;:36::i;:::-;46489:43;;46367:171;;;:::o;24122:100::-;24176:13;24209:5;24202:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24122:100;:::o;25681:221::-;25757:7;25785:16;25793:7;25785;:16::i;:::-;25777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25870:15;:24;25886:7;25870:24;;;;;;;;;;;;;;;;;;;;;25863:31;;25681:221;;;:::o;43436:855::-;43522:7;;43509:9;:20;43501:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43698:1;43676:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;43666:36;;;;;;43641:7;:19;43649:10;43641:19;;;;;;;;;;;;;;;43624:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;43614:48;;;;;;:88;;43606:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;42395:42;43778:13;;;43799:9;43778:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42481:42;43882:13;;;42578:42;42481;43915:14;;;43938:4;43915:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43882:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43952:31;43986:58;;;;;;;;44001:5;43986:58;;;;44007:25;:15;:23;:25::i;:::-;43986:58;;;;44033:10;43986:58;;;;;43952:92;;44073:5;44051:7;:19;44059:10;44051:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;44131:9;44085:16;:43;44102:25;:15;:23;:25::i;:::-;44085:43;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44171:25;:15;:23;:25::i;:::-;44147:14;44162:5;44147:21;;;;;;:::i;:::-;;;;;;;;;;;;;:49;;;;44203:48;44213:10;44225:25;:15;:23;:25::i;:::-;44203:9;:48::i;:::-;44258:27;:15;:25;:27::i;:::-;43494:797;43436:855;:::o;25204:411::-;25285:13;25301:23;25316:7;25301:14;:23::i;:::-;25285:39;;25349:5;25343:11;;:2;:11;;;;25335:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25443:5;25427:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25452:37;25469:5;25476:12;:10;:12::i;:::-;25452:16;:37::i;:::-;25427:62;25405:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25586:21;25595:2;25599:7;25586:8;:21::i;:::-;25274:341;25204:411;;:::o;45059:168::-;45159:6;45152:27;;;45180:10;45191:21;45206:5;45191:14;:21::i;:::-;45213:7;45152:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45059:168;;;:::o;44931:122::-;45005:21;45020:5;45005:14;:21::i;:::-;44997:39;;:50;45037:9;44997:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44931:122;:::o;36551:113::-;36612:7;36639:10;:17;;;;36632:24;;36551:113;:::o;26571:339::-;26766:41;26785:12;:10;:12::i;:::-;26799:7;26766:18;:41::i;:::-;26758:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26874:28;26884:4;26890:2;26894:7;26874:9;:28::i;:::-;26571:339;;;:::o;36219:256::-;36316:7;36352:23;36369:5;36352:16;:23::i;:::-;36344:5;:31;36336:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36441:12;:19;36454:5;36441:19;;;;;;;;;;;;;;;:26;36461:5;36441:26;;;;;;;;;;;;36434:33;;36219:256;;;;:::o;45415:875::-;45585:1;45563:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;45553:36;;;;;;45535:7;:12;45543:3;45535:12;;;;;;;;;;;;;;;45518:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;45508:41;;;;;;:81;;45500:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;45644:28;45675:7;:14;45683:5;45675:14;;;;;;;;;;;;;;;45644:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45696:23;45722:14;45737;45722:30;;;;;;:::i;:::-;;;;;;;;;;;;;;45696:56;;45759:26;45788:16;:33;45805:15;45788:33;;;;;;;;;;;45759:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45845:7;:14;45853:5;45845:14;;;;;;;;;;;;;;;45830:7;:12;45838:3;45830:12;;;;;;;;;;;;;;;:29;;;;;;:::i;:::-;;;;;;:::i;:::-;;45912:1;45890:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;45866:7;:14;45874:5;45866:14;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:::i;:::-;;45956:14;45971;45956:30;;;;;;:::i;:::-;;;;;;;;;;;;;;45925:14;45940:7;:12;45948:3;45940:12;;;;;;;;;;;;;;;45925:28;;;;;;:::i;:::-;;;;;;;;;;;;;:61;;;;46034:1;45993:14;46008;45993:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;46094:16;:33;46111:15;46094:33;;;;;;;;;;;46045:16;:46;46062:14;46077:7;:12;46085:3;46077:12;;;;;;;;;;;;;;;46062:28;;;;;;:::i;:::-;;;;;;;;;;;;;;46045:46;;;;;;;;;;;:82;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46170:62;;;;;;;;46214:1;46192:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;46170:62;;;;46219:1;46170:62;;;;46229:1;46170:62;;;;;46134:16;:33;46151:15;46134:33;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46241:43;46258:5;46264:3;46268:15;46241:16;:43::i;:::-;45493:797;;;45415:875;;;:::o;26981:185::-;27119:39;27136:4;27142:2;27146:7;27119:39;;;;;;;;;;;;:16;:39::i;:::-;26981:185;;;:::o;44583:111::-;44648:7;44671:17;44679:8;44671:7;:17::i;:::-;44664:24;;44583:111;;;:::o;36741:233::-;36816:7;36852:30;:28;:30::i;:::-;36844:5;:38;36836:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36949:10;36960:5;36949:17;;;;;;;;:::i;:::-;;;;;;;;;;36942:24;;36741:233;;;:::o;44700:118::-;11557:12;:10;:12::i;:::-;11546:23;;:7;:5;:7::i;:::-;:23;;;11538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44774:7:::1;44767:4;:14;;;;;;;;;;;;:::i;:::-;;44793:19;44804:7;44793:19;;;;;;:::i;:::-;;;;;;;;44700:118:::0;:::o;23816:239::-;23888:7;23908:13;23924:7;:16;23932:7;23924:16;;;;;;;;;;;;;;;;;;;;;23908:32;;23976:1;23959:19;;:5;:19;;;;23951:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24042:5;24035:12;;;23816:239;;;:::o;42627:32::-;;;;:::o;43315:115::-;11557:12;:10;:12::i;:::-;11546:23;;:7;:5;:7::i;:::-;:23;;;11538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43385:7:::1;43375;:17;;;;43404:20;43416:7;43404:20;;;;;;:::i;:::-;;;;;;;;43315:115:::0;:::o;23546:208::-;23618:7;23663:1;23646:19;;:5;:19;;;;23638:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23730:9;:16;23740:5;23730:16;;;;;;;;;;;;;;;;23723:23;;23546:208;;;:::o;11977:94::-;11557:12;:10;:12::i;:::-;11546:23;;:7;:5;:7::i;:::-;:23;;;11538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12042:21:::1;12060:1;12042:9;:21::i;:::-;11977:94::o:0;44297:112::-;44359:13;44388:7;:15;44396:6;44388:15;;;;;;;;;;;;;;;44381:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44297:112;;;:::o;11326:87::-;11372:7;11399:6;;;;;;;;;;;11392:13;;11326:87;:::o;24291:104::-;24347:13;24380:7;24373:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24291:104;:::o;25974:295::-;26089:12;:10;:12::i;:::-;26077:24;;:8;:24;;;;26069:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26189:8;26144:18;:32;26163:12;:10;:12::i;:::-;26144:32;;;;;;;;;;;;;;;:42;26177:8;26144:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26242:8;26213:48;;26228:12;:10;:12::i;:::-;26213:48;;;26252:8;26213:48;;;;;;:::i;:::-;;;;;;;;25974:295;;:::o;45233:176::-;45336:6;45328:32;;;45361:10;45372:21;45387:5;45372:14;:21::i;:::-;45394:8;45328:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45233:176;;;:::o;44415:162::-;44480:7;44496:18;44517:14;44532:5;44517:21;;;;;;:::i;:::-;;;;;;;;;;;;;;44496:42;;44552:19;44560:10;44552:7;:19::i;:::-;44545:26;;;44415:162;;;:::o;27237:328::-;27412:41;27431:12;:10;:12::i;:::-;27445:7;27412:18;:41::i;:::-;27404:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27518:39;27532:4;27538:2;27542:7;27551:5;27518:13;:39::i;:::-;27237:328;;;;:::o;24466:334::-;24539:13;24573:16;24581:7;24573;:16::i;:::-;24565:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24654:21;24678:10;:8;:10::i;:::-;24654:34;;24730:1;24712:7;24706:21;:25;:86;;;;;;;;;;;;;;;;;24758:7;24767:18;:7;:16;:18::i;:::-;24741:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24706:86;24699:93;;;24466:334;;;:::o;26340:164::-;26437:4;26461:18;:25;26480:5;26461:25;;;;;;;;;;;;;;;:35;26487:8;26461:35;;;;;;;;;;;;;;;;;;;;;;;;;26454:42;;26340:164;;;;:::o;12226:192::-;11557:12;:10;:12::i;:::-;11546:23;;:7;:5;:7::i;:::-;:23;;;11538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12335:1:::1;12315:22;;:8;:22;;;;12307:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12391:19;12401:8;12391:9;:19::i;:::-;12226:192:::0;:::o;14610:190::-;14695:4;14719:36;14743:11;14719:23;:36::i;:::-;:73;;;;14759:20;:33;14780:11;14759:33;;;;;;;;;;;;;;;;;;;;;;;;;;;14719:73;14712:80;;14610:190;;;:::o;29075:127::-;29140:4;29192:1;29164:30;;:7;:16;29172:7;29164:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29157:37;;29075:127;;;:::o;13480:114::-;13545:7;13572;:14;;;13565:21;;13480:114;;;:::o;30059:110::-;30135:26;30145:2;30149:7;30135:26;;;;;;;;;;;;:9;:26::i;:::-;30059:110;;:::o;13602:127::-;13709:1;13691:7;:14;;;:19;;;;;;;;;;;13602:127;:::o;10707:98::-;10760:7;10787:10;10780:17;;10707:98;:::o;33057:174::-;33159:2;33132:15;:24;33148:7;33132:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33215:7;33211:2;33177:46;;33186:23;33201:7;33186:14;:23::i;:::-;33177:46;;;;;;;;;;;;33057:174;;:::o;29369:348::-;29462:4;29487:16;29495:7;29487;:16::i;:::-;29479:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29563:13;29579:23;29594:7;29579:14;:23::i;:::-;29563:39;;29632:5;29621:16;;:7;:16;;;:51;;;;29665:7;29641:31;;:20;29653:7;29641:11;:20::i;:::-;:31;;;29621:51;:87;;;;29676:32;29693:5;29700:7;29676:16;:32::i;:::-;29621:87;29613:96;;;29369:348;;;;:::o;32361:578::-;32520:4;32493:31;;:23;32508:7;32493:14;:23::i;:::-;:31;;;32485:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32603:1;32589:16;;:2;:16;;;;32581:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32659:39;32680:4;32686:2;32690:7;32659:20;:39::i;:::-;32763:29;32780:1;32784:7;32763:8;:29::i;:::-;32824:1;32805:9;:15;32815:4;32805:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32853:1;32836:9;:13;32846:2;32836:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32884:2;32865:7;:16;32873:7;32865:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32923:7;32919:2;32904:27;;32913:4;32904:27;;;;;;;;;;;;32361:578;;;:::o;12426:173::-;12482:16;12501:6;;;;;;;;;;;12482:25;;12527:8;12518:6;;:17;;;;;;;;;;;;;;;;;;12582:8;12551:40;;12572:8;12551:40;;;;;;;;;;;;12471:128;12426:173;:::o;28447:315::-;28604:28;28614:4;28620:2;28624:7;28604:9;:28::i;:::-;28651:48;28674:4;28680:2;28684:7;28693:5;28651:22;:48::i;:::-;28643:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28447:315;;;;:::o;44824:91::-;44876:13;44905:4;44898:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44824:91;:::o;972:723::-;1028:13;1258:1;1249:5;:10;1245:53;;;1276:10;;;;;;;;;;;;;;;;;;;;;1245:53;1308:12;1323:5;1308:20;;1339:14;1364:78;1379:1;1371:4;:9;1364:78;;1397:8;;;;;:::i;:::-;;;;1428:2;1420:10;;;;;:::i;:::-;;;1364:78;;;1452:19;1484:6;1474:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1452:39;;1502:154;1518:1;1509:5;:10;1502:154;;1546:1;1536:11;;;;;:::i;:::-;;;1613:2;1605:5;:10;;;;:::i;:::-;1592:2;:24;;;;:::i;:::-;1579:39;;1562:6;1569;1562:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1642:2;1633:11;;;;;:::i;:::-;;;1502:154;;;1680:6;1666:21;;;;;972:723;;;;:::o;35911:224::-;36013:4;36052:35;36037:50;;;:11;:50;;;;:90;;;;36091:36;36115:11;36091:23;:36::i;:::-;36037:90;36030:97;;35911:224;;;:::o;30396:321::-;30526:18;30532:2;30536:7;30526:5;:18::i;:::-;30577:54;30608:1;30612:2;30616:7;30625:5;30577:22;:54::i;:::-;30555:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30396:321;;;:::o;37587:589::-;37731:45;37758:4;37764:2;37768:7;37731:26;:45::i;:::-;37809:1;37793:18;;:4;:18;;;37789:187;;;37828:40;37860:7;37828:31;:40::i;:::-;37789:187;;;37898:2;37890:10;;:4;:10;;;37886:90;;37917:47;37950:4;37956:7;37917:32;:47::i;:::-;37886:90;37789:187;38004:1;37990:16;;:2;:16;;;37986:183;;;38023:45;38060:7;38023:36;:45::i;:::-;37986:183;;;38096:4;38090:10;;:2;:10;;;38086:83;;38117:40;38145:2;38149:7;38117:27;:40::i;:::-;38086:83;37986:183;37587:589;;;:::o;33796:799::-;33951:4;33972:15;:2;:13;;;:15::i;:::-;33968:620;;;34024:2;34008:36;;;34045:12;:10;:12::i;:::-;34059:4;34065:7;34074:5;34008:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34004:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34267:1;34250:6;:13;:18;34246:272;;;34293:60;;;;;;;;;;:::i;:::-;;;;;;;;34246:272;34468:6;34462:13;34453:6;34449:2;34445:15;34438:38;34004:529;34141:41;;;34131:51;;;:6;:51;;;;34124:58;;;;;33968:620;34572:4;34565:11;;33796:799;;;;;;;:::o;23177:305::-;23279:4;23331:25;23316:40;;;:11;:40;;;;:105;;;;23388:33;23373:48;;;:11;:48;;;;23316:105;:158;;;;23438:36;23462:11;23438:23;:36::i;:::-;23316:158;23296:178;;23177:305;;;:::o;31053:382::-;31147:1;31133:16;;:2;:16;;;;31125:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31206:16;31214:7;31206;:16::i;:::-;31205:17;31197:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31268:45;31297:1;31301:2;31305:7;31268:20;:45::i;:::-;31343:1;31326:9;:13;31336:2;31326:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31374:2;31355:7;:16;31363:7;31355:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31419:7;31415:2;31394:33;;31411:1;31394:33;;;;;;;;;;;;31053:382;;:::o;35167:126::-;;;;:::o;38899:164::-;39003:10;:17;;;;38976:15;:24;38992:7;38976:24;;;;;;;;;;;:44;;;;39031:10;39047:7;39031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38899:164;:::o;39690:988::-;39956:22;40006:1;39981:22;39998:4;39981:16;:22::i;:::-;:26;;;;:::i;:::-;39956:51;;40018:18;40039:17;:26;40057:7;40039:26;;;;;;;;;;;;40018:47;;40186:14;40172:10;:28;40168:328;;40217:19;40239:12;:18;40252:4;40239:18;;;;;;;;;;;;;;;:34;40258:14;40239:34;;;;;;;;;;;;40217:56;;40323:11;40290:12;:18;40303:4;40290:18;;;;;;;;;;;;;;;:30;40309:10;40290:30;;;;;;;;;;;:44;;;;40440:10;40407:17;:30;40425:11;40407:30;;;;;;;;;;;:43;;;;40202:294;40168:328;40592:17;:26;40610:7;40592:26;;;;;;;;;;;40585:33;;;40636:12;:18;40649:4;40636:18;;;;;;;;;;;;;;;:34;40655:14;40636:34;;;;;;;;;;;40629:41;;;39771:907;;39690:988;;:::o;40973:1079::-;41226:22;41271:1;41251:10;:17;;;;:21;;;;:::i;:::-;41226:46;;41283:18;41304:15;:24;41320:7;41304:24;;;;;;;;;;;;41283:45;;41655:19;41677:10;41688:14;41677:26;;;;;;;;:::i;:::-;;;;;;;;;;41655:48;;41741:11;41716:10;41727;41716:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41852:10;41821:15;:28;41837:11;41821:28;;;;;;;;;;;:41;;;;41993:15;:24;42009:7;41993:24;;;;;;;;;;;41986:31;;;42028:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41044:1008;;;40973:1079;:::o;38477:221::-;38562:14;38579:20;38596:2;38579:16;:20::i;:::-;38562:37;;38637:7;38610:12;:16;38623:2;38610:16;;;;;;;;;;;;;;;:24;38627:6;38610:24;;;;;;;;;;;:34;;;;38684:6;38655:17;:26;38673:7;38655:26;;;;;;;;;;;:35;;;;38551:147;38477:221;;:::o;3343:387::-;3403:4;3611:12;3678:7;3666:20;3658:28;;3721:1;3714:4;:8;3707:15;;;3343:387;;;:::o;14180:157::-;14265:4;14304:25;14289:40;;;:11;:40;;;;14282:47;;14180:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:143::-;2477:5;2508:6;2502:13;2493:22;;2524:33;2551:5;2524:33;:::i;:::-;2420:143;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:799::-;3471:6;3479;3487;3536:2;3524:9;3515:7;3511:23;3507:32;3504:119;;;3542:79;;:::i;:::-;3504:119;3662:1;3687:53;3732:7;3723:6;3712:9;3708:22;3687:53;:::i;:::-;3677:63;;3633:117;3789:2;3815:53;3860:7;3851:6;3840:9;3836:22;3815:53;:::i;:::-;3805:63;;3760:118;3945:2;3934:9;3930:18;3917:32;3976:18;3968:6;3965:30;3962:117;;;3998:79;;:::i;:::-;3962:117;4103:63;4158:7;4149:6;4138:9;4134:22;4103:63;:::i;:::-;4093:73;;3888:288;3384:799;;;;;:::o;4189:619::-;4266:6;4274;4282;4331:2;4319:9;4310:7;4306:23;4302:32;4299:119;;;4337:79;;:::i;:::-;4299:119;4457:1;4482:53;4527:7;4518:6;4507:9;4503:22;4482:53;:::i;:::-;4472:63;;4428:117;4584:2;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4555:118;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4189:619;;;;;:::o;4814:943::-;4909:6;4917;4925;4933;4982:3;4970:9;4961:7;4957:23;4953:33;4950:120;;;4989:79;;:::i;:::-;4950:120;5109:1;5134:53;5179:7;5170:6;5159:9;5155:22;5134:53;:::i;:::-;5124:63;;5080:117;5236:2;5262:53;5307:7;5298:6;5287:9;5283:22;5262:53;:::i;:::-;5252:63;;5207:118;5364:2;5390:53;5435:7;5426:6;5415:9;5411:22;5390:53;:::i;:::-;5380:63;;5335:118;5520:2;5509:9;5505:18;5492:32;5551:18;5543:6;5540:30;5537:117;;;5573:79;;:::i;:::-;5537:117;5678:62;5732:7;5723:6;5712:9;5708:22;5678:62;:::i;:::-;5668:72;;5463:287;4814:943;;;;;;;:::o;5763:468::-;5828:6;5836;5885:2;5873:9;5864:7;5860:23;5856:32;5853:119;;;5891:79;;:::i;:::-;5853:119;6011:1;6036:53;6081:7;6072:6;6061:9;6057:22;6036:53;:::i;:::-;6026:63;;5982:117;6138:2;6164:50;6206:7;6197:6;6186:9;6182:22;6164:50;:::i;:::-;6154:60;;6109:115;5763:468;;;;;:::o;6237:474::-;6305:6;6313;6362:2;6350:9;6341:7;6337:23;6333:32;6330:119;;;6368:79;;:::i;:::-;6330:119;6488:1;6513:53;6558:7;6549:6;6538:9;6534:22;6513:53;:::i;:::-;6503:63;;6459:117;6615:2;6641:53;6686:7;6677:6;6666:9;6662:22;6641:53;:::i;:::-;6631:63;;6586:118;6237:474;;;;;:::o;6717:799::-;6804:6;6812;6820;6869:2;6857:9;6848:7;6844:23;6840:32;6837:119;;;6875:79;;:::i;:::-;6837:119;6995:1;7020:53;7065:7;7056:6;7045:9;7041:22;7020:53;:::i;:::-;7010:63;;6966:117;7122:2;7148:53;7193:7;7184:6;7173:9;7169:22;7148:53;:::i;:::-;7138:63;;7093:118;7278:2;7267:9;7263:18;7250:32;7309:18;7301:6;7298:30;7295:117;;;7331:79;;:::i;:::-;7295:117;7436:63;7491:7;7482:6;7471:9;7467:22;7436:63;:::i;:::-;7426:73;;7221:288;6717:799;;;;;:::o;7522:345::-;7589:6;7638:2;7626:9;7617:7;7613:23;7609:32;7606:119;;;7644:79;;:::i;:::-;7606:119;7764:1;7789:61;7842:7;7833:6;7822:9;7818:22;7789:61;:::i;:::-;7779:71;;7735:125;7522:345;;;;:::o;7873:327::-;7931:6;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8106:1;8131:52;8175:7;8166:6;8155:9;8151:22;8131:52;:::i;:::-;8121:62;;8077:116;7873:327;;;;:::o;8206:349::-;8275:6;8324:2;8312:9;8303:7;8299:23;8295:32;8292:119;;;8330:79;;:::i;:::-;8292:119;8450:1;8475:63;8530:7;8521:6;8510:9;8506:22;8475:63;:::i;:::-;8465:73;;8421:127;8206:349;;;;:::o;8561:509::-;8630:6;8679:2;8667:9;8658:7;8654:23;8650:32;8647:119;;;8685:79;;:::i;:::-;8647:119;8833:1;8822:9;8818:17;8805:31;8863:18;8855:6;8852:30;8849:117;;;8885:79;;:::i;:::-;8849:117;8990:63;9045:7;9036:6;9025:9;9021:22;8990:63;:::i;:::-;8980:73;;8776:287;8561:509;;;;:::o;9076:329::-;9135:6;9184:2;9172:9;9163:7;9159:23;9155:32;9152:119;;;9190:79;;:::i;:::-;9152:119;9310:1;9335:53;9380:7;9371:6;9360:9;9356:22;9335:53;:::i;:::-;9325:63;;9281:117;9076:329;;;;:::o;9411:351::-;9481:6;9530:2;9518:9;9509:7;9505:23;9501:32;9498:119;;;9536:79;;:::i;:::-;9498:119;9656:1;9681:64;9737:7;9728:6;9717:9;9713:22;9681:64;:::i;:::-;9671:74;;9627:128;9411:351;;;;:::o;9768:118::-;9855:24;9873:5;9855:24;:::i;:::-;9850:3;9843:37;9768:118;;:::o;9892:109::-;9973:21;9988:5;9973:21;:::i;:::-;9968:3;9961:34;9892:109;;:::o;10007:360::-;10093:3;10121:38;10153:5;10121:38;:::i;:::-;10175:70;10238:6;10233:3;10175:70;:::i;:::-;10168:77;;10254:52;10299:6;10294:3;10287:4;10280:5;10276:16;10254:52;:::i;:::-;10331:29;10353:6;10331:29;:::i;:::-;10326:3;10322:39;10315:46;;10097:270;10007:360;;;;:::o;10373:364::-;10461:3;10489:39;10522:5;10489:39;:::i;:::-;10544:71;10608:6;10603:3;10544:71;:::i;:::-;10537:78;;10624:52;10669:6;10664:3;10657:4;10650:5;10646:16;10624:52;:::i;:::-;10701:29;10723:6;10701:29;:::i;:::-;10696:3;10692:39;10685:46;;10465:272;10373:364;;;;:::o;10743:377::-;10849:3;10877:39;10910:5;10877:39;:::i;:::-;10932:89;11014:6;11009:3;10932:89;:::i;:::-;10925:96;;11030:52;11075:6;11070:3;11063:4;11056:5;11052:16;11030:52;:::i;:::-;11107:6;11102:3;11098:16;11091:23;;10853:267;10743:377;;;;:::o;11150:845::-;11253:3;11290:5;11284:12;11319:36;11345:9;11319:36;:::i;:::-;11371:89;11453:6;11448:3;11371:89;:::i;:::-;11364:96;;11491:1;11480:9;11476:17;11507:1;11502:137;;;;11653:1;11648:341;;;;11469:520;;11502:137;11586:4;11582:9;11571;11567:25;11562:3;11555:38;11622:6;11617:3;11613:16;11606:23;;11502:137;;11648:341;11715:38;11747:5;11715:38;:::i;:::-;11775:1;11789:154;11803:6;11800:1;11797:13;11789:154;;;11877:7;11871:14;11867:1;11862:3;11858:11;11851:35;11927:1;11918:7;11914:15;11903:26;;11825:4;11822:1;11818:12;11813:17;;11789:154;;;11972:6;11967:3;11963:16;11956:23;;11655:334;;11469:520;;11257:738;;11150:845;;;;:::o;12001:366::-;12143:3;12164:67;12228:2;12223:3;12164:67;:::i;:::-;12157:74;;12240:93;12329:3;12240:93;:::i;:::-;12358:2;12353:3;12349:12;12342:19;;12001:366;;;:::o;12373:::-;12515:3;12536:67;12600:2;12595:3;12536:67;:::i;:::-;12529:74;;12612:93;12701:3;12612:93;:::i;:::-;12730:2;12725:3;12721:12;12714:19;;12373:366;;;:::o;12745:::-;12887:3;12908:67;12972:2;12967:3;12908:67;:::i;:::-;12901:74;;12984:93;13073:3;12984:93;:::i;:::-;13102:2;13097:3;13093:12;13086:19;;12745:366;;;:::o;13117:::-;13259:3;13280:67;13344:2;13339:3;13280:67;:::i;:::-;13273:74;;13356:93;13445:3;13356:93;:::i;:::-;13474:2;13469:3;13465:12;13458:19;;13117:366;;;:::o;13489:::-;13631:3;13652:67;13716:2;13711:3;13652:67;:::i;:::-;13645:74;;13728:93;13817:3;13728:93;:::i;:::-;13846:2;13841:3;13837:12;13830:19;;13489:366;;;:::o;13861:::-;14003:3;14024:67;14088:2;14083:3;14024:67;:::i;:::-;14017:74;;14100:93;14189:3;14100:93;:::i;:::-;14218:2;14213:3;14209:12;14202:19;;13861:366;;;:::o;14233:::-;14375:3;14396:67;14460:2;14455:3;14396:67;:::i;:::-;14389:74;;14472:93;14561:3;14472:93;:::i;:::-;14590:2;14585:3;14581:12;14574:19;;14233:366;;;:::o;14605:::-;14747:3;14768:67;14832:2;14827:3;14768:67;:::i;:::-;14761:74;;14844:93;14933:3;14844:93;:::i;:::-;14962:2;14957:3;14953:12;14946:19;;14605:366;;;:::o;14977:::-;15119:3;15140:67;15204:2;15199:3;15140:67;:::i;:::-;15133:74;;15216:93;15305:3;15216:93;:::i;:::-;15334:2;15329:3;15325:12;15318:19;;14977:366;;;:::o;15349:::-;15491:3;15512:67;15576:2;15571:3;15512:67;:::i;:::-;15505:74;;15588:93;15677:3;15588:93;:::i;:::-;15706:2;15701:3;15697:12;15690:19;;15349:366;;;:::o;15721:::-;15863:3;15884:67;15948:2;15943:3;15884:67;:::i;:::-;15877:74;;15960:93;16049:3;15960:93;:::i;:::-;16078:2;16073:3;16069:12;16062:19;;15721:366;;;:::o;16093:::-;16235:3;16256:67;16320:2;16315:3;16256:67;:::i;:::-;16249:74;;16332:93;16421:3;16332:93;:::i;:::-;16450:2;16445:3;16441:12;16434:19;;16093:366;;;:::o;16465:::-;16607:3;16628:67;16692:2;16687:3;16628:67;:::i;:::-;16621:74;;16704:93;16793:3;16704:93;:::i;:::-;16822:2;16817:3;16813:12;16806:19;;16465:366;;;:::o;16837:::-;16979:3;17000:67;17064:2;17059:3;17000:67;:::i;:::-;16993:74;;17076:93;17165:3;17076:93;:::i;:::-;17194:2;17189:3;17185:12;17178:19;;16837:366;;;:::o;17209:::-;17351:3;17372:67;17436:2;17431:3;17372:67;:::i;:::-;17365:74;;17448:93;17537:3;17448:93;:::i;:::-;17566:2;17561:3;17557:12;17550:19;;17209:366;;;:::o;17581:::-;17723:3;17744:67;17808:2;17803:3;17744:67;:::i;:::-;17737:74;;17820:93;17909:3;17820:93;:::i;:::-;17938:2;17933:3;17929:12;17922:19;;17581:366;;;:::o;17953:::-;18095:3;18116:67;18180:2;18175:3;18116:67;:::i;:::-;18109:74;;18192:93;18281:3;18192:93;:::i;:::-;18310:2;18305:3;18301:12;18294:19;;17953:366;;;:::o;18325:::-;18467:3;18488:67;18552:2;18547:3;18488:67;:::i;:::-;18481:74;;18564:93;18653:3;18564:93;:::i;:::-;18682:2;18677:3;18673:12;18666:19;;18325:366;;;:::o;18697:::-;18839:3;18860:67;18924:2;18919:3;18860:67;:::i;:::-;18853:74;;18936:93;19025:3;18936:93;:::i;:::-;19054:2;19049:3;19045:12;19038:19;;18697:366;;;:::o;19069:::-;19211:3;19232:67;19296:2;19291:3;19232:67;:::i;:::-;19225:74;;19308:93;19397:3;19308:93;:::i;:::-;19426:2;19421:3;19417:12;19410:19;;19069:366;;;:::o;19441:::-;19583:3;19604:67;19668:2;19663:3;19604:67;:::i;:::-;19597:74;;19680:93;19769:3;19680:93;:::i;:::-;19798:2;19793:3;19789:12;19782:19;;19441:366;;;:::o;19813:118::-;19900:24;19918:5;19900:24;:::i;:::-;19895:3;19888:37;19813:118;;:::o;19937:157::-;20042:45;20062:24;20080:5;20062:24;:::i;:::-;20042:45;:::i;:::-;20037:3;20030:58;19937:157;;:::o;20100:275::-;20232:3;20254:95;20345:3;20336:6;20254:95;:::i;:::-;20247:102;;20366:3;20359:10;;20100:275;;;;:::o;20381:435::-;20561:3;20583:95;20674:3;20665:6;20583:95;:::i;:::-;20576:102;;20695:95;20786:3;20777:6;20695:95;:::i;:::-;20688:102;;20807:3;20800:10;;20381:435;;;;;:::o;20822:269::-;20951:3;20973:92;21061:3;21052:6;20973:92;:::i;:::-;20966:99;;21082:3;21075:10;;20822:269;;;;:::o;21097:256::-;21209:3;21224:75;21295:3;21286:6;21224:75;:::i;:::-;21324:2;21319:3;21315:12;21308:19;;21344:3;21337:10;;21097:256;;;;:::o;21359:222::-;21452:4;21490:2;21479:9;21475:18;21467:26;;21503:71;21571:1;21560:9;21556:17;21547:6;21503:71;:::i;:::-;21359:222;;;;:::o;21587:442::-;21736:4;21774:2;21763:9;21759:18;21751:26;;21787:71;21855:1;21844:9;21840:17;21831:6;21787:71;:::i;:::-;21868:72;21936:2;21925:9;21921:18;21912:6;21868:72;:::i;:::-;21950;22018:2;22007:9;22003:18;21994:6;21950:72;:::i;:::-;21587:442;;;;;;:::o;22035:640::-;22230:4;22268:3;22257:9;22253:19;22245:27;;22282:71;22350:1;22339:9;22335:17;22326:6;22282:71;:::i;:::-;22363:72;22431:2;22420:9;22416:18;22407:6;22363:72;:::i;:::-;22445;22513:2;22502:9;22498:18;22489:6;22445:72;:::i;:::-;22564:9;22558:4;22554:20;22549:2;22538:9;22534:18;22527:48;22592:76;22663:4;22654:6;22592:76;:::i;:::-;22584:84;;22035:640;;;;;;;:::o;22681:332::-;22802:4;22840:2;22829:9;22825:18;22817:26;;22853:71;22921:1;22910:9;22906:17;22897:6;22853:71;:::i;:::-;22934:72;23002:2;22991:9;22987:18;22978:6;22934:72;:::i;:::-;22681:332;;;;;:::o;23019:210::-;23106:4;23144:2;23133:9;23129:18;23121:26;;23157:65;23219:1;23208:9;23204:17;23195:6;23157:65;:::i;:::-;23019:210;;;;:::o;23235:313::-;23348:4;23386:2;23375:9;23371:18;23363:26;;23435:9;23429:4;23425:20;23421:1;23410:9;23406:17;23399:47;23463:78;23536:4;23527:6;23463:78;:::i;:::-;23455:86;;23235:313;;;;:::o;23554:419::-;23720:4;23758:2;23747:9;23743:18;23735:26;;23807:9;23801:4;23797:20;23793:1;23782:9;23778:17;23771:47;23835:131;23961:4;23835:131;:::i;:::-;23827:139;;23554:419;;;:::o;23979:::-;24145:4;24183:2;24172:9;24168:18;24160:26;;24232:9;24226:4;24222:20;24218:1;24207:9;24203:17;24196:47;24260:131;24386:4;24260:131;:::i;:::-;24252:139;;23979:419;;;:::o;24404:::-;24570:4;24608:2;24597:9;24593:18;24585:26;;24657:9;24651:4;24647:20;24643:1;24632:9;24628:17;24621:47;24685:131;24811:4;24685:131;:::i;:::-;24677:139;;24404:419;;;:::o;24829:::-;24995:4;25033:2;25022:9;25018:18;25010:26;;25082:9;25076:4;25072:20;25068:1;25057:9;25053:17;25046:47;25110:131;25236:4;25110:131;:::i;:::-;25102:139;;24829:419;;;:::o;25254:::-;25420:4;25458:2;25447:9;25443:18;25435:26;;25507:9;25501:4;25497:20;25493:1;25482:9;25478:17;25471:47;25535:131;25661:4;25535:131;:::i;:::-;25527:139;;25254:419;;;:::o;25679:::-;25845:4;25883:2;25872:9;25868:18;25860:26;;25932:9;25926:4;25922:20;25918:1;25907:9;25903:17;25896:47;25960:131;26086:4;25960:131;:::i;:::-;25952:139;;25679:419;;;:::o;26104:::-;26270:4;26308:2;26297:9;26293:18;26285:26;;26357:9;26351:4;26347:20;26343:1;26332:9;26328:17;26321:47;26385:131;26511:4;26385:131;:::i;:::-;26377:139;;26104:419;;;:::o;26529:::-;26695:4;26733:2;26722:9;26718:18;26710:26;;26782:9;26776:4;26772:20;26768:1;26757:9;26753:17;26746:47;26810:131;26936:4;26810:131;:::i;:::-;26802:139;;26529:419;;;:::o;26954:::-;27120:4;27158:2;27147:9;27143:18;27135:26;;27207:9;27201:4;27197:20;27193:1;27182:9;27178:17;27171:47;27235:131;27361:4;27235:131;:::i;:::-;27227:139;;26954:419;;;:::o;27379:::-;27545:4;27583:2;27572:9;27568:18;27560:26;;27632:9;27626:4;27622:20;27618:1;27607:9;27603:17;27596:47;27660:131;27786:4;27660:131;:::i;:::-;27652:139;;27379:419;;;:::o;27804:::-;27970:4;28008:2;27997:9;27993:18;27985:26;;28057:9;28051:4;28047:20;28043:1;28032:9;28028:17;28021:47;28085:131;28211:4;28085:131;:::i;:::-;28077:139;;27804:419;;;:::o;28229:::-;28395:4;28433:2;28422:9;28418:18;28410:26;;28482:9;28476:4;28472:20;28468:1;28457:9;28453:17;28446:47;28510:131;28636:4;28510:131;:::i;:::-;28502:139;;28229:419;;;:::o;28654:::-;28820:4;28858:2;28847:9;28843:18;28835:26;;28907:9;28901:4;28897:20;28893:1;28882:9;28878:17;28871:47;28935:131;29061:4;28935:131;:::i;:::-;28927:139;;28654:419;;;:::o;29079:::-;29245:4;29283:2;29272:9;29268:18;29260:26;;29332:9;29326:4;29322:20;29318:1;29307:9;29303:17;29296:47;29360:131;29486:4;29360:131;:::i;:::-;29352:139;;29079:419;;;:::o;29504:::-;29670:4;29708:2;29697:9;29693:18;29685:26;;29757:9;29751:4;29747:20;29743:1;29732:9;29728:17;29721:47;29785:131;29911:4;29785:131;:::i;:::-;29777:139;;29504:419;;;:::o;29929:::-;30095:4;30133:2;30122:9;30118:18;30110:26;;30182:9;30176:4;30172:20;30168:1;30157:9;30153:17;30146:47;30210:131;30336:4;30210:131;:::i;:::-;30202:139;;29929:419;;;:::o;30354:::-;30520:4;30558:2;30547:9;30543:18;30535:26;;30607:9;30601:4;30597:20;30593:1;30582:9;30578:17;30571:47;30635:131;30761:4;30635:131;:::i;:::-;30627:139;;30354:419;;;:::o;30779:::-;30945:4;30983:2;30972:9;30968:18;30960:26;;31032:9;31026:4;31022:20;31018:1;31007:9;31003:17;30996:47;31060:131;31186:4;31060:131;:::i;:::-;31052:139;;30779:419;;;:::o;31204:::-;31370:4;31408:2;31397:9;31393:18;31385:26;;31457:9;31451:4;31447:20;31443:1;31432:9;31428:17;31421:47;31485:131;31611:4;31485:131;:::i;:::-;31477:139;;31204:419;;;:::o;31629:::-;31795:4;31833:2;31822:9;31818:18;31810:26;;31882:9;31876:4;31872:20;31868:1;31857:9;31853:17;31846:47;31910:131;32036:4;31910:131;:::i;:::-;31902:139;;31629:419;;;:::o;32054:::-;32220:4;32258:2;32247:9;32243:18;32235:26;;32307:9;32301:4;32297:20;32293:1;32282:9;32278:17;32271:47;32335:131;32461:4;32335:131;:::i;:::-;32327:139;;32054:419;;;:::o;32479:222::-;32572:4;32610:2;32599:9;32595:18;32587:26;;32623:71;32691:1;32680:9;32676:17;32667:6;32623:71;:::i;:::-;32479:222;;;;:::o;32707:129::-;32741:6;32768:20;;:::i;:::-;32758:30;;32797:33;32825:4;32817:6;32797:33;:::i;:::-;32707:129;;;:::o;32842:75::-;32875:6;32908:2;32902:9;32892:19;;32842:75;:::o;32923:307::-;32984:4;33074:18;33066:6;33063:30;33060:56;;;33096:18;;:::i;:::-;33060:56;33134:29;33156:6;33134:29;:::i;:::-;33126:37;;33218:4;33212;33208:15;33200:23;;32923:307;;;:::o;33236:308::-;33298:4;33388:18;33380:6;33377:30;33374:56;;;33410:18;;:::i;:::-;33374:56;33448:29;33470:6;33448:29;:::i;:::-;33440:37;;33532:4;33526;33522:15;33514:23;;33236:308;;;:::o;33550:141::-;33599:4;33622:3;33614:11;;33645:3;33642:1;33635:14;33679:4;33676:1;33666:18;33658:26;;33550:141;;;:::o;33697:98::-;33748:6;33782:5;33776:12;33766:22;;33697:98;;;:::o;33801:99::-;33853:6;33887:5;33881:12;33871:22;;33801:99;;;:::o;33906:168::-;33989:11;34023:6;34018:3;34011:19;34063:4;34058:3;34054:14;34039:29;;33906:168;;;;:::o;34080:169::-;34164:11;34198:6;34193:3;34186:19;34238:4;34233:3;34229:14;34214:29;;34080:169;;;;:::o;34255:148::-;34357:11;34394:3;34379:18;;34255:148;;;;:::o;34409:305::-;34449:3;34468:20;34486:1;34468:20;:::i;:::-;34463:25;;34502:20;34520:1;34502:20;:::i;:::-;34497:25;;34656:1;34588:66;34584:74;34581:1;34578:81;34575:107;;;34662:18;;:::i;:::-;34575:107;34706:1;34703;34699:9;34692:16;;34409:305;;;;:::o;34720:185::-;34760:1;34777:20;34795:1;34777:20;:::i;:::-;34772:25;;34811:20;34829:1;34811:20;:::i;:::-;34806:25;;34850:1;34840:35;;34855:18;;:::i;:::-;34840:35;34897:1;34894;34890:9;34885:14;;34720:185;;;;:::o;34911:191::-;34951:4;34971:20;34989:1;34971:20;:::i;:::-;34966:25;;35005:20;35023:1;35005:20;:::i;:::-;35000:25;;35044:1;35041;35038:8;35035:34;;;35049:18;;:::i;:::-;35035:34;35094:1;35091;35087:9;35079:17;;34911:191;;;;:::o;35108:96::-;35145:7;35174:24;35192:5;35174:24;:::i;:::-;35163:35;;35108:96;;;:::o;35210:90::-;35244:7;35287:5;35280:13;35273:21;35262:32;;35210:90;;;:::o;35306:149::-;35342:7;35382:66;35375:5;35371:78;35360:89;;35306:149;;;:::o;35461:126::-;35498:7;35538:42;35531:5;35527:54;35516:65;;35461:126;;;:::o;35593:77::-;35630:7;35659:5;35648:16;;35593:77;;;:::o;35676:154::-;35760:6;35755:3;35750;35737:30;35822:1;35813:6;35808:3;35804:16;35797:27;35676:154;;;:::o;35836:307::-;35904:1;35914:113;35928:6;35925:1;35922:13;35914:113;;;36013:1;36008:3;36004:11;35998:18;35994:1;35989:3;35985:11;35978:39;35950:2;35947:1;35943:10;35938:15;;35914:113;;;36045:6;36042:1;36039:13;36036:101;;;36125:1;36116:6;36111:3;36107:16;36100:27;36036:101;35885:258;35836:307;;;:::o;36149:320::-;36193:6;36230:1;36224:4;36220:12;36210:22;;36277:1;36271:4;36267:12;36298:18;36288:81;;36354:4;36346:6;36342:17;36332:27;;36288:81;36416:2;36408:6;36405:14;36385:18;36382:38;36379:84;;;36435:18;;:::i;:::-;36379:84;36200:269;36149:320;;;:::o;36475:281::-;36558:27;36580:4;36558:27;:::i;:::-;36550:6;36546:40;36688:6;36676:10;36673:22;36652:18;36640:10;36637:34;36634:62;36631:88;;;36699:18;;:::i;:::-;36631:88;36739:10;36735:2;36728:22;36518:238;36475:281;;:::o;36762:233::-;36801:3;36824:24;36842:5;36824:24;:::i;:::-;36815:33;;36870:66;36863:5;36860:77;36857:103;;;36940:18;;:::i;:::-;36857:103;36987:1;36980:5;36976:13;36969:20;;36762:233;;;:::o;37001:79::-;37040:7;37069:5;37058:16;;37001:79;;;:::o;37086:176::-;37118:1;37135:20;37153:1;37135:20;:::i;:::-;37130:25;;37169:20;37187:1;37169:20;:::i;:::-;37164:25;;37208:1;37198:35;;37213:18;;:::i;:::-;37198:35;37254:1;37251;37247:9;37242:14;;37086:176;;;;:::o;37268:180::-;37316:77;37313:1;37306:88;37413:4;37410:1;37403:15;37437:4;37434:1;37427:15;37454:180;37502:77;37499:1;37492:88;37599:4;37596:1;37589:15;37623:4;37620:1;37613:15;37640:180;37688:77;37685:1;37678:88;37785:4;37782:1;37775:15;37809:4;37806:1;37799:15;37826:180;37874:77;37871:1;37864:88;37971:4;37968:1;37961:15;37995:4;37992:1;37985:15;38012:180;38060:77;38057:1;38050:88;38157:4;38154:1;38147:15;38181:4;38178:1;38171:15;38198:180;38246:77;38243:1;38236:88;38343:4;38340:1;38333:15;38367:4;38364:1;38357:15;38384:117;38493:1;38490;38483:12;38507:117;38616:1;38613;38606:12;38630:117;38739:1;38736;38729:12;38753:117;38862:1;38859;38852:12;38876:102;38917:6;38968:2;38964:7;38959:2;38952:5;38948:14;38944:28;38934:38;;38876:102;;;:::o;38984:230::-;39124:34;39120:1;39112:6;39108:14;39101:58;39193:13;39188:2;39180:6;39176:15;39169:38;38984:230;:::o;39220:237::-;39360:34;39356:1;39348:6;39344:14;39337:58;39429:20;39424:2;39416:6;39412:15;39405:45;39220:237;:::o;39463:225::-;39603:34;39599:1;39591:6;39587:14;39580:58;39672:8;39667:2;39659:6;39655:15;39648:33;39463:225;:::o;39694:178::-;39834:30;39830:1;39822:6;39818:14;39811:54;39694:178;:::o;39878:223::-;40018:34;40014:1;40006:6;40002:14;39995:58;40087:6;40082:2;40074:6;40070:15;40063:31;39878:223;:::o;40107:175::-;40247:27;40243:1;40235:6;40231:14;40224:51;40107:175;:::o;40288:231::-;40428:34;40424:1;40416:6;40412:14;40405:58;40497:14;40492:2;40484:6;40480:15;40473:39;40288:231;:::o;40525:232::-;40665:34;40661:1;40653:6;40649:14;40642:58;40734:11;40729:2;40721:6;40717:15;40710:36;40525:232;:::o;40767:255::-;40911:34;40907:1;40899:6;40895:14;40888:58;40984:26;40979:2;40971:6;40967:15;40960:51;40767:255;:::o;41032:241::-;41176:34;41172:1;41164:6;41160:14;41153:58;41249:12;41244:2;41236:6;41232:15;41225:37;41032:241;:::o;41283:240::-;41427:34;41423:1;41415:6;41411:14;41404:58;41500:11;41495:2;41487:6;41483:15;41476:36;41283:240;:::o;41533:190::-;41677:34;41673:1;41665:6;41661:14;41654:58;41533:190;:::o;41733:235::-;41877:34;41873:1;41865:6;41861:14;41854:58;41950:6;41945:2;41937:6;41933:15;41926:31;41733:235;:::o;41978:243::-;42122:34;42118:1;42110:6;42106:14;42099:58;42195:14;42190:2;42182:6;42178:15;42171:39;41978:243;:::o;42231:190::-;42375:34;42371:1;42363:6;42359:14;42352:58;42231:190;:::o;42431:240::-;42575:34;42571:1;42563:6;42559:14;42552:58;42648:11;42643:2;42635:6;42631:15;42624:36;42431:240;:::o;42681:246::-;42825:34;42821:1;42813:6;42809:14;42802:58;42898:17;42893:2;42885:6;42881:15;42874:42;42681:246;:::o;42937:232::-;43081:34;43077:1;43069:6;43065:14;43058:58;43154:3;43149:2;43141:6;43137:15;43130:28;42937:232;:::o;43179:248::-;43323:34;43319:1;43311:6;43307:14;43300:58;43396:19;43391:2;43383:6;43379:15;43372:44;43179:248;:::o;43437:243::-;43581:34;43577:1;43569:6;43565:14;43558:58;43654:14;43649:2;43641:6;43637:15;43630:39;43437:243;:::o;43690:::-;43834:34;43830:1;43822:6;43818:14;43811:58;43907:14;43902:2;43894:6;43890:15;43883:39;43690:243;:::o;43943:130::-;44020:24;44038:5;44020:24;:::i;:::-;44013:5;44010:35;44000:63;;44059:1;44056;44049:12;44000:63;43943:130;:::o;44083:124::-;44157:21;44172:5;44157:21;:::i;:::-;44150:5;44147:32;44137:60;;44193:1;44190;44183:12;44137:60;44083:124;:::o;44217:128::-;44293:23;44310:5;44293:23;:::i;:::-;44286:5;44283:34;44273:62;;44331:1;44328;44321:12;44273:62;44217:128;:::o;44355:130::-;44432:24;44450:5;44432:24;:::i;:::-;44425:5;44422:35;44412:63;;44471:1;44468;44461:12;44412:63;44355:130;:::o
Swarm Source
ipfs://14903971e6056bf1c2215c55b19c4516dc81bcefdf52c1ce4b747ca4024a0d16
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.