More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 230 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Rewards | 17459144 | 576 days ago | IN | 0 ETH | 0.00212375 | ||||
Claim Rewards | 16759923 | 675 days ago | IN | 0 ETH | 0.00192575 | ||||
Claim Rewards | 16759913 | 675 days ago | IN | 0 ETH | 0.00194718 | ||||
Release Neo | 16759896 | 675 days ago | IN | 0 ETH | 0.01026767 | ||||
Release Neo | 16754606 | 675 days ago | IN | 0 ETH | 0.00962722 | ||||
Release Neo | 16732463 | 678 days ago | IN | 0 ETH | 0.00826482 | ||||
Release Neo | 16725794 | 679 days ago | IN | 0 ETH | 0.00496861 | ||||
Release Neo | 16717523 | 681 days ago | IN | 0 ETH | 0.00602084 | ||||
Claim Rewards | 16717521 | 681 days ago | IN | 0 ETH | 0.00279321 | ||||
Release Neo | 16716665 | 681 days ago | IN | 0 ETH | 0.0047367 | ||||
Release Neo | 16617753 | 695 days ago | IN | 0 ETH | 0.00794063 | ||||
Claim Rewards | 16548496 | 704 days ago | IN | 0 ETH | 0.00239565 | ||||
Sendto Class | 16518360 | 708 days ago | IN | 0 ETH | 0.00692783 | ||||
Sendto Class | 16507217 | 710 days ago | IN | 0 ETH | 0.00585689 | ||||
Sendto Class | 16506016 | 710 days ago | IN | 0 ETH | 0.00534657 | ||||
Sendto Class | 16503277 | 711 days ago | IN | 0 ETH | 0.01029926 | ||||
Sendto Class | 16495655 | 712 days ago | IN | 0 ETH | 0.00629082 | ||||
Sendto Class | 16490683 | 712 days ago | IN | 0 ETH | 0.00622227 | ||||
Sendto Class | 16488941 | 713 days ago | IN | 0 ETH | 0.00620949 | ||||
Sendto Class | 16487073 | 713 days ago | IN | 0 ETH | 0.00945373 | ||||
Sendto Class | 16484744 | 713 days ago | IN | 0 ETH | 0.00922408 | ||||
Sendto Class | 16483906 | 713 days ago | IN | 0 ETH | 0.00683241 | ||||
Sendto Class | 16483689 | 713 days ago | IN | 0 ETH | 0.00576108 | ||||
Sendto Class | 16483052 | 713 days ago | IN | 0 ETH | 0.00107012 | ||||
Sendto Class | 16483050 | 713 days ago | IN | 0 ETH | 0.00582181 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Neophytes_Class_Attendance
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-15 */ pragma solidity ^0.8.0; interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } //"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,"5000000000000000000",2,"1668708000","1668967200","1672509600" pragma solidity ^0.8.0; 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); function numberTokensLocked(address owner) external view returns (uint256 number); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; function totalSupply() external view returns (uint256); /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } abstract contract ReentrancyGuard { // word because each write operation emits an extra SLOAD to first read the // back. This is the compiler's defense against contract upgrades and // but in exchange the refund on every call to nonReentrant will be lower in // transaction's gas, it is best to keep them low in cases like this one, to uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } //SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract Neophytes_Class_Attendance is EIP712, Ownable, ReentrancyGuard{ using SafeMath for uint256; string private constant SIGNING_DOMAIN = "sanctum"; string private constant SIGNATURE_VERSION = "1"; bool paused = false; //Erc20 Variables IERC20 public rewardToken; //Staking Variables uint256 public Total_Neo_In_Class = 0; mapping(address => uint256) private _balances; mapping(address => uint256) public lastClaimTime; mapping(uint => uint256) public voucherIds; uint legend_rewards=10000000000000000000; uint genesis_rewards=5000000000000000000; uint neo_rewards=3000000000000000000; //Collection Variables IERC721 public nft; IERC721 public Rooms_renting_contract; mapping(uint256 => address) public tokenIdOwners; mapping(address => uint256) public numberTokensLocked; mapping(address => mapping(uint256 => uint256)) public ownerTokenIds; uint[] public legendids; address private Verify = 0x1479d797B8431d0D47F2e7A18d589dD67a4b7dc4; modifier updateReward(address account) { uint256 reward = getRewards(account); lastClaimTime[account] = block.timestamp; _balances[account] += reward; _; } /////////////////////////////////////////////////////////////////// struct Locking_record{ uint tokenid; uint perdaytoken; uint owntime; uint starttime; uint endtime; uint total; } //////////////////////////////////////////////////////////////////// struct user_record{ Locking_record[] nft_entries; uint totalentries; uint totalreward; uint claimedreward; uint Total_locked_Nfts; } mapping(address => user_record) private user_db; constructor() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){ //nft = IERC721(_nftAddress); //rewardToken = IERC20(_rewardToken); } //this function is to get estimated earing for 1 day if you lock now function Rewards_Calculator_per_entry_checker(address user,uint tokenid, uint ot, uint perday) public view returns(uint) { uint tm=0; if(ot==5) { uint totalentries=user_db[user].totalentries; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].tokenid==tokenid) { tm = user_db[user].nft_entries[i].owntime; } } } else{tm=ot;} uint owntime = tm; uint starttime = block.timestamp; uint endtime = starttime+86401; if(endtime==0){endtime=block.timestamp;} uint perdaytoken = perday; uint owningdays= (starttime-owntime)/86400; owningdays++; uint calculation=0; //Holding Factor Calculator uint Total_Days_Locked= (endtime-starttime)/86400; uint factordays=owningdays; uint looptorun=0; if(owningdays<30) { if(Total_Days_Locked<30-owningdays) { looptorun=Total_Days_Locked; } else{ looptorun=30-owningdays; } for(uint i=1;i<=looptorun;i++) { uint operand1 = factordays * 1000; uint operand2 = 30; uint operand3 = perdaytoken; // Perform the calculation using integer arithmetic uint result = (operand1/operand2)*operand3; result=result / 1000; calculation +=result; factordays++; } if(Total_Days_Locked+owningdays>30){ calculation+=(Total_Days_Locked-factordays)*perdaytoken; } } else{ calculation=Total_Days_Locked*perdaytoken; } return calculation; } //function this function is to calculate the rewards per staking record function Rewards_Calculator_per_entry(Locking_record memory temp) public view returns(uint) { uint owntime = temp.owntime; uint starttime = temp.starttime; uint endtime = temp.endtime; if(endtime==0){endtime=block.timestamp;} uint perdaytoken = temp.perdaytoken; uint owningdays= (starttime-owntime)/86400; owningdays++; uint calculation=0; //factor calculator uint Total_Days_Locked= (endtime-starttime)/86400; uint factordays=owningdays; uint looptorun=0; if(owningdays<30) { if(Total_Days_Locked<30-owningdays) { looptorun=Total_Days_Locked; } else{ looptorun=30-owningdays; } for(uint i=1;i<=looptorun;i++) { uint operand1 = factordays * 1000; uint operand2 = 30; uint operand3 = perdaytoken; // Perform the calculation using integer arithmetic uint result = (operand1/operand2)*operand3; result=result / 1000; calculation +=result; factordays++; } if(Total_Days_Locked+owningdays>30){ calculation+=(Total_Days_Locked-factordays)*perdaytoken; } } else{ calculation=Total_Days_Locked*perdaytoken; } return calculation; } function nft_entry(address user, uint perdaytoken, uint tokenid, uint owntime ) internal{ Locking_record memory temp; temp.tokenid=tokenid; temp.owntime=owntime; temp.starttime=block.timestamp; temp.endtime=0; temp.perdaytoken=perdaytoken; temp.total=0; user_db[user].nft_entries.push(temp); user_db[user].totalentries+=1; user_db[user].Total_locked_Nfts+=1; } function close_nft_entry(address user, uint tokenid) internal { user_db[user].Total_locked_Nfts=user_db[user].Total_locked_Nfts-1; uint totalentries=user_db[user].totalentries; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].tokenid==tokenid && user_db[user].nft_entries[i].total==0) { user_db[user].nft_entries[i].total=Rewards_Calculator_per_entry(user_db[user].nft_entries[i]); user_db[user].nft_entries[i].endtime=block.timestamp; } } } function getlast_tms(uint tokenid, address user ) internal view returns (uint){ uint totalentries=user_db[user].totalentries; uint tm=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].tokenid==tokenid) { tm = user_db[user].nft_entries[i].owntime; } } return tm; } function get_total_rewards(address user) public view returns(uint){ uint totalentries=user_db[user].totalentries; uint totalcalculation=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0) { totalcalculation += Rewards_Calculator_per_entry(user_db[user].nft_entries[i]); } else { totalcalculation +=user_db[user].nft_entries[i].total; } } return totalcalculation; } //Setter Functions function set_Staking_Reward_In_Wei(uint256 legend,uint256 genesis,uint256 neo) public onlyOwner{ legend_rewards=legend; genesis_rewards=genesis; neo_rewards=neo; } function setRewardTokenAddress(address val) public onlyOwner{ rewardToken = IERC20(val); } function setNftAddress(address val) public onlyOwner{ nft = IERC721(val); } function setRoomsRentingAddress(address val) public onlyOwner{ Rooms_renting_contract = IERC721(val); } function withdrawTokens(address _to, uint amount_in_wei) public onlyOwner{ rewardToken.transfer(_to, amount_in_wei); } function rewardsPerDay(address user) public view returns (uint256){ uint totalentries=user_db[user].totalentries; uint totalcalculation=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0) { totalcalculation += Rewards_Calculator_per_entry_checker(user,user_db[user].nft_entries[i].tokenid, user_db[user].nft_entries[i].owntime, user_db[user].nft_entries[i].perdaytoken); } } return totalcalculation; } function getRewards(address user) internal view returns(uint256) { uint totalentries=user_db[user].totalentries; uint totalcalculation=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].total==0) { totalcalculation += Rewards_Calculator_per_entry(user_db[user].nft_entries[i]); } else { totalcalculation +=user_db[user].nft_entries[i].total; } } return totalcalculation; } function viewRewards(address account) public view returns(uint256){ // Total Earned Rewards uint256 totalReward = getRewards(account); return totalReward - user_db[account].claimedreward; } function claimRewards() updateReward(msg.sender) external nonReentrant{ uint256 reward = viewRewards(msg.sender); require(reward > 0, "Zero Rewards"); require(rewardToken.balanceOf(address(this)) >= reward, "Contract does not have enough reward Tokens."); _balances[msg.sender] = 0; user_db[msg.sender].claimedreward+=reward; rewardToken.transfer(address(msg.sender), reward); } function getNftsIdsbyAddress(address _add) public view returns (uint256[] memory){ uint256 len = nft.balanceOf(_add); uint256[] memory temp = new uint[](len); uint256 temp_count = 0; uint256 totalCollectionSize = nft.totalSupply(); for(uint i=1;i<=totalCollectionSize;i++){ if(nft.ownerOf(i) == _add){ temp[temp_count] = i; temp_count++; } } return temp; } function getUserLockedNftIds(address _user) public view returns (uint256[] memory){ uint256 len = numberTokensLocked[_user]; uint256[] memory temp = new uint[](len); uint totalentries=user_db[_user].totalentries; uint counter=0; for(uint i=0;i<totalentries;i++) { if(user_db[_user].nft_entries[i].total==0 && user_db[_user].nft_entries[i].endtime==0) { temp[counter]=user_db[_user].nft_entries[i].tokenid; counter++; } } return temp; } //this function will run in staking function to calculate per day reward of a token function perday_calculator(uint tokennum) public view returns (uint){ for(uint i = 0; i < legendids.length; i++) { if(legendids[i]==tokennum) return legend_rewards; } if(tokennum<=2000) { return genesis_rewards; } else{ return neo_rewards; } } function check_ownership(address user, uint[] memory list)public view returns (bool){ for (uint256 i = 0; i < list.length; i++) { if(IERC721(nft).ownerOf(list[i]) != user) { return false; } } return true; } function check_all_tms(uint[] memory listtms) internal pure returns(bool){ for (uint256 i = 0; i < listtms.length; i++) { if(listtms[i] == 0) { return false; } } return true; } function check_Locked_ownership(address user, uint[] memory list)public view returns (bool){ for (uint256 i = 0; i < list.length; i++) { if(tokenIdOwners[list[i]] != user) { return false; } } return true; } function SendtoClass(uint256[] memory tokenIds, uint[] memory tms, uint256 id, bytes memory signature) updateReward(msg.sender) external nonReentrant { require(!paused,"Contract is paused"); require(IERC721(nft).isApprovedForAll(msg.sender, address(this)) , "Approve Neophytes First"); require(tokenIds.length > 0, "0 Neophyte to send to class"); require(check_ownership(msg.sender,tokenIds),"You are not owner of this Neophyte."); require(check_all_tms(tms),"Something went wrong"); require(check(id,signature) == Verify, "Sorry Something is wrong with the encryption."); require(voucherIds[id] == 0, "Invalid Voucher. Try Again."); voucherIds[id] = 1; uint256 len = tokenIds.length; uint256 numLocked = numberTokensLocked[msg.sender]; for (uint256 i = 0; i < len; i++) { uint256 tokenId = tokenIds[i]; if(tms[i]!=5)//if released and unsold error code { nft_entry(msg.sender,perday_calculator(tokenIds[i]),tokenIds[i],tms[i]); } else{ nft_entry(msg.sender, perday_calculator(tokenIds[i]), tokenIds[i], getlast_tms(tokenIds[i], msg.sender)); } tokenIdOwners[tokenId] = msg.sender; ownerTokenIds[msg.sender][numLocked] = tokenId; numLocked++; Total_Neo_In_Class++; nft.transferFrom(msg.sender,address(this),tokenId); } numberTokensLocked[msg.sender] = numLocked; } function ReleaseNeo(uint256[] memory tokenIds) updateReward(msg.sender) external nonReentrant{ require(!paused,"Contract is paused"); require(numberTokensLocked[msg.sender]-tokenIds.length>=Rooms_renting_contract.numberTokensLocked(msg.sender),"Please release Rooms first"); require(tokenIds.length > 0, "0 Neophyte to release"); require(check_ownership(address(this),tokenIds),"Neophyte not available in the contract"); require(check_Locked_ownership(msg.sender,tokenIds),"you don't own this Neophyte"); uint256 len = tokenIds.length; for (uint256 i = 0; i < len; i++) { uint256 tokenId = tokenIds[i]; removeFromUserLockedTokens(msg.sender, tokenId); close_nft_entry(msg.sender,tokenIds[i]); numberTokensLocked[msg.sender]--; Total_Neo_In_Class--; delete tokenIdOwners[tokenId]; nft.transferFrom( address(this), msg.sender, tokenId ); } } function inputLegends(uint[] memory ids) public onlyOwner{ for(uint i=0; i<ids.length;i++) { legendids.push(ids[i]); } } function togglePause() public onlyOwner{ paused = !paused; } function removeFromUserLockedTokens(address user, uint256 tokenId) internal { uint256 _numLocked = numberTokensLocked[user]; for (uint256 j = 0; j < _numLocked; ++j) { if (ownerTokenIds[user][j] == tokenId) { uint256 lastIndex = _numLocked - 1; ownerTokenIds[user][j] = ownerTokenIds[user][ lastIndex ]; delete ownerTokenIds[user][lastIndex]; break; } } } function check(uint id, bytes memory signature) public view returns(address){ return _verify(id, signature); } function _verify(uint id, bytes memory signature) internal view returns(address){ bytes32 digest = _hash(id); return ECDSA.recover(digest, signature); } function _hash(uint id) internal view returns(bytes32){ return _hashTypedDataV4(keccak256(abi.encode( keccak256("EIP712Domain(uint id)"), id ))); } function verifySignature(bytes memory signature, bytes memory message, address expectedAddress) public pure returns (bool) { // Extract the v, r, and s values from the signature (uint8 v, bytes32 r, bytes32 s) = abi.decode(signature, (uint8, bytes32, bytes32)); // Recover the signer's address address signer = ecrecover(keccak256(abi.encodePacked(message)), v, r, s); return signer == expectedAddress; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"ReleaseNeo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"perdaytoken","type":"uint256"},{"internalType":"uint256","name":"owntime","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"internalType":"struct Neophytes_Class_Attendance.Locking_record","name":"temp","type":"tuple"}],"name":"Rewards_Calculator_per_entry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"ot","type":"uint256"},{"internalType":"uint256","name":"perday","type":"uint256"}],"name":"Rewards_Calculator_per_entry_checker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Rooms_renting_contract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tms","type":"uint256[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"SendtoClass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Total_Neo_In_Class","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"check_Locked_ownership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"check_ownership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"getNftsIdsbyAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserLockedNftIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"get_total_rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"inputLegends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"legendids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberTokensLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokennum","type":"uint256"}],"name":"perday_calculator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"rewardsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setRewardTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setRoomsRentingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"legend","type":"uint256"},{"internalType":"uint256","name":"genesis","type":"uint256"},{"internalType":"uint256","name":"neo","type":"uint256"}],"name":"set_Staking_Reward_In_Wei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"address","name":"expectedAddress","type":"address"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voucherIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount_in_wei","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526000600260006101000a81548160ff0219169083151502179055506000600355678ac7230489e80000600755674563918244f400006008556729a2241af62c0000600955731479d797b8431d0d47f2e7a18d589dd67a4b7dc4601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ab57600080fd5b506040518060400160405280600781526020017f73616e6374756d000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000181818484620001fa60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050620001ed620001e16200023660201b60201c565b6200023e60201b60201c565b60018081905550620003da565b600083838346306040516020016200021795949392919062000335565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030d8162000392565b82525050565b6200031e81620003a6565b82525050565b6200032f81620003d0565b82525050565b600060a0820190506200034c600083018862000313565b6200035b602083018762000313565b6200036a604083018662000313565b62000379606083018562000324565b62000388608083018462000302565b9695505050505050565b60006200039f82620003b0565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60805160a05160c05160601c60e0516101005161012051615d4f6200042d60003960006141580152600061419a01526000614179015260006140ae015260006141040152600061412d0152615d4f6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638da5cb5b11610125578063c26f9404116100ad578063da40ef801161007c578063da40ef801461066e578063e57deb391461069e578063f191743c146106ce578063f2fde38b146106ec578063f7c618c11461070857610211565b8063c26f9404146105fa578063c4ae316814610618578063c9bc0a9a14610622578063ce85b6ef1461065257610211565b8063a8d77db3116100f4578063a8d77db314610532578063ab34ee4f1461054e578063b5bb2b061461057e578063b773bf5e146105ae578063b77cf9c6146105ca57610211565b80638da5cb5b1461049857806391a7e0a7146104b657806393545272146104e65780639a6acf201461051657610211565b806342265f9a116101a85780636fe08746116101775780636fe08746146103e2578063715018a614610412578063722a10ac1461041c578063786568da1461044c5780638d03c3b61461047c57610211565b806342265f9a1461034857806347ccca02146103785780634884254a146103965780634fee928e146103c657610211565b80631bfff8ac116101e45780631bfff8ac146102ae57806322f10836146102de5780632bf2a10a1461030e578063372500ab1461033e57610211565b806306b091f9146102165780630b102d1a146102325780630fb979a11461024e57806317afaee71461027e575b600080fd5b610230600480360381019061022b91906146ca565b610726565b005b61024c60048036038101906102479190614614565b610856565b005b6102686004803603810190610263919061466e565b610916565b6040516102759190614fdf565b60405180910390f35b61029860048036038101906102939190614614565b6109d0565b6040516102a59190615371565b60405180910390f35b6102c860048036038101906102c39190614614565b610c58565b6040516102d59190615371565b60405180910390f35b6102f860048036038101906102f391906146ca565b610ef2565b6040516103059190615371565b60405180910390f35b61032860048036038101906103239190614614565b610f17565b6040516103359190615371565b60405180910390f35b610346610f2f565b005b610362600480360381019061035d919061492d565b6112bc565b60405161036f9190615371565b60405180910390f35b61038061145d565b60405161038d91906150d6565b60405180910390f35b6103b060048036038101906103ab919061495a565b611483565b6040516103bd9190614f19565b60405180910390f35b6103e060048036038101906103db9190614614565b6114b6565b005b6103fc60048036038101906103f7919061470a565b611576565b6040516104099190615371565b60405180910390f35b61041a61186e565b005b6104366004803603810190610431919061495a565b6118f6565b6040516104439190615371565b60405180910390f35b610466600480360381019061046191906148a2565b61191a565b6040516104739190614fdf565b60405180910390f35b61049660048036038101906104919190614771565b6119ef565b005b6104a0611ef7565b6040516104ad9190614f19565b60405180910390f35b6104d060048036038101906104cb919061495a565b611f20565b6040516104dd9190615371565b60405180910390f35b61050060048036038101906104fb9190614614565b611f98565b60405161050d9190614fbd565b60405180910390f35b610530600480360381019061052b9190614614565b612211565b005b61054c600480360381019061054791906147ba565b6122d1565b005b6105686004803603810190610563919061495a565b612a11565b6040516105759190615371565b60405180910390f35b6105986004803603810190610593919061466e565b612a29565b6040516105a59190614fdf565b60405180910390f35b6105c860048036038101906105c39190614771565b612b5a565b005b6105e460048036038101906105df9190614614565b612c3c565b6040516105f19190615371565b60405180910390f35b610602612c54565b60405161060f91906150d6565b60405180910390f35b610620612c7a565b005b61063c60048036038101906106379190614614565b612d22565b6040516106499190614fbd565b60405180910390f35b61066c60048036038101906106679190614a10565b613000565b005b61068860048036038101906106839190614614565b613096565b6040516106959190615371565b60405180910390f35b6106b860048036038101906106b391906149b4565b6130fa565b6040516106c59190614f19565b60405180910390f35b6106d661310e565b6040516106e39190615371565b60405180910390f35b61070660048036038101906107019190614614565b613114565b005b61071061320c565b60405161071d91906150bb565b60405180910390f35b61072e613232565b73ffffffffffffffffffffffffffffffffffffffff1661074c611ef7565b73ffffffffffffffffffffffffffffffffffffffff16146107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990615271565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016107ff929190614f94565b602060405180830381600087803b15801561081957600080fd5b505af115801561082d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108519190614875565b505050565b61085e613232565b73ffffffffffffffffffffffffffffffffffffffff1661087c611ef7565b73ffffffffffffffffffffffffffffffffffffffff16146108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990615271565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090505b82518110156109c4578373ffffffffffffffffffffffffffffffffffffffff16600c6000858481518110610955576109546157b2565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109b15760009150506109ca565b80806109bc906156d2565b91505061091e565b50600190505b92915050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610c4d576000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610a7a57610a796157b2565b5b906000526020600020906006020160050154148015610afe57506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610aea57610ae96157b2565b5b906000526020600020906006020160040154145b15610bc657610bb4601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610b5a57610b596157b2565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506112bc565b82610bbf9190615479565b9150610c3a565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610c1a57610c196157b2565b5b90600052602060002090600602016005015482610c379190615479565b91505b8080610c45906156d2565b915050610a1c565b508092505050919050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610ee7576000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610d0257610d016157b2565b5b906000526020600020906006020160050154148015610d8657506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610d7257610d716157b2565b5b906000526020600020906006020160040154145b15610ed457610ec685601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610de357610de26157b2565b5b906000526020600020906006020160000154601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110610e4957610e486157b2565b5b906000526020600020906006020160020154601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018581548110610eaf57610eae6157b2565b5b906000526020600020906006020160010154611576565b82610ed19190615479565b91505b8080610edf906156d2565b915050610ca4565b508092505050919050565b600e602052816000526040600020602052806000526040600020600091509150505481565b600d6020528060005260406000206000915090505481565b336000610f3b8261323a565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd09190615479565b925050819055506002600154141561101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490615351565b60405180910390fd5b6002600181905550600061103033613096565b905060008111611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906151b1565b60405180910390fd5b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110d19190614f19565b60206040518083038186803b1580156110e957600080fd5b505afa1580156110fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111219190614987565b1015611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906152f1565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546111f99190615479565b92505081905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161125d929190614f94565b602060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190614875565b5050600180819055505050565b6000808260400151905060008360600151905060008460800151905060008114156112e5574290505b6000856020015190506000620151808585611300919061555a565b61130a91906154cf565b90508080611317906156d2565b91505060008062015180868661132d919061555a565b61133791906154cf565b905060008390506000601e85101561143d5784601e611356919061555a565b83101561136557829050611375565b84601e611372919061555a565b90505b6000600190505b8181116113fe5760006103e8846113939190615500565b90506000601e9050600089905060008183856113af91906154cf565b6113b99190615500565b90506103e8816113c991906154cf565b905080896113d79190615479565b985086806113e4906156d2565b9750505050505080806113f6906156d2565b91505061137c565b50601e858461140d9190615479565b111561143857858284611420919061555a565b61142a9190615500565b846114359190615479565b93505b61144c565b85836114499190615500565b93505b839950505050505050505050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114be613232565b73ffffffffffffffffffffffffffffffffffffffff166114dc611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990615271565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000905060058414156116c8576000601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b818110156116c15786601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061162d5761162c6157b2565b5b90600052602060002090600602016000015414156116ae57601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110611699576116986157b2565b5b90600052602060002090600602016002015492505b80806116b9906156d2565b9150506115d0565b50506116cc565b8390505b60008190506000429050600062015181826116e79190615479565b905060008114156116f6574290505b6000869050600062015180858561170d919061555a565b61171791906154cf565b90508080611724906156d2565b91505060008062015180868661173a919061555a565b61174491906154cf565b905060008390506000601e85101561184a5784601e611763919061555a565b83101561177257829050611782565b84601e61177f919061555a565b90505b6000600190505b81811161180b5760006103e8846117a09190615500565b90506000601e9050600089905060008183856117bc91906154cf565b6117c69190615500565b90506103e8816117d691906154cf565b905080896117e49190615479565b985086806117f1906156d2565b975050505050508080611803906156d2565b915050611789565b50601e858461181a9190615479565b11156118455785828461182d919061555a565b6118379190615500565b846118429190615479565b93505b611859565b85836118569190615500565b93505b839a5050505050505050505050949350505050565b611876613232565b73ffffffffffffffffffffffffffffffffffffffff16611894611ef7565b73ffffffffffffffffffffffffffffffffffffffff16146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190615271565b60405180910390fd5b6118f46000613451565b565b600f818154811061190657600080fd5b906000526020600020016000915090505481565b600080600080868060200190518101906119349190614a63565b925092509250600060018760405160200161194f9190614ecb565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516119859493929190615076565b6020604051602081039080840390855afa1580156119a7573d6000803e3d6000fd5b5050506020604051035190508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149450505050509392505050565b3360006119fb8261323a565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a909190615479565b9250508190555060026001541415611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490615351565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90615331565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632bf2a10a336040518263ffffffff1660e01b8152600401611b909190614f19565b60206040518083038186803b158015611ba857600080fd5b505afa158015611bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be09190614987565b8351600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c2c919061555a565b1015611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490615291565b60405180910390fd5b6000835111611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890615311565b60405180910390fd5b611cbb3084612a29565b611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906152d1565b60405180910390fd5b611d043384610916565b611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90615211565b60405180910390fd5b60008351905060005b81811015611ee9576000858281518110611d6957611d686157b2565b5b60200260200101519050611d7d3382613515565b611da133878481518110611d9457611d936157b2565b5b60200260200101516136e3565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611df190615677565b919050555060036000815480929190611e0990615677565b9190505550600c600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611ea393929190614f5d565b600060405180830381600087803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b50505050508080611ee1906156d2565b915050611d4c565b505060018081905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600090505b600f80549050811015611f795782600f8281548110611f4a57611f496157b2565b5b90600052602060002001541415611f6657600754915050611f93565b8080611f71906156d2565b915050611f28565b506107d08211611f8d576008549050611f93565b60095490505b919050565b60606000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008167ffffffffffffffff811115611ffa57611ff96157e1565b5b6040519080825280602002602001820160405280156120285781602001602082028036833780820191505090505b5090506000601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015612204576000601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106120d4576120d36157b2565b5b90600052602060002090600602016005015414801561215857506000601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110612144576121436157b2565b5b906000526020600020906006020160040154145b156121f157601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106121b1576121b06157b2565b5b9060005260206000209060060201600001548483815181106121d6576121d56157b2565b5b60200260200101818152505081806121ed906156d2565b9250505b80806121fc906156d2565b915050612076565b5082945050505050919050565b612219613232565b73ffffffffffffffffffffffffffffffffffffffff16612237611ef7565b73ffffffffffffffffffffffffffffffffffffffff161461228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490615271565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3360006122dd8261323a565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123729190615479565b92505081905550600260015414156123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b690615351565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90615331565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401612474929190614f34565b60206040518083038186803b15801561248c57600080fd5b505afa1580156124a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c49190614875565b612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fa90615231565b60405180910390fd5b6000865111612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90615151565b60405180910390fd5b6125513387612a29565b612590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258790615171565b60405180910390fd5b61259985613a46565b6125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cf90615191565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b85856130fa565b73ffffffffffffffffffffffffffffffffffffffff1614612671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612668906151f1565b60405180910390fd5b60006006600086815260200190815260200160002054146126c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126be906152b1565b60405180910390fd5b600160066000868152602001908152602001600020819055506000865190506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b828110156129bb57600089828151811061274a576127496157b2565b5b602002602001015190506005898381518110612769576127686157b2565b5b6020026020010151146127dd576127d83361279d8c85815181106127905761278f6157b2565b5b6020026020010151611f20565b8c85815181106127b0576127af6157b2565b5b60200260200101518c86815181106127cb576127ca6157b2565b5b6020026020010151613aa2565b612849565b612848336128048c85815181106127f7576127f66157b2565b5b6020026020010151611f20565b8c8581518110612817576128166157b2565b5b60200260200101516128438e8781518110612835576128346157b2565b5b602002602001015133613c4d565b613aa2565b5b33600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000208190555082806128fb906156d2565b93505060036000815480929190612911906156d2565b9190505550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161297593929190614f5d565b600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050505080806129b3906156d2565b91505061272d565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505060018081905550505050505050565b60066020528060005260406000206000915090505481565b600080600090505b8251811015612b4e578373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110612aa257612aa16157b2565b5b60200260200101516040518263ffffffff1660e01b8152600401612ac69190615371565b60206040518083038186803b158015612ade57600080fd5b505afa158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b169190614641565b73ffffffffffffffffffffffffffffffffffffffff1614612b3b576000915050612b54565b8080612b46906156d2565b915050612a31565b50600190505b92915050565b612b62613232565b73ffffffffffffffffffffffffffffffffffffffff16612b80611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614612bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcd90615271565b60405180910390fd5b60005b8151811015612c3857600f828281518110612bf757612bf66157b2565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080612c30906156d2565b915050612bd9565b5050565b60056020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612c82613232565b73ffffffffffffffffffffffffffffffffffffffff16612ca0611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90615271565b60405180910390fd5b600260009054906101000a900460ff1615600260006101000a81548160ff021916908315150217905550565b60606000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612d819190614f19565b60206040518083038186803b158015612d9957600080fd5b505afa158015612dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd19190614987565b905060008167ffffffffffffffff811115612def57612dee6157e1565b5b604051908082528060200260200182016040528015612e1d5781602001602082028036833780820191505090505b509050600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec39190614987565b90506000600190505b818111612ff3578673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612f459190615371565b60206040518083038186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f959190614641565b73ffffffffffffffffffffffffffffffffffffffff161415612fe05780848481518110612fc557612fc46157b2565b5b6020026020010181815250508280612fdc906156d2565b9350505b8080612feb906156d2565b915050612ecc565b5082945050505050919050565b613008613232565b73ffffffffffffffffffffffffffffffffffffffff16613026611ef7565b73ffffffffffffffffffffffffffffffffffffffff161461307c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307390615271565b60405180910390fd5b826007819055508160088190555080600981905550505050565b6000806130a28361323a565b9050601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154816130f2919061555a565b915050919050565b60006131068383613d96565b905092915050565b60035481565b61311c613232565b73ffffffffffffffffffffffffffffffffffffffff1661313a611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614613190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318790615271565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f790615131565b60405180910390fd5b61320981613451565b50565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613446576000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106132e4576132e36157b2565b5b90600052602060002090600602016005015414156133bf576133ad601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613353576133526157b2565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506112bc565b826133b89190615479565b9150613433565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613413576134126157b2565b5b906000526020600020906006020160050154826134309190615479565b91505b808061343e906156d2565b915050613286565b508092505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b818110156136dd5782600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205414156136cc5760006001836135cb919061555a565b9050600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009055506136dd565b806136d6906156d2565b905061355c565b50505050565b6001601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154613732919061555a565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b81811015613a405782601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061381f5761381e6157b2565b5b9060005260206000209060060201600001541480156138a357506000601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061388f5761388e6157b2565b5b906000526020600020906006020160050154145b15613a2d57613959601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106138ff576138fe6157b2565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506112bc565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106139ad576139ac6157b2565b5b90600052602060002090600602016005018190555042601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613a1757613a166157b2565b5b9060005260206000209060060201600401819055505b8080613a38906156d2565b9150506137c2565b50505050565b600080600090505b8251811015613a97576000838281518110613a6c57613a6b6157b2565b5b60200260200101511415613a84576000915050613a9d565b8080613a8f906156d2565b915050613a4e565b50600190505b919050565b613aaa61439d565b82816000018181525050818160400181815250504281606001818152505060008160800181815250508381602001818152505060008160a0018181525050601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550506001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254613be59190615479565b925050819055506001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000828254613c3f9190615479565b925050819055505050505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613d8a5785601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613cf657613cf56157b2565b5b9060005260206000209060060201600001541415613d7757601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613d6257613d616157b2565b5b90600052602060002090600602016002015491505b8080613d82906156d2565b915050613c99565b50809250505092915050565b600080613da284613db7565b9050613dae8184613e11565b91505092915050565b6000613e0a7f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001613def92919061504d565b60405160208183030381529060405280519060200120613e38565b9050919050565b6000806000613e208585613e52565b91509150613e2d81613ed5565b819250505092915050565b6000613e4b613e456140aa565b836141c4565b9050919050565b600080604183511415613e945760008060006020860151925060408601519150606086015160001a9050613e88878285856141f7565b94509450505050613ece565b604083511415613ec5576000806020850151915060408501519050613eba868383614304565b935093505050613ece565b60006002915091505b9250929050565b60006004811115613ee957613ee8615783565b5b816004811115613efc57613efb615783565b5b1415613f07576140a7565b60016004811115613f1b57613f1a615783565b5b816004811115613f2e57613f2d615783565b5b1415613f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f66906150f1565b60405180910390fd5b60026004811115613f8357613f82615783565b5b816004811115613f9657613f95615783565b5b1415613fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fce90615111565b60405180910390fd5b60036004811115613feb57613fea615783565b5b816004811115613ffe57613ffd615783565b5b141561403f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614036906151d1565b60405180910390fd5b60048081111561405257614051615783565b5b81600481111561406557614064615783565b5b14156140a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409d90615251565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561412657507f000000000000000000000000000000000000000000000000000000000000000046145b15614153577f000000000000000000000000000000000000000000000000000000000000000090506141c1565b6141be7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614363565b90505b90565b600082826040516020016141d9929190614ee2565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156142325760006003915091506142fb565b601b8560ff161415801561424a5750601c8560ff1614155b1561425c5760006004915091506142fb565b6000600187878787604051600081526020016040526040516142819493929190615076565b6020604051602081039080840390855afa1580156142a3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156142f2576000600192509250506142fb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6143479190615479565b9050614355878288856141f7565b935093505050935093915050565b6000838383463060405160200161437e959493929190614ffa565b6040516020818303038152906040528051906020012090509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006143e66143e1846153b1565b61538c565b905080838252602082019050828560208602820111156144095761440861581a565b5b60005b85811015614439578161441f88826145d5565b84526020840193506020830192505060018101905061440c565b5050509392505050565b6000614456614451846153dd565b61538c565b9050828152602081018484840111156144725761447161581f565b5b61447d848285615635565b509392505050565b60008135905061449481615ca6565b92915050565b6000815190506144a981615ca6565b92915050565b600082601f8301126144c4576144c3615810565b5b81356144d48482602086016143d3565b91505092915050565b6000815190506144ec81615cbd565b92915050565b60008151905061450181615cd4565b92915050565b600082601f83011261451c5761451b615810565b5b813561452c848260208601614443565b91505092915050565b600060c0828403121561454b5761454a615815565b5b61455560c061538c565b90506000614565848285016145d5565b6000830152506020614579848285016145d5565b602083015250604061458d848285016145d5565b60408301525060606145a1848285016145d5565b60608301525060806145b5848285016145d5565b60808301525060a06145c9848285016145d5565b60a08301525092915050565b6000813590506145e481615ceb565b92915050565b6000815190506145f981615ceb565b92915050565b60008151905061460e81615d02565b92915050565b60006020828403121561462a57614629615829565b5b600061463884828501614485565b91505092915050565b60006020828403121561465757614656615829565b5b60006146658482850161449a565b91505092915050565b6000806040838503121561468557614684615829565b5b600061469385828601614485565b925050602083013567ffffffffffffffff8111156146b4576146b3615824565b5b6146c0858286016144af565b9150509250929050565b600080604083850312156146e1576146e0615829565b5b60006146ef85828601614485565b9250506020614700858286016145d5565b9150509250929050565b6000806000806080858703121561472457614723615829565b5b600061473287828801614485565b9450506020614743878288016145d5565b9350506040614754878288016145d5565b9250506060614765878288016145d5565b91505092959194509250565b60006020828403121561478757614786615829565b5b600082013567ffffffffffffffff8111156147a5576147a4615824565b5b6147b1848285016144af565b91505092915050565b600080600080608085870312156147d4576147d3615829565b5b600085013567ffffffffffffffff8111156147f2576147f1615824565b5b6147fe878288016144af565b945050602085013567ffffffffffffffff81111561481f5761481e615824565b5b61482b878288016144af565b935050604061483c878288016145d5565b925050606085013567ffffffffffffffff81111561485d5761485c615824565b5b61486987828801614507565b91505092959194509250565b60006020828403121561488b5761488a615829565b5b6000614899848285016144dd565b91505092915050565b6000806000606084860312156148bb576148ba615829565b5b600084013567ffffffffffffffff8111156148d9576148d8615824565b5b6148e586828701614507565b935050602084013567ffffffffffffffff81111561490657614905615824565b5b61491286828701614507565b925050604061492386828701614485565b9150509250925092565b600060c0828403121561494357614942615829565b5b600061495184828501614535565b91505092915050565b6000602082840312156149705761496f615829565b5b600061497e848285016145d5565b91505092915050565b60006020828403121561499d5761499c615829565b5b60006149ab848285016145ea565b91505092915050565b600080604083850312156149cb576149ca615829565b5b60006149d9858286016145d5565b925050602083013567ffffffffffffffff8111156149fa576149f9615824565b5b614a0685828601614507565b9150509250929050565b600080600060608486031215614a2957614a28615829565b5b6000614a37868287016145d5565b9350506020614a48868287016145d5565b9250506040614a59868287016145d5565b9150509250925092565b600080600060608486031215614a7c57614a7b615829565b5b6000614a8a868287016145ff565b9350506020614a9b868287016144f2565b9250506040614aac868287016144f2565b9150509250925092565b6000614ac28383614e9e565b60208301905092915050565b614ad78161558e565b82525050565b6000614ae88261541e565b614af28185615441565b9350614afd8361540e565b8060005b83811015614b2e578151614b158882614ab6565b9750614b2083615434565b925050600181019050614b01565b5085935050505092915050565b614b44816155a0565b82525050565b614b53816155ac565b82525050565b614b6a614b65826155ac565b61571b565b82525050565b6000614b7b82615429565b614b858185615452565b9350614b95818560208601615644565b80840191505092915050565b614baa816155ed565b82525050565b614bb9816155ff565b82525050565b6000614bcc60188361545d565b9150614bd78261583f565b602082019050919050565b6000614bef601f8361545d565b9150614bfa82615868565b602082019050919050565b6000614c1260268361545d565b9150614c1d82615891565b604082019050919050565b6000614c35601b8361545d565b9150614c40826158e0565b602082019050919050565b6000614c5860028361546e565b9150614c6382615909565b600282019050919050565b6000614c7b60238361545d565b9150614c8682615932565b604082019050919050565b6000614c9e60148361545d565b9150614ca982615981565b602082019050919050565b6000614cc1600c8361545d565b9150614ccc826159aa565b602082019050919050565b6000614ce460228361545d565b9150614cef826159d3565b604082019050919050565b6000614d07602d8361545d565b9150614d1282615a22565b604082019050919050565b6000614d2a601b8361545d565b9150614d3582615a71565b602082019050919050565b6000614d4d60178361545d565b9150614d5882615a9a565b602082019050919050565b6000614d7060228361545d565b9150614d7b82615ac3565b604082019050919050565b6000614d9360208361545d565b9150614d9e82615b12565b602082019050919050565b6000614db6601a8361545d565b9150614dc182615b3b565b602082019050919050565b6000614dd9601b8361545d565b9150614de482615b64565b602082019050919050565b6000614dfc60268361545d565b9150614e0782615b8d565b604082019050919050565b6000614e1f602c8361545d565b9150614e2a82615bdc565b604082019050919050565b6000614e4260158361545d565b9150614e4d82615c2b565b602082019050919050565b6000614e6560128361545d565b9150614e7082615c54565b602082019050919050565b6000614e88601f8361545d565b9150614e9382615c7d565b602082019050919050565b614ea7816155d6565b82525050565b614eb6816155d6565b82525050565b614ec5816155e0565b82525050565b6000614ed78284614b70565b915081905092915050565b6000614eed82614c4b565b9150614ef98285614b59565b602082019150614f098284614b59565b6020820191508190509392505050565b6000602082019050614f2e6000830184614ace565b92915050565b6000604082019050614f496000830185614ace565b614f566020830184614ace565b9392505050565b6000606082019050614f726000830186614ace565b614f7f6020830185614ace565b614f8c6040830184614ead565b949350505050565b6000604082019050614fa96000830185614ace565b614fb66020830184614ead565b9392505050565b60006020820190508181036000830152614fd78184614add565b905092915050565b6000602082019050614ff46000830184614b3b565b92915050565b600060a08201905061500f6000830188614b4a565b61501c6020830187614b4a565b6150296040830186614b4a565b6150366060830185614ead565b6150436080830184614ace565b9695505050505050565b60006040820190506150626000830185614b4a565b61506f6020830184614ead565b9392505050565b600060808201905061508b6000830187614b4a565b6150986020830186614ebc565b6150a56040830185614b4a565b6150b26060830184614b4a565b95945050505050565b60006020820190506150d06000830184614ba1565b92915050565b60006020820190506150eb6000830184614bb0565b92915050565b6000602082019050818103600083015261510a81614bbf565b9050919050565b6000602082019050818103600083015261512a81614be2565b9050919050565b6000602082019050818103600083015261514a81614c05565b9050919050565b6000602082019050818103600083015261516a81614c28565b9050919050565b6000602082019050818103600083015261518a81614c6e565b9050919050565b600060208201905081810360008301526151aa81614c91565b9050919050565b600060208201905081810360008301526151ca81614cb4565b9050919050565b600060208201905081810360008301526151ea81614cd7565b9050919050565b6000602082019050818103600083015261520a81614cfa565b9050919050565b6000602082019050818103600083015261522a81614d1d565b9050919050565b6000602082019050818103600083015261524a81614d40565b9050919050565b6000602082019050818103600083015261526a81614d63565b9050919050565b6000602082019050818103600083015261528a81614d86565b9050919050565b600060208201905081810360008301526152aa81614da9565b9050919050565b600060208201905081810360008301526152ca81614dcc565b9050919050565b600060208201905081810360008301526152ea81614def565b9050919050565b6000602082019050818103600083015261530a81614e12565b9050919050565b6000602082019050818103600083015261532a81614e35565b9050919050565b6000602082019050818103600083015261534a81614e58565b9050919050565b6000602082019050818103600083015261536a81614e7b565b9050919050565b60006020820190506153866000830184614ead565b92915050565b60006153966153a7565b90506153a282826156a1565b919050565b6000604051905090565b600067ffffffffffffffff8211156153cc576153cb6157e1565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153f8576153f76157e1565b5b6154018261582e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615484826155d6565b915061548f836155d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154c4576154c3615725565b5b828201905092915050565b60006154da826155d6565b91506154e5836155d6565b9250826154f5576154f4615754565b5b828204905092915050565b600061550b826155d6565b9150615516836155d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561554f5761554e615725565b5b828202905092915050565b6000615565826155d6565b9150615570836155d6565b92508282101561558357615582615725565b5b828203905092915050565b6000615599826155b6565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006155f882615611565b9050919050565b600061560a82615611565b9050919050565b600061561c82615623565b9050919050565b600061562e826155b6565b9050919050565b82818337600083830152505050565b60005b83811015615662578082015181840152602081019050615647565b83811115615671576000848401525b50505050565b6000615682826155d6565b9150600082141561569657615695615725565b5b600182039050919050565b6156aa8261582e565b810181811067ffffffffffffffff821117156156c9576156c86157e1565b5b80604052505050565b60006156dd826155d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157105761570f615725565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2073656e6420746f20636c6173730000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f662074686973204e656f70687960008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f536f6d657468696e672077656e742077726f6e67000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920536f6d657468696e672069732077726f6e67207769746820746860008201527f6520656e6372797074696f6e2e00000000000000000000000000000000000000602082015250565b7f796f7520646f6e2774206f776e2074686973204e656f70687974650000000000600082015250565b7f417070726f7665204e656f706879746573204669727374000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506c656173652072656c6561736520526f6f6d73206669727374000000000000600082015250565b7f496e76616c696420566f75636865722e2054727920416761696e2e0000000000600082015250565b7f4e656f7068797465206e6f7420617661696c61626c6520696e2074686520636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820726560008201527f7761726420546f6b656e732e0000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2072656c656173650000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615caf8161558e565b8114615cba57600080fd5b50565b615cc6816155a0565b8114615cd157600080fd5b50565b615cdd816155ac565b8114615ce857600080fd5b50565b615cf4816155d6565b8114615cff57600080fd5b50565b615d0b816155e0565b8114615d1657600080fd5b5056fea26469706673582212204f424891ae86d969f38597f7bda6abc57b2f62e7b804ade5cd04f8d04d7ee54864736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638da5cb5b11610125578063c26f9404116100ad578063da40ef801161007c578063da40ef801461066e578063e57deb391461069e578063f191743c146106ce578063f2fde38b146106ec578063f7c618c11461070857610211565b8063c26f9404146105fa578063c4ae316814610618578063c9bc0a9a14610622578063ce85b6ef1461065257610211565b8063a8d77db3116100f4578063a8d77db314610532578063ab34ee4f1461054e578063b5bb2b061461057e578063b773bf5e146105ae578063b77cf9c6146105ca57610211565b80638da5cb5b1461049857806391a7e0a7146104b657806393545272146104e65780639a6acf201461051657610211565b806342265f9a116101a85780636fe08746116101775780636fe08746146103e2578063715018a614610412578063722a10ac1461041c578063786568da1461044c5780638d03c3b61461047c57610211565b806342265f9a1461034857806347ccca02146103785780634884254a146103965780634fee928e146103c657610211565b80631bfff8ac116101e45780631bfff8ac146102ae57806322f10836146102de5780632bf2a10a1461030e578063372500ab1461033e57610211565b806306b091f9146102165780630b102d1a146102325780630fb979a11461024e57806317afaee71461027e575b600080fd5b610230600480360381019061022b91906146ca565b610726565b005b61024c60048036038101906102479190614614565b610856565b005b6102686004803603810190610263919061466e565b610916565b6040516102759190614fdf565b60405180910390f35b61029860048036038101906102939190614614565b6109d0565b6040516102a59190615371565b60405180910390f35b6102c860048036038101906102c39190614614565b610c58565b6040516102d59190615371565b60405180910390f35b6102f860048036038101906102f391906146ca565b610ef2565b6040516103059190615371565b60405180910390f35b61032860048036038101906103239190614614565b610f17565b6040516103359190615371565b60405180910390f35b610346610f2f565b005b610362600480360381019061035d919061492d565b6112bc565b60405161036f9190615371565b60405180910390f35b61038061145d565b60405161038d91906150d6565b60405180910390f35b6103b060048036038101906103ab919061495a565b611483565b6040516103bd9190614f19565b60405180910390f35b6103e060048036038101906103db9190614614565b6114b6565b005b6103fc60048036038101906103f7919061470a565b611576565b6040516104099190615371565b60405180910390f35b61041a61186e565b005b6104366004803603810190610431919061495a565b6118f6565b6040516104439190615371565b60405180910390f35b610466600480360381019061046191906148a2565b61191a565b6040516104739190614fdf565b60405180910390f35b61049660048036038101906104919190614771565b6119ef565b005b6104a0611ef7565b6040516104ad9190614f19565b60405180910390f35b6104d060048036038101906104cb919061495a565b611f20565b6040516104dd9190615371565b60405180910390f35b61050060048036038101906104fb9190614614565b611f98565b60405161050d9190614fbd565b60405180910390f35b610530600480360381019061052b9190614614565b612211565b005b61054c600480360381019061054791906147ba565b6122d1565b005b6105686004803603810190610563919061495a565b612a11565b6040516105759190615371565b60405180910390f35b6105986004803603810190610593919061466e565b612a29565b6040516105a59190614fdf565b60405180910390f35b6105c860048036038101906105c39190614771565b612b5a565b005b6105e460048036038101906105df9190614614565b612c3c565b6040516105f19190615371565b60405180910390f35b610602612c54565b60405161060f91906150d6565b60405180910390f35b610620612c7a565b005b61063c60048036038101906106379190614614565b612d22565b6040516106499190614fbd565b60405180910390f35b61066c60048036038101906106679190614a10565b613000565b005b61068860048036038101906106839190614614565b613096565b6040516106959190615371565b60405180910390f35b6106b860048036038101906106b391906149b4565b6130fa565b6040516106c59190614f19565b60405180910390f35b6106d661310e565b6040516106e39190615371565b60405180910390f35b61070660048036038101906107019190614614565b613114565b005b61071061320c565b60405161071d91906150bb565b60405180910390f35b61072e613232565b73ffffffffffffffffffffffffffffffffffffffff1661074c611ef7565b73ffffffffffffffffffffffffffffffffffffffff16146107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990615271565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016107ff929190614f94565b602060405180830381600087803b15801561081957600080fd5b505af115801561082d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108519190614875565b505050565b61085e613232565b73ffffffffffffffffffffffffffffffffffffffff1661087c611ef7565b73ffffffffffffffffffffffffffffffffffffffff16146108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990615271565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090505b82518110156109c4578373ffffffffffffffffffffffffffffffffffffffff16600c6000858481518110610955576109546157b2565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109b15760009150506109ca565b80806109bc906156d2565b91505061091e565b50600190505b92915050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610c4d576000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610a7a57610a796157b2565b5b906000526020600020906006020160050154148015610afe57506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610aea57610ae96157b2565b5b906000526020600020906006020160040154145b15610bc657610bb4601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610b5a57610b596157b2565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506112bc565b82610bbf9190615479565b9150610c3a565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610c1a57610c196157b2565b5b90600052602060002090600602016005015482610c379190615479565b91505b8080610c45906156d2565b915050610a1c565b508092505050919050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610ee7576000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610d0257610d016157b2565b5b906000526020600020906006020160050154148015610d8657506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610d7257610d716157b2565b5b906000526020600020906006020160040154145b15610ed457610ec685601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610de357610de26157b2565b5b906000526020600020906006020160000154601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110610e4957610e486157b2565b5b906000526020600020906006020160020154601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018581548110610eaf57610eae6157b2565b5b906000526020600020906006020160010154611576565b82610ed19190615479565b91505b8080610edf906156d2565b915050610ca4565b508092505050919050565b600e602052816000526040600020602052806000526040600020600091509150505481565b600d6020528060005260406000206000915090505481565b336000610f3b8261323a565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd09190615479565b925050819055506002600154141561101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490615351565b60405180910390fd5b6002600181905550600061103033613096565b905060008111611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906151b1565b60405180910390fd5b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110d19190614f19565b60206040518083038186803b1580156110e957600080fd5b505afa1580156110fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111219190614987565b1015611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906152f1565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546111f99190615479565b92505081905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161125d929190614f94565b602060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190614875565b5050600180819055505050565b6000808260400151905060008360600151905060008460800151905060008114156112e5574290505b6000856020015190506000620151808585611300919061555a565b61130a91906154cf565b90508080611317906156d2565b91505060008062015180868661132d919061555a565b61133791906154cf565b905060008390506000601e85101561143d5784601e611356919061555a565b83101561136557829050611375565b84601e611372919061555a565b90505b6000600190505b8181116113fe5760006103e8846113939190615500565b90506000601e9050600089905060008183856113af91906154cf565b6113b99190615500565b90506103e8816113c991906154cf565b905080896113d79190615479565b985086806113e4906156d2565b9750505050505080806113f6906156d2565b91505061137c565b50601e858461140d9190615479565b111561143857858284611420919061555a565b61142a9190615500565b846114359190615479565b93505b61144c565b85836114499190615500565b93505b839950505050505050505050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114be613232565b73ffffffffffffffffffffffffffffffffffffffff166114dc611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990615271565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000905060058414156116c8576000601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b818110156116c15786601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061162d5761162c6157b2565b5b90600052602060002090600602016000015414156116ae57601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110611699576116986157b2565b5b90600052602060002090600602016002015492505b80806116b9906156d2565b9150506115d0565b50506116cc565b8390505b60008190506000429050600062015181826116e79190615479565b905060008114156116f6574290505b6000869050600062015180858561170d919061555a565b61171791906154cf565b90508080611724906156d2565b91505060008062015180868661173a919061555a565b61174491906154cf565b905060008390506000601e85101561184a5784601e611763919061555a565b83101561177257829050611782565b84601e61177f919061555a565b90505b6000600190505b81811161180b5760006103e8846117a09190615500565b90506000601e9050600089905060008183856117bc91906154cf565b6117c69190615500565b90506103e8816117d691906154cf565b905080896117e49190615479565b985086806117f1906156d2565b975050505050508080611803906156d2565b915050611789565b50601e858461181a9190615479565b11156118455785828461182d919061555a565b6118379190615500565b846118429190615479565b93505b611859565b85836118569190615500565b93505b839a5050505050505050505050949350505050565b611876613232565b73ffffffffffffffffffffffffffffffffffffffff16611894611ef7565b73ffffffffffffffffffffffffffffffffffffffff16146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190615271565b60405180910390fd5b6118f46000613451565b565b600f818154811061190657600080fd5b906000526020600020016000915090505481565b600080600080868060200190518101906119349190614a63565b925092509250600060018760405160200161194f9190614ecb565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516119859493929190615076565b6020604051602081039080840390855afa1580156119a7573d6000803e3d6000fd5b5050506020604051035190508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149450505050509392505050565b3360006119fb8261323a565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a909190615479565b9250508190555060026001541415611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490615351565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90615331565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632bf2a10a336040518263ffffffff1660e01b8152600401611b909190614f19565b60206040518083038186803b158015611ba857600080fd5b505afa158015611bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be09190614987565b8351600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c2c919061555a565b1015611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490615291565b60405180910390fd5b6000835111611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890615311565b60405180910390fd5b611cbb3084612a29565b611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906152d1565b60405180910390fd5b611d043384610916565b611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90615211565b60405180910390fd5b60008351905060005b81811015611ee9576000858281518110611d6957611d686157b2565b5b60200260200101519050611d7d3382613515565b611da133878481518110611d9457611d936157b2565b5b60200260200101516136e3565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611df190615677565b919050555060036000815480929190611e0990615677565b9190505550600c600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611ea393929190614f5d565b600060405180830381600087803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b50505050508080611ee1906156d2565b915050611d4c565b505060018081905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600090505b600f80549050811015611f795782600f8281548110611f4a57611f496157b2565b5b90600052602060002001541415611f6657600754915050611f93565b8080611f71906156d2565b915050611f28565b506107d08211611f8d576008549050611f93565b60095490505b919050565b60606000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008167ffffffffffffffff811115611ffa57611ff96157e1565b5b6040519080825280602002602001820160405280156120285781602001602082028036833780820191505090505b5090506000601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015612204576000601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106120d4576120d36157b2565b5b90600052602060002090600602016005015414801561215857506000601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110612144576121436157b2565b5b906000526020600020906006020160040154145b156121f157601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106121b1576121b06157b2565b5b9060005260206000209060060201600001548483815181106121d6576121d56157b2565b5b60200260200101818152505081806121ed906156d2565b9250505b80806121fc906156d2565b915050612076565b5082945050505050919050565b612219613232565b73ffffffffffffffffffffffffffffffffffffffff16612237611ef7565b73ffffffffffffffffffffffffffffffffffffffff161461228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490615271565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3360006122dd8261323a565b905042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123729190615479565b92505081905550600260015414156123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b690615351565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90615331565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401612474929190614f34565b60206040518083038186803b15801561248c57600080fd5b505afa1580156124a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c49190614875565b612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fa90615231565b60405180910390fd5b6000865111612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90615151565b60405180910390fd5b6125513387612a29565b612590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258790615171565b60405180910390fd5b61259985613a46565b6125d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cf90615191565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b85856130fa565b73ffffffffffffffffffffffffffffffffffffffff1614612671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612668906151f1565b60405180910390fd5b60006006600086815260200190815260200160002054146126c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126be906152b1565b60405180910390fd5b600160066000868152602001908152602001600020819055506000865190506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b828110156129bb57600089828151811061274a576127496157b2565b5b602002602001015190506005898381518110612769576127686157b2565b5b6020026020010151146127dd576127d83361279d8c85815181106127905761278f6157b2565b5b6020026020010151611f20565b8c85815181106127b0576127af6157b2565b5b60200260200101518c86815181106127cb576127ca6157b2565b5b6020026020010151613aa2565b612849565b612848336128048c85815181106127f7576127f66157b2565b5b6020026020010151611f20565b8c8581518110612817576128166157b2565b5b60200260200101516128438e8781518110612835576128346157b2565b5b602002602001015133613c4d565b613aa2565b5b33600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000208190555082806128fb906156d2565b93505060036000815480929190612911906156d2565b9190505550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161297593929190614f5d565b600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050505080806129b3906156d2565b91505061272d565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505060018081905550505050505050565b60066020528060005260406000206000915090505481565b600080600090505b8251811015612b4e578373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110612aa257612aa16157b2565b5b60200260200101516040518263ffffffff1660e01b8152600401612ac69190615371565b60206040518083038186803b158015612ade57600080fd5b505afa158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b169190614641565b73ffffffffffffffffffffffffffffffffffffffff1614612b3b576000915050612b54565b8080612b46906156d2565b915050612a31565b50600190505b92915050565b612b62613232565b73ffffffffffffffffffffffffffffffffffffffff16612b80611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614612bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcd90615271565b60405180910390fd5b60005b8151811015612c3857600f828281518110612bf757612bf66157b2565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080612c30906156d2565b915050612bd9565b5050565b60056020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612c82613232565b73ffffffffffffffffffffffffffffffffffffffff16612ca0611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90615271565b60405180910390fd5b600260009054906101000a900460ff1615600260006101000a81548160ff021916908315150217905550565b60606000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612d819190614f19565b60206040518083038186803b158015612d9957600080fd5b505afa158015612dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd19190614987565b905060008167ffffffffffffffff811115612def57612dee6157e1565b5b604051908082528060200260200182016040528015612e1d5781602001602082028036833780820191505090505b509050600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec39190614987565b90506000600190505b818111612ff3578673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612f459190615371565b60206040518083038186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f959190614641565b73ffffffffffffffffffffffffffffffffffffffff161415612fe05780848481518110612fc557612fc46157b2565b5b6020026020010181815250508280612fdc906156d2565b9350505b8080612feb906156d2565b915050612ecc565b5082945050505050919050565b613008613232565b73ffffffffffffffffffffffffffffffffffffffff16613026611ef7565b73ffffffffffffffffffffffffffffffffffffffff161461307c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307390615271565b60405180910390fd5b826007819055508160088190555080600981905550505050565b6000806130a28361323a565b9050601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154816130f2919061555a565b915050919050565b60006131068383613d96565b905092915050565b60035481565b61311c613232565b73ffffffffffffffffffffffffffffffffffffffff1661313a611ef7565b73ffffffffffffffffffffffffffffffffffffffff1614613190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318790615271565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f790615131565b60405180910390fd5b61320981613451565b50565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613446576000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106132e4576132e36157b2565b5b90600052602060002090600602016005015414156133bf576133ad601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613353576133526157b2565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506112bc565b826133b89190615479565b9150613433565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613413576134126157b2565b5b906000526020600020906006020160050154826134309190615479565b91505b808061343e906156d2565b915050613286565b508092505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b818110156136dd5782600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205414156136cc5760006001836135cb919061555a565b9050600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009055506136dd565b806136d6906156d2565b905061355c565b50505050565b6001601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154613732919061555a565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b81811015613a405782601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061381f5761381e6157b2565b5b9060005260206000209060060201600001541480156138a357506000601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061388f5761388e6157b2565b5b906000526020600020906006020160050154145b15613a2d57613959601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106138ff576138fe6157b2565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506112bc565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106139ad576139ac6157b2565b5b90600052602060002090600602016005018190555042601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613a1757613a166157b2565b5b9060005260206000209060060201600401819055505b8080613a38906156d2565b9150506137c2565b50505050565b600080600090505b8251811015613a97576000838281518110613a6c57613a6b6157b2565b5b60200260200101511415613a84576000915050613a9d565b8080613a8f906156d2565b915050613a4e565b50600190505b919050565b613aaa61439d565b82816000018181525050818160400181815250504281606001818152505060008160800181815250508381602001818152505060008160a0018181525050601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550506001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254613be59190615479565b925050819055506001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000828254613c3f9190615479565b925050819055505050505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613d8a5785601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613cf657613cf56157b2565b5b9060005260206000209060060201600001541415613d7757601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613d6257613d616157b2565b5b90600052602060002090600602016002015491505b8080613d82906156d2565b915050613c99565b50809250505092915050565b600080613da284613db7565b9050613dae8184613e11565b91505092915050565b6000613e0a7f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001613def92919061504d565b60405160208183030381529060405280519060200120613e38565b9050919050565b6000806000613e208585613e52565b91509150613e2d81613ed5565b819250505092915050565b6000613e4b613e456140aa565b836141c4565b9050919050565b600080604183511415613e945760008060006020860151925060408601519150606086015160001a9050613e88878285856141f7565b94509450505050613ece565b604083511415613ec5576000806020850151915060408501519050613eba868383614304565b935093505050613ece565b60006002915091505b9250929050565b60006004811115613ee957613ee8615783565b5b816004811115613efc57613efb615783565b5b1415613f07576140a7565b60016004811115613f1b57613f1a615783565b5b816004811115613f2e57613f2d615783565b5b1415613f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f66906150f1565b60405180910390fd5b60026004811115613f8357613f82615783565b5b816004811115613f9657613f95615783565b5b1415613fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fce90615111565b60405180910390fd5b60036004811115613feb57613fea615783565b5b816004811115613ffe57613ffd615783565b5b141561403f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614036906151d1565b60405180910390fd5b60048081111561405257614051615783565b5b81600481111561406557614064615783565b5b14156140a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409d90615251565b60405180910390fd5b5b50565b60007f000000000000000000000000ed7039eba376fada54b1076677d321e52d894fb073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561412657507f000000000000000000000000000000000000000000000000000000000000000146145b15614153577fd0d614911ed88c32519a2b7833364e544b570b42ff4e49ee3ff485f622c0952590506141c1565b6141be7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fff2482e359c85257fce2d1c26524268866db6bce9ba4a51357f2523068861c027fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6614363565b90505b90565b600082826040516020016141d9929190614ee2565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156142325760006003915091506142fb565b601b8560ff161415801561424a5750601c8560ff1614155b1561425c5760006004915091506142fb565b6000600187878787604051600081526020016040526040516142819493929190615076565b6020604051602081039080840390855afa1580156142a3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156142f2576000600192509250506142fb565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6143479190615479565b9050614355878288856141f7565b935093505050935093915050565b6000838383463060405160200161437e959493929190614ffa565b6040516020818303038152906040528051906020012090509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006143e66143e1846153b1565b61538c565b905080838252602082019050828560208602820111156144095761440861581a565b5b60005b85811015614439578161441f88826145d5565b84526020840193506020830192505060018101905061440c565b5050509392505050565b6000614456614451846153dd565b61538c565b9050828152602081018484840111156144725761447161581f565b5b61447d848285615635565b509392505050565b60008135905061449481615ca6565b92915050565b6000815190506144a981615ca6565b92915050565b600082601f8301126144c4576144c3615810565b5b81356144d48482602086016143d3565b91505092915050565b6000815190506144ec81615cbd565b92915050565b60008151905061450181615cd4565b92915050565b600082601f83011261451c5761451b615810565b5b813561452c848260208601614443565b91505092915050565b600060c0828403121561454b5761454a615815565b5b61455560c061538c565b90506000614565848285016145d5565b6000830152506020614579848285016145d5565b602083015250604061458d848285016145d5565b60408301525060606145a1848285016145d5565b60608301525060806145b5848285016145d5565b60808301525060a06145c9848285016145d5565b60a08301525092915050565b6000813590506145e481615ceb565b92915050565b6000815190506145f981615ceb565b92915050565b60008151905061460e81615d02565b92915050565b60006020828403121561462a57614629615829565b5b600061463884828501614485565b91505092915050565b60006020828403121561465757614656615829565b5b60006146658482850161449a565b91505092915050565b6000806040838503121561468557614684615829565b5b600061469385828601614485565b925050602083013567ffffffffffffffff8111156146b4576146b3615824565b5b6146c0858286016144af565b9150509250929050565b600080604083850312156146e1576146e0615829565b5b60006146ef85828601614485565b9250506020614700858286016145d5565b9150509250929050565b6000806000806080858703121561472457614723615829565b5b600061473287828801614485565b9450506020614743878288016145d5565b9350506040614754878288016145d5565b9250506060614765878288016145d5565b91505092959194509250565b60006020828403121561478757614786615829565b5b600082013567ffffffffffffffff8111156147a5576147a4615824565b5b6147b1848285016144af565b91505092915050565b600080600080608085870312156147d4576147d3615829565b5b600085013567ffffffffffffffff8111156147f2576147f1615824565b5b6147fe878288016144af565b945050602085013567ffffffffffffffff81111561481f5761481e615824565b5b61482b878288016144af565b935050604061483c878288016145d5565b925050606085013567ffffffffffffffff81111561485d5761485c615824565b5b61486987828801614507565b91505092959194509250565b60006020828403121561488b5761488a615829565b5b6000614899848285016144dd565b91505092915050565b6000806000606084860312156148bb576148ba615829565b5b600084013567ffffffffffffffff8111156148d9576148d8615824565b5b6148e586828701614507565b935050602084013567ffffffffffffffff81111561490657614905615824565b5b61491286828701614507565b925050604061492386828701614485565b9150509250925092565b600060c0828403121561494357614942615829565b5b600061495184828501614535565b91505092915050565b6000602082840312156149705761496f615829565b5b600061497e848285016145d5565b91505092915050565b60006020828403121561499d5761499c615829565b5b60006149ab848285016145ea565b91505092915050565b600080604083850312156149cb576149ca615829565b5b60006149d9858286016145d5565b925050602083013567ffffffffffffffff8111156149fa576149f9615824565b5b614a0685828601614507565b9150509250929050565b600080600060608486031215614a2957614a28615829565b5b6000614a37868287016145d5565b9350506020614a48868287016145d5565b9250506040614a59868287016145d5565b9150509250925092565b600080600060608486031215614a7c57614a7b615829565b5b6000614a8a868287016145ff565b9350506020614a9b868287016144f2565b9250506040614aac868287016144f2565b9150509250925092565b6000614ac28383614e9e565b60208301905092915050565b614ad78161558e565b82525050565b6000614ae88261541e565b614af28185615441565b9350614afd8361540e565b8060005b83811015614b2e578151614b158882614ab6565b9750614b2083615434565b925050600181019050614b01565b5085935050505092915050565b614b44816155a0565b82525050565b614b53816155ac565b82525050565b614b6a614b65826155ac565b61571b565b82525050565b6000614b7b82615429565b614b858185615452565b9350614b95818560208601615644565b80840191505092915050565b614baa816155ed565b82525050565b614bb9816155ff565b82525050565b6000614bcc60188361545d565b9150614bd78261583f565b602082019050919050565b6000614bef601f8361545d565b9150614bfa82615868565b602082019050919050565b6000614c1260268361545d565b9150614c1d82615891565b604082019050919050565b6000614c35601b8361545d565b9150614c40826158e0565b602082019050919050565b6000614c5860028361546e565b9150614c6382615909565b600282019050919050565b6000614c7b60238361545d565b9150614c8682615932565b604082019050919050565b6000614c9e60148361545d565b9150614ca982615981565b602082019050919050565b6000614cc1600c8361545d565b9150614ccc826159aa565b602082019050919050565b6000614ce460228361545d565b9150614cef826159d3565b604082019050919050565b6000614d07602d8361545d565b9150614d1282615a22565b604082019050919050565b6000614d2a601b8361545d565b9150614d3582615a71565b602082019050919050565b6000614d4d60178361545d565b9150614d5882615a9a565b602082019050919050565b6000614d7060228361545d565b9150614d7b82615ac3565b604082019050919050565b6000614d9360208361545d565b9150614d9e82615b12565b602082019050919050565b6000614db6601a8361545d565b9150614dc182615b3b565b602082019050919050565b6000614dd9601b8361545d565b9150614de482615b64565b602082019050919050565b6000614dfc60268361545d565b9150614e0782615b8d565b604082019050919050565b6000614e1f602c8361545d565b9150614e2a82615bdc565b604082019050919050565b6000614e4260158361545d565b9150614e4d82615c2b565b602082019050919050565b6000614e6560128361545d565b9150614e7082615c54565b602082019050919050565b6000614e88601f8361545d565b9150614e9382615c7d565b602082019050919050565b614ea7816155d6565b82525050565b614eb6816155d6565b82525050565b614ec5816155e0565b82525050565b6000614ed78284614b70565b915081905092915050565b6000614eed82614c4b565b9150614ef98285614b59565b602082019150614f098284614b59565b6020820191508190509392505050565b6000602082019050614f2e6000830184614ace565b92915050565b6000604082019050614f496000830185614ace565b614f566020830184614ace565b9392505050565b6000606082019050614f726000830186614ace565b614f7f6020830185614ace565b614f8c6040830184614ead565b949350505050565b6000604082019050614fa96000830185614ace565b614fb66020830184614ead565b9392505050565b60006020820190508181036000830152614fd78184614add565b905092915050565b6000602082019050614ff46000830184614b3b565b92915050565b600060a08201905061500f6000830188614b4a565b61501c6020830187614b4a565b6150296040830186614b4a565b6150366060830185614ead565b6150436080830184614ace565b9695505050505050565b60006040820190506150626000830185614b4a565b61506f6020830184614ead565b9392505050565b600060808201905061508b6000830187614b4a565b6150986020830186614ebc565b6150a56040830185614b4a565b6150b26060830184614b4a565b95945050505050565b60006020820190506150d06000830184614ba1565b92915050565b60006020820190506150eb6000830184614bb0565b92915050565b6000602082019050818103600083015261510a81614bbf565b9050919050565b6000602082019050818103600083015261512a81614be2565b9050919050565b6000602082019050818103600083015261514a81614c05565b9050919050565b6000602082019050818103600083015261516a81614c28565b9050919050565b6000602082019050818103600083015261518a81614c6e565b9050919050565b600060208201905081810360008301526151aa81614c91565b9050919050565b600060208201905081810360008301526151ca81614cb4565b9050919050565b600060208201905081810360008301526151ea81614cd7565b9050919050565b6000602082019050818103600083015261520a81614cfa565b9050919050565b6000602082019050818103600083015261522a81614d1d565b9050919050565b6000602082019050818103600083015261524a81614d40565b9050919050565b6000602082019050818103600083015261526a81614d63565b9050919050565b6000602082019050818103600083015261528a81614d86565b9050919050565b600060208201905081810360008301526152aa81614da9565b9050919050565b600060208201905081810360008301526152ca81614dcc565b9050919050565b600060208201905081810360008301526152ea81614def565b9050919050565b6000602082019050818103600083015261530a81614e12565b9050919050565b6000602082019050818103600083015261532a81614e35565b9050919050565b6000602082019050818103600083015261534a81614e58565b9050919050565b6000602082019050818103600083015261536a81614e7b565b9050919050565b60006020820190506153866000830184614ead565b92915050565b60006153966153a7565b90506153a282826156a1565b919050565b6000604051905090565b600067ffffffffffffffff8211156153cc576153cb6157e1565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153f8576153f76157e1565b5b6154018261582e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615484826155d6565b915061548f836155d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154c4576154c3615725565b5b828201905092915050565b60006154da826155d6565b91506154e5836155d6565b9250826154f5576154f4615754565b5b828204905092915050565b600061550b826155d6565b9150615516836155d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561554f5761554e615725565b5b828202905092915050565b6000615565826155d6565b9150615570836155d6565b92508282101561558357615582615725565b5b828203905092915050565b6000615599826155b6565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006155f882615611565b9050919050565b600061560a82615611565b9050919050565b600061561c82615623565b9050919050565b600061562e826155b6565b9050919050565b82818337600083830152505050565b60005b83811015615662578082015181840152602081019050615647565b83811115615671576000848401525b50505050565b6000615682826155d6565b9150600082141561569657615695615725565b5b600182039050919050565b6156aa8261582e565b810181811067ffffffffffffffff821117156156c9576156c86157e1565b5b80604052505050565b60006156dd826155d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157105761570f615725565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2073656e6420746f20636c6173730000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f662074686973204e656f70687960008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f536f6d657468696e672077656e742077726f6e67000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920536f6d657468696e672069732077726f6e67207769746820746860008201527f6520656e6372797074696f6e2e00000000000000000000000000000000000000602082015250565b7f796f7520646f6e2774206f776e2074686973204e656f70687974650000000000600082015250565b7f417070726f7665204e656f706879746573204669727374000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506c656173652072656c6561736520526f6f6d73206669727374000000000000600082015250565b7f496e76616c696420566f75636865722e2054727920416761696e2e0000000000600082015250565b7f4e656f7068797465206e6f7420617661696c61626c6520696e2074686520636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820726560008201527f7761726420546f6b656e732e0000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2072656c656173650000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615caf8161558e565b8114615cba57600080fd5b50565b615cc6816155a0565b8114615cd157600080fd5b50565b615cdd816155ac565b8114615ce857600080fd5b50565b615cf4816155d6565b8114615cff57600080fd5b50565b615d0b816155e0565b8114615d1657600080fd5b5056fea26469706673582212204f424891ae86d969f38597f7bda6abc57b2f62e7b804ade5cd04f8d04d7ee54864736f6c63430008070033
Deployed Bytecode Sourcemap
47109:17564:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55498:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55269:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59672:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54311:601;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55638:626;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47998:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47938:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57061:449;;;:::i;:::-;;51171:1522;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47813:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47883:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55366:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49190:1901;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14445:103;;;:::i;:::-;;48073:23;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64213:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61650:1215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13794:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58713:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58023:597;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55159:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59986:1656;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47600:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59088:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62871:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47539:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47839:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63042:74;;;:::i;:::-;;57519:489;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54958:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56841:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63698:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47443:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14703:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47384:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55498:132;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55582:11:::1;;;;;;;;;;;:20;;;55603:3;55608:13;55582:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55498:132:::0;;:::o;55269:89::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55346:3:::1;55332;;:18;;;;;;;;;;;;;;;;;;55269:89:::0;:::o;59672:302::-;59758:4;59780:9;59792:1;59780:13;;59775:168;59799:4;:11;59795:1;:15;59775:168;;;59862:4;59836:30;;:13;:22;59850:4;59855:1;59850:7;;;;;;;;:::i;:::-;;;;;;;;59836:22;;;;;;;;;;;;;;;;;;;;;:30;;;59833:98;;59909:5;59902:12;;;;;59833:98;59812:3;;;;;:::i;:::-;;;;59775:168;;;;59960:4;59953:11;;59672:302;;;;;:::o;54311:601::-;54372:4;54386:17;54404:7;:13;54412:4;54404:13;;;;;;;;;;;;;;;:26;;;54386:44;;54439:21;54477:6;54473:398;54488:12;54486:1;:14;54473:398;;;54572:1;54536:7;:13;54544:4;54536:13;;;;;;;;;;;;;;;:25;;54562:1;54536:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;:80;;;;;54615:1;54577:7;:13;54585:4;54577:13;;;;;;;;;;;;;;;:25;;54603:1;54577:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;54536:80;54533:327;;;54666:58;54695:7;:13;54703:4;54695:13;;;;;;;;;;;;;;;:25;;54721:1;54695:28;;;;;;;;:::i;:::-;;;;;;;;;;;;54666:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;54646:78;;;;;:::i;:::-;;;54533:327;;;54810:7;:13;54818:4;54810:13;;;;;;;;;;;;;;;:25;;54836:1;54810:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;54791:53;;;;;:::i;:::-;;;54533:327;54501:3;;;;;:::i;:::-;;;;54473:398;;;;54888:16;54881:23;;;;54311:601;;;:::o;55638:626::-;55696:7;55716:17;55734:7;:13;55742:4;55734:13;;;;;;;;;;;;;;;:26;;;55716:44;;55772:21;55813:6;55809:410;55824:12;55822:1;:14;55809:410;;;55908:1;55872:7;:13;55880:4;55872:13;;;;;;;;;;;;;;;:25;;55898:1;55872:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;:80;;;;;55951:1;55913:7;:13;55921:4;55913:13;;;;;;;;;;;;;;;:25;;55939:1;55913:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;55872:80;55869:326;;;56020:159;56057:4;56062:7;:13;56070:4;56062:13;;;;;;;;;;;;;;;:25;;56088:1;56062:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;56100:7;:13;56108:4;56100:13;;;;;;;;;;;;;;;:25;;56126:1;56100:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;56138:7;:13;56146:4;56138:13;;;;;;;;;;;;;;;:25;;56164:1;56138:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:40;;;56020:36;:159::i;:::-;56000:179;;;;;:::i;:::-;;;55869:326;55837:3;;;;;:::i;:::-;;;;55809:410;;;;56240:16;56233:23;;;;55638:626;;;:::o;47998:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47938:53::-;;;;;;;;;;;;;;;;;:::o;57061:449::-;57098:10;48230:14;48247:19;48258:7;48247:10;:19::i;:::-;48230:36;;48302:15;48277:13;:22;48291:7;48277:22;;;;;;;;;;;;;;;:40;;;;48350:6;48328:9;:18;48338:7;48328:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;32262:1:::1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;57142:14:::2;57159:23;57171:10;57159:11;:23::i;:::-;57142:40;;57210:1;57201:6;:10;57193:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;57287:6;57247:11;;;;;;;;;;;:21;;;57277:4;57247:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;57239:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;57377:1;57353:9;:21;57363:10;57353:21;;;;;;;;;;;;;;;:25;;;;57424:6;57389:7;:19;57397:10;57389:19;;;;;;;;;;;;;;;:33;;;:41;;;;;;;:::i;:::-;;;;;;;;57443:11;;;;;;;;;;;:20;;;57472:10;57485:6;57443:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57131:379;32218:1:::1;32570:7:::0;:22:::1;;;;48219:157:::0;57061:449;:::o;51171:1522::-;51257:4;51275:12;51290:4;:12;;;51275:27;;51314:14;51331:4;:14;;;51314:31;;51357:12;51372:4;:12;;;51357:27;;51408:1;51399:7;:10;51396:40;;;51419:15;51411:23;;51396:40;51447:16;51466:4;:16;;;51447:35;;51494:15;51531:5;51522:7;51512:9;:17;;;;:::i;:::-;51511:25;;;;:::i;:::-;51494:42;;51548:12;;;;;:::i;:::-;;;;51571:16;51649:22;51693:5;51682:9;51674:7;:17;;;;:::i;:::-;51673:25;;;;:::i;:::-;51649:49;;51708:15;51724:10;51708:26;;51745:14;51786:2;51775:10;:13;51772:877;;;51838:10;51835:2;:13;;;;:::i;:::-;51817:17;:31;51814:183;;;51892:17;51882:27;;51814:183;;;51971:10;51968:2;:13;;;;:::i;:::-;51958:23;;51814:183;52017:6;52024:1;52017:8;;52013:408;52029:9;52026:1;:12;52013:408;;52072:13;52101:4;52088:10;:17;;;;:::i;:::-;52072:33;;52120:13;52136:2;52120:18;;52153:13;52169:11;52153:27;;52258:11;52292:8;52282;52273;:17;;;;:::i;:::-;52272:28;;;;:::i;:::-;52258:42;;52331:4;52322:6;:13;;;;:::i;:::-;52315:20;;52368:6;52354:20;;;;;:::i;:::-;;;52393:12;;;;;:::i;:::-;;;;52057:364;;;;52039:3;;;;;:::i;:::-;;;;52013:408;;;;52467:2;52456:10;52438:17;:28;;;;:::i;:::-;:31;52435:120;;;52528:11;52516:10;52498:17;:28;;;;:::i;:::-;52497:42;;;;:::i;:::-;52484:55;;;;;:::i;:::-;;;52435:120;51772:877;;;52626:11;52608:17;:29;;;;:::i;:::-;52596:41;;51772:877;52672:11;52665:18;;;;;;;;;;;51171:1522;;;:::o;47813:18::-;;;;;;;;;;;;;:::o;47883:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;55366:117::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55471:3:::1;55438:22;;:37;;;;;;;;;;;;;;;;;;55366:117:::0;:::o;49190:1901::-;49305:4;49322:7;49330:1;49322:9;;49350:1;49346:2;:5;49343:347;;;49375:17;49393:7;:13;49401:4;49393:13;;;;;;;;;;;;;;;:26;;;49375:44;;49442:6;49438:217;49453:12;49451:1;:14;49438:217;;;49539:7;49501;:13;49509:4;49501:13;;;;;;;;;;;;;;;:25;;49527:1;49501:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;49498:135;;;49581:7;:13;49589:4;49581:13;;;;;;;;;;;;;;;:25;;49607:1;49581:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;49576:41;;49498:135;49466:3;;;;;:::i;:::-;;;;49438:217;;;;49363:304;49343:347;;;49686:2;49683:5;;49343:347;49701:12;49716:2;49701:17;;49730:14;49747:15;49730:32;;49774:12;49799:5;49789:9;:15;;;;:::i;:::-;49774:30;;49828:1;49819:7;:10;49816:40;;;49839:15;49831:23;;49816:40;49867:16;49886:6;49867:25;;49904:15;49941:5;49932:7;49922:9;:17;;;;:::i;:::-;49921:25;;;;:::i;:::-;49904:42;;49958:12;;;;;:::i;:::-;;;;49981:16;50067:22;50111:5;50100:9;50092:7;:17;;;;:::i;:::-;50091:25;;;;:::i;:::-;50067:49;;50127:15;50143:10;50127:26;;50164:14;50205:2;50194:10;:13;50191:861;;;50257:10;50254:2;:13;;;;:::i;:::-;50236:17;:31;50233:183;;;50311:17;50301:27;;50233:183;;;50390:10;50387:2;:13;;;;:::i;:::-;50377:23;;50233:183;50436:6;50443:1;50436:8;;50432:393;50448:9;50445:1;:12;50432:393;;50491:13;50520:4;50507:10;:17;;;;:::i;:::-;50491:33;;50535:13;50551:2;50535:18;;50564:13;50580:11;50564:27;;50665:11;50699:8;50689;50680;:17;;;;:::i;:::-;50679:28;;;;:::i;:::-;50665:42;;50735:4;50726:6;:13;;;;:::i;:::-;50719:20;;50772:6;50758:20;;;;;:::i;:::-;;;50797:12;;;;;:::i;:::-;;;;50476:349;;;;50458:3;;;;;:::i;:::-;;;;50432:393;;;;50871:2;50860:10;50842:17;:28;;;;:::i;:::-;:31;50839:120;;;50932:11;50920:10;50902:17;:28;;;;:::i;:::-;50901:42;;;;:::i;:::-;50888:55;;;;;:::i;:::-;;;50839:120;50191:861;;;51029:11;51011:17;:29;;;;:::i;:::-;50999:41;;50191:861;51075:11;51068:18;;;;;;;;;;;;49190:1901;;;;;;:::o;14445:103::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14510:30:::1;14537:1;14510:18;:30::i;:::-;14445:103::o:0;48073:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64213:454::-;64330:4;64410:7;64419:9;64430;64454;64443:48;;;;;;;;;;;;:::i;:::-;64409:82;;;;;;64543:14;64560:56;64597:7;64580:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;64570:36;;;;;;64608:1;64611;64614;64560:56;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64543:73;;64644:15;64634:25;;:6;:25;;;64627:32;;;;;;64213:454;;;;;:::o;61650:1215::-;61710:10;48230:14;48247:19;48258:7;48247:10;:19::i;:::-;48230:36;;48302:15;48277:13;:22;48291:7;48277:22;;;;;;;;;;;;;;;:40;;;;48350:6;48328:9;:18;48338:7;48328:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;32262:1:::1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;61763:6:::2;;;;;;;;;;;61762:7;61754:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61858:22;;;;;;;;;;;:41;;;61900:10;61858:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61841:8;:15;61810:18;:30;61829:10;61810:30;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:101;;61802:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;61978:1;61960:8;:15;:19;61952:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;62024:39;62048:4;62054:8;62024:15;:39::i;:::-;62016:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;62124:43;62147:10;62158:8;62124:22;:43::i;:::-;62116:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;62213:11;62227:8;:15;62213:29;;62264:9;62259:561;62283:3;62279:1;:7;62259:561;;;62311:15;62329:8;62338:1;62329:11;;;;;;;;:::i;:::-;;;;;;;;62311:29;;62374:47;62401:10;62413:7;62374:26;:47::i;:::-;62457:39;62473:10;62484:8;62493:1;62484:11;;;;;;;;:::i;:::-;;;;;;;;62457:15;:39::i;:::-;62516:18;:30;62535:10;62516:30;;;;;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;62566:18;;:20;;;;;;;;;:::i;:::-;;;;;;62611:13;:22;62625:7;62611:22;;;;;;;;;;;;62604:29;;;;;;;;;;;62654:3;;;;;;;;;;;:16;;;62705:4;62737:10;62774:7;62654:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;62293:527;62288:3;;;;;:::i;:::-;;;;62259:561;;;;61743:1122;32218:1:::1;32570:7:::0;:22:::1;;;;48219:157:::0;61650:1215;;:::o;13794:87::-;13840:7;13867:6;;;;;;;;;;;13860:13;;13794:87;:::o;58713:369::-;58776:4;58806:6;58815:1;58806:10;;58802:127;58822:9;:16;;;;58818:1;:20;58802:127;;;58886:8;58872:9;58882:1;58872:12;;;;;;;;:::i;:::-;;;;;;;;;;:22;58869:48;;;58903:14;;58896:21;;;;;58869:48;58840:3;;;;;:::i;:::-;;;;58802:127;;;;58952:4;58942:8;:14;58939:136;;58989:15;;58982:22;;;;58939:136;59052:11;;59045:18;;58713:369;;;;:::o;58023:597::-;58088:16;58116:11;58130:18;:25;58149:5;58130:25;;;;;;;;;;;;;;;;58116:39;;58166:21;58201:3;58190:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58166:39;;58216:17;58234:7;:14;58242:5;58234:14;;;;;;;;;;;;;;;:27;;;58216:45;;58273:12;58305:6;58301:290;58316:12;58314:1;:14;58301:290;;;58401:1;58364:7;:14;58372:5;58364:14;;;;;;;;;;;;;;;:26;;58391:1;58364:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;:38;:82;;;;;58445:1;58406:7;:14;58414:5;58406:14;;;;;;;;;;;;;;;:26;;58433:1;58406:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;:40;58364:82;58361:206;;;58490:7;:14;58498:5;58490:14;;;;;;;;;;;;;;;:26;;58517:1;58490:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;58476:4;58481:7;58476:13;;;;;;;;:::i;:::-;;;;;;;:51;;;;;58542:9;;;;;:::i;:::-;;;;58361:206;58329:3;;;;;:::i;:::-;;;;58301:290;;;;58608:4;58601:11;;;;;;58023:597;;;:::o;55159:104::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55251:3:::1;55230:11;;:25;;;;;;;;;;;;;;;;;;55159:104:::0;:::o;59986:1656::-;60102:10;48230:14;48247:19;48258:7;48247:10;:19::i;:::-;48230:36;;48302:15;48277:13;:22;48291:7;48277:22;;;;;;;;;;;;;;;:40;;;;48350:6;48328:9;:18;48338:7;48328:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;32262:1:::1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;60156:6:::2;;;;;;;;;;;60155:7;60147:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60211:3;;;;;;;;;;;60203:29;;;60233:10;60253:4;60203:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60195:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;60325:1;60307:8;:15;:19;60299:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60377:36;60393:10;60404:8;60377:15;:36::i;:::-;60369:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;60471:18;60485:3;60471:13;:18::i;:::-;60463:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;60555:6;;;;;;;;;;;60532:29;;:19;60538:2;60541:9;60532:5;:19::i;:::-;:29;;;60524:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60648:1;60630:10;:14;60641:2;60630:14;;;;;;;;;;;;:19;60622:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60709:1;60692:10;:14;60703:2;60692:14;;;;;;;;;;;:18;;;;60725:11;60739:8;:15;60725:29;;60769:17;60789:18;:30;60808:10;60789:30;;;;;;;;;;;;;;;;60769:50;;60839:9;60834:734;60858:3;60854:1;:7;60834:734;;;60887:15;60905:8;60914:1;60905:11;;;;;;;;:::i;:::-;;;;;;;;60887:29;;60964:1;60956:3;60960:1;60956:6;;;;;;;;:::i;:::-;;;;;;;;:9;60953:341;;61038:71;61048:10;61059:30;61077:8;61086:1;61077:11;;;;;;;;:::i;:::-;;;;;;;;61059:17;:30::i;:::-;61090:8;61099:1;61090:11;;;;;;;;:::i;:::-;;;;;;;;61102:3;61106:1;61102:6;;;;;;;;:::i;:::-;;;;;;;;61038:9;:71::i;:::-;60953:341;;;61170:104;61180:10;61192:30;61210:8;61219:1;61210:11;;;;;;;;:::i;:::-;;;;;;;;61192:17;:30::i;:::-;61224:8;61233:1;61224:11;;;;;;;;:::i;:::-;;;;;;;;61237:36;61249:8;61258:1;61249:11;;;;;;;;:::i;:::-;;;;;;;;61262:10;61237:11;:36::i;:::-;61170:9;:104::i;:::-;60953:341;61339:10;61314:13;:22;61328:7;61314:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;61407:7;61368:13;:25;61382:10;61368:25;;;;;;;;;;;;;;;:36;61394:9;61368:36;;;;;;;;;;;:46;;;;61433:11;;;;;:::i;:::-;;;;61463:18;;:20;;;;;;;;;:::i;:::-;;;;;;61502:3;;;;;;;;;;;:16;;;61519:10;61538:4;61544:7;61502:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;60868:700;60863:3;;;;;:::i;:::-;;;;60834:734;;;;61615:9;61582:18;:30;61601:10;61582:30;;;;;;;;;;;;;;;:42;;;;60136:1506;;32218:1:::1;32570:7:::0;:22:::1;;;;48219:157:::0;59986:1656;;;;;:::o;47600:42::-;;;;;;;;;;;;;;;;;:::o;59088:302::-;59167:4;59189:9;59201:1;59189:13;;59184:175;59208:4;:11;59204:1;:15;59184:175;;;59278:4;59245:37;;59253:3;;;;;;;;;;;59245:20;;;59266:4;59271:1;59266:7;;;;;;;;:::i;:::-;;;;;;;;59245:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;59242:105;;59325:5;59318:12;;;;;59242:105;59221:3;;;;;:::i;:::-;;;;59184:175;;;;59376:4;59369:11;;59088:302;;;;;:::o;62871:165::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62943:6:::1;62939:90;62955:3;:10;62953:1;:12;62939:90;;;62995:9;63010:3;63014:1;63010:6;;;;;;;;:::i;:::-;;;;;;;;62995:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62966:3;;;;;:::i;:::-;;;;62939:90;;;;62871:165:::0;:::o;47539:48::-;;;;;;;;;;;;;;;;;:::o;47839:37::-;;;;;;;;;;;;;:::o;63042:74::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63102:6:::1;;;;;;;;;;;63101:7;63092:6;;:16;;;;;;;;;;;;;;;;;;63042:74::o:0;57519:489::-;57583:16;57611:11;57625:3;;;;;;;;;;;:13;;;57639:4;57625:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57611:33;;57655:21;57690:3;57679:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57655:39;;57705:18;57740:27;57770:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57740:47;;57804:6;57811:1;57804:8;;57800:177;57816:19;57813:1;:22;57800:177;;57876:4;57858:22;;:3;;;;;;;;;;;:11;;;57870:1;57858:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;;;57855:111;;;57918:1;57899:4;57904:10;57899:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;57938:12;;;;;:::i;:::-;;;;57855:111;57836:3;;;;;:::i;:::-;;;;57800:177;;;;57996:4;57989:11;;;;;;57519:489;;;:::o;54958:195::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55079:6:::1;55064:14;:21;;;;55112:7;55096:15;:23;;;;55142:3;55130:11;:15;;;;54958:195:::0;;;:::o;56841:212::-;56899:7;56942:19;56964;56975:7;56964:10;:19::i;:::-;56942:41;;57015:7;:16;57023:7;57015:16;;;;;;;;;;;;;;;:30;;;57001:11;:44;;;;:::i;:::-;56994:51;;;56841:212;;;:::o;63698:124::-;63766:7;63792:22;63800:2;63804:9;63792:7;:22::i;:::-;63785:29;;63698:124;;;;:::o;47443:37::-;;;;:::o;14703:201::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14812:1:::1;14792:22;;:8;:22;;;;14784:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14868:28;14887:8;14868:18;:28::i;:::-;14703:201:::0;:::o;47384:25::-;;;;;;;;;;;;;:::o;12518:98::-;12571:7;12598:10;12591:17;;12518:98;:::o;56270:563::-;56326:7;56350:17;56368:7;:13;56376:4;56368:13;;;;;;;;;;;;;;;:26;;;56350:44;;56403:21;56441:6;56437:355;56452:12;56450:1;:14;56437:355;;;56536:1;56500:7;:13;56508:4;56500:13;;;;;;;;;;;;;;;:25;;56526:1;56500:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;56497:284;;;56587:58;56616:7;:13;56624:4;56616:13;;;;;;;;;;;;;;;:25;;56642:1;56616:28;;;;;;;;:::i;:::-;;;;;;;;;;;;56587:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;56567:78;;;;;:::i;:::-;;;56497:284;;;56731:7;:13;56739:4;56731:13;;;;;;;;;;;;;;;:25;;56757:1;56731:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;56712:53;;;;;:::i;:::-;;;56497:284;56465:3;;;;;:::i;:::-;;;;56437:355;;;;56809:16;56802:23;;;;56270:563;;;:::o;15064:191::-;15138:16;15157:6;;;;;;;;;;;15138:25;;15183:8;15174:6;;:17;;;;;;;;;;;;;;;;;;15238:8;15207:40;;15228:8;15207:40;;;;;;;;;;;;15127:128;15064:191;:::o;63124:555::-;63211:18;63232;:24;63251:4;63232:24;;;;;;;;;;;;;;;;63211:45;;63272:9;63267:405;63291:10;63287:1;:14;63267:405;;;63357:7;63331:13;:19;63345:4;63331:19;;;;;;;;;;;;;;;:22;63351:1;63331:22;;;;;;;;;;;;:33;63327:330;;;63389:17;63422:1;63409:10;:14;;;;:::i;:::-;63389:34;;63471:13;:19;63485:4;63471:19;;;;;;;;;;;;;;;:78;63517:9;63471:78;;;;;;;;;;;;63446:13;:19;63460:4;63446:19;;;;;;;;;;;;;;;:22;63466:1;63446:22;;;;;;;;;;;:103;;;;63579:13;:19;63593:4;63579:19;;;;;;;;;;;;;;;:30;63599:9;63579:30;;;;;;;;;;;63572:37;;;63632:5;;;63327:330;63303:3;;;;:::i;:::-;;;63267:405;;;;63200:479;63124:555;;:::o;53228:640::-;53382:1;53350:7;:13;53358:4;53350:13;;;;;;;;;;;;;;;:31;;;:33;;;;:::i;:::-;53318:7;:13;53326:4;53318:13;;;;;;;;;;;;;;;:31;;:65;;;;53403:17;53421:7;:13;53429:4;53421:13;;;;;;;;;;;;;;;:26;;;53403:44;;53480:6;53476:377;53491:12;53489:1;:14;53476:377;;;53577:7;53539;:13;53547:4;53539:13;;;;;;;;;;;;;;;:25;;53565:1;53539:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;:86;;;;;53624:1;53588:7;:13;53596:4;53588:13;;;;;;;;;;;;;;;:25;;53614:1;53588:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;53539:86;53536:295;;;53690:58;53719:7;:13;53727:4;53719:13;;;;;;;;;;;;;;;:25;;53745:1;53719:28;;;;;;;;:::i;:::-;;;;;;;;;;;;53690:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;53655:7;:13;53663:4;53655:13;;;;;;;;;;;;;;;:25;;53681:1;53655:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;:93;;;;53800:15;53763:7;:13;53771:4;53763:13;;;;;;;;;;;;;;;:25;;53789:1;53763:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;:52;;;;53536:295;53504:3;;;;;:::i;:::-;;;;53476:377;;;;53299:569;53228:640;;:::o;59398:270::-;59466:4;59488:9;59500:1;59488:13;;59483:156;59507:7;:14;59503:1;:18;59483:156;;;59561:1;59547:7;59555:1;59547:10;;;;;;;;:::i;:::-;;;;;;;;:15;59544:83;;;59605:5;59598:12;;;;;59544:83;59523:3;;;;;:::i;:::-;;;;59483:156;;;;59656:4;59649:11;;59398:270;;;;:::o;52700:522::-;52817:26;;:::i;:::-;52871:7;52858:4;:12;;:20;;;;;52906:7;52893:4;:12;;:20;;;;;52943:15;52928:4;:14;;:30;;;;;52986:1;52973:4;:12;;:14;;;;;53019:11;53002:4;:16;;:28;;;;;53056:1;53045:4;:10;;:12;;;;;53074:7;:13;53082:4;53074:13;;;;;;;;;;;;;;;:25;;53105:4;53074:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53154:1;53126:7;:13;53134:4;53126:13;;;;;;;;;;;;;;;:26;;;:29;;;;;;;:::i;:::-;;;;;;;;53203:1;53170:7;:13;53178:4;53170:13;;;;;;;;;;;;;;;:31;;;:34;;;;;;;:::i;:::-;;;;;;;;52806:416;52700:522;;;;:::o;53877:426::-;53959:4;53976:17;53994:7;:13;54002:4;53994:13;;;;;;;;;;;;;;;:26;;;53976:44;;54029:7;54053:6;54049:217;54064:12;54062:1;:14;54049:217;;;54150:7;54112;:13;54120:4;54112:13;;;;;;;;;;;;;;;:25;;54138:1;54112:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;54109:135;;;54192:7;:13;54200:4;54192:13;;;;;;;;;;;;;;;:25;;54218:1;54192:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;54187:41;;54109:135;54077:3;;;;;:::i;:::-;;;;54049:217;;;;54283:2;54276:9;;;;53877:426;;;;:::o;63830:175::-;63902:7;63921:14;63938:9;63944:2;63938:5;:9::i;:::-;63921:26;;63965:32;63979:6;63987:9;63965:13;:32::i;:::-;63958:39;;;63830:175;;;;:::o;64013:196::-;64059:7;64085:116;64137:34;64186:2;64112:87;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64102:98;;;;;;64085:16;:116::i;:::-;64078:123;;64013:196;;;:::o;38644:231::-;38722:7;38743:17;38762:18;38784:27;38795:4;38801:9;38784:10;:27::i;:::-;38742:69;;;;38822:18;38834:5;38822:11;:18::i;:::-;38858:9;38851:16;;;;38644:231;;;;:::o;46877:167::-;46954:7;46981:55;47003:20;:18;:20::i;:::-;47025:10;46981:21;:55::i;:::-;46974:62;;46877:167;;;:::o;36534:1308::-;36615:7;36624:12;36869:2;36849:9;:16;:22;36845:990;;;36888:9;36912;36936:7;37145:4;37134:9;37130:20;37124:27;37119:32;;37195:4;37184:9;37180:20;37174:27;37169:32;;37253:4;37242:9;37238:20;37232:27;37229:1;37224:36;37219:41;;37296:25;37307:4;37313:1;37316;37319;37296:10;:25::i;:::-;37289:32;;;;;;;;;36845:990;37363:2;37343:9;:16;:22;37339:496;;;37382:9;37406:10;37618:4;37607:9;37603:20;37597:27;37592:32;;37669:4;37658:9;37654:20;37648:27;37642:33;;37711:23;37722:4;37728:1;37731:2;37711:10;:23::i;:::-;37704:30;;;;;;;;37339:496;37783:1;37787:35;37767:56;;;;36534:1308;;;;;;:::o;34805:643::-;34883:20;34874:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;34870:571;;;34920:7;;34870:571;34981:29;34972:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;34968:473;;;35027:34;;;;;;;;;;:::i;:::-;;;;;;;;34968:473;35092:35;35083:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;35079:362;;;35144:41;;;;;;;;;;:::i;:::-;;;;;;;;35079:362;35216:30;35207:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;35203:238;;;35263:44;;;;;;;;;;:::i;:::-;;;;;;;;35203:238;35338:30;35329:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;35325:116;;;35385:44;;;;;;;;;;:::i;:::-;;;;;;;;35325:116;34805:643;;:::o;45650:314::-;45703:7;45744:12;45727:29;;45735:4;45727:29;;;:66;;;;;45777:16;45760:13;:33;45727:66;45723:234;;;45817:24;45810:31;;;;45723:234;45881:64;45903:10;45915:12;45929:15;45881:21;:64::i;:::-;45874:71;;45650:314;;:::o;43558:196::-;43651:7;43717:15;43734:10;43688:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43678:68;;;;;;43671:75;;43558:196;;;;:::o;40096:1632::-;40227:7;40236:12;41161:66;41156:1;41148:10;;:79;41144:163;;;41260:1;41264:30;41244:51;;;;;;41144:163;41326:2;41321:1;:7;;;;:18;;;;;41337:2;41332:1;:7;;;;41321:18;41317:102;;;41372:1;41376:30;41356:51;;;;;;41317:102;41516:14;41533:24;41543:4;41549:1;41552;41555;41533:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41516:41;;41590:1;41572:20;;:6;:20;;;41568:103;;;41625:1;41629:29;41609:50;;;;;;;41568:103;41691:6;41699:20;41683:37;;;;;40096:1632;;;;;;;;:::o;39138:344::-;39252:7;39261:12;39286:9;39311:66;39303:75;;39298:2;:80;39286:92;;39389:7;39428:2;39421:3;39414:2;39406:11;;:18;;39405:25;;;;:::i;:::-;39389:42;;39449:25;39460:4;39466:1;39469;39472;39449:10;:25::i;:::-;39442:32;;;;;;39138:344;;;;;;:::o;45972:263::-;46116:7;46164:8;46174;46184:11;46197:13;46220:4;46153:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46143:84;;;;;;46136:91;;45972:263;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:143::-;1370:5;1401:6;1395:13;1386:22;;1417:33;1444:5;1417:33;:::i;:::-;1313:143;;;;:::o;1479:370::-;1550:5;1599:3;1592:4;1584:6;1580:17;1576:27;1566:122;;1607:79;;:::i;:::-;1566:122;1724:6;1711:20;1749:94;1839:3;1831:6;1824:4;1816:6;1812:17;1749:94;:::i;:::-;1740:103;;1556:293;1479:370;;;;:::o;1855:137::-;1909:5;1940:6;1934:13;1925:22;;1956:30;1980:5;1956:30;:::i;:::-;1855:137;;;;:::o;1998:143::-;2055:5;2086:6;2080:13;2071:22;;2102:33;2129:5;2102:33;:::i;:::-;1998:143;;;;:::o;2160:338::-;2215:5;2264:3;2257:4;2249:6;2245:17;2241:27;2231:122;;2272:79;;:::i;:::-;2231:122;2389:6;2376:20;2414:78;2488:3;2480:6;2473:4;2465:6;2461:17;2414:78;:::i;:::-;2405:87;;2221:277;2160:338;;;;:::o;2560:1249::-;2641:5;2685:4;2673:9;2668:3;2664:19;2660:30;2657:117;;;2693:79;;:::i;:::-;2657:117;2792:21;2808:4;2792:21;:::i;:::-;2783:30;;2875:1;2915:49;2960:3;2951:6;2940:9;2936:22;2915:49;:::i;:::-;2908:4;2901:5;2897:16;2890:75;2823:153;3042:2;3083:49;3128:3;3119:6;3108:9;3104:22;3083:49;:::i;:::-;3076:4;3069:5;3065:16;3058:75;2986:158;3206:2;3247:49;3292:3;3283:6;3272:9;3268:22;3247:49;:::i;:::-;3240:4;3233:5;3229:16;3222:75;3154:154;3372:2;3413:49;3458:3;3449:6;3438:9;3434:22;3413:49;:::i;:::-;3406:4;3399:5;3395:16;3388:75;3318:156;3536:3;3578:49;3623:3;3614:6;3603:9;3599:22;3578:49;:::i;:::-;3571:4;3564:5;3560:16;3553:75;3484:155;3699:3;3741:49;3786:3;3777:6;3766:9;3762:22;3741:49;:::i;:::-;3734:4;3727:5;3723:16;3716:75;3649:153;2560:1249;;;;:::o;3815:139::-;3861:5;3899:6;3886:20;3877:29;;3915:33;3942:5;3915:33;:::i;:::-;3815:139;;;;:::o;3960:143::-;4017:5;4048:6;4042:13;4033:22;;4064:33;4091:5;4064:33;:::i;:::-;3960:143;;;;:::o;4109:139::-;4164:5;4195:6;4189:13;4180:22;;4211:31;4236:5;4211:31;:::i;:::-;4109:139;;;;:::o;4254:329::-;4313:6;4362:2;4350:9;4341:7;4337:23;4333:32;4330:119;;;4368:79;;:::i;:::-;4330:119;4488:1;4513:53;4558:7;4549:6;4538:9;4534:22;4513:53;:::i;:::-;4503:63;;4459:117;4254:329;;;;:::o;4589:351::-;4659:6;4708:2;4696:9;4687:7;4683:23;4679:32;4676:119;;;4714:79;;:::i;:::-;4676:119;4834:1;4859:64;4915:7;4906:6;4895:9;4891:22;4859:64;:::i;:::-;4849:74;;4805:128;4589:351;;;;:::o;4946:684::-;5039:6;5047;5096:2;5084:9;5075:7;5071:23;5067:32;5064:119;;;5102:79;;:::i;:::-;5064:119;5222:1;5247:53;5292:7;5283:6;5272:9;5268:22;5247:53;:::i;:::-;5237:63;;5193:117;5377:2;5366:9;5362:18;5349:32;5408:18;5400:6;5397:30;5394:117;;;5430:79;;:::i;:::-;5394:117;5535:78;5605:7;5596:6;5585:9;5581:22;5535:78;:::i;:::-;5525:88;;5320:303;4946:684;;;;;:::o;5636:474::-;5704:6;5712;5761:2;5749:9;5740:7;5736:23;5732:32;5729:119;;;5767:79;;:::i;:::-;5729:119;5887:1;5912:53;5957:7;5948:6;5937:9;5933:22;5912:53;:::i;:::-;5902:63;;5858:117;6014:2;6040:53;6085:7;6076:6;6065:9;6061:22;6040:53;:::i;:::-;6030:63;;5985:118;5636:474;;;;;:::o;6116:765::-;6202:6;6210;6218;6226;6275:3;6263:9;6254:7;6250:23;6246:33;6243:120;;;6282:79;;:::i;:::-;6243:120;6402:1;6427:53;6472:7;6463:6;6452:9;6448:22;6427:53;:::i;:::-;6417:63;;6373:117;6529:2;6555:53;6600:7;6591:6;6580:9;6576:22;6555:53;:::i;:::-;6545:63;;6500:118;6657:2;6683:53;6728:7;6719:6;6708:9;6704:22;6683:53;:::i;:::-;6673:63;;6628:118;6785:2;6811:53;6856:7;6847:6;6836:9;6832:22;6811:53;:::i;:::-;6801:63;;6756:118;6116:765;;;;;;;:::o;6887:539::-;6971:6;7020:2;7008:9;6999:7;6995:23;6991:32;6988:119;;;7026:79;;:::i;:::-;6988:119;7174:1;7163:9;7159:17;7146:31;7204:18;7196:6;7193:30;7190:117;;;7226:79;;:::i;:::-;7190:117;7331:78;7401:7;7392:6;7381:9;7377:22;7331:78;:::i;:::-;7321:88;;7117:302;6887:539;;;;:::o;7432:1363::-;7577:6;7585;7593;7601;7650:3;7638:9;7629:7;7625:23;7621:33;7618:120;;;7657:79;;:::i;:::-;7618:120;7805:1;7794:9;7790:17;7777:31;7835:18;7827:6;7824:30;7821:117;;;7857:79;;:::i;:::-;7821:117;7962:78;8032:7;8023:6;8012:9;8008:22;7962:78;:::i;:::-;7952:88;;7748:302;8117:2;8106:9;8102:18;8089:32;8148:18;8140:6;8137:30;8134:117;;;8170:79;;:::i;:::-;8134:117;8275:78;8345:7;8336:6;8325:9;8321:22;8275:78;:::i;:::-;8265:88;;8060:303;8402:2;8428:53;8473:7;8464:6;8453:9;8449:22;8428:53;:::i;:::-;8418:63;;8373:118;8558:2;8547:9;8543:18;8530:32;8589:18;8581:6;8578:30;8575:117;;;8611:79;;:::i;:::-;8575:117;8716:62;8770:7;8761:6;8750:9;8746:22;8716:62;:::i;:::-;8706:72;;8501:287;7432:1363;;;;;;;:::o;8801:345::-;8868:6;8917:2;8905:9;8896:7;8892:23;8888:32;8885:119;;;8923:79;;:::i;:::-;8885:119;9043:1;9068:61;9121:7;9112:6;9101:9;9097:22;9068:61;:::i;:::-;9058:71;;9014:125;8801:345;;;;:::o;9152:975::-;9247:6;9255;9263;9312:2;9300:9;9291:7;9287:23;9283:32;9280:119;;;9318:79;;:::i;:::-;9280:119;9466:1;9455:9;9451:17;9438:31;9496:18;9488:6;9485:30;9482:117;;;9518:79;;:::i;:::-;9482:117;9623:62;9677:7;9668:6;9657:9;9653:22;9623:62;:::i;:::-;9613:72;;9409:286;9762:2;9751:9;9747:18;9734:32;9793:18;9785:6;9782:30;9779:117;;;9815:79;;:::i;:::-;9779:117;9920:62;9974:7;9965:6;9954:9;9950:22;9920:62;:::i;:::-;9910:72;;9705:287;10031:2;10057:53;10102:7;10093:6;10082:9;10078:22;10057:53;:::i;:::-;10047:63;;10002:118;9152:975;;;;;:::o;10133:394::-;10224:6;10273:3;10261:9;10252:7;10248:23;10244:33;10241:120;;;10280:79;;:::i;:::-;10241:120;10400:1;10425:85;10502:7;10493:6;10482:9;10478:22;10425:85;:::i;:::-;10415:95;;10371:149;10133:394;;;;:::o;10533:329::-;10592:6;10641:2;10629:9;10620:7;10616:23;10612:32;10609:119;;;10647:79;;:::i;:::-;10609:119;10767:1;10792:53;10837:7;10828:6;10817:9;10813:22;10792:53;:::i;:::-;10782:63;;10738:117;10533:329;;;;:::o;10868:351::-;10938:6;10987:2;10975:9;10966:7;10962:23;10958:32;10955:119;;;10993:79;;:::i;:::-;10955:119;11113:1;11138:64;11194:7;11185:6;11174:9;11170:22;11138:64;:::i;:::-;11128:74;;11084:128;10868:351;;;;:::o;11225:652::-;11302:6;11310;11359:2;11347:9;11338:7;11334:23;11330:32;11327:119;;;11365:79;;:::i;:::-;11327:119;11485:1;11510:53;11555:7;11546:6;11535:9;11531:22;11510:53;:::i;:::-;11500:63;;11456:117;11640:2;11629:9;11625:18;11612:32;11671:18;11663:6;11660:30;11657:117;;;11693:79;;:::i;:::-;11657:117;11798:62;11852:7;11843:6;11832:9;11828:22;11798:62;:::i;:::-;11788:72;;11583:287;11225:652;;;;;:::o;11883:619::-;11960:6;11968;11976;12025:2;12013:9;12004:7;12000:23;11996:32;11993:119;;;12031:79;;:::i;:::-;11993:119;12151:1;12176:53;12221:7;12212:6;12201:9;12197:22;12176:53;:::i;:::-;12166:63;;12122:117;12278:2;12304:53;12349:7;12340:6;12329:9;12325:22;12304:53;:::i;:::-;12294:63;;12249:118;12406:2;12432:53;12477:7;12468:6;12457:9;12453:22;12432:53;:::i;:::-;12422:63;;12377:118;11883:619;;;;;:::o;12508:659::-;12594:6;12602;12610;12659:2;12647:9;12638:7;12634:23;12630:32;12627:119;;;12665:79;;:::i;:::-;12627:119;12785:1;12810:62;12864:7;12855:6;12844:9;12840:22;12810:62;:::i;:::-;12800:72;;12756:126;12921:2;12947:64;13003:7;12994:6;12983:9;12979:22;12947:64;:::i;:::-;12937:74;;12892:129;13060:2;13086:64;13142:7;13133:6;13122:9;13118:22;13086:64;:::i;:::-;13076:74;;13031:129;12508:659;;;;;:::o;13173:179::-;13242:10;13263:46;13305:3;13297:6;13263:46;:::i;:::-;13341:4;13336:3;13332:14;13318:28;;13173:179;;;;:::o;13358:118::-;13445:24;13463:5;13445:24;:::i;:::-;13440:3;13433:37;13358:118;;:::o;13512:732::-;13631:3;13660:54;13708:5;13660:54;:::i;:::-;13730:86;13809:6;13804:3;13730:86;:::i;:::-;13723:93;;13840:56;13890:5;13840:56;:::i;:::-;13919:7;13950:1;13935:284;13960:6;13957:1;13954:13;13935:284;;;14036:6;14030:13;14063:63;14122:3;14107:13;14063:63;:::i;:::-;14056:70;;14149:60;14202:6;14149:60;:::i;:::-;14139:70;;13995:224;13982:1;13979;13975:9;13970:14;;13935:284;;;13939:14;14235:3;14228:10;;13636:608;;;13512:732;;;;:::o;14250:109::-;14331:21;14346:5;14331:21;:::i;:::-;14326:3;14319:34;14250:109;;:::o;14365:118::-;14452:24;14470:5;14452:24;:::i;:::-;14447:3;14440:37;14365:118;;:::o;14489:157::-;14594:45;14614:24;14632:5;14614:24;:::i;:::-;14594:45;:::i;:::-;14589:3;14582:58;14489:157;;:::o;14652:373::-;14756:3;14784:38;14816:5;14784:38;:::i;:::-;14838:88;14919:6;14914:3;14838:88;:::i;:::-;14831:95;;14935:52;14980:6;14975:3;14968:4;14961:5;14957:16;14935:52;:::i;:::-;15012:6;15007:3;15003:16;14996:23;;14760:265;14652:373;;;;:::o;15031:159::-;15132:51;15177:5;15132:51;:::i;:::-;15127:3;15120:64;15031:159;;:::o;15196:161::-;15298:52;15344:5;15298:52;:::i;:::-;15293:3;15286:65;15196:161;;:::o;15363:366::-;15505:3;15526:67;15590:2;15585:3;15526:67;:::i;:::-;15519:74;;15602:93;15691:3;15602:93;:::i;:::-;15720:2;15715:3;15711:12;15704:19;;15363:366;;;:::o;15735:::-;15877:3;15898:67;15962:2;15957:3;15898:67;:::i;:::-;15891:74;;15974:93;16063:3;15974:93;:::i;:::-;16092:2;16087:3;16083:12;16076:19;;15735:366;;;:::o;16107:::-;16249:3;16270:67;16334:2;16329:3;16270:67;:::i;:::-;16263:74;;16346:93;16435:3;16346:93;:::i;:::-;16464:2;16459:3;16455:12;16448:19;;16107:366;;;:::o;16479:::-;16621:3;16642:67;16706:2;16701:3;16642:67;:::i;:::-;16635:74;;16718:93;16807:3;16718:93;:::i;:::-;16836:2;16831:3;16827:12;16820:19;;16479:366;;;:::o;16851:400::-;17011:3;17032:84;17114:1;17109:3;17032:84;:::i;:::-;17025:91;;17125:93;17214:3;17125:93;:::i;:::-;17243:1;17238:3;17234:11;17227:18;;16851:400;;;:::o;17257:366::-;17399:3;17420:67;17484:2;17479:3;17420:67;:::i;:::-;17413:74;;17496:93;17585:3;17496:93;:::i;:::-;17614:2;17609:3;17605:12;17598:19;;17257:366;;;:::o;17629:::-;17771:3;17792:67;17856:2;17851:3;17792:67;:::i;:::-;17785:74;;17868:93;17957:3;17868:93;:::i;:::-;17986:2;17981:3;17977:12;17970:19;;17629:366;;;:::o;18001:::-;18143:3;18164:67;18228:2;18223:3;18164:67;:::i;:::-;18157:74;;18240:93;18329:3;18240:93;:::i;:::-;18358:2;18353:3;18349:12;18342:19;;18001:366;;;:::o;18373:::-;18515:3;18536:67;18600:2;18595:3;18536:67;:::i;:::-;18529:74;;18612:93;18701:3;18612:93;:::i;:::-;18730:2;18725:3;18721:12;18714:19;;18373:366;;;:::o;18745:::-;18887:3;18908:67;18972:2;18967:3;18908:67;:::i;:::-;18901:74;;18984:93;19073:3;18984:93;:::i;:::-;19102:2;19097:3;19093:12;19086:19;;18745:366;;;:::o;19117:::-;19259:3;19280:67;19344:2;19339:3;19280:67;:::i;:::-;19273:74;;19356:93;19445:3;19356:93;:::i;:::-;19474:2;19469:3;19465:12;19458:19;;19117:366;;;:::o;19489:::-;19631:3;19652:67;19716:2;19711:3;19652:67;:::i;:::-;19645:74;;19728:93;19817:3;19728:93;:::i;:::-;19846:2;19841:3;19837:12;19830:19;;19489:366;;;:::o;19861:::-;20003:3;20024:67;20088:2;20083:3;20024:67;:::i;:::-;20017:74;;20100:93;20189:3;20100:93;:::i;:::-;20218:2;20213:3;20209:12;20202:19;;19861:366;;;:::o;20233:::-;20375:3;20396:67;20460:2;20455:3;20396:67;:::i;:::-;20389:74;;20472:93;20561:3;20472:93;:::i;:::-;20590:2;20585:3;20581:12;20574:19;;20233:366;;;:::o;20605:::-;20747:3;20768:67;20832:2;20827:3;20768:67;:::i;:::-;20761:74;;20844:93;20933:3;20844:93;:::i;:::-;20962:2;20957:3;20953:12;20946:19;;20605:366;;;:::o;20977:::-;21119:3;21140:67;21204:2;21199:3;21140:67;:::i;:::-;21133:74;;21216:93;21305:3;21216:93;:::i;:::-;21334:2;21329:3;21325:12;21318:19;;20977:366;;;:::o;21349:::-;21491:3;21512:67;21576:2;21571:3;21512:67;:::i;:::-;21505:74;;21588:93;21677:3;21588:93;:::i;:::-;21706:2;21701:3;21697:12;21690:19;;21349:366;;;:::o;21721:::-;21863:3;21884:67;21948:2;21943:3;21884:67;:::i;:::-;21877:74;;21960:93;22049:3;21960:93;:::i;:::-;22078:2;22073:3;22069:12;22062:19;;21721:366;;;:::o;22093:::-;22235:3;22256:67;22320:2;22315:3;22256:67;:::i;:::-;22249:74;;22332:93;22421:3;22332:93;:::i;:::-;22450:2;22445:3;22441:12;22434:19;;22093:366;;;:::o;22465:::-;22607:3;22628:67;22692:2;22687:3;22628:67;:::i;:::-;22621:74;;22704:93;22793:3;22704:93;:::i;:::-;22822:2;22817:3;22813:12;22806:19;;22465:366;;;:::o;22837:::-;22979:3;23000:67;23064:2;23059:3;23000:67;:::i;:::-;22993:74;;23076:93;23165:3;23076:93;:::i;:::-;23194:2;23189:3;23185:12;23178:19;;22837:366;;;:::o;23209:108::-;23286:24;23304:5;23286:24;:::i;:::-;23281:3;23274:37;23209:108;;:::o;23323:118::-;23410:24;23428:5;23410:24;:::i;:::-;23405:3;23398:37;23323:118;;:::o;23447:112::-;23530:22;23546:5;23530:22;:::i;:::-;23525:3;23518:35;23447:112;;:::o;23565:271::-;23695:3;23717:93;23806:3;23797:6;23717:93;:::i;:::-;23710:100;;23827:3;23820:10;;23565:271;;;;:::o;23842:663::-;24083:3;24105:148;24249:3;24105:148;:::i;:::-;24098:155;;24263:75;24334:3;24325:6;24263:75;:::i;:::-;24363:2;24358:3;24354:12;24347:19;;24376:75;24447:3;24438:6;24376:75;:::i;:::-;24476:2;24471:3;24467:12;24460:19;;24496:3;24489:10;;23842:663;;;;;:::o;24511:222::-;24604:4;24642:2;24631:9;24627:18;24619:26;;24655:71;24723:1;24712:9;24708:17;24699:6;24655:71;:::i;:::-;24511:222;;;;:::o;24739:332::-;24860:4;24898:2;24887:9;24883:18;24875:26;;24911:71;24979:1;24968:9;24964:17;24955:6;24911:71;:::i;:::-;24992:72;25060:2;25049:9;25045:18;25036:6;24992:72;:::i;:::-;24739:332;;;;;:::o;25077:442::-;25226:4;25264:2;25253:9;25249:18;25241:26;;25277:71;25345:1;25334:9;25330:17;25321:6;25277:71;:::i;:::-;25358:72;25426:2;25415:9;25411:18;25402:6;25358:72;:::i;:::-;25440;25508:2;25497:9;25493:18;25484:6;25440:72;:::i;:::-;25077:442;;;;;;:::o;25525:332::-;25646:4;25684:2;25673:9;25669:18;25661:26;;25697:71;25765:1;25754:9;25750:17;25741:6;25697:71;:::i;:::-;25778:72;25846:2;25835:9;25831:18;25822:6;25778:72;:::i;:::-;25525:332;;;;;:::o;25863:373::-;26006:4;26044:2;26033:9;26029:18;26021:26;;26093:9;26087:4;26083:20;26079:1;26068:9;26064:17;26057:47;26121:108;26224:4;26215:6;26121:108;:::i;:::-;26113:116;;25863:373;;;;:::o;26242:210::-;26329:4;26367:2;26356:9;26352:18;26344:26;;26380:65;26442:1;26431:9;26427:17;26418:6;26380:65;:::i;:::-;26242:210;;;;:::o;26458:664::-;26663:4;26701:3;26690:9;26686:19;26678:27;;26715:71;26783:1;26772:9;26768:17;26759:6;26715:71;:::i;:::-;26796:72;26864:2;26853:9;26849:18;26840:6;26796:72;:::i;:::-;26878;26946:2;26935:9;26931:18;26922:6;26878:72;:::i;:::-;26960;27028:2;27017:9;27013:18;27004:6;26960:72;:::i;:::-;27042:73;27110:3;27099:9;27095:19;27086:6;27042:73;:::i;:::-;26458:664;;;;;;;;:::o;27128:332::-;27249:4;27287:2;27276:9;27272:18;27264:26;;27300:71;27368:1;27357:9;27353:17;27344:6;27300:71;:::i;:::-;27381:72;27449:2;27438:9;27434:18;27425:6;27381:72;:::i;:::-;27128:332;;;;;:::o;27466:545::-;27639:4;27677:3;27666:9;27662:19;27654:27;;27691:71;27759:1;27748:9;27744:17;27735:6;27691:71;:::i;:::-;27772:68;27836:2;27825:9;27821:18;27812:6;27772:68;:::i;:::-;27850:72;27918:2;27907:9;27903:18;27894:6;27850:72;:::i;:::-;27932;28000:2;27989:9;27985:18;27976:6;27932:72;:::i;:::-;27466:545;;;;;;;:::o;28017:250::-;28124:4;28162:2;28151:9;28147:18;28139:26;;28175:85;28257:1;28246:9;28242:17;28233:6;28175:85;:::i;:::-;28017:250;;;;:::o;28273:252::-;28381:4;28419:2;28408:9;28404:18;28396:26;;28432:86;28515:1;28504:9;28500:17;28491:6;28432:86;:::i;:::-;28273:252;;;;:::o;28531:419::-;28697:4;28735:2;28724:9;28720:18;28712:26;;28784:9;28778:4;28774:20;28770:1;28759:9;28755:17;28748:47;28812:131;28938:4;28812:131;:::i;:::-;28804:139;;28531:419;;;:::o;28956:::-;29122:4;29160:2;29149:9;29145:18;29137:26;;29209:9;29203:4;29199:20;29195:1;29184:9;29180:17;29173:47;29237:131;29363:4;29237:131;:::i;:::-;29229:139;;28956:419;;;:::o;29381:::-;29547:4;29585:2;29574:9;29570:18;29562:26;;29634:9;29628:4;29624:20;29620:1;29609:9;29605:17;29598:47;29662:131;29788:4;29662:131;:::i;:::-;29654:139;;29381:419;;;:::o;29806:::-;29972:4;30010:2;29999:9;29995:18;29987:26;;30059:9;30053:4;30049:20;30045:1;30034:9;30030:17;30023:47;30087:131;30213:4;30087:131;:::i;:::-;30079:139;;29806:419;;;:::o;30231:::-;30397:4;30435:2;30424:9;30420:18;30412:26;;30484:9;30478:4;30474:20;30470:1;30459:9;30455:17;30448:47;30512:131;30638:4;30512:131;:::i;:::-;30504:139;;30231:419;;;:::o;30656:::-;30822:4;30860:2;30849:9;30845:18;30837:26;;30909:9;30903:4;30899:20;30895:1;30884:9;30880:17;30873:47;30937:131;31063:4;30937:131;:::i;:::-;30929:139;;30656:419;;;:::o;31081:::-;31247:4;31285:2;31274:9;31270:18;31262:26;;31334:9;31328:4;31324:20;31320:1;31309:9;31305:17;31298:47;31362:131;31488:4;31362:131;:::i;:::-;31354:139;;31081:419;;;:::o;31506:::-;31672:4;31710:2;31699:9;31695:18;31687:26;;31759:9;31753:4;31749:20;31745:1;31734:9;31730:17;31723:47;31787:131;31913:4;31787:131;:::i;:::-;31779:139;;31506:419;;;:::o;31931:::-;32097:4;32135:2;32124:9;32120:18;32112:26;;32184:9;32178:4;32174:20;32170:1;32159:9;32155:17;32148:47;32212:131;32338:4;32212:131;:::i;:::-;32204:139;;31931:419;;;:::o;32356:::-;32522:4;32560:2;32549:9;32545:18;32537:26;;32609:9;32603:4;32599:20;32595:1;32584:9;32580:17;32573:47;32637:131;32763:4;32637:131;:::i;:::-;32629:139;;32356:419;;;:::o;32781:::-;32947:4;32985:2;32974:9;32970:18;32962:26;;33034:9;33028:4;33024:20;33020:1;33009:9;33005:17;32998:47;33062:131;33188:4;33062:131;:::i;:::-;33054:139;;32781:419;;;:::o;33206:::-;33372:4;33410:2;33399:9;33395:18;33387:26;;33459:9;33453:4;33449:20;33445:1;33434:9;33430:17;33423:47;33487:131;33613:4;33487:131;:::i;:::-;33479:139;;33206:419;;;:::o;33631:::-;33797:4;33835:2;33824:9;33820:18;33812:26;;33884:9;33878:4;33874:20;33870:1;33859:9;33855:17;33848:47;33912:131;34038:4;33912:131;:::i;:::-;33904:139;;33631:419;;;:::o;34056:::-;34222:4;34260:2;34249:9;34245:18;34237:26;;34309:9;34303:4;34299:20;34295:1;34284:9;34280:17;34273:47;34337:131;34463:4;34337:131;:::i;:::-;34329:139;;34056:419;;;:::o;34481:::-;34647:4;34685:2;34674:9;34670:18;34662:26;;34734:9;34728:4;34724:20;34720:1;34709:9;34705:17;34698:47;34762:131;34888:4;34762:131;:::i;:::-;34754:139;;34481:419;;;:::o;34906:::-;35072:4;35110:2;35099:9;35095:18;35087:26;;35159:9;35153:4;35149:20;35145:1;35134:9;35130:17;35123:47;35187:131;35313:4;35187:131;:::i;:::-;35179:139;;34906:419;;;:::o;35331:::-;35497:4;35535:2;35524:9;35520:18;35512:26;;35584:9;35578:4;35574:20;35570:1;35559:9;35555:17;35548:47;35612:131;35738:4;35612:131;:::i;:::-;35604:139;;35331:419;;;:::o;35756:::-;35922:4;35960:2;35949:9;35945:18;35937:26;;36009:9;36003:4;35999:20;35995:1;35984:9;35980:17;35973:47;36037:131;36163:4;36037:131;:::i;:::-;36029:139;;35756:419;;;:::o;36181:::-;36347:4;36385:2;36374:9;36370:18;36362:26;;36434:9;36428:4;36424:20;36420:1;36409:9;36405:17;36398:47;36462:131;36588:4;36462:131;:::i;:::-;36454:139;;36181:419;;;:::o;36606:::-;36772:4;36810:2;36799:9;36795:18;36787:26;;36859:9;36853:4;36849:20;36845:1;36834:9;36830:17;36823:47;36887:131;37013:4;36887:131;:::i;:::-;36879:139;;36606:419;;;:::o;37031:222::-;37124:4;37162:2;37151:9;37147:18;37139:26;;37175:71;37243:1;37232:9;37228:17;37219:6;37175:71;:::i;:::-;37031:222;;;;:::o;37259:129::-;37293:6;37320:20;;:::i;:::-;37310:30;;37349:33;37377:4;37369:6;37349:33;:::i;:::-;37259:129;;;:::o;37394:75::-;37427:6;37460:2;37454:9;37444:19;;37394:75;:::o;37475:311::-;37552:4;37642:18;37634:6;37631:30;37628:56;;;37664:18;;:::i;:::-;37628:56;37714:4;37706:6;37702:17;37694:25;;37774:4;37768;37764:15;37756:23;;37475:311;;;:::o;37792:307::-;37853:4;37943:18;37935:6;37932:30;37929:56;;;37965:18;;:::i;:::-;37929:56;38003:29;38025:6;38003:29;:::i;:::-;37995:37;;38087:4;38081;38077:15;38069:23;;37792:307;;;:::o;38105:132::-;38172:4;38195:3;38187:11;;38225:4;38220:3;38216:14;38208:22;;38105:132;;;:::o;38243:114::-;38310:6;38344:5;38338:12;38328:22;;38243:114;;;:::o;38363:98::-;38414:6;38448:5;38442:12;38432:22;;38363:98;;;:::o;38467:113::-;38537:4;38569;38564:3;38560:14;38552:22;;38467:113;;;:::o;38586:184::-;38685:11;38719:6;38714:3;38707:19;38759:4;38754:3;38750:14;38735:29;;38586:184;;;;:::o;38776:147::-;38877:11;38914:3;38899:18;;38776:147;;;;:::o;38929:169::-;39013:11;39047:6;39042:3;39035:19;39087:4;39082:3;39078:14;39063:29;;38929:169;;;;:::o;39104:148::-;39206:11;39243:3;39228:18;;39104:148;;;;:::o;39258:305::-;39298:3;39317:20;39335:1;39317:20;:::i;:::-;39312:25;;39351:20;39369:1;39351:20;:::i;:::-;39346:25;;39505:1;39437:66;39433:74;39430:1;39427:81;39424:107;;;39511:18;;:::i;:::-;39424:107;39555:1;39552;39548:9;39541:16;;39258:305;;;;:::o;39569:185::-;39609:1;39626:20;39644:1;39626:20;:::i;:::-;39621:25;;39660:20;39678:1;39660:20;:::i;:::-;39655:25;;39699:1;39689:35;;39704:18;;:::i;:::-;39689:35;39746:1;39743;39739:9;39734:14;;39569:185;;;;:::o;39760:348::-;39800:7;39823:20;39841:1;39823:20;:::i;:::-;39818:25;;39857:20;39875:1;39857:20;:::i;:::-;39852:25;;40045:1;39977:66;39973:74;39970:1;39967:81;39962:1;39955:9;39948:17;39944:105;39941:131;;;40052:18;;:::i;:::-;39941:131;40100:1;40097;40093:9;40082:20;;39760:348;;;;:::o;40114:191::-;40154:4;40174:20;40192:1;40174:20;:::i;:::-;40169:25;;40208:20;40226:1;40208:20;:::i;:::-;40203:25;;40247:1;40244;40241:8;40238:34;;;40252:18;;:::i;:::-;40238:34;40297:1;40294;40290:9;40282:17;;40114:191;;;;:::o;40311:96::-;40348:7;40377:24;40395:5;40377:24;:::i;:::-;40366:35;;40311:96;;;:::o;40413:90::-;40447:7;40490:5;40483:13;40476:21;40465:32;;40413:90;;;:::o;40509:77::-;40546:7;40575:5;40564:16;;40509:77;;;:::o;40592:126::-;40629:7;40669:42;40662:5;40658:54;40647:65;;40592:126;;;:::o;40724:77::-;40761:7;40790:5;40779:16;;40724:77;;;:::o;40807:86::-;40842:7;40882:4;40875:5;40871:16;40860:27;;40807:86;;;:::o;40899:140::-;40963:9;40996:37;41027:5;40996:37;:::i;:::-;40983:50;;40899:140;;;:::o;41045:141::-;41110:9;41143:37;41174:5;41143:37;:::i;:::-;41130:50;;41045:141;;;:::o;41192:126::-;41242:9;41275:37;41306:5;41275:37;:::i;:::-;41262:50;;41192:126;;;:::o;41324:113::-;41374:9;41407:24;41425:5;41407:24;:::i;:::-;41394:37;;41324:113;;;:::o;41443:154::-;41527:6;41522:3;41517;41504:30;41589:1;41580:6;41575:3;41571:16;41564:27;41443:154;;;:::o;41603:307::-;41671:1;41681:113;41695:6;41692:1;41689:13;41681:113;;;41780:1;41775:3;41771:11;41765:18;41761:1;41756:3;41752:11;41745:39;41717:2;41714:1;41710:10;41705:15;;41681:113;;;41812:6;41809:1;41806:13;41803:101;;;41892:1;41883:6;41878:3;41874:16;41867:27;41803:101;41652:258;41603:307;;;:::o;41916:171::-;41955:3;41978:24;41996:5;41978:24;:::i;:::-;41969:33;;42024:4;42017:5;42014:15;42011:41;;;42032:18;;:::i;:::-;42011:41;42079:1;42072:5;42068:13;42061:20;;41916:171;;;:::o;42093:281::-;42176:27;42198:4;42176:27;:::i;:::-;42168:6;42164:40;42306:6;42294:10;42291:22;42270:18;42258:10;42255:34;42252:62;42249:88;;;42317:18;;:::i;:::-;42249:88;42357:10;42353:2;42346:22;42136:238;42093:281;;:::o;42380:233::-;42419:3;42442:24;42460:5;42442:24;:::i;:::-;42433:33;;42488:66;42481:5;42478:77;42475:103;;;42558:18;;:::i;:::-;42475:103;42605:1;42598:5;42594:13;42587:20;;42380:233;;;:::o;42619:79::-;42658:7;42687:5;42676:16;;42619:79;;;:::o;42704:180::-;42752:77;42749:1;42742:88;42849:4;42846:1;42839:15;42873:4;42870:1;42863:15;42890:180;42938:77;42935:1;42928:88;43035:4;43032:1;43025:15;43059:4;43056:1;43049:15;43076:180;43124:77;43121:1;43114:88;43221:4;43218:1;43211:15;43245:4;43242:1;43235:15;43262:180;43310:77;43307:1;43300:88;43407:4;43404:1;43397:15;43431:4;43428:1;43421:15;43448:180;43496:77;43493:1;43486:88;43593:4;43590:1;43583:15;43617:4;43614:1;43607:15;43634:117;43743:1;43740;43733:12;43757:117;43866:1;43863;43856:12;44003:117;44112:1;44109;44102:12;44126:117;44235:1;44232;44225:12;44249:117;44358:1;44355;44348:12;44372:117;44481:1;44478;44471:12;44495:102;44536:6;44587:2;44583:7;44578:2;44571:5;44567:14;44563:28;44553:38;;44495:102;;;:::o;44603:174::-;44743:26;44739:1;44731:6;44727:14;44720:50;44603:174;:::o;44783:181::-;44923:33;44919:1;44911:6;44907:14;44900:57;44783:181;:::o;44970:225::-;45110:34;45106:1;45098:6;45094:14;45087:58;45179:8;45174:2;45166:6;45162:15;45155:33;44970:225;:::o;45201:177::-;45341:29;45337:1;45329:6;45325:14;45318:53;45201:177;:::o;45384:214::-;45524:66;45520:1;45512:6;45508:14;45501:90;45384:214;:::o;45604:222::-;45744:34;45740:1;45732:6;45728:14;45721:58;45813:5;45808:2;45800:6;45796:15;45789:30;45604:222;:::o;45832:170::-;45972:22;45968:1;45960:6;45956:14;45949:46;45832:170;:::o;46008:162::-;46148:14;46144:1;46136:6;46132:14;46125:38;46008:162;:::o;46176:221::-;46316:34;46312:1;46304:6;46300:14;46293:58;46385:4;46380:2;46372:6;46368:15;46361:29;46176:221;:::o;46403:232::-;46543:34;46539:1;46531:6;46527:14;46520:58;46612:15;46607:2;46599:6;46595:15;46588:40;46403:232;:::o;46641:177::-;46781:29;46777:1;46769:6;46765:14;46758:53;46641:177;:::o;46824:173::-;46964:25;46960:1;46952:6;46948:14;46941:49;46824:173;:::o;47003:221::-;47143:34;47139:1;47131:6;47127:14;47120:58;47212:4;47207:2;47199:6;47195:15;47188:29;47003:221;:::o;47230:182::-;47370:34;47366:1;47358:6;47354:14;47347:58;47230:182;:::o;47418:176::-;47558:28;47554:1;47546:6;47542:14;47535:52;47418:176;:::o;47600:177::-;47740:29;47736:1;47728:6;47724:14;47717:53;47600:177;:::o;47783:225::-;47923:34;47919:1;47911:6;47907:14;47900:58;47992:8;47987:2;47979:6;47975:15;47968:33;47783:225;:::o;48014:231::-;48154:34;48150:1;48142:6;48138:14;48131:58;48223:14;48218:2;48210:6;48206:15;48199:39;48014:231;:::o;48251:171::-;48391:23;48387:1;48379:6;48375:14;48368:47;48251:171;:::o;48428:168::-;48568:20;48564:1;48556:6;48552:14;48545:44;48428:168;:::o;48602:181::-;48742:33;48738:1;48730:6;48726:14;48719:57;48602:181;:::o;48789:122::-;48862:24;48880:5;48862:24;:::i;:::-;48855:5;48852:35;48842:63;;48901:1;48898;48891:12;48842:63;48789:122;:::o;48917:116::-;48987:21;49002:5;48987:21;:::i;:::-;48980:5;48977:32;48967:60;;49023:1;49020;49013:12;48967:60;48917:116;:::o;49039:122::-;49112:24;49130:5;49112:24;:::i;:::-;49105:5;49102:35;49092:63;;49151:1;49148;49141:12;49092:63;49039:122;:::o;49167:::-;49240:24;49258:5;49240:24;:::i;:::-;49233:5;49230:35;49220:63;;49279:1;49276;49269:12;49220:63;49167:122;:::o;49295:118::-;49366:22;49382:5;49366:22;:::i;:::-;49359:5;49356:33;49346:61;;49403:1;49400;49393:12;49346:61;49295:118;:::o
Swarm Source
ipfs://4f424891ae86d969f38597f7bda6abc57b2f62e7b804ade5cd04f8d04d7ee548
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.