Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,984 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Quit Pool | 19485513 | 395 days ago | IN | 0 ETH | 0.00711426 | ||||
Quit Pool | 19485505 | 395 days ago | IN | 0 ETH | 0.00716602 | ||||
Quit Pool | 19485496 | 395 days ago | IN | 0 ETH | 0.00747477 | ||||
Withdraw | 16367568 | 832 days ago | IN | 0 ETH | 0.00398638 | ||||
Withdraw | 16011882 | 882 days ago | IN | 0 ETH | 0.00431225 | ||||
Withdraw | 15978804 | 887 days ago | IN | 0 ETH | 0.00445383 | ||||
Withdraw | 15978800 | 887 days ago | IN | 0 ETH | 0.00453027 | ||||
Withdraw | 15719473 | 923 days ago | IN | 0 ETH | 0.01049991 | ||||
Withdraw | 15490017 | 956 days ago | IN | 0 ETH | 0.00201666 | ||||
Withdraw | 15482709 | 957 days ago | IN | 0 ETH | 0.0027937 | ||||
Withdraw | 15101133 | 1017 days ago | IN | 0 ETH | 0.0034439 | ||||
Withdraw | 15018317 | 1031 days ago | IN | 0 ETH | 0.00761583 | ||||
Withdraw | 14659353 | 1090 days ago | IN | 0 ETH | 0.00826534 | ||||
Withdraw | 14652925 | 1091 days ago | IN | 0 ETH | 0.00793181 | ||||
Withdraw | 14341491 | 1140 days ago | IN | 0 ETH | 0.00672826 | ||||
Withdraw | 14332989 | 1141 days ago | IN | 0 ETH | 0.00309786 | ||||
Withdraw | 14332957 | 1141 days ago | IN | 0 ETH | 0.0055028 | ||||
Withdraw | 13918742 | 1205 days ago | IN | 0 ETH | 0.01645888 | ||||
Withdraw | 13906214 | 1207 days ago | IN | 0 ETH | 0.0212458 | ||||
Withdraw | 13857200 | 1215 days ago | IN | 0 ETH | 0.01914786 | ||||
Withdraw | 13841271 | 1217 days ago | IN | 0 ETH | 0.01042936 | ||||
Withdraw | 13834791 | 1218 days ago | IN | 0 ETH | 0.00787013 | ||||
Withdraw | 13797539 | 1224 days ago | IN | 0 ETH | 0.01317536 | ||||
Withdraw | 13795379 | 1224 days ago | IN | 0 ETH | 0.0090665 | ||||
Deposit | 13772347 | 1228 days ago | IN | 0 ETH | 0.01764354 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NerdVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-30 */ // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts-ethereum-package/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.6.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 GSN 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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol pragma solidity ^0.6.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. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File: contracts/INerdBaseToken.sol pragma solidity 0.6.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface INerdBaseToken { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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 ); event Log(string log); } interface INerdBaseTokenLGE is INerdBaseToken { function getAllocatedLP(address _user) external view returns (uint256); function getLpReleaseStart() external view returns (uint256); function getTokenUniswapPair() external view returns (address); function getTotalLPTokensMinted() external view returns (uint256); function getReleasableLPTokensMinted() external view returns (uint256); function isLPGenerationCompleted() external view returns (bool); function tokenUniswapPair() external view returns (address); function getUniswapRouterV2() external view returns (address); function getUniswapFactory() external view returns (address); function devFundAddress() external view returns (address); function transferCheckerAddress() external view returns (address); function feeDistributor() external view returns (address); } // File: contracts/uniswapv2/interfaces/IUniswapV2Factory.sol pragma solidity 0.6.12; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function migrator() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function setMigrator(address) external; } // File: contracts/uniswapv2/interfaces/IUniswapV2Router01.sol pragma solidity 0.6.12; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File: contracts/uniswapv2/interfaces/IUniswapV2Router02.sol pragma solidity 0.6.12; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File: contracts/uniswapv2/interfaces/IUniswapV2Pair.sol pragma solidity 0.6.12; interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/uniswapv2/interfaces/IWETH.sol pragma solidity 0.6.12; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; function approve(address guy, uint256 wad) external returns (bool); function balanceOf(address addr) external view returns (uint256); } // File: @nomiclabs/buidler/console.sol pragma solidity >= 0.4.22 <0.8.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logByte(byte p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(byte)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File: contracts/NerdVault.sol pragma solidity 0.6.12; // Nerd Vault distributes fees equally amongst staked pools // Have fun reading it. Hopefully it's bug-free. God bless. contract TimeLockLPToken { using SafeMath for uint256; using Address for address; uint256 public constant LP_LOCKED_PERIOD_WEEKS = 10; //10 weeks, uint256 public constant LP_RELEASE_TRUNK = 1 weeks; //releasable every week, uint256 public constant LP_LOCK_FOREVER_PERCENT = 40; //40% uint256 public constant LP_INITIAL_LOCKED_PERIOD = 28 days; uint256 public constant LP_ACCUMULATION_FEE = 1; //1/1000 address public constant ADDRESS_LOCKED_LP_ACCUMULATION = address(0); // Info of each user. struct UserInfo { bool genesisLPClaimed; uint256 amount; // How many tokens the user currently has. uint256 referenceAmount; //this amount is used for computing releasable LP amount uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLocked; uint256 releaseTime; // // We do some fancy math here. Basically, any point in time, the amount of NERDs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accNerdPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws tokens to a pool. Here's what happens: // 1. The pool's `accNerdPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. uint256 depositTime; //See explanation below. //this is a dynamic value. It changes every time user deposit to the pool //1. initial deposit X => deposit time is block time //2. deposit more at time deposit2 without amount Y => // => compute current releasable amount R // => compute diffTime = R*lockedPeriod/(X + Y) => this is the duration users can unlock R with new deposit amount // => updated depositTime = (blocktime - diffTime/2) } // Info of each pool. struct PoolInfo { IERC20 token; // Address of token contract. uint256 allocPoint; // How many allocation points assigned to this pool. NERDs to distribute per block. uint256 accNerdPerShare; // Accumulated NERDs per share, times 1e18. See below. uint256 lockedPeriod; // liquidity locked period mapping(address => mapping(address => uint256)) allowance; bool emergencyWithdrawable; uint256 rewardsInThisEpoch; uint256 cumulativeRewardsSinceStart; uint256 startBlock; // For easy graphing historical epoch rewards mapping(uint256 => uint256) epochRewards; uint256 epochCalculationStartBlock; } // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; bool genesisLPClaimed; // The NERD TOKEN! INerdBaseTokenLGE public nerd; event LPTokenClaimed(address dst, uint256 value); function getAllocatedLP(address _user) public view returns (uint256) { return nerd.getAllocatedLP(_user); } function getLpReleaseStart(uint256 _pid, address _user) public view returns (uint256) { if (_pid == 0 && !userInfo[_pid][_user].genesisLPClaimed) { return nerd.getLpReleaseStart(); } else { return userInfo[_pid][_user].depositTime.add(LP_INITIAL_LOCKED_PERIOD); } } function getRemainingLP(uint256 _pid, address _user) public view returns (uint256) { if (_pid == 0 && !userInfo[_pid][_user].genesisLPClaimed) { return getAllocatedLP(_user); } else { return userInfo[_pid][_user].amount; } } function getReferenceAmount(uint256 _pid, address _user) public view returns (uint256) { if (_pid == 0 && !userInfo[_pid][_user].genesisLPClaimed) { return getAllocatedLP(_user); } else { return userInfo[_pid][_user].referenceAmount; } } function computeReleasableLP(uint256 _pid, address _addr) public view returns (uint256) { uint256 lpReleaseStart = getLpReleaseStart(_pid, _addr); if (block.timestamp < lpReleaseStart) { return 0; } uint256 amountLP = getReferenceAmount(_pid, _addr); if (amountLP == 0) return 0; uint256 totalReleasableTilNow = 0; if (block.timestamp > lpReleaseStart.add(poolInfo[_pid].lockedPeriod)) { totalReleasableTilNow = amountLP; } else { uint256 weeksTilNow = weeksSinceLPReleaseTilNow(_pid, _addr); totalReleasableTilNow = weeksTilNow .mul(LP_RELEASE_TRUNK) .mul(amountLP) .div(poolInfo[_pid].lockedPeriod); } if (totalReleasableTilNow > amountLP) { totalReleasableTilNow = amountLP; } uint256 alreadyReleased = amountLP.sub(getRemainingLP(_pid, _addr)); if (totalReleasableTilNow > alreadyReleased) { return totalReleasableTilNow.sub(alreadyReleased); } return 0; } function computeLockedLP(uint256 _pid, address _addr) public view returns (uint256) { return getRemainingLP(_pid, _addr); } function weeksSinceLPReleaseTilNow(uint256 _pid, address _addr) public view returns (uint256) { uint256 lpReleaseStart = getLpReleaseStart(_pid, _addr); if (lpReleaseStart == 0 || block.timestamp < lpReleaseStart) return 0; uint256 timeTillNow = block.timestamp.sub(lpReleaseStart); uint256 weeksTilNow = timeTillNow.div(LP_RELEASE_TRUNK); weeksTilNow = weeksTilNow.add(1); return weeksTilNow; } } contract NerdVault is OwnableUpgradeSafe, TimeLockLPToken { using SafeMath for uint256; using SafeERC20 for IERC20; // Dev address. address public devaddr; address public tentativeDevAddress; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; //// pending rewards awaiting anyone to massUpdate uint256 public pendingRewards; uint256 public epoch; uint256 public constant REWARD_LOCKED_PERIOD = 28 days; uint256 public constant REWARD_RELEASE_PERCENTAGE = 50; uint256 public contractStartBlock; uint256 private nerdBalance; // Sets the dev fee for this contract // defaults at 7.24% // Note contract owner is meant to be a governance contract allowing NERD governance consensus uint16 DEV_FEE; uint256 public pending_DEV_rewards; address private _superAdmin; IUniswapV2Router02 public uniswapRouterV2; IUniswapV2Factory public uniswapFactory; // Returns fees generated since start of this contract function averageFeesPerBlockSinceStart(uint256 _pid) external view returns (uint256 averagePerBlock) { averagePerBlock = poolInfo[_pid] .cumulativeRewardsSinceStart .add(poolInfo[_pid].rewardsInThisEpoch) .add(pendingNerdForPool(_pid)) .div(block.number.sub(poolInfo[_pid].startBlock)); } // Returns averge fees in this epoch function averageFeesPerBlockEpoch(uint256 _pid) external view returns (uint256 averagePerBlock) { averagePerBlock = poolInfo[_pid] .rewardsInThisEpoch .add(pendingNerdForPool(_pid)) .div(block.number.sub(poolInfo[_pid].epochCalculationStartBlock)); } function getEpochReward(uint256 _pid, uint256 _epoch) public view returns (uint256) { return poolInfo[_pid].epochRewards[_epoch]; } //Starts a new calculation epoch // Because averge since start will not be accurate function startNewEpoch() public { for (uint256 _pid = 0; _pid < poolInfo.length; _pid++) { require( poolInfo[_pid].epochCalculationStartBlock + 50000 < block.number, "New epoch not ready yet" ); // About a week poolInfo[_pid].epochRewards[epoch] = poolInfo[_pid] .rewardsInThisEpoch; poolInfo[_pid].cumulativeRewardsSinceStart = poolInfo[_pid] .cumulativeRewardsSinceStart .add(poolInfo[_pid].rewardsInThisEpoch); poolInfo[_pid].rewardsInThisEpoch = 0; poolInfo[_pid].epochCalculationStartBlock = block.number; ++epoch; } } event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event Approval( address indexed owner, address indexed spender, uint256 _pid, uint256 value ); function initialize(INerdBaseTokenLGE _nerd, address superAdmin) public initializer { OwnableUpgradeSafe.__Ownable_init(); DEV_FEE = 724; nerd = _nerd; devaddr = nerd.devFundAddress(); tentativeDevAddress = address(0); contractStartBlock = block.number; _superAdmin = superAdmin; require( isTokenPairValid(nerd.tokenUniswapPair()), "One of the paired tokens must be NERD" ); //add first pool: genesis pool add(uint256(1000), IERC20(nerd.tokenUniswapPair()), true); uniswapRouterV2 = IUniswapV2Router02(nerd.getUniswapRouterV2()); uniswapFactory = IUniswapV2Factory(nerd.getUniswapFactory()); } function isTokenPairValid(address _pair) public view returns (bool) { IUniswapV2Pair tokenPair = IUniswapV2Pair(_pair); return tokenPair.token0() == address(nerd) || tokenPair.token1() == address(nerd); } function poolLength() external view returns (uint256) { return poolInfo.length; } function poolToken(uint256 _pid) external view returns (address) { return address(poolInfo[_pid].token); } function isMultipleOfWeek(uint256 _period) public pure returns (bool) { uint256 numWeeks = _period.div(LP_RELEASE_TRUNK); return (_period == numWeeks.mul(LP_RELEASE_TRUNK)); } // Add a new token pool. Can only be called by the owner. // Note contract owner is meant to be a governance contract allowing NERD governance consensus function add( uint256 _allocPoint, IERC20 _token, bool _withUpdate ) public onlyOwner { require( isTokenPairValid(address(_token)), "One of the paired tokens must be NERD" ); if (_withUpdate) { massUpdatePools(); } uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { require(poolInfo[pid].token != _token, "Error pool already added"); } totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ token: _token, allocPoint: _allocPoint, accNerdPerShare: 0, lockedPeriod: LP_LOCKED_PERIOD_WEEKS.mul(LP_RELEASE_TRUNK), emergencyWithdrawable: false, rewardsInThisEpoch: 0, cumulativeRewardsSinceStart: 0, startBlock: block.number, epochCalculationStartBlock: block.number }) ); } function claimLPToken() public { if (!genesisLPClaimed) { if (nerd.isLPGenerationCompleted()) { genesisLPClaimed = true; uint256 totalMinted = nerd.getReleasableLPTokensMinted(); poolInfo[0].token.safeTransferFrom( address(nerd), address(this), totalMinted ); } } } function claimLPTokensToFarmingPool(address _addr) public { claimLPToken(); if (genesisLPClaimed) { if (!userInfo[0][_addr].genesisLPClaimed) { uint256 allocated = getAllocatedLP(_addr); userInfo[0][_addr].genesisLPClaimed = true; userInfo[0][_addr].amount = allocated; userInfo[0][_addr].referenceAmount = allocated; userInfo[0][_addr].depositTime = nerd.getLpReleaseStart().sub( LP_INITIAL_LOCKED_PERIOD ); } } } function getDepositTime(uint256 _pid, address _addr) public view returns (uint256) { return userInfo[_pid][_addr].depositTime; } //return value is /1000 function getPenaltyFactorForEarlyUnlockers(uint256 _pid, address _addr) public view returns (uint256) { uint256 lpReleaseStart = getLpReleaseStart(_pid, _addr); if (lpReleaseStart == 0 || block.timestamp < lpReleaseStart) return 1000; uint256 weeksTilNow = weeksSinceLPReleaseTilNow(_pid, _addr); uint256 numReleaseWeeks = poolInfo[_pid].lockedPeriod.div( LP_RELEASE_TRUNK ); //10 if (weeksTilNow >= numReleaseWeeks) return 0; uint256 remainingWeeks = numReleaseWeeks.sub(weeksTilNow); //week 1: 45/1000 = 4.5% //week 2: 40/1000 = 4% uint256 ret = remainingWeeks.mul(50000).div(1000).div(numReleaseWeeks); return ret > 1000 ? 1000 : ret; } function computeReleasableLPWithPenalty(uint256 _pid, address _addr) public view returns (uint256 userAmount, uint256 penaltyAmount) { uint256 releasableWithoutPenalty = computeReleasableLP(_pid, _addr); uint256 penalty = getPenaltyFactorForEarlyUnlockers(_pid, _addr); penaltyAmount = releasableWithoutPenalty.mul(penalty).div(1000); userAmount = releasableWithoutPenalty .mul(uint256(1000).sub(penalty)) .div(1000); } function removeLiquidity(address _pair, uint256 _lpAmount) internal returns (uint256) { IUniswapV2Pair _tokenPair = IUniswapV2Pair(_pair); _tokenPair.approve(address(uniswapRouterV2), _lpAmount); (uint256 amountA, uint256 amountB) = uniswapRouterV2.removeLiquidity( _tokenPair.token0(), _tokenPair.token1(), _lpAmount, 0, 0, address(this), block.timestamp + 86400 ); uint256 otherTokenAmount = _tokenPair.token0() == address(nerd) ? amountB : amountA; return otherTokenAmount; } function swapTokenForNerd(address _pair, uint256 _tokenAmount) internal { //withdraw liquidtity for _actualPenalty IUniswapV2Pair _tokenPair = IUniswapV2Pair(_pair); address otherTokenAddress = _tokenPair.token0() == address(nerd) ? _tokenPair.token1() : _tokenPair.token0(); address[] memory paths = new address[](2); paths[0] = otherTokenAddress; paths[1] = address(nerd); IERC20 otherToken = IERC20(otherTokenAddress); otherToken.approve(address(uniswapRouterV2), _tokenAmount); uniswapRouterV2.swapExactTokensForTokens( _tokenAmount, 0, paths, address(this), block.timestamp.add(86400) ); } // Update the given pool's NERDs allocation point. Can only be called by the owner. // Note contract owner is meant to be a governance contract allowing NERD governance consensus function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Update the given pool's ability to withdraw tokens // Note contract owner is meant to be a governance contract allowing NERD governance consensus function setPoolLockPeriod(uint256 _pid, uint256 _lockedPeriod) public onlyOwner { require( isMultipleOfWeek(_lockedPeriod), "Locked period must be a multiple of week" ); poolInfo[_pid].lockedPeriod = _lockedPeriod; } function setEmergencyWithdrawable(uint256 _pid, bool _withdrawable) public onlyOwner { poolInfo[_pid].emergencyWithdrawable = _withdrawable; } function setDevFee(uint16 _DEV_FEE) public onlyOwner { require(_DEV_FEE <= 1000, "Dev fee clamped at 10%"); DEV_FEE = _DEV_FEE; } function pendingNerdForPool(uint256 _pid) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (_pid == 0 && !genesisLPClaimed) { uint256 totalMinted = nerd.getReleasableLPTokensMinted(); tokenSupply = tokenSupply.add(totalMinted); } if (tokenSupply == 0) return 0; uint256 nerdRewardWhole = pendingRewards // Multiplies pending rewards by allocation point of this pool and then total allocation .mul(pool.allocPoint) // getting the percent of total pending rewards this pool should get .div(totalAllocPoint); // we can do this because pools are only mass updated uint256 nerdRewardFee = nerdRewardWhole.mul(DEV_FEE).div(10000); return nerdRewardWhole.sub(nerdRewardFee); } // View function to see pending NERDs on frontend. function pendingNerd(uint256 _pid, address _user) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accNerdPerShare = pool.accNerdPerShare; uint256 amount = user.amount; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (_pid == 0 && !genesisLPClaimed) { uint256 totalMinted = nerd.getReleasableLPTokensMinted(); tokenSupply = tokenSupply.add(totalMinted); } if (tokenSupply == 0) return 0; if (_pid == 0 && !user.genesisLPClaimed) { uint256 allocated = getAllocatedLP(_user); amount = amount.add(allocated); } uint256 nerdRewardWhole = pendingRewards // Multiplies pending rewards by allocation point of this pool and then total allocation .mul(pool.allocPoint) // getting the percent of total pending rewards this pool should get .div(totalAllocPoint); // we can do this because pools are only mass updated uint256 nerdRewardFee = nerdRewardWhole.mul(DEV_FEE).div(10000); uint256 nerdRewardToDistribute = nerdRewardWhole.sub(nerdRewardFee); uint256 inc = nerdRewardToDistribute.mul(1e18).div(tokenSupply); accNerdPerShare = accNerdPerShare.add(inc); return amount.mul(accNerdPerShare).div(1e18).sub(user.rewardDebt); } function getLockedReward(uint256 _pid, address _user) public view returns (uint256) { return userInfo[_pid][_user].rewardLocked; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { console.log("Mass Updating Pools"); uint256 length = poolInfo.length; uint256 allRewards; for (uint256 pid = 0; pid < length; ++pid) { allRewards = allRewards.add(updatePool(pid)); } pendingRewards = pendingRewards.sub(allRewards); } // ---- // Function that adds pending rewards, called by the NERD token. // ---- function updatePendingRewards() public { uint256 newRewards = nerd.balanceOf(address(this)).sub(nerdBalance); if (newRewards > 0) { nerdBalance = nerd.balanceOf(address(this)); // If there is no change the balance didn't change pendingRewards = pendingRewards.add(newRewards); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal returns (uint256 nerdRewardWhole) { PoolInfo storage pool = poolInfo[_pid]; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (_pid == 0 && !genesisLPClaimed) { uint256 totalMinted = nerd.getReleasableLPTokensMinted(); tokenSupply = tokenSupply.add(totalMinted); } if (tokenSupply == 0) { // avoids division by 0 errors return 0; } nerdRewardWhole = pendingRewards // Multiplies pending rewards by allocation point of this pool and then total allocation .mul(pool.allocPoint) // getting the percent of total pending rewards this pool should get .div(totalAllocPoint); // we can do this because pools are only mass updated uint256 nerdRewardFee = nerdRewardWhole.mul(DEV_FEE).div(10000); uint256 nerdRewardToDistribute = nerdRewardWhole.sub(nerdRewardFee); uint256 inc = nerdRewardToDistribute.mul(1e18).div(tokenSupply); nerdRewardToDistribute = tokenSupply.mul(inc).div(1e18); nerdRewardFee = nerdRewardWhole.sub(nerdRewardToDistribute); pending_DEV_rewards = pending_DEV_rewards.add(nerdRewardFee); pool.accNerdPerShare = pool.accNerdPerShare.add(inc); pool.rewardsInThisEpoch = pool.rewardsInThisEpoch.add( nerdRewardToDistribute ); } function withdrawNerd(uint256 _pid) public { withdraw(_pid, 0); } // Deposit tokens to NerdVault for NERD allocation. function deposit(uint256 _pid, uint256 _originAmount) public { claimLPTokensToFarmingPool(msg.sender); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, msg.sender); uint256 lpAccumulationFee = _originAmount.mul(LP_ACCUMULATION_FEE).div( 1000 ); uint256 _amount = _originAmount.sub(lpAccumulationFee); //Transfer in the amounts from user // save gas if (_amount > 0) { pool.token.safeTransferFrom( address(msg.sender), ADDRESS_LOCKED_LP_ACCUMULATION, lpAccumulationFee ); pool.token.safeTransferFrom( address(msg.sender), address(this), _amount ); updateDepositTime(_pid, msg.sender, _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accNerdPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } function updateDepositTime( uint256 _pid, address _addr, uint256 _depositAmount ) internal { UserInfo storage user = userInfo[_pid][_addr]; if (user.amount == 0) { user.depositTime = block.timestamp; user.referenceAmount = _depositAmount; } else { uint256 lockedPeriod = poolInfo[_pid].lockedPeriod; uint256 tobeReleased = computeReleasableLP(_pid, _addr); uint256 amountAfterDeposit = user.amount.add(_depositAmount); uint256 diffTime = tobeReleased.mul(lockedPeriod).div( amountAfterDeposit ); user.depositTime = block.timestamp.sub(diffTime.div(2)); //reset referenceAmount to start a new lock-release period user.referenceAmount = amountAfterDeposit; } } // Test coverage // [x] Does user get the deposited amounts? // [x] Does user that its deposited for update correcty? // [x] Does the depositor get their tokens decreased function depositFor( address _depositFor, uint256 _pid, uint256 _originAmount ) public { claimLPTokensToFarmingPool(_depositFor); // requires no allowances PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_depositFor]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, _depositFor); // Update the balances of person that amount is being deposited for uint256 lpAccumulationFee = _originAmount.mul(LP_ACCUMULATION_FEE).div( 1000 ); uint256 _amount = _originAmount.sub(lpAccumulationFee); if (_amount > 0) { pool.token.safeTransferFrom( address(msg.sender), ADDRESS_LOCKED_LP_ACCUMULATION, lpAccumulationFee ); pool.token.safeTransferFrom( address(msg.sender), address(this), _amount ); updateDepositTime(_pid, _depositFor, _amount); user.amount = user.amount.add(_amount); // This is depositedFor address } user.rewardDebt = user.amount.mul(pool.accNerdPerShare).div(1e18); /// This is deposited for address emit Deposit(_depositFor, _pid, _amount); } // Test coverage // [x] Does allowance update correctly? function setAllowanceForPoolToken( address spender, uint256 _pid, uint256 value ) public { PoolInfo storage pool = poolInfo[_pid]; pool.allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender, _pid, value); } function quitPool(uint256 _pid) public { require( block.timestamp > getLpReleaseStart(_pid, msg.sender), "cannot withdraw all lp tokens before" ); (uint256 withdrawnableAmount, ) = computeReleasableLPWithPenalty( _pid, msg.sender ); withdraw(_pid, withdrawnableAmount); } // Test coverage // [x] Does allowance decrease? // [x] Do oyu need allowance // [x] Withdraws to correct address function withdrawFrom( address owner, uint256 _pid, uint256 _amount ) public { claimLPTokensToFarmingPool(owner); PoolInfo storage pool = poolInfo[_pid]; require( pool.allowance[owner][msg.sender] >= _amount, "withdraw: insufficient allowance" ); pool.allowance[owner][msg.sender] = pool.allowance[owner][msg.sender] .sub(_amount); _withdraw(_pid, _amount, owner, msg.sender); } // Withdraw tokens from NerdVault. function withdraw(uint256 _pid, uint256 _amount) public { claimLPTokensToFarmingPool(msg.sender); _withdraw(_pid, _amount, msg.sender, msg.sender); } // Low level withdraw function function _withdraw( uint256 _pid, uint256 _amount, address from, address to ) internal { PoolInfo storage pool = poolInfo[_pid]; //require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][from]; ( uint256 withdrawnableAmount, uint256 penaltyAmount ) = computeReleasableLPWithPenalty(_pid, from); require(withdrawnableAmount >= _amount, "withdraw: not good"); massUpdatePools(); updateAndPayOutPending(_pid, from); // Update balances of from this is not withdrawal but claiming NERD farmed if (_amount > 0) { uint256 _actualWithdrawn = _amount; uint256 _actualPenalty = _actualWithdrawn.mul(penaltyAmount).div( withdrawnableAmount ); user.amount = user.amount.sub(_actualWithdrawn.add(_actualPenalty)); pool.token.safeTransfer(address(to), _actualWithdrawn); if (_actualPenalty > 0) { //withdraw liquidtity for _actualPenalty uint256 otherTokenAmount = removeLiquidity( address(pool.token), _actualPenalty ); swapTokenForNerd(address(pool.token), otherTokenAmount); updatePendingRewards(); } } user.rewardDebt = user.amount.mul(pool.accNerdPerShare).div(1e18); emit Withdraw(to, _pid, _amount); } function updateAndPayOutPending(uint256 _pid, address from) internal { UserInfo storage user = userInfo[_pid][from]; if (user.releaseTime == 0) { user.releaseTime = block.timestamp.add(REWARD_LOCKED_PERIOD); } if (block.timestamp > user.releaseTime) { //compute withdrawnable amount uint256 lockedAmount = user.rewardLocked; user.rewardLocked = 0; safeNerdTransfer(from, lockedAmount); user.releaseTime = block.timestamp.add(REWARD_LOCKED_PERIOD); } uint256 pending = pendingNerd(_pid, from); uint256 paid = pending.mul(REWARD_RELEASE_PERCENTAGE).div(100); uint256 _lockedReward = pending.sub(paid); if (_lockedReward > 0) { user.rewardLocked = user.rewardLocked.add(_lockedReward); } if (paid > 0) { safeNerdTransfer(from, paid); } } // function that lets owner/governance contract // approve allowance for any token inside this contract // This means all future UNI like airdrops are covered // And at the same time allows us to give allowance to strategy contracts. // Upcoming cYFI etc vaults strategy contracts will se this function to manage and farm yield on value locked function setStrategyContractOrDistributionContractAllowance( address tokenAddress, uint256 _amount, address contractAddress ) public onlySuperAdmin { require( isContract(contractAddress), "Recipent is not a smart contract, BAD" ); require( block.number > contractStartBlock.add(95_000), "Governance setup grace period not over" ); IERC20(tokenAddress).approve(contractAddress, _amount); } function isContract(address addr) public view returns (bool) { uint256 size; assembly { size := extcodesize(addr) } return size > 0; } function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; require( pool.emergencyWithdrawable, "Withdrawing from this pool is disabled" ); claimLPTokensToFarmingPool(msg.sender); UserInfo storage user = userInfo[_pid][msg.sender]; pool.token.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } function safeNerdTransfer(address _to, uint256 _amount) internal { uint256 nerdBal = nerd.balanceOf(address(this)); if (_amount > nerdBal) { nerd.transfer(_to, nerdBal); nerdBalance = nerd.balanceOf(address(this)); } else { nerd.transfer(_to, _amount); nerdBalance = nerd.balanceOf(address(this)); } transferDevFee(); } function transferDevFee() public { if (pending_DEV_rewards == 0) return; uint256 nerdBal = nerd.balanceOf(address(this)); if (pending_DEV_rewards > nerdBal) { nerd.transfer(devaddr, nerdBal); nerdBalance = nerd.balanceOf(address(this)); } else { nerd.transfer(devaddr, pending_DEV_rewards); nerdBalance = nerd.balanceOf(address(this)); } pending_DEV_rewards = 0; } function setDevFeeReciever(address _devaddr) public onlyOwner { require(devaddr == msg.sender, "only dev can change"); tentativeDevAddress = _devaddr; } function confirmDevAddress() public { require(tentativeDevAddress == msg.sender, "not tentativeDevAddress!"); devaddr = tentativeDevAddress; tentativeDevAddress = address(0); } event SuperAdminTransfered( address indexed previousOwner, address indexed newOwner ); function superAdmin() public view returns (address) { return _superAdmin; } modifier onlySuperAdmin() { require( _superAdmin == _msgSender(), "Super admin : caller is not super admin." ); _; } function burnSuperAdmin() public virtual onlySuperAdmin { emit SuperAdminTransfered(_superAdmin, address(0)); _superAdmin = address(0); } function newSuperAdmin(address newOwner) public virtual onlySuperAdmin { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit SuperAdminTransfered(_superAdmin, newOwner); _superAdmin = newOwner; } function getLiquidityInfo(uint256 _pid) public view returns ( uint256 lpSupply, uint256 nerdAmount, uint256 totalNerdAmount, uint256 tokenAmount, uint256 totalTokenAmount, uint256 lockedLP, uint256 totalLockedLP ) { IERC20 lpToken = poolInfo[_pid].token; IERC20 nerdToken = IERC20(address(nerd)); IUniswapV2Pair pair = IUniswapV2Pair(address(lpToken)); address otherTokenAddress = (pair.token0() == address(nerd)) ? pair.token1() : pair.token0(); IERC20 otherToken = IERC20(otherTokenAddress); lpSupply = lpToken.totalSupply(); if (lpSupply > 0) { uint256 lpNerdBalance = nerdToken.balanceOf(address(lpToken)); uint256 lpOtherBalance = otherToken.balanceOf(address(lpToken)); lockedLP = lpToken.balanceOf(address(this)); if (lockedLP == 0 && _pid == 0 && !genesisLPClaimed) { lockedLP = nerd.getReleasableLPTokensMinted(); totalLockedLP = nerd.getTotalLPTokensMinted(); } else { totalLockedLP = lockedLP; if (_pid == 0) { totalLockedLP = totalLockedLP.add( nerd.getTotalLPTokensMinted().sub( nerd.getReleasableLPTokensMinted() ) ); } } nerdAmount = lockedLP.mul(lpNerdBalance).div(lpSupply); totalNerdAmount = totalLockedLP.mul(lpNerdBalance).div(lpSupply); tokenAmount = lockedLP.mul(lpOtherBalance).div(lpSupply); totalTokenAmount = totalLockedLP.mul(lpOtherBalance).div(lpSupply); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LPTokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SuperAdminTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ADDRESS_LOCKED_LP_ACCUMULATION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_ACCUMULATION_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_INITIAL_LOCKED_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_LOCKED_PERIOD_WEEKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_LOCK_FOREVER_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_RELEASE_TRUNK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_LOCKED_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_RELEASE_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"averageFeesPerBlockEpoch","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"averageFeesPerBlockSinceStart","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLPToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"claimLPTokensToFarmingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"computeLockedLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"computeReleasableLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"computeReleasableLPWithPenalty","outputs":[{"internalType":"uint256","name":"userAmount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"confirmDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_originAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_depositFor","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_originAmount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllocatedLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"getDepositTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_epoch","type":"uint256"}],"name":"getEpochReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getLiquidityInfo","outputs":[{"internalType":"uint256","name":"lpSupply","type":"uint256"},{"internalType":"uint256","name":"nerdAmount","type":"uint256"},{"internalType":"uint256","name":"totalNerdAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"totalTokenAmount","type":"uint256"},{"internalType":"uint256","name":"lockedLP","type":"uint256"},{"internalType":"uint256","name":"totalLockedLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getLockedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getLpReleaseStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"getPenaltyFactorForEarlyUnlockers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getReferenceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRemainingLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract INerdBaseTokenLGE","name":"_nerd","type":"address"},{"internalType":"address","name":"superAdmin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"isMultipleOfWeek","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"isTokenPairValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nerd","outputs":[{"internalType":"contract INerdBaseTokenLGE","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"newSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingNerd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"pendingNerdForPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pending_DEV_rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"accNerdPerShare","type":"uint256"},{"internalType":"uint256","name":"lockedPeriod","type":"uint256"},{"internalType":"bool","name":"emergencyWithdrawable","type":"bool"},{"internalType":"uint256","name":"rewardsInThisEpoch","type":"uint256"},{"internalType":"uint256","name":"cumulativeRewardsSinceStart","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"epochCalculationStartBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"quitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setAllowanceForPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_DEV_FEE","type":"uint16"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"setDevFeeReciever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"setEmergencyWithdrawable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_lockedPeriod","type":"uint256"}],"name":"setPoolLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setStrategyContractOrDistributionContractAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startNewEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tentativeDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV2","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updatePendingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"bool","name":"genesisLPClaimed","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"referenceAmount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLocked","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"},{"internalType":"uint256","name":"depositTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"weeksSinceLPReleaseTilNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawNerd","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615569806100206000396000f3fe608060405234801561001057600080fd5b506004361061041d5760003560e01c8063715018a61161022b578063b1610ab311610130578063d49e77cd116100b8578063e2bbb15811610087578063e2bbb15814610c0a578063e64aa2af14610c2d578063eded3fda14610c53578063f2fde38b14610c5b578063faa1809e14610c815761041d565b8063d49e77cd14610b5a578063dbe0901f14610b62578063df57f2fa14610b94578063e18cb4fe14610be95761041d565b8063c4014588116100ff578063c401458814610ada578063c42c808914610b10578063cddf6ed714610b2d578063cdfc6b7e14610b35578063cfdec60614610b3d5761041d565b8063b1610ab314610a44578063b4594fa314610a61578063b79232ed14610a69578063be35cee814610a955761041d565b806393f1a40b116101b35780639f774078116101825780639f774078146109925780639f92cad5146109be578063a0e3be5b146109ea578063a676860a146109f2578063b13208c014610a185761041d565b806393f1a40b146108ea578063976dd4c4146109505780639874752e1461096d5780639aa35332146109755761041d565b8063881c5922116101fa578063881c5922146108ad5780638bdb2afa146108ca5780638da5cb5b146108d2578063900cf0cf146108da578063934eaa50146108e25761041d565b8063715018a614610855578063762b6da61461085d57806377f5bf5e146108655780637c8ff53c146108885761041d565b80633a0967cd116103315780635312ea8e116102b95780635fbe6c1a116102885780635fbe6c1a146107d157806361e0012a146107d9578063630b5ba11461080557806364482f791461080d5780636e7d4019146108385761041d565b80635312ea8e1461075d578063581651af1461077a578063596fa9e31461079d5780635da02c6a146107a55761041d565b8063444820fb11610300578063444820fb146106e5578063485cc955146106ed57806349c5468d1461071b5780634cf5fbf514610723578063509f5b14146107555761041d565b80633a0967cd146106805780633aab0a62146106b2578063434339f3146106ba578063441a3e70146106c25761041d565b806317f27c80116103b457806329575f6a1161038357806329575f6a146105b85780632bdbbc56146105dc5780632c010100146106085780632d6754e51461062e5780633952141b146106545761041d565b806317f27c80146104225780631b3b8d8b146105505780631c9c52ab1461057c5780631eaaa045146105845761041d565b80631526fe27116103f05780631526fe271461047a57806316279055146104e857806317908e771461052257806317caf6f1146105485761041d565b806304deb07e14610422578063081e3eda1461043c5780630bc3b1c0146104445780631041921c1461044e575b600080fd5b61042a610c89565b60408051918252519081900360200190f35b61042a610c90565b61044c610c96565b005b61042a6004803603604081101561046457600080fd5b50803590602001356001600160a01b0316610df3565b6104976004803603602081101561049057600080fd5b5035610e69565b604080516001600160a01b03909a168a5260208a0198909852888801969096526060880194909452911515608087015260a086015260c085015260e084015261010083015251908190036101200190f35b61050e600480360360208110156104fe57600080fd5b50356001600160a01b0316610ecf565b604080519115158252519081900360200190f35b61042a6004803603602081101561053857600080fd5b50356001600160a01b0316610ed9565b61042a610f6f565b61042a6004803603604081101561056657600080fd5b50803590602001356001600160a01b0316610f75565b61044c611044565b61044c6004803603606081101561059a57600080fd5b508035906001600160a01b03602082013516906040013515156110ca565b6105c0611326565b604080516001600160a01b039092168252519081900360200190f35b61042a600480360360408110156105f257600080fd5b50803590602001356001600160a01b0316611335565b61044c6004803603602081101561061e57600080fd5b50356001600160a01b0316611456565b61044c6004803603602081101561064457600080fd5b50356001600160a01b03166115c1565b61042a6004803603604081101561066a57600080fd5b50803590602001356001600160a01b0316611690565b61044c6004803603606081101561069657600080fd5b506001600160a01b03813516906020810135906040013561177c565b61044c61188c565b61044c611a2c565b61044c600480360360408110156106d857600080fd5b5080359060200135611ce4565b6105c0611cfd565b61044c6004803603604081101561070357600080fd5b506001600160a01b0381358116916020013516611d0c565b61042a6120ed565b61044c6004803603606081101561073957600080fd5b506001600160a01b0381351690602081013590604001356120f3565b61042a61223b565b61044c6004803603602081101561077357600080fd5b5035612242565b61042a6004803603604081101561079057600080fd5b5080359060200135612334565b6105c0612369565b61042a600480360360408110156107bb57600080fd5b50803590602001356001600160a01b0316612378565b61042a61238b565b61042a600480360360408110156107ef57600080fd5b50803590602001356001600160a01b0316612390565b61044c6123ee565b61044c6004803603606081101561082357600080fd5b50803590602081013590604001351515612463565b6105c06004803603602081101561084e57600080fd5b5035612534565b61044c612563565b6105c0612605565b61044c6004803603604081101561087b57600080fd5b5080359060200135612619565b61044c6004803603604081101561089e57600080fd5b508035906020013515156126dc565b61042a600480360360208110156108c357600080fd5b5035612768565b6105c06128fe565b6105c061290d565b61042a61291c565b61044c612922565b6109166004803603604081101561090057600080fd5b50803590602001356001600160a01b03166129c0565b6040805197151588526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61042a6004803603602081101561096657600080fd5b5035612a0c565b61042a612a7b565b61050e6004803603602081101561098b57600080fd5b5035612a80565b61042a600480360360408110156109a857600080fd5b50803590602001356001600160a01b0316612aa8565b61042a600480360360408110156109d457600080fd5b50803590602001356001600160a01b0316612ad3565b61042a612d23565b61044c60048036036020811015610a0857600080fd5b50356001600160a01b0316612d28565b61042a60048036036040811015610a2e57600080fd5b50803590602001356001600160a01b0316612e1d565b61044c60048036036020811015610a5a57600080fd5b5035612e48565b61042a612e53565b61042a60048036036040811015610a7f57600080fd5b50803590602001356001600160a01b0316612e58565b610ac160048036036040811015610aab57600080fd5b50803590602001356001600160a01b0316612ec5565b6040805192835260208301919091528051918290030190f35b61044c60048036036060811015610af057600080fd5b506001600160a01b03813581169160208101359160409091013516612f1b565b61042a60048036036020811015610b2657600080fd5b5035613088565b6105c06130f9565b61042a6130fe565b61044c60048036036020811015610b5357600080fd5b5035613104565b6105c0613164565b61044c60048036036060811015610b7857600080fd5b506001600160a01b038135169060208101359060400135613173565b610bb160048036036020811015610baa57600080fd5b50356131f7565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61044c60048036036020811015610bff57600080fd5b503561ffff166137aa565b61044c60048036036040811015610c2057600080fd5b508035906020013561386e565b61050e60048036036020811015610c4357600080fd5b50356001600160a01b03166139a3565b61042a613ad2565b61044c60048036036020811015610c7157600080fd5b50356001600160a01b0316613ad8565b61044c613bd1565b6224ea0081565b60975490565b60995460ff16610df157609960019054906101000a90046001600160a01b03166001600160a01b031663da3ca81d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b505115610df1576099805460ff19166001179081905560408051630ad0cd7d60e41b815290516000926001600160a01b03610100909104169163ad0cd7d0916004808301926020929190829003018186803b158015610d7657600080fd5b505afa158015610d8a573d6000803e3d6000fd5b505050506040513d6020811015610da057600080fd5b505160995460978054929350610def926101009092046001600160a01b03169130918591600090610dcd57fe5b60009182526020909120600b90910201546001600160a01b0316929190613cd4565b505b565b600082158015610e26575060008381526098602090815260408083206001600160a01b038616845290915290205460ff16155b15610e3b57610e3482610ed9565b9050610e63565b5060008281526098602090815260408083206001600160a01b03851684529091529020600201545b92915050565b60978181548110610e7657fe5b60009182526020909120600b9091020180546001820154600283015460038401546005850154600686015460078701546008880154600a909801546001600160a01b03909716985094969395929460ff90921693909289565b803b15155b919050565b6000609960019054906101000a90046001600160a01b03166001600160a01b03166317908e77836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f3d57600080fd5b505afa158015610f51573d6000803e3d6000fd5b505050506040513d6020811015610f6757600080fd5b505192915050565b609c5481565b600080610f828484611690565b9050801580610f9057508042105b15610fa0576103e8915050610e63565b6000610fac8585612390565b90506000610fe462093a8060978881548110610fc457fe5b90600052602060002090600b020160030154613d2e90919063ffffffff16565b9050808210610ff95760009350505050610e63565b60006110058284613d70565b905060006110238361101d6103e8818661c350613db2565b90613d2e565b90506103e881116110345780611038565b6103e85b98975050505050505050565b609b546001600160a01b031633146110a3576040805162461bcd60e51b815260206004820152601860248201527f6e6f742074656e74617469766544657641646472657373210000000000000000604482015290519081900360640190fd5b609b8054609a80546001600160a01b03199081166001600160a01b03841617909155169055565b6110d2613e0b565b6065546001600160a01b03908116911614611122576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b61112b826139a3565b6111665760405162461bcd60e51b81526004018080602001828103825260258152602001806154eb6025913960400191505060405180910390fd5b8015611174576111746123ee565b60975460005b8181101561120e57836001600160a01b03166097828154811061119957fe5b60009182526020909120600b90910201546001600160a01b03161415611206576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220706f6f6c20616c72656164792061646465640000000000000000604482015290519081900360640190fd5b60010161117a565b50609c5461121c9085613e0f565b609c819055506097604051806101200160405280856001600160a01b031681526020018681526020016000815260200161126362093a80600a613db290919063ffffffff16565b8152600060208083018290526040808401839052606080850184905243608080870182905260a096870191909152875460018082018a55988652948490208751600b9096020180546001600160a01b0319166001600160a01b03909616959095178555928601519684019690965584015160028301559383015160038201559282015160058401805460ff1916911515919091179055810151600683015560c0810151600783015560e081015160088301556101000151600a9091015550505050565b60a3546001600160a01b031690565b6000806113428484611690565b905080421015611356576000915050610e63565b60006113628585610df3565b90508061137457600092505050610e63565b60006113a76097878154811061138657fe5b90600052602060002090600b02016003015484613e0f90919063ffffffff16565b4211156113b5575080611409565b60006113c18787612390565b9050611405609788815481106113d357fe5b90600052602060002090600b02016003015461101d856113ff62093a8086613db290919063ffffffff16565b90613db2565b9150505b818111156114145750805b600061142a6114238888612e58565b8490613d70565b9050808211156114495761143e8282613d70565b945050505050610e63565b5060009695505050505050565b61145e610c96565b60995460ff1615610def576001600160a01b03811660009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff16610def5760006114b382610ed9565b6001600160a01b0383811660009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e6020908152604091829020805460ff19166001908117825581018590556002018490556099548251630fec7f8360e41b81529251949550611582946224ea00946101009092049091169263fec7f830926004808301939192829003018186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d602081101561157a57600080fd5b505190613d70565b6001600160a01b03831660009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e60205260409020600601555050565b6115c9613e0b565b6065546001600160a01b03908116911614611619576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b609a546001600160a01b0316331461166e576040805162461bcd60e51b81526020600482015260136024820152726f6e6c79206465762063616e206368616e676560681b604482015290519081900360640190fd5b609b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000821580156116c3575060008381526098602090815260408083206001600160a01b038616845290915290205460ff16155b1561174957609960019054906101000a90046001600160a01b03166001600160a01b031663fec7f8306040518163ffffffff1660e01b815260040160206040518083038186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d602081101561174057600080fd5b50519050610e63565b60008381526098602090815260408083206001600160a01b0386168452909152902060060154610e34906224ea00613e0f565b61178583611456565b60006097838154811061179457fe5b600091825260208083206001600160a01b03881684526004600b90930201918201815260408084203385529091529091205490915082111561181d576040805162461bcd60e51b815260206004820181905260248201527f77697468647261773a20696e73756666696369656e7420616c6c6f77616e6365604482015290519081900360640190fd5b6001600160a01b0384166000908152600482016020908152604080832033845290915290205461184d9083613d70565b6001600160a01b038516600090815260048301602090815260408083203380855292529091209190915561188690849084908790613e69565b50505050565b60005b609754811015610def5743609782815481106118a757fe5b90600052602060002090600b0201600a015461c350011061190f576040805162461bcd60e51b815260206004820152601760248201527f4e65772065706f6368206e6f7420726561647920796574000000000000000000604482015290519081900360640190fd5b6097818154811061191c57fe5b90600052602060002090600b0201600601546097828154811061193b57fe5b90600052602060002090600b02016009016000609e548152602001908152602001600020819055506119b26097828154811061197357fe5b90600052602060002090600b0201600601546097838154811061199257fe5b90600052602060002090600b020160070154613e0f90919063ffffffff16565b609782815481106119bf57fe5b90600052602060002090600b0201600701819055506000609782815481106119e357fe5b90600052602060002090600b0201600601819055504360978281548110611a0657fe5b60009182526020909120600a600b909202010155609e805460019081019091550161188f565b60a254611a3857610df1565b609954604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a8857600080fd5b505afa158015611a9c573d6000803e3d6000fd5b505050506040513d6020811015611ab257600080fd5b505160a254909150811015611bcf57609954609a546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b158015611b2057600080fd5b505af1158015611b34573d6000803e3d6000fd5b505050506040513d6020811015611b4a57600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d6020811015611bc557600080fd5b505160a055611cdc565b609954609a5460a2546040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b158015611c3157600080fd5b505af1158015611c45573d6000803e3d6000fd5b505050506040513d6020811015611c5b57600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b505160a0555b50600060a255565b611ced33611456565b611cf982823333613e69565b5050565b609b546001600160a01b031681565b600054610100900460ff1680611d255750611d25614019565b80611d33575060005460ff16155b611d6e5760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff16158015611d99576000805460ff1961ff0019909116610100171660011790555b611da161401f565b60a1805461ffff19166102d4179055609980546001600160a01b03808616610100908102610100600160a81b031990931692909217928390556040805163b480f6ad60e01b8152905192909304169163b480f6ad916004808301926020929190829003018186803b158015611e1557600080fd5b505afa158015611e29573d6000803e3d6000fd5b505050506040513d6020811015611e3f57600080fd5b5051609a80546001600160a01b03199081166001600160a01b0393841617909155609b80548216905543609f5560a3805490911684831617905560995460408051634d33245760e01b81529051611ef19361010090930490921691634d33245791600480820192602092909190829003018186803b158015611ec057600080fd5b505afa158015611ed4573d6000803e3d6000fd5b505050506040513d6020811015611eea57600080fd5b50516139a3565b611f2c5760405162461bcd60e51b81526004018080602001828103825260258152602001806154eb6025913960400191505060405180910390fd5b611fb36103e8609960019054906101000a90046001600160a01b03166001600160a01b0316634d3324576040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8057600080fd5b505afa158015611f94573d6000803e3d6000fd5b505050506040513d6020811015611faa57600080fd5b505160016110ca565b609960019054906101000a90046001600160a01b03166001600160a01b0316635873aaa36040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b505160a480546001600160a01b0319166001600160a01b0392831617905560995460408051631f36fd1b60e11b8152905161010090920490921691633e6dfa36916004808301926020929190829003018186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d60208110156120b557600080fd5b505160a580546001600160a01b0319166001600160a01b0390921691909117905580156120e8576000805461ff00191690555b505050565b609f5481565b6120fc83611456565b60006097838154811061210b57fe5b600091825260208083208684526098825260408085206001600160a01b038a1686529092529220600b90910290910191506121446123ee565b61214e84866140d0565b60006121616103e861101d866001613db2565b9050600061216f8583613d70565b905080156121c657835461218f906001600160a01b031633600085613cd4565b83546121a6906001600160a01b0316333084613cd4565b6121b18688836141a6565b60018301546121c09082613e0f565b60018401555b6121ed670de0b6b3a764000061101d86600201548660010154613db290919063ffffffff16565b600384015560408051828152905187916001600160a01b038a16917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a350505050505050565b62093a8081565b60006097828154811061225157fe5b60009182526020909120600b90910201600581015490915060ff166122a75760405162461bcd60e51b81526004018080602001828103825260268152602001806154756026913960400191505060405180910390fd5b6122b033611456565b60008281526098602090815260408083203380855292529091206001810154835491926122e6926001600160a01b031691614269565b60018101546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a36000600182018190556003909101555050565b60006097838154811061234357fe5b600091825260208083209483526009600b90920290940101909252506040902054919050565b60a4546001600160a01b031681565b60006123848383612e58565b9392505050565b600181565b60008061239d8484611690565b90508015806123ab57508042105b156123ba576000915050610e63565b60006123c64283613d70565b905060006123d78262093a80613d2e565b90506123e4816001613e0f565b9695505050505050565b612422604051806040016040528060138152602001724d617373205570646174696e6720506f6f6c7360681b8152506142bb565b6097546000805b8281101561244e5761244461243d82614361565b8390613e0f565b9150600101612429565b50609d5461245c9082613d70565b609d555050565b61246b613e0b565b6065546001600160a01b039081169116146124bb576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b80156124c9576124c96123ee565b61250682612500609786815481106124dd57fe5b90600052602060002090600b020160010154609c54613d7090919063ffffffff16565b90613e0f565b609c81905550816097848154811061251a57fe5b90600052602060002090600b020160010181905550505050565b60006097828154811061254357fe5b60009182526020909120600b90910201546001600160a01b031692915050565b61256b613e0b565b6065546001600160a01b039081169116146125bb576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60995461010090046001600160a01b031681565b612621613e0b565b6065546001600160a01b03908116911614612671576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b61267a81612a80565b6126b55760405162461bcd60e51b81526004018080602001828103825260288152602001806153b66028913960400191505060405180910390fd5b80609783815481106126c357fe5b90600052602060002090600b0201600301819055505050565b6126e4613e0b565b6065546001600160a01b03908116911614612734576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b806097838154811061274257fe5b60009182526020909120600b90910201600501805460ff19169115159190911790555050565b6000806097838154811061277857fe5b60009182526020808320600b9092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116926370a0823192602480840193829003018186803b1580156127d157600080fd5b505afa1580156127e5573d6000803e3d6000fd5b505050506040513d60208110156127fb57600080fd5b5051905083158015612810575060995460ff16155b156128a1576000609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d602081101561288f57600080fd5b5051905061289d8282613e0f565b9150505b806128b157600092505050610ed4565b60006128d2609c5461101d8560010154609d54613db290919063ffffffff16565b60a1549091506000906128f2906127109061101d90859061ffff16613db2565b90506123e48282613d70565b60a5546001600160a01b031681565b6065546001600160a01b031690565b609e5481565b61292a613e0b565b60a3546001600160a01b039081169116146129765760405162461bcd60e51b81526004018080602001828103825260288152602001806153de6028913960400191505060405180910390fd5b60a3546040516000916001600160a01b0316907ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b64908390a360a380546001600160a01b0319169055565b6098602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460069096015460ff9095169593949293919290919087565b6000610e63612a4260978481548110612a2157fe5b90600052602060002090600b0201600a015443613d7090919063ffffffff16565b61101d612a4e85612768565b60978681548110612a5b57fe5b90600052602060002090600b020160060154613e0f90919063ffffffff16565b603281565b600080612a908362093a80613d2e565b9050612a9f8162093a80613db2565b90921492915050565b60009182526098602090815260408084206001600160a01b0393909316845291905290206004015490565b60008060978481548110612ae357fe5b600091825260208083208784526098825260408085206001600160a01b038981168752908452818620600b9590950290920160028101546001860154825484516370a0823160e01b81523060048201529451939950969791969095919416926370a082319260248083019392829003018186803b158015612b6357600080fd5b505afa158015612b77573d6000803e3d6000fd5b505050506040513d6020811015612b8d57600080fd5b5051905087158015612ba2575060995460ff16155b15612c33576000609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b158015612bf757600080fd5b505afa158015612c0b573d6000803e3d6000fd5b505050506040513d6020811015612c2157600080fd5b50519050612c2f8282613e0f565b9150505b80612c4657600095505050505050610e63565b87158015612c565750835460ff16155b15612c76576000612c6688610ed9565b9050612c728382613e0f565b9250505b6000612c97609c5461101d8860010154609d54613db290919063ffffffff16565b60a154909150600090612cb7906127109061101d90859061ffff16613db2565b90506000612cc58383613d70565b90506000612cdf8561101d84670de0b6b3a7640000613db2565b9050612ceb8782613e0f565b6003890154909750612d1390612d0d670de0b6b3a764000061101d8a8c613db2565b90613d70565b9c9b505050505050505050505050565b600a81565b612d30613e0b565b60a3546001600160a01b03908116911614612d7c5760405162461bcd60e51b81526004018080602001828103825260288152602001806153de6028913960400191505060405180910390fd5b6001600160a01b038116612dc15760405162461bcd60e51b815260040180806020018281038252602681526020018061536b6026913960400191505060405180910390fd5b60a3546040516001600160a01b038084169216907ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6490600090a360a380546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526098602090815260408084206001600160a01b0393909316845291905290206006015490565b610def816000611ce4565b602881565b600082158015612e8b575060008381526098602090815260408083206001600160a01b038616845290915290205460ff16155b15612e9957610e3482610ed9565b5060008281526098602090815260408083206001600160a01b0385168452909152902060010154610e63565b6000806000612ed48585611335565b90506000612ee28686610f75565b9050612ef46103e861101d8484613db2565b9250612f106103e861101d612f098285613d70565b8590613db2565b935050509250929050565b612f23613e0b565b60a3546001600160a01b03908116911614612f6f5760405162461bcd60e51b81526004018080602001828103825260288152602001806153de6028913960400191505060405180910390fd5b612f7881610ecf565b612fb35760405162461bcd60e51b81526004018080602001828103825260258152602001806153916025913960400191505060405180910390fd5b609f54612fc39062017318613e0f565b43116130005760405162461bcd60e51b815260040180806020018281038252602681526020018061549b6026913960400191505060405180910390fd5b826001600160a01b031663095ea7b382846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561305757600080fd5b505af115801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b5050505050565b6000610e636130be6097848154811061309d57fe5b90600052602060002090600b02016008015443613d7090919063ffffffff16565b61101d6130ca85612768565b612500609787815481106130da57fe5b90600052602060002090600b0201600601546097888154811061199257fe5b600081565b60a25481565b61310e8133611690565b421161314b5760405162461bcd60e51b81526004018080602001828103825260248152602001806155106024913960400191505060405180910390fd5b60006131578233612ec5565b509050611cf98282611ce4565b609a546001600160a01b031681565b60006097838154811061318257fe5b6000918252602080832033808552600b939093020160048101825260408085206001600160a01b038a1680875290845294819020879055805188815292830187905280519195507fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7928290030190a350505050565b6000806000806000806000806097898154811061321057fe5b60009182526020808320600b9092029091015460995460408051630dfe168160e01b815290516001600160a01b039384169650610100909204909216938593909285928592630dfe16819260048082019391829003018186803b15801561327657600080fd5b505afa15801561328a573d6000803e3d6000fd5b505050506040513d60208110156132a057600080fd5b50516001600160a01b03161461331a57816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e957600080fd5b505afa1580156132fd573d6000803e3d6000fd5b505050506040513d602081101561331357600080fd5b5051613380565b816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d602081101561337d57600080fd5b50515b90506000819050846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d60208110156133ea57600080fd5b50519b508b1561379a576000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561344357600080fd5b505afa158015613457573d6000803e3d6000fd5b505050506040513d602081101561346d57600080fd5b5051604080516370a0823160e01b81526001600160a01b0389811660048301529151929350600092918516916370a0823191602480820192602092909190829003018186803b1580156134bf57600080fd5b505afa1580156134d3573d6000803e3d6000fd5b505050506040513d60208110156134e957600080fd5b5051604080516370a0823160e01b815230600482015290519192506001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561353557600080fd5b505afa158015613549573d6000803e3d6000fd5b505050506040513d602081101561355f57600080fd5b505198508815801561356f57508e155b801561357e575060995460ff16155b1561367c57609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156135d157600080fd5b505afa1580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505160995460408051632f85c5a960e21b81529051929b506101009091046001600160a01b03169163be1716a491600480820192602092909190829003018186803b15801561364957600080fd5b505afa15801561365d573d6000803e3d6000fd5b505050506040513d602081101561367357600080fd5b50519750613757565b8897508e6137575761375461374d609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156136d857600080fd5b505afa1580156136ec573d6000803e3d6000fd5b505050506040513d602081101561370257600080fd5b505160995460408051632f85c5a960e21b815290516101009092046001600160a01b03169163be1716a491600480820192602092909190829003018186803b15801561155057600080fd5b8990613e0f565b97505b6137658e61101d8b85613db2565b9c506137758e61101d8a85613db2565b9b506137858e61101d8b84613db2565b9a506137958e61101d8a84613db2565b995050505b5050505050919395979092949650565b6137b2613e0b565b6065546001600160a01b03908116911614613802576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b6103e88161ffff161115613856576040805162461bcd60e51b81526020600482015260166024820152754465762066656520636c616d7065642061742031302560501b604482015290519081900360640190fd5b60a1805461ffff191661ffff92909216919091179055565b61387733611456565b60006097838154811061388657fe5b600091825260208083208684526098825260408085203386529092529220600b90910290910191506138b66123ee565b6138c084336140d0565b60006138d36103e861101d866001613db2565b905060006138e18583613d70565b90508015613938578354613901906001600160a01b031633600085613cd4565b8354613918906001600160a01b0316333084613cd4565b6139238633836141a6565b60018301546139329082613e0f565b60018401555b61395f670de0b6b3a764000061101d86600201548660010154613db290919063ffffffff16565b6003840155604080518281529051879133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a3505050505050565b600080829050609960019054906101000a90046001600160a01b03166001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613a0157600080fd5b505afa158015613a15573d6000803e3d6000fd5b505050506040513d6020811015613a2b57600080fd5b50516001600160a01b031614806123845750609960019054906101000a90046001600160a01b03166001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015613a9557600080fd5b505afa158015613aa9573d6000803e3d6000fd5b505050506040513d6020811015613abf57600080fd5b50516001600160a01b0316149392505050565b609d5481565b613ae0613e0b565b6065546001600160a01b03908116911614613b30576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b6001600160a01b038116613b755760405162461bcd60e51b815260040180806020018281038252602681526020018061536b6026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000613c3b60a054609960019054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561155057600080fd5b90508015610def57609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015613c9257600080fd5b505afa158015613ca6573d6000803e3d6000fd5b505050506040513d6020811015613cbc57600080fd5b505160a055609d54613cce9082613e0f565b609d5550565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261188690859061457d565b600061238483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614735565b600061238483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506147d7565b600082613dc157506000610e63565b82820282848281613dce57fe5b04146123845760405162461bcd60e51b81526004018080602001828103825260218152602001806154066021913960400191505060405180910390fd5b3390565b600082820183811015612384576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600060978581548110613e7857fe5b600091825260208083208884526098825260408085206001600160a01b0389168652909252908320600b9092020192509080613eb48887612ec5565b9150915086821015613f02576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b613f0a6123ee565b613f1488876140d0565b8615613fa357866000613f2b8461101d8486613db2565b9050613f45613f3a8383613e0f565b600187015490613d70565b60018601558554613f60906001600160a01b03168884614269565b8015613fa0578554600090613f7e906001600160a01b031683614831565b8754909150613f96906001600160a01b031682614aea565b613f9e613bd1565b505b50505b613fca670de0b6b3a764000061101d86600201548660010154613db290919063ffffffff16565b600384015560408051888152905189916001600160a01b038816917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a35050505050505050565b303b1590565b600054610100900460ff16806140385750614038614019565b80614046575060005460ff16155b6140815760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff161580156140ac576000805460ff1961ff0019909116610100171660011790555b6140b4614ed4565b6140bc614f74565b8015610def576000805461ff001916905550565b60008281526098602090815260408083206001600160a01b03851684529091529020600581015461410e57614108426224ea00613e0f565b60058201555b806005015442111561414357600481018054600090915561412f838261506d565b61413c426224ea00613e0f565b6005830155505b600061414f8484612ad3565b90506000614163606461101d846032613db2565b905060006141718383613d70565b9050801561418e5760048401546141889082613e0f565b60048501555b811561419e5761419e858361506d565b505050505050565b60008381526098602090815260408083206001600160a01b0386168452909152902060018101546141e35742600682015560028101829055611886565b6000609785815481106141f257fe5b90600052602060002090600b020160030154905060006142128686611335565b9050600061422d858560010154613e0f90919063ffffffff16565b9050600061423f8261101d8587613db2565b905061425661424f826002613d2e565b4290613d70565b6006860155506002840155505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526120e890849061457d565b610def816040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156142ff5781810151838201526020016142e7565b50505050905090810190601f16801561432c5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052925061530d915050565b6000806097838154811061437157fe5b60009182526020808320600b9092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116926370a0823192602480840193829003018186803b1580156143ca57600080fd5b505afa1580156143de573d6000803e3d6000fd5b505050506040513d60208110156143f457600080fd5b5051905083158015614409575060995460ff16155b1561449a576000609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b15801561445e57600080fd5b505afa158015614472573d6000803e3d6000fd5b505050506040513d602081101561448857600080fd5b505190506144968282613e0f565b9150505b806144aa57600092505050610ed4565b6144c9609c5461101d8460010154609d54613db290919063ffffffff16565b60a1549093506000906144e9906127109061101d90879061ffff16613db2565b905060006144f78583613d70565b905060006145118461101d84670de0b6b3a7640000613db2565b9050614529670de0b6b3a764000061101d8684613db2565b91506145358683613d70565b60a2549093506145459084613e0f565b60a25560028501546145579082613e0f565b6002860155600685015461456b9083613e0f565b85600601819055505050505050919050565b61458f826001600160a01b031661532e565b6145e0576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061461e5780518252601f1990920191602091820191016145ff565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614680576040519150601f19603f3d011682016040523d82523d6000602084013e614685565b606091505b5091509150816146dc576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611886578080602001905160208110156146f857600080fd5b50516118865760405162461bcd60e51b815260040180806020018281038252602a8152602001806154c1602a913960400191505060405180910390fd5b600081836147c15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561478657818101518382015260200161476e565b50505050905090810190601f1680156147b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816147cd57fe5b0495945050505050565b600081848411156148295760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561478657818101518382015260200161476e565b505050900390565b60a4546040805163095ea7b360e01b81526001600160a01b03928316600482015260248101849052905160009285929083169163095ea7b39160448082019260209290919082900301818887803b15801561488b57600080fd5b505af115801561489f573d6000803e3d6000fd5b505050506040513d60208110156148b557600080fd5b505060a45460408051630dfe168160e01b8152905160009283926001600160a01b039182169263baa2abde92871691630dfe1681916004808301926020929190829003018186803b15801561490957600080fd5b505afa15801561491d573d6000803e3d6000fd5b505050506040513d602081101561493357600080fd5b50516040805163d21220a760e01b815290516001600160a01b0388169163d21220a7916004808301926020929190829003018186803b15801561497557600080fd5b505afa158015614989573d6000803e3d6000fd5b505050506040513d602081101561499f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201899052600060648301819052608483018190523060a484015262015180420160c4840152815160e4808501949192918390030190829087803b158015614a1857600080fd5b505af1158015614a2c573d6000803e3d6000fd5b505050506040513d6040811015614a4257600080fd5b50805160209182015160995460408051630dfe168160e01b815290519396509194506000936001600160a01b0361010090920482169391881692630dfe16819260048083019392829003018186803b158015614a9d57600080fd5b505afa158015614ab1573d6000803e3d6000fd5b505050506040513d6020811015614ac757600080fd5b50516001600160a01b031614614add5782614adf565b815b979650505050505050565b60008290506000609960019054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015614b4957600080fd5b505afa158015614b5d573d6000803e3d6000fd5b505050506040513d6020811015614b7357600080fd5b50516001600160a01b031614614bed57816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015614bbc57600080fd5b505afa158015614bd0573d6000803e3d6000fd5b505050506040513d6020811015614be657600080fd5b5051614c53565b816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015614c2657600080fd5b505afa158015614c3a573d6000803e3d6000fd5b505050506040513d6020811015614c5057600080fd5b50515b6040805160028082526060808301845293945090916020830190803683370190505090508181600081518110614c8557fe5b6001600160a01b03928316602091820292909201015260995482516101009091049091169082906001908110614cb757fe5b6001600160a01b0392831660209182029290920181019190915260a4546040805163095ea7b360e01b815291841660048301526024820188905251859384169263095ea7b392604480820193918290030181600087803b158015614d1a57600080fd5b505af1158015614d2e573d6000803e3d6000fd5b505050506040513d6020811015614d4457600080fd5b505060a4546001600160a01b03166338ed17398660008530614d694262015180613e0f565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015614dd9578181015183820152602001614dc1565b505050509050019650505050505050600060405180830381600087803b158015614e0257600080fd5b505af1158015614e16573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015614e3f57600080fd5b8101908080516040519392919084640100000000821115614e5f57600080fd5b908301906020820185811115614e7457600080fd5b8251866020820283011164010000000082111715614e9157600080fd5b82525081516020918201928201910280838360005b83811015614ebe578181015183820152602001614ea6565b5050505090500160405250505050505050505050565b600054610100900460ff1680614eed5750614eed614019565b80614efb575060005460ff16155b614f365760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff161580156140bc576000805460ff1961ff0019909116610100171660011790558015610def576000805461ff001916905550565b600054610100900460ff1680614f8d5750614f8d614019565b80614f9b575060005460ff16155b614fd65760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff16158015615001576000805460ff1961ff0019909116610100171660011790555b600061500b613e0b565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610def576000805461ff001916905550565b609954604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156150bd57600080fd5b505afa1580156150d1573d6000803e3d6000fd5b505050506040513d60208110156150e757600080fd5b50519050808211156151fe576099546040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820185905291516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b15801561514f57600080fd5b505af1158015615163573d6000803e3d6000fd5b505050506040513d602081101561517957600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b1580156151ca57600080fd5b505afa1580156151de573d6000803e3d6000fd5b505050506040513d60208110156151f457600080fd5b505160a055615305565b6099546040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905291516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b15801561525a57600080fd5b505af115801561526e573d6000803e3d6000fd5b505050506040513d602081101561528457600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b1580156152d557600080fd5b505afa1580156152e9573d6000803e3d6000fd5b505050506040513d60208110156152ff57600080fd5b505160a0555b6120e8611a2c565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061536257508115155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c204241444c6f636b656420706572696f64206d7573742062652061206d756c7469706c65206f66207765656b53757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f6e65206f66207468652070616972656420746f6b656e73206d757374206265204e45524463616e6e6f7420776974686472617720616c6c206c7020746f6b656e73206265666f7265a264697066735822122092ba07ccec48088bdcccbcb65f01ab8cd8880c4e37dd0015289f733f921225d764736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061041d5760003560e01c8063715018a61161022b578063b1610ab311610130578063d49e77cd116100b8578063e2bbb15811610087578063e2bbb15814610c0a578063e64aa2af14610c2d578063eded3fda14610c53578063f2fde38b14610c5b578063faa1809e14610c815761041d565b8063d49e77cd14610b5a578063dbe0901f14610b62578063df57f2fa14610b94578063e18cb4fe14610be95761041d565b8063c4014588116100ff578063c401458814610ada578063c42c808914610b10578063cddf6ed714610b2d578063cdfc6b7e14610b35578063cfdec60614610b3d5761041d565b8063b1610ab314610a44578063b4594fa314610a61578063b79232ed14610a69578063be35cee814610a955761041d565b806393f1a40b116101b35780639f774078116101825780639f774078146109925780639f92cad5146109be578063a0e3be5b146109ea578063a676860a146109f2578063b13208c014610a185761041d565b806393f1a40b146108ea578063976dd4c4146109505780639874752e1461096d5780639aa35332146109755761041d565b8063881c5922116101fa578063881c5922146108ad5780638bdb2afa146108ca5780638da5cb5b146108d2578063900cf0cf146108da578063934eaa50146108e25761041d565b8063715018a614610855578063762b6da61461085d57806377f5bf5e146108655780637c8ff53c146108885761041d565b80633a0967cd116103315780635312ea8e116102b95780635fbe6c1a116102885780635fbe6c1a146107d157806361e0012a146107d9578063630b5ba11461080557806364482f791461080d5780636e7d4019146108385761041d565b80635312ea8e1461075d578063581651af1461077a578063596fa9e31461079d5780635da02c6a146107a55761041d565b8063444820fb11610300578063444820fb146106e5578063485cc955146106ed57806349c5468d1461071b5780634cf5fbf514610723578063509f5b14146107555761041d565b80633a0967cd146106805780633aab0a62146106b2578063434339f3146106ba578063441a3e70146106c25761041d565b806317f27c80116103b457806329575f6a1161038357806329575f6a146105b85780632bdbbc56146105dc5780632c010100146106085780632d6754e51461062e5780633952141b146106545761041d565b806317f27c80146104225780631b3b8d8b146105505780631c9c52ab1461057c5780631eaaa045146105845761041d565b80631526fe27116103f05780631526fe271461047a57806316279055146104e857806317908e771461052257806317caf6f1146105485761041d565b806304deb07e14610422578063081e3eda1461043c5780630bc3b1c0146104445780631041921c1461044e575b600080fd5b61042a610c89565b60408051918252519081900360200190f35b61042a610c90565b61044c610c96565b005b61042a6004803603604081101561046457600080fd5b50803590602001356001600160a01b0316610df3565b6104976004803603602081101561049057600080fd5b5035610e69565b604080516001600160a01b03909a168a5260208a0198909852888801969096526060880194909452911515608087015260a086015260c085015260e084015261010083015251908190036101200190f35b61050e600480360360208110156104fe57600080fd5b50356001600160a01b0316610ecf565b604080519115158252519081900360200190f35b61042a6004803603602081101561053857600080fd5b50356001600160a01b0316610ed9565b61042a610f6f565b61042a6004803603604081101561056657600080fd5b50803590602001356001600160a01b0316610f75565b61044c611044565b61044c6004803603606081101561059a57600080fd5b508035906001600160a01b03602082013516906040013515156110ca565b6105c0611326565b604080516001600160a01b039092168252519081900360200190f35b61042a600480360360408110156105f257600080fd5b50803590602001356001600160a01b0316611335565b61044c6004803603602081101561061e57600080fd5b50356001600160a01b0316611456565b61044c6004803603602081101561064457600080fd5b50356001600160a01b03166115c1565b61042a6004803603604081101561066a57600080fd5b50803590602001356001600160a01b0316611690565b61044c6004803603606081101561069657600080fd5b506001600160a01b03813516906020810135906040013561177c565b61044c61188c565b61044c611a2c565b61044c600480360360408110156106d857600080fd5b5080359060200135611ce4565b6105c0611cfd565b61044c6004803603604081101561070357600080fd5b506001600160a01b0381358116916020013516611d0c565b61042a6120ed565b61044c6004803603606081101561073957600080fd5b506001600160a01b0381351690602081013590604001356120f3565b61042a61223b565b61044c6004803603602081101561077357600080fd5b5035612242565b61042a6004803603604081101561079057600080fd5b5080359060200135612334565b6105c0612369565b61042a600480360360408110156107bb57600080fd5b50803590602001356001600160a01b0316612378565b61042a61238b565b61042a600480360360408110156107ef57600080fd5b50803590602001356001600160a01b0316612390565b61044c6123ee565b61044c6004803603606081101561082357600080fd5b50803590602081013590604001351515612463565b6105c06004803603602081101561084e57600080fd5b5035612534565b61044c612563565b6105c0612605565b61044c6004803603604081101561087b57600080fd5b5080359060200135612619565b61044c6004803603604081101561089e57600080fd5b508035906020013515156126dc565b61042a600480360360208110156108c357600080fd5b5035612768565b6105c06128fe565b6105c061290d565b61042a61291c565b61044c612922565b6109166004803603604081101561090057600080fd5b50803590602001356001600160a01b03166129c0565b6040805197151588526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61042a6004803603602081101561096657600080fd5b5035612a0c565b61042a612a7b565b61050e6004803603602081101561098b57600080fd5b5035612a80565b61042a600480360360408110156109a857600080fd5b50803590602001356001600160a01b0316612aa8565b61042a600480360360408110156109d457600080fd5b50803590602001356001600160a01b0316612ad3565b61042a612d23565b61044c60048036036020811015610a0857600080fd5b50356001600160a01b0316612d28565b61042a60048036036040811015610a2e57600080fd5b50803590602001356001600160a01b0316612e1d565b61044c60048036036020811015610a5a57600080fd5b5035612e48565b61042a612e53565b61042a60048036036040811015610a7f57600080fd5b50803590602001356001600160a01b0316612e58565b610ac160048036036040811015610aab57600080fd5b50803590602001356001600160a01b0316612ec5565b6040805192835260208301919091528051918290030190f35b61044c60048036036060811015610af057600080fd5b506001600160a01b03813581169160208101359160409091013516612f1b565b61042a60048036036020811015610b2657600080fd5b5035613088565b6105c06130f9565b61042a6130fe565b61044c60048036036020811015610b5357600080fd5b5035613104565b6105c0613164565b61044c60048036036060811015610b7857600080fd5b506001600160a01b038135169060208101359060400135613173565b610bb160048036036020811015610baa57600080fd5b50356131f7565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61044c60048036036020811015610bff57600080fd5b503561ffff166137aa565b61044c60048036036040811015610c2057600080fd5b508035906020013561386e565b61050e60048036036020811015610c4357600080fd5b50356001600160a01b03166139a3565b61042a613ad2565b61044c60048036036020811015610c7157600080fd5b50356001600160a01b0316613ad8565b61044c613bd1565b6224ea0081565b60975490565b60995460ff16610df157609960019054906101000a90046001600160a01b03166001600160a01b031663da3ca81d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b505115610df1576099805460ff19166001179081905560408051630ad0cd7d60e41b815290516000926001600160a01b03610100909104169163ad0cd7d0916004808301926020929190829003018186803b158015610d7657600080fd5b505afa158015610d8a573d6000803e3d6000fd5b505050506040513d6020811015610da057600080fd5b505160995460978054929350610def926101009092046001600160a01b03169130918591600090610dcd57fe5b60009182526020909120600b90910201546001600160a01b0316929190613cd4565b505b565b600082158015610e26575060008381526098602090815260408083206001600160a01b038616845290915290205460ff16155b15610e3b57610e3482610ed9565b9050610e63565b5060008281526098602090815260408083206001600160a01b03851684529091529020600201545b92915050565b60978181548110610e7657fe5b60009182526020909120600b9091020180546001820154600283015460038401546005850154600686015460078701546008880154600a909801546001600160a01b03909716985094969395929460ff90921693909289565b803b15155b919050565b6000609960019054906101000a90046001600160a01b03166001600160a01b03166317908e77836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f3d57600080fd5b505afa158015610f51573d6000803e3d6000fd5b505050506040513d6020811015610f6757600080fd5b505192915050565b609c5481565b600080610f828484611690565b9050801580610f9057508042105b15610fa0576103e8915050610e63565b6000610fac8585612390565b90506000610fe462093a8060978881548110610fc457fe5b90600052602060002090600b020160030154613d2e90919063ffffffff16565b9050808210610ff95760009350505050610e63565b60006110058284613d70565b905060006110238361101d6103e8818661c350613db2565b90613d2e565b90506103e881116110345780611038565b6103e85b98975050505050505050565b609b546001600160a01b031633146110a3576040805162461bcd60e51b815260206004820152601860248201527f6e6f742074656e74617469766544657641646472657373210000000000000000604482015290519081900360640190fd5b609b8054609a80546001600160a01b03199081166001600160a01b03841617909155169055565b6110d2613e0b565b6065546001600160a01b03908116911614611122576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b61112b826139a3565b6111665760405162461bcd60e51b81526004018080602001828103825260258152602001806154eb6025913960400191505060405180910390fd5b8015611174576111746123ee565b60975460005b8181101561120e57836001600160a01b03166097828154811061119957fe5b60009182526020909120600b90910201546001600160a01b03161415611206576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220706f6f6c20616c72656164792061646465640000000000000000604482015290519081900360640190fd5b60010161117a565b50609c5461121c9085613e0f565b609c819055506097604051806101200160405280856001600160a01b031681526020018681526020016000815260200161126362093a80600a613db290919063ffffffff16565b8152600060208083018290526040808401839052606080850184905243608080870182905260a096870191909152875460018082018a55988652948490208751600b9096020180546001600160a01b0319166001600160a01b03909616959095178555928601519684019690965584015160028301559383015160038201559282015160058401805460ff1916911515919091179055810151600683015560c0810151600783015560e081015160088301556101000151600a9091015550505050565b60a3546001600160a01b031690565b6000806113428484611690565b905080421015611356576000915050610e63565b60006113628585610df3565b90508061137457600092505050610e63565b60006113a76097878154811061138657fe5b90600052602060002090600b02016003015484613e0f90919063ffffffff16565b4211156113b5575080611409565b60006113c18787612390565b9050611405609788815481106113d357fe5b90600052602060002090600b02016003015461101d856113ff62093a8086613db290919063ffffffff16565b90613db2565b9150505b818111156114145750805b600061142a6114238888612e58565b8490613d70565b9050808211156114495761143e8282613d70565b945050505050610e63565b5060009695505050505050565b61145e610c96565b60995460ff1615610def576001600160a01b03811660009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff16610def5760006114b382610ed9565b6001600160a01b0383811660009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e6020908152604091829020805460ff19166001908117825581018590556002018490556099548251630fec7f8360e41b81529251949550611582946224ea00946101009092049091169263fec7f830926004808301939192829003018186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d602081101561157a57600080fd5b505190613d70565b6001600160a01b03831660009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e60205260409020600601555050565b6115c9613e0b565b6065546001600160a01b03908116911614611619576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b609a546001600160a01b0316331461166e576040805162461bcd60e51b81526020600482015260136024820152726f6e6c79206465762063616e206368616e676560681b604482015290519081900360640190fd5b609b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000821580156116c3575060008381526098602090815260408083206001600160a01b038616845290915290205460ff16155b1561174957609960019054906101000a90046001600160a01b03166001600160a01b031663fec7f8306040518163ffffffff1660e01b815260040160206040518083038186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d602081101561174057600080fd5b50519050610e63565b60008381526098602090815260408083206001600160a01b0386168452909152902060060154610e34906224ea00613e0f565b61178583611456565b60006097838154811061179457fe5b600091825260208083206001600160a01b03881684526004600b90930201918201815260408084203385529091529091205490915082111561181d576040805162461bcd60e51b815260206004820181905260248201527f77697468647261773a20696e73756666696369656e7420616c6c6f77616e6365604482015290519081900360640190fd5b6001600160a01b0384166000908152600482016020908152604080832033845290915290205461184d9083613d70565b6001600160a01b038516600090815260048301602090815260408083203380855292529091209190915561188690849084908790613e69565b50505050565b60005b609754811015610def5743609782815481106118a757fe5b90600052602060002090600b0201600a015461c350011061190f576040805162461bcd60e51b815260206004820152601760248201527f4e65772065706f6368206e6f7420726561647920796574000000000000000000604482015290519081900360640190fd5b6097818154811061191c57fe5b90600052602060002090600b0201600601546097828154811061193b57fe5b90600052602060002090600b02016009016000609e548152602001908152602001600020819055506119b26097828154811061197357fe5b90600052602060002090600b0201600601546097838154811061199257fe5b90600052602060002090600b020160070154613e0f90919063ffffffff16565b609782815481106119bf57fe5b90600052602060002090600b0201600701819055506000609782815481106119e357fe5b90600052602060002090600b0201600601819055504360978281548110611a0657fe5b60009182526020909120600a600b909202010155609e805460019081019091550161188f565b60a254611a3857610df1565b609954604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a8857600080fd5b505afa158015611a9c573d6000803e3d6000fd5b505050506040513d6020811015611ab257600080fd5b505160a254909150811015611bcf57609954609a546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b158015611b2057600080fd5b505af1158015611b34573d6000803e3d6000fd5b505050506040513d6020811015611b4a57600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d6020811015611bc557600080fd5b505160a055611cdc565b609954609a5460a2546040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b158015611c3157600080fd5b505af1158015611c45573d6000803e3d6000fd5b505050506040513d6020811015611c5b57600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b505160a0555b50600060a255565b611ced33611456565b611cf982823333613e69565b5050565b609b546001600160a01b031681565b600054610100900460ff1680611d255750611d25614019565b80611d33575060005460ff16155b611d6e5760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff16158015611d99576000805460ff1961ff0019909116610100171660011790555b611da161401f565b60a1805461ffff19166102d4179055609980546001600160a01b03808616610100908102610100600160a81b031990931692909217928390556040805163b480f6ad60e01b8152905192909304169163b480f6ad916004808301926020929190829003018186803b158015611e1557600080fd5b505afa158015611e29573d6000803e3d6000fd5b505050506040513d6020811015611e3f57600080fd5b5051609a80546001600160a01b03199081166001600160a01b0393841617909155609b80548216905543609f5560a3805490911684831617905560995460408051634d33245760e01b81529051611ef19361010090930490921691634d33245791600480820192602092909190829003018186803b158015611ec057600080fd5b505afa158015611ed4573d6000803e3d6000fd5b505050506040513d6020811015611eea57600080fd5b50516139a3565b611f2c5760405162461bcd60e51b81526004018080602001828103825260258152602001806154eb6025913960400191505060405180910390fd5b611fb36103e8609960019054906101000a90046001600160a01b03166001600160a01b0316634d3324576040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8057600080fd5b505afa158015611f94573d6000803e3d6000fd5b505050506040513d6020811015611faa57600080fd5b505160016110ca565b609960019054906101000a90046001600160a01b03166001600160a01b0316635873aaa36040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b505160a480546001600160a01b0319166001600160a01b0392831617905560995460408051631f36fd1b60e11b8152905161010090920490921691633e6dfa36916004808301926020929190829003018186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d60208110156120b557600080fd5b505160a580546001600160a01b0319166001600160a01b0390921691909117905580156120e8576000805461ff00191690555b505050565b609f5481565b6120fc83611456565b60006097838154811061210b57fe5b600091825260208083208684526098825260408085206001600160a01b038a1686529092529220600b90910290910191506121446123ee565b61214e84866140d0565b60006121616103e861101d866001613db2565b9050600061216f8583613d70565b905080156121c657835461218f906001600160a01b031633600085613cd4565b83546121a6906001600160a01b0316333084613cd4565b6121b18688836141a6565b60018301546121c09082613e0f565b60018401555b6121ed670de0b6b3a764000061101d86600201548660010154613db290919063ffffffff16565b600384015560408051828152905187916001600160a01b038a16917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a350505050505050565b62093a8081565b60006097828154811061225157fe5b60009182526020909120600b90910201600581015490915060ff166122a75760405162461bcd60e51b81526004018080602001828103825260268152602001806154756026913960400191505060405180910390fd5b6122b033611456565b60008281526098602090815260408083203380855292529091206001810154835491926122e6926001600160a01b031691614269565b60018101546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a36000600182018190556003909101555050565b60006097838154811061234357fe5b600091825260208083209483526009600b90920290940101909252506040902054919050565b60a4546001600160a01b031681565b60006123848383612e58565b9392505050565b600181565b60008061239d8484611690565b90508015806123ab57508042105b156123ba576000915050610e63565b60006123c64283613d70565b905060006123d78262093a80613d2e565b90506123e4816001613e0f565b9695505050505050565b612422604051806040016040528060138152602001724d617373205570646174696e6720506f6f6c7360681b8152506142bb565b6097546000805b8281101561244e5761244461243d82614361565b8390613e0f565b9150600101612429565b50609d5461245c9082613d70565b609d555050565b61246b613e0b565b6065546001600160a01b039081169116146124bb576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b80156124c9576124c96123ee565b61250682612500609786815481106124dd57fe5b90600052602060002090600b020160010154609c54613d7090919063ffffffff16565b90613e0f565b609c81905550816097848154811061251a57fe5b90600052602060002090600b020160010181905550505050565b60006097828154811061254357fe5b60009182526020909120600b90910201546001600160a01b031692915050565b61256b613e0b565b6065546001600160a01b039081169116146125bb576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60995461010090046001600160a01b031681565b612621613e0b565b6065546001600160a01b03908116911614612671576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b61267a81612a80565b6126b55760405162461bcd60e51b81526004018080602001828103825260288152602001806153b66028913960400191505060405180910390fd5b80609783815481106126c357fe5b90600052602060002090600b0201600301819055505050565b6126e4613e0b565b6065546001600160a01b03908116911614612734576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b806097838154811061274257fe5b60009182526020909120600b90910201600501805460ff19169115159190911790555050565b6000806097838154811061277857fe5b60009182526020808320600b9092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116926370a0823192602480840193829003018186803b1580156127d157600080fd5b505afa1580156127e5573d6000803e3d6000fd5b505050506040513d60208110156127fb57600080fd5b5051905083158015612810575060995460ff16155b156128a1576000609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d602081101561288f57600080fd5b5051905061289d8282613e0f565b9150505b806128b157600092505050610ed4565b60006128d2609c5461101d8560010154609d54613db290919063ffffffff16565b60a1549091506000906128f2906127109061101d90859061ffff16613db2565b90506123e48282613d70565b60a5546001600160a01b031681565b6065546001600160a01b031690565b609e5481565b61292a613e0b565b60a3546001600160a01b039081169116146129765760405162461bcd60e51b81526004018080602001828103825260288152602001806153de6028913960400191505060405180910390fd5b60a3546040516000916001600160a01b0316907ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b64908390a360a380546001600160a01b0319169055565b6098602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460069096015460ff9095169593949293919290919087565b6000610e63612a4260978481548110612a2157fe5b90600052602060002090600b0201600a015443613d7090919063ffffffff16565b61101d612a4e85612768565b60978681548110612a5b57fe5b90600052602060002090600b020160060154613e0f90919063ffffffff16565b603281565b600080612a908362093a80613d2e565b9050612a9f8162093a80613db2565b90921492915050565b60009182526098602090815260408084206001600160a01b0393909316845291905290206004015490565b60008060978481548110612ae357fe5b600091825260208083208784526098825260408085206001600160a01b038981168752908452818620600b9590950290920160028101546001860154825484516370a0823160e01b81523060048201529451939950969791969095919416926370a082319260248083019392829003018186803b158015612b6357600080fd5b505afa158015612b77573d6000803e3d6000fd5b505050506040513d6020811015612b8d57600080fd5b5051905087158015612ba2575060995460ff16155b15612c33576000609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b158015612bf757600080fd5b505afa158015612c0b573d6000803e3d6000fd5b505050506040513d6020811015612c2157600080fd5b50519050612c2f8282613e0f565b9150505b80612c4657600095505050505050610e63565b87158015612c565750835460ff16155b15612c76576000612c6688610ed9565b9050612c728382613e0f565b9250505b6000612c97609c5461101d8860010154609d54613db290919063ffffffff16565b60a154909150600090612cb7906127109061101d90859061ffff16613db2565b90506000612cc58383613d70565b90506000612cdf8561101d84670de0b6b3a7640000613db2565b9050612ceb8782613e0f565b6003890154909750612d1390612d0d670de0b6b3a764000061101d8a8c613db2565b90613d70565b9c9b505050505050505050505050565b600a81565b612d30613e0b565b60a3546001600160a01b03908116911614612d7c5760405162461bcd60e51b81526004018080602001828103825260288152602001806153de6028913960400191505060405180910390fd5b6001600160a01b038116612dc15760405162461bcd60e51b815260040180806020018281038252602681526020018061536b6026913960400191505060405180910390fd5b60a3546040516001600160a01b038084169216907ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6490600090a360a380546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526098602090815260408084206001600160a01b0393909316845291905290206006015490565b610def816000611ce4565b602881565b600082158015612e8b575060008381526098602090815260408083206001600160a01b038616845290915290205460ff16155b15612e9957610e3482610ed9565b5060008281526098602090815260408083206001600160a01b0385168452909152902060010154610e63565b6000806000612ed48585611335565b90506000612ee28686610f75565b9050612ef46103e861101d8484613db2565b9250612f106103e861101d612f098285613d70565b8590613db2565b935050509250929050565b612f23613e0b565b60a3546001600160a01b03908116911614612f6f5760405162461bcd60e51b81526004018080602001828103825260288152602001806153de6028913960400191505060405180910390fd5b612f7881610ecf565b612fb35760405162461bcd60e51b81526004018080602001828103825260258152602001806153916025913960400191505060405180910390fd5b609f54612fc39062017318613e0f565b43116130005760405162461bcd60e51b815260040180806020018281038252602681526020018061549b6026913960400191505060405180910390fd5b826001600160a01b031663095ea7b382846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561305757600080fd5b505af115801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b5050505050565b6000610e636130be6097848154811061309d57fe5b90600052602060002090600b02016008015443613d7090919063ffffffff16565b61101d6130ca85612768565b612500609787815481106130da57fe5b90600052602060002090600b0201600601546097888154811061199257fe5b600081565b60a25481565b61310e8133611690565b421161314b5760405162461bcd60e51b81526004018080602001828103825260248152602001806155106024913960400191505060405180910390fd5b60006131578233612ec5565b509050611cf98282611ce4565b609a546001600160a01b031681565b60006097838154811061318257fe5b6000918252602080832033808552600b939093020160048101825260408085206001600160a01b038a1680875290845294819020879055805188815292830187905280519195507fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7928290030190a350505050565b6000806000806000806000806097898154811061321057fe5b60009182526020808320600b9092029091015460995460408051630dfe168160e01b815290516001600160a01b039384169650610100909204909216938593909285928592630dfe16819260048082019391829003018186803b15801561327657600080fd5b505afa15801561328a573d6000803e3d6000fd5b505050506040513d60208110156132a057600080fd5b50516001600160a01b03161461331a57816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e957600080fd5b505afa1580156132fd573d6000803e3d6000fd5b505050506040513d602081101561331357600080fd5b5051613380565b816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d602081101561337d57600080fd5b50515b90506000819050846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d60208110156133ea57600080fd5b50519b508b1561379a576000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561344357600080fd5b505afa158015613457573d6000803e3d6000fd5b505050506040513d602081101561346d57600080fd5b5051604080516370a0823160e01b81526001600160a01b0389811660048301529151929350600092918516916370a0823191602480820192602092909190829003018186803b1580156134bf57600080fd5b505afa1580156134d3573d6000803e3d6000fd5b505050506040513d60208110156134e957600080fd5b5051604080516370a0823160e01b815230600482015290519192506001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561353557600080fd5b505afa158015613549573d6000803e3d6000fd5b505050506040513d602081101561355f57600080fd5b505198508815801561356f57508e155b801561357e575060995460ff16155b1561367c57609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156135d157600080fd5b505afa1580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505160995460408051632f85c5a960e21b81529051929b506101009091046001600160a01b03169163be1716a491600480820192602092909190829003018186803b15801561364957600080fd5b505afa15801561365d573d6000803e3d6000fd5b505050506040513d602081101561367357600080fd5b50519750613757565b8897508e6137575761375461374d609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156136d857600080fd5b505afa1580156136ec573d6000803e3d6000fd5b505050506040513d602081101561370257600080fd5b505160995460408051632f85c5a960e21b815290516101009092046001600160a01b03169163be1716a491600480820192602092909190829003018186803b15801561155057600080fd5b8990613e0f565b97505b6137658e61101d8b85613db2565b9c506137758e61101d8a85613db2565b9b506137858e61101d8b84613db2565b9a506137958e61101d8a84613db2565b995050505b5050505050919395979092949650565b6137b2613e0b565b6065546001600160a01b03908116911614613802576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b6103e88161ffff161115613856576040805162461bcd60e51b81526020600482015260166024820152754465762066656520636c616d7065642061742031302560501b604482015290519081900360640190fd5b60a1805461ffff191661ffff92909216919091179055565b61387733611456565b60006097838154811061388657fe5b600091825260208083208684526098825260408085203386529092529220600b90910290910191506138b66123ee565b6138c084336140d0565b60006138d36103e861101d866001613db2565b905060006138e18583613d70565b90508015613938578354613901906001600160a01b031633600085613cd4565b8354613918906001600160a01b0316333084613cd4565b6139238633836141a6565b60018301546139329082613e0f565b60018401555b61395f670de0b6b3a764000061101d86600201548660010154613db290919063ffffffff16565b6003840155604080518281529051879133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a3505050505050565b600080829050609960019054906101000a90046001600160a01b03166001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613a0157600080fd5b505afa158015613a15573d6000803e3d6000fd5b505050506040513d6020811015613a2b57600080fd5b50516001600160a01b031614806123845750609960019054906101000a90046001600160a01b03166001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015613a9557600080fd5b505afa158015613aa9573d6000803e3d6000fd5b505050506040513d6020811015613abf57600080fd5b50516001600160a01b0316149392505050565b609d5481565b613ae0613e0b565b6065546001600160a01b03908116911614613b30576040805162461bcd60e51b81526020600482018190526024820152600080516020615427833981519152604482015290519081900360640190fd5b6001600160a01b038116613b755760405162461bcd60e51b815260040180806020018281038252602681526020018061536b6026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000613c3b60a054609960019054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561155057600080fd5b90508015610def57609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015613c9257600080fd5b505afa158015613ca6573d6000803e3d6000fd5b505050506040513d6020811015613cbc57600080fd5b505160a055609d54613cce9082613e0f565b609d5550565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261188690859061457d565b600061238483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614735565b600061238483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506147d7565b600082613dc157506000610e63565b82820282848281613dce57fe5b04146123845760405162461bcd60e51b81526004018080602001828103825260218152602001806154066021913960400191505060405180910390fd5b3390565b600082820183811015612384576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600060978581548110613e7857fe5b600091825260208083208884526098825260408085206001600160a01b0389168652909252908320600b9092020192509080613eb48887612ec5565b9150915086821015613f02576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b613f0a6123ee565b613f1488876140d0565b8615613fa357866000613f2b8461101d8486613db2565b9050613f45613f3a8383613e0f565b600187015490613d70565b60018601558554613f60906001600160a01b03168884614269565b8015613fa0578554600090613f7e906001600160a01b031683614831565b8754909150613f96906001600160a01b031682614aea565b613f9e613bd1565b505b50505b613fca670de0b6b3a764000061101d86600201548660010154613db290919063ffffffff16565b600384015560408051888152905189916001600160a01b038816917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a35050505050505050565b303b1590565b600054610100900460ff16806140385750614038614019565b80614046575060005460ff16155b6140815760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff161580156140ac576000805460ff1961ff0019909116610100171660011790555b6140b4614ed4565b6140bc614f74565b8015610def576000805461ff001916905550565b60008281526098602090815260408083206001600160a01b03851684529091529020600581015461410e57614108426224ea00613e0f565b60058201555b806005015442111561414357600481018054600090915561412f838261506d565b61413c426224ea00613e0f565b6005830155505b600061414f8484612ad3565b90506000614163606461101d846032613db2565b905060006141718383613d70565b9050801561418e5760048401546141889082613e0f565b60048501555b811561419e5761419e858361506d565b505050505050565b60008381526098602090815260408083206001600160a01b0386168452909152902060018101546141e35742600682015560028101829055611886565b6000609785815481106141f257fe5b90600052602060002090600b020160030154905060006142128686611335565b9050600061422d858560010154613e0f90919063ffffffff16565b9050600061423f8261101d8587613db2565b905061425661424f826002613d2e565b4290613d70565b6006860155506002840155505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526120e890849061457d565b610def816040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156142ff5781810151838201526020016142e7565b50505050905090810190601f16801561432c5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052925061530d915050565b6000806097838154811061437157fe5b60009182526020808320600b9092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116926370a0823192602480840193829003018186803b1580156143ca57600080fd5b505afa1580156143de573d6000803e3d6000fd5b505050506040513d60208110156143f457600080fd5b5051905083158015614409575060995460ff16155b1561449a576000609960019054906101000a90046001600160a01b03166001600160a01b031663ad0cd7d06040518163ffffffff1660e01b815260040160206040518083038186803b15801561445e57600080fd5b505afa158015614472573d6000803e3d6000fd5b505050506040513d602081101561448857600080fd5b505190506144968282613e0f565b9150505b806144aa57600092505050610ed4565b6144c9609c5461101d8460010154609d54613db290919063ffffffff16565b60a1549093506000906144e9906127109061101d90879061ffff16613db2565b905060006144f78583613d70565b905060006145118461101d84670de0b6b3a7640000613db2565b9050614529670de0b6b3a764000061101d8684613db2565b91506145358683613d70565b60a2549093506145459084613e0f565b60a25560028501546145579082613e0f565b6002860155600685015461456b9083613e0f565b85600601819055505050505050919050565b61458f826001600160a01b031661532e565b6145e0576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061461e5780518252601f1990920191602091820191016145ff565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614680576040519150601f19603f3d011682016040523d82523d6000602084013e614685565b606091505b5091509150816146dc576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611886578080602001905160208110156146f857600080fd5b50516118865760405162461bcd60e51b815260040180806020018281038252602a8152602001806154c1602a913960400191505060405180910390fd5b600081836147c15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561478657818101518382015260200161476e565b50505050905090810190601f1680156147b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816147cd57fe5b0495945050505050565b600081848411156148295760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561478657818101518382015260200161476e565b505050900390565b60a4546040805163095ea7b360e01b81526001600160a01b03928316600482015260248101849052905160009285929083169163095ea7b39160448082019260209290919082900301818887803b15801561488b57600080fd5b505af115801561489f573d6000803e3d6000fd5b505050506040513d60208110156148b557600080fd5b505060a45460408051630dfe168160e01b8152905160009283926001600160a01b039182169263baa2abde92871691630dfe1681916004808301926020929190829003018186803b15801561490957600080fd5b505afa15801561491d573d6000803e3d6000fd5b505050506040513d602081101561493357600080fd5b50516040805163d21220a760e01b815290516001600160a01b0388169163d21220a7916004808301926020929190829003018186803b15801561497557600080fd5b505afa158015614989573d6000803e3d6000fd5b505050506040513d602081101561499f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201899052600060648301819052608483018190523060a484015262015180420160c4840152815160e4808501949192918390030190829087803b158015614a1857600080fd5b505af1158015614a2c573d6000803e3d6000fd5b505050506040513d6040811015614a4257600080fd5b50805160209182015160995460408051630dfe168160e01b815290519396509194506000936001600160a01b0361010090920482169391881692630dfe16819260048083019392829003018186803b158015614a9d57600080fd5b505afa158015614ab1573d6000803e3d6000fd5b505050506040513d6020811015614ac757600080fd5b50516001600160a01b031614614add5782614adf565b815b979650505050505050565b60008290506000609960019054906101000a90046001600160a01b03166001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015614b4957600080fd5b505afa158015614b5d573d6000803e3d6000fd5b505050506040513d6020811015614b7357600080fd5b50516001600160a01b031614614bed57816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015614bbc57600080fd5b505afa158015614bd0573d6000803e3d6000fd5b505050506040513d6020811015614be657600080fd5b5051614c53565b816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015614c2657600080fd5b505afa158015614c3a573d6000803e3d6000fd5b505050506040513d6020811015614c5057600080fd5b50515b6040805160028082526060808301845293945090916020830190803683370190505090508181600081518110614c8557fe5b6001600160a01b03928316602091820292909201015260995482516101009091049091169082906001908110614cb757fe5b6001600160a01b0392831660209182029290920181019190915260a4546040805163095ea7b360e01b815291841660048301526024820188905251859384169263095ea7b392604480820193918290030181600087803b158015614d1a57600080fd5b505af1158015614d2e573d6000803e3d6000fd5b505050506040513d6020811015614d4457600080fd5b505060a4546001600160a01b03166338ed17398660008530614d694262015180613e0f565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015614dd9578181015183820152602001614dc1565b505050509050019650505050505050600060405180830381600087803b158015614e0257600080fd5b505af1158015614e16573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015614e3f57600080fd5b8101908080516040519392919084640100000000821115614e5f57600080fd5b908301906020820185811115614e7457600080fd5b8251866020820283011164010000000082111715614e9157600080fd5b82525081516020918201928201910280838360005b83811015614ebe578181015183820152602001614ea6565b5050505090500160405250505050505050505050565b600054610100900460ff1680614eed5750614eed614019565b80614efb575060005460ff16155b614f365760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff161580156140bc576000805460ff1961ff0019909116610100171660011790558015610def576000805461ff001916905550565b600054610100900460ff1680614f8d5750614f8d614019565b80614f9b575060005460ff16155b614fd65760405162461bcd60e51b815260040180806020018281038252602e815260200180615447602e913960400191505060405180910390fd5b600054610100900460ff16158015615001576000805460ff1961ff0019909116610100171660011790555b600061500b613e0b565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610def576000805461ff001916905550565b609954604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156150bd57600080fd5b505afa1580156150d1573d6000803e3d6000fd5b505050506040513d60208110156150e757600080fd5b50519050808211156151fe576099546040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820185905291516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b15801561514f57600080fd5b505af1158015615163573d6000803e3d6000fd5b505050506040513d602081101561517957600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b1580156151ca57600080fd5b505afa1580156151de573d6000803e3d6000fd5b505050506040513d60208110156151f457600080fd5b505160a055615305565b6099546040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905291516101009093049091169163a9059cbb916044808201926020929091908290030181600087803b15801561525a57600080fd5b505af115801561526e573d6000803e3d6000fd5b505050506040513d602081101561528457600080fd5b5050609954604080516370a0823160e01b815230600482015290516101009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b1580156152d557600080fd5b505afa1580156152e9573d6000803e3d6000fd5b505050506040513d60208110156152ff57600080fd5b505160a0555b6120e8611a2c565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061536257508115155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c204241444c6f636b656420706572696f64206d7573742062652061206d756c7469706c65206f66207765656b53757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f6e65206f66207468652070616972656420746f6b656e73206d757374206265204e45524463616e6e6f7420776974686472617720616c6c206c7020746f6b656e73206265666f7265a264697066735822122092ba07ccec48088bdcccbcb65f01ab8cd8880c4e37dd0015289f733f921225d764736f6c634300060c0033
Deployed Bytecode Sourcemap
113139:30283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113615:54;;;:::i;:::-;;;;;;;;;;;;;;;;117513:95;;;:::i;119206:445::-;;;:::i;:::-;;110957:327;;;;;;;;;;;;;;;;-1:-1:-1;110957:327:0;;;;;;-1:-1:-1;;;;;110957:327:0;;:::i;109826:26::-;;;;;;;;;;;;;;;;-1:-1:-1;109826:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;109826:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138642:188;;;;;;;;;;;;;;;;-1:-1:-1;138642:188:0;-1:-1:-1;;;;;138642:188:0;;:::i;:::-;;;;;;;;;;;;;;;;;;110126:121;;;;;;;;;;;;;;;;-1:-1:-1;110126:121:0;-1:-1:-1;;;;;110126:121:0;;:::i;113453:30::-;;;:::i;120473:801::-;;;;;;;;;;;;;;;;-1:-1:-1;120473:801:0;;;;;;-1:-1:-1;;;;;120473:801:0;;:::i;140475:208::-;;;:::i;118113:1085::-;;;;;;;;;;;;;;;;-1:-1:-1;118113:1085:0;;;-1:-1:-1;;;;;118113:1085:0;;;;;;;;;;;;:::i;140808:89::-;;;:::i;:::-;;;;-1:-1:-1;;;;;140808:89:0;;;;;;;;;;;;;;111292:1169;;;;;;;;;;;;;;;;-1:-1:-1;111292:1169:0;;;;;;-1:-1:-1;;;;;111292:1169:0;;:::i;119659:595::-;;;;;;;;;;;;;;;;-1:-1:-1;119659:595:0;-1:-1:-1;;;;;119659:595:0;;:::i;140292:175::-;;;;;;;;;;;;;;;;-1:-1:-1;140292:175:0;-1:-1:-1;;;;;140292:175:0;;:::i;110255:372::-;;;;;;;;;;;;;;;;-1:-1:-1;110255:372:0;;;;;;-1:-1:-1;;;;;110255:372:0;;:::i;134424:508::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;134424:508:0;;;;;;;;;;;;;:::i;115300:743::-;;;:::i;139805:479::-;;;:::i;134981:172::-;;;;;;;;;;;;;;;;-1:-1:-1;134981:172:0;;;;;;;:::i;113322:34::-;;;:::i;116476:768::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;116476:768:0;;;;;;;;;;:::i;113737:33::-;;;:::i;132145:1389::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;132145:1389:0;;;;;;;;;;;;;:::i;107194:50::-;;;:::i;138838:528::-;;;;;;;;;;;;;;;;-1:-1:-1;138838:528:0;;:::i;115021:177::-;;;;;;;;;;;;;;;;-1:-1:-1;115021:177:0;;;;;;;:::i;114086:41::-;;;:::i;112469:169::-;;;;;;;;;;;;;;;;-1:-1:-1;112469:169:0;;;;;;-1:-1:-1;;;;;112469:169:0;;:::i;107406:47::-;;;:::i;112646:486::-;;;;;;;;;;;;;;;;-1:-1:-1;112646:486:0;;;;;;-1:-1:-1;;;;;112646:486:0;;:::i;127356:343::-;;;:::i;123474:364::-;;;;;;;;;;;;;;;;-1:-1:-1;123474:364:0;;;;;;;;;;;;;;:::i;117616:120::-;;;;;;;;;;;;;;;;-1:-1:-1;117616:120:0;;:::i;28447:148::-;;;:::i;110031:29::-;;;:::i;124005:298::-;;;;;;;;;;;;;;;;-1:-1:-1;124005:298:0;;;;;;;:::i;124311:179::-;;;;;;;;;;;;;;;;-1:-1:-1;124311:179:0;;;;;;;;;:::i;124658:889::-;;;;;;;;;;;;;;;;-1:-1:-1;124658:889:0;;:::i;114134:39::-;;;:::i;27805:79::-;;;:::i;113586:20::-;;;:::i;141087:160::-;;;:::i;109906:64::-;;;;;;;;;;;;;;;;-1:-1:-1;109906:64:0;;;;;;-1:-1:-1;;;;;109906:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114678:335;;;;;;;;;;;;;;;;-1:-1:-1;114678:335:0;;:::i;113676:54::-;;;:::i;117744:198::-;;;;;;;;;;;;;;;;-1:-1:-1;117744:198:0;;:::i;127097:176::-;;;;;;;;;;;;;;;;-1:-1:-1;127097:176:0;;;;;;-1:-1:-1;;;;;127097:176:0;;:::i;125611:1478::-;;;;;;;;;;;;;;;;-1:-1:-1;125611:1478:0;;;;;;-1:-1:-1;;;;;125611:1478:0;;:::i;107124:51::-;;;:::i;141255:292::-;;;;;;;;;;;;;;;;-1:-1:-1;141255:292:0;-1:-1:-1;;;;;141255:292:0;;:::i;120262:174::-;;;;;;;;;;;;;;;;-1:-1:-1;120262:174:0;;;;;;-1:-1:-1;;;;;120262:174:0;;:::i;129690:79::-;;;;;;;;;;;;;;;;-1:-1:-1;129690:79:0;;:::i;107276:52::-;;;:::i;110635:314::-;;;;;;;;;;;;;;;;-1:-1:-1;110635:314:0;;;;;;-1:-1:-1;;;;;110635:314:0;;:::i;121282:518::-;;;;;;;;;;;;;;;;-1:-1:-1;121282:518:0;;;;;;-1:-1:-1;;;;;121282:518:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;138112:522;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;138112:522:0;;;;;;;;;;;;;;;;;:::i;114242:386::-;;;;;;;;;;;;;;;;-1:-1:-1;114242:386:0;;:::i;107469:67::-;;;:::i;114007:34::-;;;:::i;133907:375::-;;;;;;;;;;;;;;;;-1:-1:-1;133907:375:0;;:::i;113293:22::-;;;:::i;133609:290::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;133609:290:0;;;;;;;;;;;;;:::i;141555:1864::-;;;;;;;;;;;;;;;;-1:-1:-1;141555:1864:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124498:152;;;;;;;;;;;;;;;;-1:-1:-1;124498:152:0;;;;:::i;129835:1225::-;;;;;;;;;;;;;;;;-1:-1:-1;129835:1225:0;;;;;;;:::i;117252:253::-;;;;;;;;;;;;;;;;-1:-1:-1;117252:253:0;-1:-1:-1;;;;;117252:253:0;;:::i;113548:29::-;;;:::i;28750:244::-;;;;;;;;;;;;;;;;-1:-1:-1;28750:244:0;-1:-1:-1;;;;;28750:244:0;;:::i;127803:340::-;;;:::i;113615:54::-;113662:7;113615:54;:::o;117513:95::-;117585:8;:15;117513:95;:::o;119206:445::-;119253:16;;;;119248:396;;119290:4;;;;;;;;;-1:-1:-1;;;;;119290:4:0;-1:-1:-1;;;;;119290:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;119290:30:0;119286:347;;;119341:16;:23;;-1:-1:-1;;119341:23:0;119360:4;119341:23;;;;;119405:34;;;-1:-1:-1;;;119405:34:0;;;;119341:16;;-1:-1:-1;;;;;119341:23:0;119405:4;;;;;:32;;:34;;;;;;;;;;;;;;:4;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;119405:34:0;119523:4;;119458:8;:11;;119405:34;;-1:-1:-1;119458:159:0;;119523:4;;;;-1:-1:-1;;;;;119523:4:0;;119559;;119405:34;;119467:1;;119458:11;;;;;;;;;;;;;;;;;:17;-1:-1:-1;;;;;119458:17:0;;:159;;:34;:159::i;:::-;119286:347;;119206:445::o;110957:327::-;111062:7;111091:9;;:52;;;;-1:-1:-1;111105:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;111105:21:0;;;;;;;;;:38;;;111104:39;111091:52;111087:190;;;111167:21;111182:5;111167:14;:21::i;:::-;111160:28;;;;111087:190;-1:-1:-1;111228:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;111228:21:0;;;;;;;;;:37;;;111087:190;110957:327;;;;:::o;109826:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;109826:26:0;;;;-1:-1:-1;109826:26:0;;;;;;;;;;;;;;:::o;138642:188::-;138769:17;;138814:8;;138642:188;;;;:::o;110126:121::-;110186:7;110213:4;;;;;;;;;-1:-1:-1;;;;;110213:4:0;-1:-1:-1;;;;;110213:19:0;;110233:5;110213:26;;;;;;;;;;;;;-1:-1:-1;;;;;110213:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;110213:26:0;;110126:121;-1:-1:-1;;110126:121:0:o;113453:30::-;;;;:::o;120473:801::-;120593:7;120618:22;120643:30;120661:4;120667:5;120643:17;:30::i;:::-;120618:55;-1:-1:-1;120688:19:0;;;:55;;;120729:14;120711:15;:32;120688:55;120684:85;;;120765:4;120758:11;;;;;120684:85;120780:19;120802:38;120828:4;120834:5;120802:25;:38::i;:::-;120780:60;;120851:23;120877:73;107237:7;120877:8;120886:4;120877:14;;;;;;;;;;;;;;;;;;:27;;;:31;;:73;;;;:::i;:::-;120851:99;;120985:15;120970:11;:30;120966:44;;121009:1;121002:8;;;;;;;120966:44;121021:22;121046:32;:15;121066:11;121046:19;:32::i;:::-;121021:57;-1:-1:-1;121155:11:0;121169:56;121209:15;121169:35;121199:4;121169:35;121021:57;121188:5;121169:18;:25::i;:::-;:29;;:35::i;:56::-;121155:70;;121249:4;121243:3;:10;:23;;121263:3;121243:23;;;121256:4;121243:23;121236:30;120473:801;-1:-1:-1;;;;;;;;120473:801:0:o;140475:208::-;140530:19;;-1:-1:-1;;;;;140530:19:0;140553:10;140530:33;140522:70;;;;;-1:-1:-1;;;140522:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;140613:19;;;140603:7;:29;;-1:-1:-1;;;;;;140603:29:0;;;-1:-1:-1;;;;;140613:19:0;;140603:29;;;;140643:32;;;140475:208::o;118113:1085::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;118264:33:::1;118289:6;118264:16;:33::i;:::-;118242:120;;;;-1:-1:-1::0;;;118242:120:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118377:11;118373:61;;;118405:17;:15;:17::i;:::-;118463:8;:15:::0;118446:14:::1;118489:136;118517:6;118511:3;:12;118489:136;;;118578:6;-1:-1:-1::0;;;;;118555:29:0::1;:8;118564:3;118555:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:19:::0;-1:-1:-1;;;;;118555:19:0::1;:29;;118547:66;;;::::0;;-1:-1:-1;;;118547:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;118525:5;;118489:136;;;-1:-1:-1::0;118655:15:0::1;::::0;:32:::1;::::0;118675:11;118655:19:::1;:32::i;:::-;118637:15;:50;;;;118700:8;118728:451;;;;;;;;118763:6;-1:-1:-1::0;;;;;118728:451:0::1;;;;;118800:11;118728:451;;;;118847:1;118728:451;;;;118881:44;107237:7;107173:2;118881:26;;:44;;;;:::i;:::-;118728:451:::0;;118967:5:::1;118728:451;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;119092:12:::1;118728:451:::0;;;;;;;;;;;;;;;118700:490;;118728:451;118700:490;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;118700:490:0::1;-1:-1:-1::0;;;;;118700:490:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;118700:490:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;118113:1085:0:o;140808:89::-;140878:11;;-1:-1:-1;;;;;140878:11:0;140808:89;:::o;111292:1169::-;111398:7;111423:22;111448:30;111466:4;111472:5;111448:17;:30::i;:::-;111423:55;;111511:14;111493:15;:32;111489:73;;;111549:1;111542:8;;;;;111489:73;111574:16;111593:31;111612:4;111618:5;111593:18;:31::i;:::-;111574:50;-1:-1:-1;111639:13:0;111635:27;;111661:1;111654:8;;;;;;111635:27;111675:29;111743:47;111762:8;111771:4;111762:14;;;;;;;;;;;;;;;;;;:27;;;111743:14;:18;;:47;;;;:::i;:::-;111725:15;:65;111721:398;;;-1:-1:-1;111831:8:0;111721:398;;;111872:19;111894:38;111920:4;111926:5;111894:25;:38::i;:::-;111872:60;;111973:134;112079:8;112088:4;112079:14;;;;;;;;;;;;;;;;;;:27;;;111973:83;112047:8;111973:51;107237:7;111973:11;:33;;:51;;;;:::i;:::-;:73;;:83::i;:134::-;111949:158;;111721:398;;112157:8;112133:21;:32;112129:97;;;-1:-1:-1;112206:8:0;112129:97;112236:23;112262:41;112275:27;112290:4;112296:5;112275:14;:27::i;:::-;112262:8;;:12;:41::i;:::-;112236:67;;112342:15;112318:21;:39;112314:121;;;112381:42;:21;112407:15;112381:25;:42::i;:::-;112374:49;;;;;;;;112314:121;-1:-1:-1;112452:1:0;;111292:1169;-1:-1:-1;;;;;;111292:1169:0:o;119659:595::-;119728:14;:12;:14::i;:::-;119757:16;;;;119753:494;;;-1:-1:-1;;;;;119795:18:0;;:11;:18;;;:11;;:18;:11;:18;;:35;;;119790:446;;119851:17;119871:21;119886:5;119871:14;:21::i;:::-;-1:-1:-1;;;;;119911:18:0;;;:11;:18;;;:11;;:18;;;:11;:18;;;;:42;;-1:-1:-1;;119911:42:0;119949:4;119911:42;;;;;119972:25;;:37;;;120028:34;;:46;;;120126:4;;:24;;-1:-1:-1;;;120126:24:0;;;;119972:37;;-1:-1:-1;120126:94:0;;107392:7;;119911:42;120126:4;;;;;;;:22;;:24;;;;;119911:11;;120126:24;;;;;:4;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;120126:24:0;;:28;:94::i;:::-;-1:-1:-1;;;;;120093:18:0;;:11;:18;;;:11;;:18;:11;:18;;:30;;:127;-1:-1:-1;119659:595:0;:::o;140292:175::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;140373:7:::1;::::0;-1:-1:-1;;;;;140373:7:0::1;140384:10;140373:21;140365:53;;;::::0;;-1:-1:-1;;;140365:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;140365:53:0;;;;;;;;;;;;;::::1;;140429:19;:30:::0;;-1:-1:-1;;;;;;140429:30:0::1;-1:-1:-1::0;;;;;140429:30:0;;;::::1;::::0;;;::::1;::::0;;140292:175::o;110255:372::-;110359:7;110388:9;;:52;;;;-1:-1:-1;110402:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;110402:21:0;;;;;;;;;:38;;;110401:39;110388:52;110384:236;;;110464:4;;;;;;;;;-1:-1:-1;;;;;110464:4:0;-1:-1:-1;;;;;110464:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;110464:24:0;;-1:-1:-1;110457:31:0;;110384:236;110545:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;110545:21:0;;;;;;;;;:33;;;:63;;107392:7;110545:37;:63::i;134424:508::-;134544:33;134571:5;134544:26;:33::i;:::-;134588:21;134612:8;134621:4;134612:14;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134659:21:0;;;;:14;134612;;;;;134659;;;:21;;;;;;134681:10;134659:33;;;;;;;;;134612:14;;-1:-1:-1;134659:44:0;-1:-1:-1;134659:44:0;134637:126;;;;;-1:-1:-1;;;134637:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134810:21:0;;;;;;:14;;;:21;;;;;;;;134832:10;134810:33;;;;;;;;:60;;134862:7;134810:51;:60::i;:::-;-1:-1:-1;;;;;134774:21:0;;;;;;:14;;;:21;;;;;;;;134796:10;134774:33;;;;;;;;:96;;;;134881:43;;134891:4;;134897:7;;134789:5;;134881:9;:43::i;:::-;134424:508;;;;:::o;115300:743::-;115348:12;115343:693;115373:8;:15;115366:22;;115343:693;;;115512:12;115439:8;115448:4;115439:14;;;;;;;;;;;;;;;;;;:41;;;115483:5;115439:49;:85;115413:170;;;;;-1:-1:-1;;;115413:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;115651:8;115660:4;115651:14;;;;;;;;;;;;;;;;;;:51;;;115614:8;115623:4;115614:14;;;;;;;;;;;;;;;;;;:27;;:34;115642:5;;115614:34;;;;;;;;;;;:88;;;;115762:117;115845:8;115854:4;115845:14;;;;;;;;;;;;;;;;;;:33;;;115762:8;115771:4;115762:14;;;;;;;;;;;;;;;;;;:60;;;:82;;:117;;;;:::i;:::-;115717:8;115726:4;115717:14;;;;;;;;;;;;;;;;;;:42;;:162;;;;115930:1;115894:8;115903:4;115894:14;;;;;;;;;;;;;;;;;;:33;;:37;;;;115990:12;115946:8;115955:4;115946:14;;;;;;;;;;;;;;;;:41;:14;;;;;:41;:56;116019:5;116017:7;;;;;;;;;115390:6;115343:693;;139805:479;139853:19;;139849:37;;139879:7;;139849:37;139916:4;;:29;;;-1:-1:-1;;;139916:29:0;;139939:4;139916:29;;;;;;-1:-1:-1;;139916:4:0;;;-1:-1:-1;;;;;139916:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;139916:29:0;139960:19;;139916:29;;-1:-1:-1;139960:29:0;-1:-1:-1;139956:285:0;;;140006:4;;140020:7;;140006:31;;;-1:-1:-1;;;140006:31:0;;-1:-1:-1;;;;;140020:7:0;;;140006:31;;;;;;;;;;;;:4;;;;;;;;:13;;:31;;;;;;;;;;;;;;;-1:-1:-1;140006:4:0;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;140066:4:0;;:29;;;-1:-1:-1;;;140066:29:0;;140089:4;140066:29;;;;;;:4;;;;-1:-1:-1;;;;;140066:4:0;;:14;;:29;;;;;140006:31;;140066:29;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;140066:29:0;140052:11;:43;139956:285;;;140128:4;;140142:7;;140151:19;;140128:43;;;-1:-1:-1;;;140128:43:0;;-1:-1:-1;;;;;140142:7:0;;;140128:43;;;;;;;;;;;;:4;;;;;;;;:13;;:43;;;;;;;;;;;;;;;-1:-1:-1;140128:4:0;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;140200:4:0;;:29;;;-1:-1:-1;;;140200:29:0;;140223:4;140200:29;;;;;;:4;;;;-1:-1:-1;;;;;140200:4:0;;:14;;:29;;;;;140128:43;;140200:29;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;140200:29:0;140186:11;:43;139956:285;-1:-1:-1;140275:1:0;140253:19;:23;139805:479::o;134981:172::-;135048:38;135075:10;135048:26;:38::i;:::-;135097:48;135107:4;135113:7;135122:10;135134;135097:9;:48::i;:::-;134981:172;;:::o;113322:34::-;;;-1:-1:-1;;;;;113322:34:0;;:::o;116476:768::-;24050:12;;;;;;;;:31;;;24066:15;:13;:15::i;:::-;24050:47;;;-1:-1:-1;24086:11:0;;;;24085:12;24050:47;24042:106;;;;-1:-1:-1;;;24042:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24157:19;24180:12;;;;;;24179:13;24199:83;;;;24228:12;:19;;-1:-1:-1;;;;24228:19:0;;;;;24256:18;24243:4;24256:18;;;24199:83;116594:35:::1;:33;:35::i;:::-;116640:7;:13:::0;;-1:-1:-1;;116640:13:0::1;116650:3;116640:13;::::0;;116664:4:::1;:12:::0;;-1:-1:-1;;;;;116664:12:0;;::::1;116640:13;116664:12:::0;;::::1;-1:-1:-1::0;;;;;;116664:12:0;;::::1;::::0;;;::::1;::::0;;;;116697:21:::1;::::0;;-1:-1:-1;;;116697:21:0;;;;:4;;;::::1;;::::0;:19:::1;::::0;:21:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:4;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;116697:21:0;116687:7:::1;:31:::0;;-1:-1:-1;;;;;;116687:31:0;;::::1;-1:-1:-1::0;;;;;116687:31:0;;::::1;;::::0;;;116729:19:::1;:32:::0;;;::::1;::::0;;116793:12:::1;116772:18;:33:::0;116816:11:::1;:24:::0;;;;::::1;::::0;;::::1;;::::0;;116892:4:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;116892:23:0;;;;116875:41:::1;::::0;116687:31:::1;116892:4:::0;;::::1;::::0;;::::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;116697:21:::1;::::0;116892:23;;;;;;;;:4;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;116892:23:0;116875:16:::1;:41::i;:::-;116853:128;;;;-1:-1:-1::0;;;116853:128:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117034:57;117046:4;117060;;;;;;;;;-1:-1:-1::0;;;;;117060:4:0::1;-1:-1:-1::0;;;;;117060:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;117060:23:0;117086:4:::1;117034:3;:57::i;:::-;117139:4;;;;;;;;;-1:-1:-1::0;;;;;117139:4:0::1;-1:-1:-1::0;;;;;117139:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;117139:25:0;117102:15:::1;:63:::0;;-1:-1:-1;;;;;;117102:63:0::1;-1:-1:-1::0;;;;;117102:63:0;;::::1;;::::0;;117211:4:::1;::::0;:24:::1;::::0;;-1:-1:-1;;;117211:24:0;;;;117102:63:::1;117211:4:::0;;::::1;::::0;;::::1;::::0;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;117139:25:::1;::::0;117211:24;;;;;;;:4;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;117211:24:0;117176:14:::1;:60:::0;;-1:-1:-1;;;;;;117176:60:0::1;-1:-1:-1::0;;;;;117176:60:0;;::::1;::::0;;;::::1;::::0;;24300:57;;;;24344:5;24329:20;;-1:-1:-1;;24329:20:0;;;24300:57;116476:768;;;:::o;113737:33::-;;;;:::o;132145:1389::-;132275:39;132302:11;132275:26;:39::i;:::-;132360:21;132384:8;132393:4;132384:14;;;;;;;;;;;;;;;;132433;;;:8;:14;;;;;;-1:-1:-1;;;;;132433:27:0;;;;;;;;;132384:14;;;;;;;;-1:-1:-1;132473:17:0;:15;:17::i;:::-;132559:41;132582:4;132588:11;132559:22;:41::i;:::-;132679:25;132707:72;132764:4;132707:38;:13;107452:1;132707:17;:38::i;:72::-;132679:100;-1:-1:-1;132790:15:0;132808:36;:13;132679:100;132808:17;:36::i;:::-;132790:54;-1:-1:-1;132861:11:0;;132857:507;;132889:10;;:165;;-1:-1:-1;;;;;132889:10:0;132943;107534:1;133022:17;132889:27;:165::i;:::-;133069:10;;:138;;-1:-1:-1;;;;;133069:10:0;133123;133161:4;133185:7;133069:27;:138::i;:::-;133222:45;133240:4;133246:11;133259:7;133222:17;:45::i;:::-;133296:11;;;;:24;;133312:7;133296:15;:24::i;:::-;133282:11;;;:38;132857:507;133394:47;133436:4;133394:37;133410:4;:20;;;133394:4;:11;;;:15;;:37;;;;:::i;:47::-;133376:15;;;:65;133491:35;;;;;;;;133512:4;;-1:-1:-1;;;;;133491:35:0;;;;;;;;;;;;132145:1389;;;;;;;:::o;107194:50::-;107237:7;107194:50;:::o;138838:528::-;138897:21;138921:8;138930:4;138921:14;;;;;;;;;;;;;;;;;;;;;138968:26;;;;138921:14;;-1:-1:-1;138968:26:0;;138946:114;;;;-1:-1:-1;;;138946:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;139071:38;139098:10;139071:26;:38::i;:::-;139120:21;139144:14;;;:8;:14;;;;;;;;139159:10;139144:26;;;;;;;;139226:11;;;;139181:10;;139144:26;;139181:57;;-1:-1:-1;;;;;139181:10:0;;:23;:57::i;:::-;139290:11;;;;139254:48;;;;;;;139284:4;;139272:10;;139254:48;;;;;;;;;139327:1;139313:11;;;:15;;;139339;;;;:19;-1:-1:-1;;138838:528:0:o;115021:177::-;115123:7;115155:8;115164:4;115155:14;;;;;;;;;;;;;;;;:35;;;:27;:14;;;;;;;:27;:35;;;-1:-1:-1;115155:35:0;;;;;115021:177;-1:-1:-1;115021:177:0:o;114086:41::-;;;-1:-1:-1;;;;;114086:41:0;;:::o;112469:169::-;112571:7;112603:27;112618:4;112624:5;112603:14;:27::i;:::-;112596:34;112469:169;-1:-1:-1;;;112469:169:0:o;107406:47::-;107452:1;107406:47;:::o;112646:486::-;112758:7;112783:22;112808:30;112826:4;112832:5;112808:17;:30::i;:::-;112783:55;-1:-1:-1;112853:19:0;;;:55;;;112894:14;112876:15;:32;112853:55;112849:69;;;112917:1;112910:8;;;;;112849:69;112929:19;112951:35;:15;112971:14;112951:19;:35::i;:::-;112929:57;-1:-1:-1;112997:19:0;113019:33;112929:57;107237:7;113019:15;:33::i;:::-;112997:55;-1:-1:-1;113077:18:0;112997:55;113093:1;113077:15;:18::i;:::-;113063:32;112646:486;-1:-1:-1;;;;;;112646:486:0:o;127356:343::-;127401:34;;;;;;;;;;;;;;-1:-1:-1;;;127401:34:0;;;:11;:34::i;:::-;127463:8;:15;127446:14;;127518:114;127546:6;127540:3;:12;127518:114;;;127589:31;127604:15;127615:3;127604:10;:15::i;:::-;127589:10;;:14;:31::i;:::-;127576:44;-1:-1:-1;127554:5:0;;127518:114;;;-1:-1:-1;127661:14:0;;:30;;127680:10;127661:18;:30::i;:::-;127644:14;:47;-1:-1:-1;;127356:343:0:o;123474:364::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;123606:11:::1;123602:61;;;123634:17;:15;:17::i;:::-;123693:87;123758:11;123693:46;123713:8;123722:4;123713:14;;;;;;;;;;;;;;;;;;:25;;;123693:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;123675:15;:105;;;;123819:11;123791:8;123800:4;123791:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;123474:364:::0;;;:::o;117616:120::-;117672:7;117707:8;117716:4;117707:14;;;;;;;;;;;;;;;;;;;;;:20;-1:-1:-1;;;;;117707:20:0;;117616:120;-1:-1:-1;;117616:120:0:o;28447:148::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;28538:6:::1;::::0;28517:40:::1;::::0;28554:1:::1;::::0;-1:-1:-1;;;;;28538:6:0::1;::::0;28517:40:::1;::::0;28554:1;;28517:40:::1;28568:6;:19:::0;;-1:-1:-1;;;;;;28568:19:0::1;::::0;;28447:148::o;110031:29::-;;;;;;-1:-1:-1;;;;;110031:29:0;;:::o;124005:298::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;124142:31:::1;124159:13;124142:16;:31::i;:::-;124120:121;;;;-1:-1:-1::0;;;124120:121:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124282:13;124252:8;124261:4;124252:14;;;;;;;;;;;;;;;;;;:27;;:43;;;;124005:298:::0;;:::o;124311:179::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;124469:13:::1;124430:8;124439:4;124430:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:36;;:52:::0;;-1:-1:-1;;124430:52:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;124311:179:0:o;124658:889::-;124721:7;124741:21;124765:8;124774:4;124765:14;;;;;;;;;;;;;;;;;;;;;;;124814:10;;:35;;;-1:-1:-1;;;124814:35:0;;124843:4;124814:35;;;;;;124765:14;;-1:-1:-1;;;;;;124814:10:0;;;;:20;;:35;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124814:35:0;;-1:-1:-1;124864:9:0;;:30;;;;-1:-1:-1;124878:16:0;;;;124877:17;124864:30;124860:176;;;124911:19;124933:4;;;;;;;;;-1:-1:-1;;;;;124933:4:0;-1:-1:-1;;;;;124933:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124933:34:0;;-1:-1:-1;124996:28:0;:11;124933:34;124996:15;:28::i;:::-;124982:42;;124860:176;;125052:16;125048:30;;125077:1;125070:8;;;;;;125048:30;125091:23;125117:242;125343:15;;125117:138;125239:4;:15;;;125117:14;;:121;;:138;;;;:::i;:242::-;125468:7;;125091:268;;-1:-1:-1;125424:21:0;;125448:39;;125481:5;;125448:28;;125091:268;;125468:7;;125448:19;:28::i;:39::-;125424:63;-1:-1:-1;125505:34:0;:15;125424:63;125505:19;:34::i;114134:39::-;;;-1:-1:-1;;;;;114134:39:0;;:::o;27805:79::-;27870:6;;-1:-1:-1;;;;;27870:6:0;27805:79;:::o;113586:20::-;;;;:::o;141087:160::-;140979:12;:10;:12::i;:::-;140964:11;;-1:-1:-1;;;;;140964:11:0;;;:27;;;140942:117;;;;-1:-1:-1;;;140942:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141180:11:::1;::::0;141159:45:::1;::::0;141201:1:::1;::::0;-1:-1:-1;;;;;141180:11:0::1;::::0;141159:45:::1;::::0;141201:1;;141159:45:::1;141215:11;:24:::0;;-1:-1:-1;;;;;;141215:24:0::1;::::0;;141087:160::o;109906:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;114678:335::-;114776:23;114835:170;114945:59;114962:8;114971:4;114962:14;;;;;;;;;;;;;;;;;;:41;;;114945:12;:16;;:59;;;;:::i;:::-;114835:91;114901:24;114920:4;114901:18;:24::i;:::-;114835:8;114844:4;114835:14;;;;;;;;;;;;;;;;;;:47;;;:65;;:91;;;;:::i;113676:54::-;113728:2;113676:54;:::o;117744:198::-;117808:4;;117844:29;:7;107237;117844:11;:29::i;:::-;117825:48;-1:-1:-1;117903:30:0;117825:48;107237:7;117903:12;:30::i;:::-;117892:41;;;;117744:198;-1:-1:-1;;117744:198:0:o;127097:176::-;127199:7;127231:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;127231:21:0;;;;;;;;;;;:34;;;;127097:176::o;125611:1478::-;125709:7;125734:21;125758:8;125767:4;125758:14;;;;;;;;;;;;;;;;125807;;;:8;:14;;;;;;-1:-1:-1;;;;;125807:21:0;;;;;;;;;;;125758:14;;;;;;;;125865:20;;;;125913:11;;;;125959:10;;:35;;-1:-1:-1;;;125959:35:0;;125988:4;125959:35;;;;;;125758:14;;-1:-1:-1;125807:21:0;;125865:20;;125913:11;;125758:14;;125959:10;;:20;;:35;;;;;125758:14;125959:35;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;125959:35:0;;-1:-1:-1;126009:9:0;;:30;;;;-1:-1:-1;126023:16:0;;;;126022:17;126009:30;126005:176;;;126056:19;126078:4;;;;;;;;;-1:-1:-1;;;;;126078:4:0;-1:-1:-1;;;;;126078:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;126078:34:0;;-1:-1:-1;126141:28:0;:11;126078:34;126141:15;:28::i;:::-;126127:42;;126005:176;;126197:16;126193:30;;126222:1;126215:8;;;;;;;;;126193:30;126240:9;;:35;;;;-1:-1:-1;126254:21:0;;;;126253:22;126240:35;126236:154;;;126292:17;126312:21;126327:5;126312:14;:21::i;:::-;126292:41;-1:-1:-1;126357:21:0;:6;126292:41;126357:10;:21::i;:::-;126348:30;;126236:154;;126402:23;126428:242;126654:15;;126428:138;126550:4;:15;;;126428:14;;:121;;:138;;;;:::i;:242::-;126779:7;;126402:268;;-1:-1:-1;126735:21:0;;126759:39;;126792:5;;126759:28;;126402:268;;126779:7;;126759:19;:28::i;:39::-;126735:63;-1:-1:-1;126809:30:0;126842:34;:15;126735:63;126842:19;:34::i;:::-;126809:67;-1:-1:-1;126887:11:0;126901:49;126938:11;126901:32;126809:67;126928:4;126901:26;:32::i;:49::-;126887:63;-1:-1:-1;126979:24:0;:15;126887:63;126979:19;:24::i;:::-;127065:15;;;;126961:42;;-1:-1:-1;127023:58:0;;:37;127055:4;127023:27;:6;126961:42;127023:10;:27::i;:37::-;:41;;:58::i;:::-;127016:65;125611:1478;-1:-1:-1;;;;;;;;;;;;125611:1478:0:o;107124:51::-;107173:2;107124:51;:::o;141255:292::-;140979:12;:10;:12::i;:::-;140964:11;;-1:-1:-1;;;;;140964:11:0;;;:27;;;140942:117;;;;-1:-1:-1;;;140942:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;141359:22:0;::::1;141337:110;;;;-1:-1:-1::0;;;141337:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141484:11;::::0;141463:43:::1;::::0;-1:-1:-1;;;;;141463:43:0;;::::1;::::0;141484:11:::1;::::0;141463:43:::1;::::0;141484:11:::1;::::0;141463:43:::1;141517:11;:22:::0;;-1:-1:-1;;;;;;141517:22:0::1;-1:-1:-1::0;;;;;141517:22:0;;;::::1;::::0;;;::::1;::::0;;141255:292::o;120262:174::-;120363:7;120395:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;120395:21:0;;;;;;;;;;;:33;;;;120262:174::o;129690:79::-;129744:17;129753:4;129759:1;129744:8;:17::i;107276:52::-;107326:2;107276:52;:::o;110635:314::-;110736:7;110765:9;;:52;;;;-1:-1:-1;110779:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;110779:21:0;;;;;;;;;:38;;;110778:39;110765:52;110761:181;;;110841:21;110856:5;110841:14;:21::i;110761:181::-;-1:-1:-1;110902:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;110902:21:0;;;;;;;;;:28;;;110895:35;;121282:518;121399:18;121419:21;121458:32;121493;121513:4;121519:5;121493:19;:32::i;:::-;121458:67;;121536:15;121554:46;121588:4;121594:5;121554:33;:46::i;:::-;121536:64;-1:-1:-1;121627:47:0;121669:4;121627:37;:24;121536:64;121627:28;:37::i;:47::-;121611:63;-1:-1:-1;121698:94:0;121787:4;121698:70;121741:26;121787:4;121759:7;121741:17;:26::i;:::-;121698:24;;:42;:70::i;:94::-;121685:107;;121282:518;;;;;;;:::o;138112:522::-;140979:12;:10;:12::i;:::-;140964:11;;-1:-1:-1;;;;;140964:11:0;;;:27;;;140942:117;;;;-1:-1:-1;;;140942:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138325:27:::1;138336:15;138325:10;:27::i;:::-;138303:114;;;;-1:-1:-1::0;;;138303:114:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138465:18;::::0;:30:::1;::::0;138488:6:::1;138465:22;:30::i;:::-;138450:12;:45;138428:133;;;;-1:-1:-1::0;;;138428:133:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138579:12;-1:-1:-1::0;;;;;138572:28:0::1;;138601:15;138618:7;138572:54;;;;;;;;;;;;;-1:-1:-1::0;;;;;138572:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;138112:522:0:o;114242:386::-;114345:23;114404:216;114576:43;114593:8;114602:4;114593:14;;;;;;;;;;;;;;;;;;:25;;;114576:12;:16;;:43;;;;:::i;:::-;114404:153;114532:24;114551:4;114532:18;:24::i;:::-;114404:109;114479:8;114488:4;114479:14;;;;;;;;;;;;;;;;;;:33;;;114404:8;114413:4;114404:14;;;;;;;107469:67;107534:1;107469:67;:::o;114007:34::-;;;;:::o;133907:375::-;133997:35;134015:4;134021:10;133997:17;:35::i;:::-;133979:15;:53;133957:139;;;;-1:-1:-1;;;133957:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;134110:27;134143:85;134188:4;134207:10;134143:30;:85::i;:::-;134109:119;;;134239:35;134248:4;134254:19;134239:8;:35::i;113293:22::-;;;-1:-1:-1;;;;;113293:22:0;;:::o;133609:290::-;133741:21;133765:8;133774:4;133765:14;;;;;;;;;;;;;;;;133805:10;133790:26;;;133765:14;;;;;;133790;;;:26;;;;;;-1:-1:-1;;;;;133790:35:0;;;;;;;;;;;;:43;;;133849:42;;;;;;;;;;;;;133765:14;;-1:-1:-1;133849:42:0;;;;;;;;133609:290;;;;:::o;141555:1864::-;141657:16;141688:18;141721:23;141759:19;141793:24;141832:16;141863:21;141912:14;141929:8;141938:4;141929:14;;;;;;;;;;;;;;;;;;;;;;;:20;141994:4;;142105:13;;;-1:-1:-1;;;142105:13:0;;;;-1:-1:-1;;;;;141929:20:0;;;;-1:-1:-1;141929:20:0;141994:4;;;;;;;141929:20;;:14;;141994:4;;141929:20;;142105:11;;:13;;;;;;;;;;;141929:20;142105:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142105:13:0;-1:-1:-1;;;;;142105:30:0;;142104:90;;142181:4;-1:-1:-1;;;;;142181:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142181:13:0;142104:90;;;142152:4;-1:-1:-1;;;;;142152:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142152:13:0;142104:90;142076:118;;142205:17;142232;142205:45;;142274:7;-1:-1:-1;;;;;142274:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142274:21:0;;-1:-1:-1;142310:12:0;;142306:1106;;142339:21;142363:9;-1:-1:-1;;;;;142363:19:0;;142391:7;142363:37;;;;;;;;;;;;;-1:-1:-1;;;;;142363:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142363:37:0;142440:38;;;-1:-1:-1;;;142440:38:0;;-1:-1:-1;;;;;142440:38:0;;;;;;;;;142363:37;;-1:-1:-1;142415:22:0;;142440:20;;;;;;:38;;;;;142363:37;;142440:38;;;;;;;;:20;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142440:38:0;142506:32;;;-1:-1:-1;;;142506:32:0;;142532:4;142506:32;;;;;;142440:38;;-1:-1:-1;;;;;;142506:17:0;;;;;:32;;;;;142440:38;;142506:32;;;;;;;;:17;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142506:32:0;;-1:-1:-1;142557:13:0;;:26;;;;-1:-1:-1;142574:9:0;;142557:26;:47;;;;-1:-1:-1;142588:16:0;;;;142587:17;142557:47;142553:546;;;142636:4;;;;;;;;;-1:-1:-1;;;;;142636:4:0;-1:-1:-1;;;;;142636:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142636:34:0;142705:4;;:29;;;-1:-1:-1;;;142705:29:0;;;;142636:34;;-1:-1:-1;142705:4:0;;;;-1:-1:-1;;;;;142705:4:0;;:27;;:29;;;;;142636:34;;142705:29;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142705:29:0;;-1:-1:-1;142553:546:0;;;142791:8;;-1:-1:-1;142822:9:0;142818:266;;142872:192;142916:125;142980:4;;;;;;;;;-1:-1:-1;;;;;142980:4:0;-1:-1:-1;;;;;142980:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142980:34:0;142916:4;;:29;;;-1:-1:-1;;;142916:29:0;;;;:4;;;;-1:-1:-1;;;;;142916:4:0;;:27;;:29;;;;;142980:34;;142916:29;;;;;;;;:4;:29;;;;;;;;;;:125;142872:13;;:17;:192::i;:::-;142856:208;;142818:266;143126:41;143158:8;143126:27;:8;143139:13;143126:12;:27::i;:41::-;143113:54;-1:-1:-1;143200:46:0;143237:8;143200:32;:13;143218;143200:17;:32::i;:46::-;143182:64;-1:-1:-1;143277:42:0;143310:8;143277:28;:8;143290:14;143277:12;:28::i;:42::-;143263:56;-1:-1:-1;143353:47:0;143391:8;143353:33;:13;143371:14;143353:17;:33::i;:47::-;143334:66;;142306:1106;;;141555:1864;;;;;;;;;;;;;;:::o;124498:152::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;124582:4:::1;124570:8;:16;;;;124562:51;;;::::0;;-1:-1:-1;;;124562:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;124562:51:0;;;;;;;;;;;;;::::1;;124624:7;:18:::0;;-1:-1:-1;;124624:18:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;124498:152::o;129835:1225::-;129907:38;129934:10;129907:26;:38::i;:::-;129956:21;129980:8;129989:4;129980:14;;;;;;;;;;;;;;;;130029;;;:8;:14;;;;;;130044:10;130029:26;;;;;;;129980:14;;;;;;;;-1:-1:-1;130068:17:0;:15;:17::i;:::-;130154:40;130177:4;130183:10;130154:22;:40::i;:::-;130207:25;130235:72;130292:4;130235:38;:13;107452:1;130235:17;:38::i;:72::-;130207:100;-1:-1:-1;130318:15:0;130336:36;:13;130207:100;130336:17;:36::i;:::-;130318:54;-1:-1:-1;130455:11:0;;130451:474;;130483:10;;:165;;-1:-1:-1;;;;;130483:10:0;130537;107534:1;130616:17;130483:27;:165::i;:::-;130663:10;;:138;;-1:-1:-1;;;;;130663:10:0;130717;130755:4;130779:7;130663:27;:138::i;:::-;130816:44;130834:4;130840:10;130852:7;130816:17;:44::i;:::-;130889:11;;;;:24;;130905:7;130889:15;:24::i;:::-;130875:11;;;:38;130451:474;130955:47;130997:4;130955:37;130971:4;:20;;;130955:4;:11;;;:15;;:37;;;;:::i;:47::-;130937:15;;;:65;131018:34;;;;;;;;131038:4;;131026:10;;131018:34;;;;;;;;;129835:1225;;;;;;:::o;117252:253::-;117314:4;117331:24;117373:5;117331:48;;117440:4;;;;;;;;;-1:-1:-1;;;;;117440:4:0;-1:-1:-1;;;;;117410:35:0;:9;-1:-1:-1;;;;;117410:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;117410:18:0;-1:-1:-1;;;;;117410:35:0;;;:87;;;117492:4;;;;;;;;;-1:-1:-1;;;;;117492:4:0;-1:-1:-1;;;;;117462:35:0;:9;-1:-1:-1;;;;;117462:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;117462:18:0;-1:-1:-1;;;;;117462:35:0;;117390:107;117252:253;-1:-1:-1;;;117252:253:0:o;113548:29::-;;;;:::o;28750:244::-;28027:12;:10;:12::i;:::-;28017:6;;-1:-1:-1;;;;;28017:6:0;;;:22;;;28009:67;;;;;-1:-1:-1;;;28009:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28009:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28839:22:0;::::1;28831:73;;;;-1:-1:-1::0;;;28831:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28941:6;::::0;28920:38:::1;::::0;-1:-1:-1;;;;;28920:38:0;;::::1;::::0;28941:6:::1;::::0;28920:38:::1;::::0;28941:6:::1;::::0;28920:38:::1;28969:6;:17:::0;;-1:-1:-1;;;;;;28969:17:0::1;-1:-1:-1::0;;;;;28969:17:0;;;::::1;::::0;;;::::1;::::0;;28750:244::o;127803:340::-;127853:18;127874:46;127908:11;;127874:4;;;;;;;;;-1:-1:-1;;;;;127874:4:0;-1:-1:-1;;;;;127874:14:0;;127897:4;127874:29;;;;;;;;;;;;;-1:-1:-1;;;;;127874:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;:46;127853:67;-1:-1:-1;127937:14:0;;127933:203;;127982:4;;:29;;;-1:-1:-1;;;127982:29:0;;128005:4;127982:29;;;;;;:4;;;;-1:-1:-1;;;;;127982:4:0;;:14;;:29;;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;127982:29:0;127968:11;:43;128094:14;;:30;;128113:10;128094:18;:30::i;:::-;128077:14;:47;127803:340;:::o;11849:205::-;11977:68;;;-1:-1:-1;;;;;11977:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11977:68:0;-1:-1:-1;;;11977:68:0;;;11950:96;;11970:5;;11950:19;:96::i;6035:132::-;6093:7;6120:39;6124:1;6127;6120:39;;;;;;;;;;;;;;;;;:3;:39::i;4222:136::-;4280:7;4307:43;4311:1;4314;4307:43;;;;;;;;;;;;;;;;;:3;:43::i;5096:471::-;5154:7;5399:6;5395:47;;-1:-1:-1;5429:1:0;5422:8;;5395:47;5466:5;;;5470:1;5466;:5;:1;5490:5;;;;;:10;5482:56;;;;-1:-1:-1;;;5482:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26081:106;26169:10;26081:106;:::o;3766:181::-;3824:7;3856:5;;;3880:6;;;;3872:46;;;;;-1:-1:-1;;;3872:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;135197:1574;135336:21;135360:8;135369:4;135360:14;;;;;;;;;;;;;;;;135490;;;:8;:14;;;;;;-1:-1:-1;;;;;135490:20:0;;;;;;;;;;135360:14;;;;;;-1:-1:-1;135490:20:0;135360:14;135613:42;135499:4;135505;135613:30;:42::i;:::-;135521:134;;;;135697:7;135674:19;:30;;135666:61;;;;;-1:-1:-1;;;135666:61:0;;;;;;;;;;;;-1:-1:-1;;;135666:61:0;;;;;;;;;;;;;;;135740:17;:15;:17::i;:::-;135768:34;135791:4;135797;135768:22;:34::i;:::-;135894:11;;135890:753;;135949:7;135922:24;135996:92;136054:19;135996:35;135949:7;136017:13;135996:20;:35::i;:92::-;135971:117;-1:-1:-1;136117:53:0;136133:36;:16;135971:117;136133:20;:36::i;:::-;136117:11;;;;;:15;:53::i;:::-;136103:11;;;:67;136187:10;;:54;;-1:-1:-1;;;;;136187:10:0;136219:2;136224:16;136187:23;:54::i;:::-;136262:18;;136258:374;;136432:10;;136359:24;;136386:113;;-1:-1:-1;;;;;136432:10:0;136466:14;136386:15;:113::i;:::-;136543:10;;136359:140;;-1:-1:-1;136518:55:0;;-1:-1:-1;;;;;136543:10:0;136359:140;136518:16;:55::i;:::-;136594:22;:20;:22::i;:::-;136258:374;;135890:753;;;136671:47;136713:4;136671:37;136687:4;:20;;;136671:4;:11;;;:15;;:37;;;;:::i;:47::-;136653:15;;;:65;136736:27;;;;;;;;136749:4;;-1:-1:-1;;;;;136736:27:0;;;;;;;;;;;;135197:1574;;;;;;;;:::o;24451:508::-;24868:4;24914:17;24946:7;24451:508;:::o;27383:129::-;24050:12;;;;;;;;:31;;;24066:15;:13;:15::i;:::-;24050:47;;;-1:-1:-1;24086:11:0;;;;24085:12;24050:47;24042:106;;;;-1:-1:-1;;;24042:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24157:19;24180:12;;;;;;24179:13;24199:83;;;;24228:12;:19;;-1:-1:-1;;;;24228:19:0;;;;;24256:18;24243:4;24256:18;;;24199:83;27441:26:::1;:24;:26::i;:::-;27478;:24;:26::i;:::-;24304:14:::0;24300:57;;;24344:5;24329:20;;-1:-1:-1;;24329:20:0;;;27383:129;:::o;136779:955::-;136859:21;136883:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;136883:20:0;;;;;;;;;136918:16;;;;136914:114;;136975:41;:15;113662:7;136975:19;:41::i;:::-;136956:16;;;:60;136914:114;137060:4;:16;;;137042:15;:34;137038:313;;;137160:17;;;;;137137:20;137192:21;;;137228:36;137245:4;137160:17;137228:16;:36::i;:::-;137298:41;:15;113662:7;137298:19;:41::i;:::-;137279:16;;;:60;-1:-1:-1;137038:313:0;137363:15;137381:23;137393:4;137399;137381:11;:23::i;:::-;137363:41;-1:-1:-1;137415:12:0;137430:47;137473:3;137430:38;137363:41;113728:2;137430:11;:38::i;:47::-;137415:62;-1:-1:-1;137488:21:0;137512:17;:7;137415:62;137512:11;:17::i;:::-;137488:41;-1:-1:-1;137544:17:0;;137540:106;;137598:17;;;;:36;;137620:13;137598:21;:36::i;:::-;137578:17;;;:56;137540:106;137662:8;;137658:69;;137687:28;137704:4;137710;137687:16;:28::i;:::-;136779:955;;;;;;:::o;131068:878::-;131202:21;131226:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;131226:21:0;;;;;;;;;131262:11;;;;131258:681;;131314:15;131295:16;;;:34;131344:20;;;:37;;;131258:681;;;131414:20;131437:8;131446:4;131437:14;;;;;;;;;;;;;;;;;;:27;;;131414:50;;131479:20;131502:32;131522:4;131528:5;131502:19;:32::i;:::-;131479:55;;131549:26;131578:31;131594:14;131578:4;:11;;;:15;;:31;;;;:::i;:::-;131549:60;-1:-1:-1;131624:16:0;131643:86;131549:60;131643:30;:12;131660;131643:16;:30::i;:86::-;131624:105;-1:-1:-1;131763:36:0;131783:15;131624:105;131796:1;131783:12;:15::i;:::-;131763;;:19;:36::i;:::-;131744:16;;;:55;-1:-1:-1;131886:20:0;;;:41;-1:-1:-1;;131068:878:0;;;;:::o;11664:177::-;11774:58;;;-1:-1:-1;;;;;11774:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11774:58:0;-1:-1:-1;;;11774:58:0;;;11747:86;;11767:5;;11747:19;:86::i;48463:114::-;48513:59;48568:2;48529:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48529:42:0;;;-1:-1:-1;;48529:42:0;;;;;;;;;;;;;;-1:-1:-1;;;;;48529:42:0;-1:-1:-1;;;48529:42:0;;;;-1:-1:-1;48513:15:0;;-1:-1:-1;;48513:59:0:i;128219:1463::-;128289:23;128330:21;128354:8;128363:4;128354:14;;;;;;;;;;;;;;;;;;;;;;;128403:10;;:35;;;-1:-1:-1;;;128403:35:0;;128432:4;128403:35;;;;;;128354:14;;-1:-1:-1;;;;;;128403:10:0;;;;:20;;:35;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;128403:35:0;;-1:-1:-1;128453:9:0;;:30;;;;-1:-1:-1;128467:16:0;;;;128466:17;128453:30;128449:176;;;128500:19;128522:4;;;;;;;;;-1:-1:-1;;;;;128522:4:0;-1:-1:-1;;;;;128522:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;128522:34:0;;-1:-1:-1;128585:28:0;:11;128522:34;128585:15;:28::i;:::-;128571:42;;128449:176;;128639:16;128635:101;;128723:1;128716:8;;;;;;128635:101;128764:242;128990:15;;128764:138;128886:4;:15;;;128764:14;;:121;;:138;;;;:::i;:242::-;129117:7;;128746:260;;-1:-1:-1;129073:21:0;;129097:39;;129130:5;;129097:28;;128746:260;;129117:7;;129097:19;:28::i;:39::-;129073:63;-1:-1:-1;129147:30:0;129180:34;:15;129073:63;129180:19;:34::i;:::-;129147:67;-1:-1:-1;129227:11:0;129241:49;129278:11;129241:32;129147:67;129268:4;129241:26;:32::i;:49::-;129227:63;-1:-1:-1;129326:30:0;129351:4;129326:20;:11;129227:63;129326:15;:20::i;:30::-;129301:55;-1:-1:-1;129383:43:0;:15;129301:55;129383:19;:43::i;:::-;129459:19;;129367:59;;-1:-1:-1;129459:38:0;;129367:59;129459:23;:38::i;:::-;129437:19;:60;129533:20;;;;:29;;129558:3;129533:24;:29::i;:::-;129510:20;;;:52;129599:23;;;;:75;;129641:22;129599:27;:75::i;:::-;129573:4;:23;;:101;;;;128219:1463;;;;;;;;:::o;13708:1115::-;14313:27;14321:5;-1:-1:-1;;;;;14313:25:0;;:27::i;:::-;14305:71;;;;;-1:-1:-1;;;14305:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14450:12;14464:23;14499:5;-1:-1:-1;;;;;14491:19:0;14511:4;14491:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14491:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14449:67;;;;14535:7;14527:52;;;;;-1:-1:-1;;;14527:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14596:17;;:21;14592:224;;14738:10;14727:30;;;;;;;;;;;;;;;-1:-1:-1;14727:30:0;14719:85;;;;-1:-1:-1;;;14719:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6655:345;6741:7;6843:12;6836:5;6828:28;;;;-1:-1:-1;;;6828:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:9;6883:1;6879;:5;;;;;;;6655:345;-1:-1:-1;;;;;6655:345:0:o;4653:192::-;4739:7;4775:12;4767:6;;;;4759:29;;;;-1:-1:-1;;;4759:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4811:5:0;;;4653:192::o;121808:677::-;122015:15;;121988:55;;;-1:-1:-1;;;121988:55:0;;-1:-1:-1;;;;;122015:15:0;;;121988:55;;;;;;;;;;;;121903:7;;121971:5;;121988:18;;;;;;:55;;;;;;;;;;;;;;;121903:7;121988:18;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;122091:15:0;;122137:19;;;-1:-1:-1;;;122137:19:0;;;;122055:15;;;;-1:-1:-1;;;;;122091:15:0;;;;:31;;122137:17;;;;;:19;;;;;121988:55;;122137:19;;;;;;;:17;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122137:19:0;122171;;;-1:-1:-1;;;122171:19:0;;;;-1:-1:-1;;;;;122171:17:0;;;;;:19;;;;;122137;;122171;;;;;;;:17;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122171:19:0;122091:232;;;-1:-1:-1;;;;;;122091:232:0;;;;;;;-1:-1:-1;;;;;122091:232:0;;;;;;;;;;;;;;;;;;;;;122229:1;122091:232;;;;;;;;;;;;122269:4;122091:232;;;;122307:5;122289:15;:23;122091:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122091:232:0;;;;;;;122392:4;;122091:232;122361:19;;-1:-1:-1;;;122361:19:0;;;;122091:232;;-1:-1:-1;122091:232:0;;-1:-1:-1;122334:24:0;;-1:-1:-1;;;;;122392:4:0;;;;;;;122361:17;;;;;;:19;;;;;122091:232;122361:19;;;;;:17;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122361:19:0;-1:-1:-1;;;;;122361:36:0;;:82;;122436:7;122361:82;;;122413:7;122361:82;122334:109;121808:677;-1:-1:-1;;;;;;;121808:677:0:o;122493:782::-;122626:25;122669:5;122626:49;;122686:25;122745:4;;;;;;;;;-1:-1:-1;;;;;122745:4:0;-1:-1:-1;;;;;122714:36:0;:10;-1:-1:-1;;;;;122714:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122714:19:0;-1:-1:-1;;;;;122714:36:0;;:106;;122801:10;-1:-1:-1;;;;;122801:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122801:19:0;122714:106;;;122766:10;-1:-1:-1;;;;;122766:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122766:19:0;122714:106;122856:16;;;122870:1;122856:16;;;122831:22;122856:16;;;;;122686:134;;-1:-1:-1;122856:16:0;;;;;;;;;;;;-1:-1:-1;122856:16:0;122831:41;;122894:17;122883:5;122889:1;122883:8;;;;;;;;-1:-1:-1;;;;;122883:28:0;;;:8;;;;;;;;;:28;122941:4;;122922:8;;122941:4;;;;;;;;122922:5;;122941:4;;122922:8;;;;;;-1:-1:-1;;;;;122922:24:0;;;:8;;;;;;;;;;:24;;;;123042:15;;123015:58;;;-1:-1:-1;;;123015:58:0;;123042:15;;;123015:58;;;;;;;;;;;122986:17;;123015:18;;;;;:58;;;;;;;;;;;122959:17;123015:18;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;123084:15:0;;-1:-1:-1;;;;;123084:15:0;:40;123139:12;123084:15;123182:5;123210:4;123230:26;:15;123250:5;123230:19;:26::i;:::-;123084:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;123084:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;123084:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;123084:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122493:782;;;;;;:::o;26002:69::-;24050:12;;;;;;;;:31;;;24066:15;:13;:15::i;:::-;24050:47;;;-1:-1:-1;24086:11:0;;;;24085:12;24050:47;24042:106;;;;-1:-1:-1;;;24042:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24157:19;24180:12;;;;;;24179:13;24199:83;;;;24228:12;:19;;-1:-1:-1;;;;24228:19:0;;;;;24256:18;24243:4;24256:18;;;24304:14;24300:57;;;24344:5;24329:20;;-1:-1:-1;;24329:20:0;;;26002:69;:::o;27520:202::-;24050:12;;;;;;;;:31;;;24066:15;:13;:15::i;:::-;24050:47;;;-1:-1:-1;24086:11:0;;;;24085:12;24050:47;24042:106;;;;-1:-1:-1;;;24042:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24157:19;24180:12;;;;;;24179:13;24199:83;;;;24228:12;:19;;-1:-1:-1;;;;24228:19:0;;;;;24256:18;24243:4;24256:18;;;24199:83;27592:17:::1;27612:12;:10;:12::i;:::-;27635:6;:18:::0;;-1:-1:-1;;;;;;27635:18:0::1;-1:-1:-1::0;;;;;27635:18:0;::::1;::::0;;::::1;::::0;;;27669:43:::1;::::0;27635:18;;-1:-1:-1;27635:18:0;-1:-1:-1;;27669:43:0::1;::::0;-1:-1:-1;;27669:43:0::1;24290:1;24304:14:::0;24300:57;;;24344:5;24329:20;;-1:-1:-1;;24329:20:0;;;27520:202;:::o;139374:423::-;139468:4;;:29;;;-1:-1:-1;;;139468:29:0;;139491:4;139468:29;;;;;;-1:-1:-1;;139468:4:0;;;-1:-1:-1;;;;;139468:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;139468:29:0;;-1:-1:-1;139514:17:0;;;139510:253;;;139548:4;;:27;;;-1:-1:-1;;;139548:27:0;;-1:-1:-1;;;;;139548:27:0;;;;;;;;;;;;;;;:4;;;;;;;;:13;;:27;;;;;;;;;;;;;;;-1:-1:-1;139548:4:0;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;139604:4:0;;:29;;;-1:-1:-1;;;139604:29:0;;139627:4;139604:29;;;;;;:4;;;;-1:-1:-1;;;;;139604:4:0;;:14;;:29;;;;;139548:27;;139604:29;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;139604:29:0;139590:11;:43;139510:253;;;139666:4;;:27;;;-1:-1:-1;;;139666:27:0;;-1:-1:-1;;;;;139666:27:0;;;;;;;;;;;;;;;:4;;;;;;;;:13;;:27;;;;;;;;;;;;;;;-1:-1:-1;139666:4:0;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;139722:4:0;;:29;;;-1:-1:-1;;;139722:29:0;;139745:4;139722:29;;;;;;:4;;;;-1:-1:-1;;;;;139722:4:0;;:14;;:29;;;;;139666:27;;139722:29;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;139722:29:0;139708:11;:43;139510:253;139773:16;:14;:16::i;43304:295::-;43393:14;;43255:42;43505:2;43492:16;;43369:21;;43393:14;43492:16;43255:42;43533:5;43522:68;43513:77;;43466:129;;;:::o;9026:619::-;9086:4;9554:20;;9397:66;9594:23;;;;;;:42;;-1:-1:-1;9621:15:0;;;9594:42;9586:51;9026:619;-1:-1:-1;;;;9026:619:0:o
Swarm Source
ipfs://92ba07ccec48088bdcccbcb65f01ab8cd8880c4e37dd0015289f733f921225d7
Loading...
Loading
Loading...
Loading
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.