More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 4,488 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 20874988 | 186 days ago | IN | 0 ETH | 0.00031908 | ||||
Emergency Withdr... | 20874967 | 186 days ago | IN | 0 ETH | 0.00030405 | ||||
Emergency Withdr... | 20742803 | 204 days ago | IN | 0 ETH | 0.00082645 | ||||
Emergency Withdr... | 20735198 | 205 days ago | IN | 0 ETH | 0.00067361 | ||||
Emergency Withdr... | 20678262 | 213 days ago | IN | 0 ETH | 0.00129798 | ||||
Emergency Withdr... | 20673249 | 214 days ago | IN | 0 ETH | 0.000123 | ||||
Emergency Withdr... | 20664380 | 215 days ago | IN | 0 ETH | 0.00147223 | ||||
Emergency Withdr... | 20245696 | 274 days ago | IN | 0 ETH | 0.00036901 | ||||
Emergency Withdr... | 19835484 | 331 days ago | IN | 0 ETH | 0.00048107 | ||||
Emergency Withdr... | 19784574 | 338 days ago | IN | 0 ETH | 0.00099412 | ||||
Emergency Withdr... | 19783130 | 338 days ago | IN | 0 ETH | 0.00222651 | ||||
Emergency Withdr... | 19783106 | 338 days ago | IN | 0 ETH | 0.00239982 | ||||
Emergency Withdr... | 19646950 | 357 days ago | IN | 0 ETH | 0.00126409 | ||||
Transfer | 19636184 | 359 days ago | IN | 0.003 ETH | 0.00028471 | ||||
Transfer | 19636181 | 359 days ago | IN | 0.004 ETH | 0.00027321 | ||||
Emergency Withdr... | 19634685 | 359 days ago | IN | 0 ETH | 0.00187723 | ||||
Emergency Withdr... | 19599088 | 364 days ago | IN | 0 ETH | 0.00157893 | ||||
Emergency Withdr... | 19472309 | 382 days ago | IN | 0 ETH | 0.0040653 | ||||
Withdraw | 19455030 | 384 days ago | IN | 0 ETH | 0.00452747 | ||||
Deposit | 19454396 | 384 days ago | IN | 0 ETH | 0.00611444 | ||||
Harvest | 19431800 | 388 days ago | IN | 0 ETH | 0.00777392 | ||||
Withdraw | 19416131 | 390 days ago | IN | 0 ETH | 0.00749112 | ||||
Harvest | 19416085 | 390 days ago | IN | 0 ETH | 0.00854778 | ||||
Withdraw | 19415173 | 390 days ago | IN | 0 ETH | 0.007831 | ||||
Withdraw | 19415168 | 390 days ago | IN | 0 ETH | 0.00905598 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SquidGrowStaking
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-04 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library SafeERC20 { 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract SquidGrowStaking is Ownable, ReentrancyGuard, IERC721Receiver { using SafeERC20 for IERC20; using SafeMath for uint256; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 pendingReward; // pending reward uint256 nftStaked; // number of NFT staked uint256 lastRewardBlock; // last block when reward was claimed. } // Info of each pool. This contract has several reward method. First method is one that has reward per block and Second method has fixed apr. struct PoolInfo { IERC20 stakedToken; // Address of staked token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Squidgrows to distribute per block. uint256 lastRewardBlock; // Last block number that Squidgrows distribution occurs. uint256 accSquidgrowPerShare; // Accumulated Squidgrows per share, times 1e13. See below. uint256 totalStaked; } struct StakedNft { address staker; uint256 tokenId; address collection; } // NFT Staker info struct NftStaker { // Amount of tokens staked by the staker uint256 amountStaked; // Staked token ids StakedNft[] stakedNfts; } struct Checkpoint { uint256 blockNumber; // blocknumber for checkpoint uint256 accSquidgrowPerSquidgrow; bool isToggleCheckpoint; // true -> nftBoostToggle checkpoint ; false -> nft whitelist checkpoint bool state; // true -> boost enabled / collection whitelisted ; false -> boost disabled, collection unwhitelisted address collection; // address of collection whitelisted. } // The Squidgrow TOKEN! IERC20 public Squidgrow; address private feeAddress; uint256 public squidStakingPoolId = 0; // Squidgrow tokens created per block. uint256 public SquidgrowPerBlock; // Toggle reward harvesting without withdrawing all the staked tokens. bool public isHarvestingEnabled = true; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // whitelist info for fee mapping(address => bool) public isWhiteListed; // blacklist info for reward mapping(address => bool) public isBlackListed; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // Max fee rate: 10%. uint16 public constant MAXIMUM_FEE_RATE = 1000; // whitlisted NFTs for staking mapping(address => bool) public isNftWhitelisted; address [] public whitelistedNFTs; Checkpoint [] public checkpoints; // owner of staked NFTs (collection => tokenId => owner) mapping(address => mapping (uint256 => address)) public vault; // info of staked NFT ( user => NftStaker) mapping(address => NftStaker) public stakedNfts; // // count of nft staked (staker => collection => count) mapping(address => mapping(address => uint256)) public nftStaked; // On/Off Nft staking bool public nftBoostEnabled = true; // Boost reward % on staking NFTs uint256 public boostAPRPerNft = 200; // 20% // The block number when SQUID mining starts. uint256 immutable public startBlock; uint256 depositTax = 200; uint256 withdrawTax = 200; uint256 harvestTax = 600; event PoolAdded(uint256 indexed poolId, address indexed stakedToken, uint256 allocPoint, uint256 totalAllocPoint); event PoolUpdated(uint256 indexed poolId, uint256 allocPoint, uint256 totalAllocPoint); event WhitelistedNFT(address indexed nftCollection); event UnwhitelistedNFT(address indexed nftCollection); event Deposited(address indexed user, uint256 indexed poolId, uint256 amount); event Harvested(address indexed user, uint256 indexed poolId, uint256 amount); event Withdrawn(address indexed user, uint256 indexed poolId, uint256 amount); event DepositedNFTs(address indexed user, address indexed nftCollection, uint256 amount); event WithdrawnNFTs(address indexed user, address indexed nftCollection, uint256 amount); event WithdrawnAllNFTs(address indexed user, uint256 amount); event EmergencyWithdrawn(address indexed user, uint256 indexed poolId); event UpdatedEmissionRate(uint256 oldEmissionRate, uint256 newEmissionRate); event Whitelisted(address indexed user); event Unwhitelisted(address indexed user); event Blacklisted(address indexed user); event Unblacklisted(address indexed user); event NftBoostingEnabled(uint256 accSquidgrowPerSquidgrow); event NftBoostingDisabled(uint256 accSquidgrowPerSquidgrow); event BoostAPRPerNftUpdated(uint256 oldBoostAPR, uint256 newBoostAPR); event StakingTaxUpdated(uint256 withdrawTax, uint256 depositTax, uint256 harvestTax); event FeeAddressUpdated(address oldFeeAddress, address newFeeAddress); event UnsupportedTokenRecovered(address indexed receiver, address indexed token, uint256 amount); event HarvestingEnabled(); event HarvestingDisabled(); event UpdatedSquidgrowAddress(address squidgrow); constructor( IERC20 _squidgrow, address _feeAddress, uint256 _squidPerBlock, uint256 _startBlock ) { require(address(_squidgrow) != address(0), "Can't be zero address"); Squidgrow = _squidgrow; feeAddress = _feeAddress; SquidgrowPerBlock = _squidPerBlock; startBlock = _startBlock; // staking pool poolInfo.push(PoolInfo({ stakedToken: _squidgrow, allocPoint: 1000, lastRewardBlock: startBlock, accSquidgrowPerShare: 0, totalStaked: 0 })); totalAllocPoint = 1000; emit PoolAdded(0, address(_squidgrow), 1000, totalAllocPoint); } // Add a new token to the pool. Can only be called by the owner. // XXX DO NOT add the same token more than once. Rewards will be messed up if you do. function add(IERC20 _stakedToken, uint256 _allocPoint, bool _withUpdate) external onlyOwner { require(address(_stakedToken) != address(0), "Can't be zero address"); if (_withUpdate) { massUpdatePools(); } uint256 length = poolInfo.length; for (uint256 i = 0 ; i < length; i++) { require(poolInfo[i].stakedToken != _stakedToken, "Pool Already added"); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint + _allocPoint; poolInfo.push(PoolInfo({ stakedToken: _stakedToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accSquidgrowPerShare: 0, totalStaked: 0 })); emit PoolAdded(poolInfo.length - 1, address(_stakedToken), _allocPoint, totalAllocPoint); } // Update the given pool's Squidgrow allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) external onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 prevAllocPoint = poolInfo[_pid].allocPoint; poolInfo[_pid].allocPoint = _allocPoint; if (prevAllocPoint != _allocPoint) { totalAllocPoint = totalAllocPoint - prevAllocPoint + _allocPoint; } emit PoolUpdated(_pid, _allocPoint, totalAllocPoint); } // Whitelist NFT colletion for staking (to boost SQUID pool reward) function whitelistNFT(address nftCollection) external onlyOwner { require(nftCollection != address(0), "Can't be zero address"); require(!isNftWhitelisted[nftCollection], "Already whitlisted"); isNftWhitelisted[nftCollection] = true; whitelistedNFTs.push(nftCollection); updatePool(squidStakingPoolId); Checkpoint memory newcheckpoint = Checkpoint (block.number, poolInfo[squidStakingPoolId].accSquidgrowPerShare, false, true, nftCollection); checkpoints.push(newcheckpoint); emit WhitelistedNFT(nftCollection); } function removeWhitelistNFT(address nftCollection) external onlyOwner { require(nftCollection != address(0), "Can't be zero address"); require(isNftWhitelisted[nftCollection], "Already non - whitlisted"); isNftWhitelisted[nftCollection] = false; uint256 length = whitelistedNFTs.length; for(uint256 i =0; i< length; i++) { if (whitelistedNFTs[i] == nftCollection) { whitelistedNFTs[i] = whitelistedNFTs[length - 1]; break; } } whitelistedNFTs.pop(); updatePool(squidStakingPoolId); Checkpoint memory newcheckpoint = Checkpoint (block.number, poolInfo[squidStakingPoolId].accSquidgrowPerShare, false, false, nftCollection); checkpoints.push(newcheckpoint); emit UnwhitelistedNFT(nftCollection); } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to - _from; } // View function to see pending Squidgrows on frontend. function pendingSquidgrow(uint256 _pid, address _user) external view returns (uint256) { PoolInfo memory pool = poolInfo[_pid]; UserInfo memory user = userInfo[_pid][_user]; uint256 accSquidgrowPerShare = pool.accSquidgrowPerShare; if (block.number > pool.lastRewardBlock && pool.totalStaked != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 SquidgrowReward = (multiplier * SquidgrowPerBlock * pool.allocPoint) / totalAllocPoint; accSquidgrowPerShare = accSquidgrowPerShare.add(SquidgrowReward.mul(1e13).div(pool.totalStaked)); } uint256 equivalentAmount = getBoostEquivalentAmount(_user, _pid); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && _pid == 0 && stakedNfts[msg.sender].amountStaked != 0) { uint256 index = checkpoints.length ; pending = equivalentAmount.mul(accSquidgrowPerShare).div(1e13).sub(equivalentAmount.mul(checkpoints[index -1].accSquidgrowPerSquidgrow).div(1e13)); uint256 nftCount = _getWhitelistedNft(_user); uint256 boostedAmount = getBoostedAmount(user.amount, nftCount); bool boostEnable = nftBoostEnabled; for (uint256 i = index; i >= 1 ; --i) { if(user.lastRewardBlock > checkpoints[i-1].blockNumber) break; if(checkpoints[i-1].isToggleCheckpoint) { boostEnable = !boostEnable; if(boostEnable) { pending += boostedAmount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub(i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ? user.rewardDebt: boostedAmount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } else { pending += user.amount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub( i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ?user.rewardDebt : user.amount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } }else { uint256 amount = nftStaked[_user][checkpoints[i-1].collection]; if(amount != 0) { nftCount = checkpoints[i-1].state ? nftCount - amount : nftCount + amount; boostedAmount = getBoostedAmount(user.amount, nftCount); } if(boostEnable) { pending += boostedAmount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub(i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ? user.rewardDebt: boostedAmount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } else { pending += user.amount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub( i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ?user.rewardDebt : user.amount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } } } }else { pending = equivalentAmount.mul(accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } return pending + user.pendingReward; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } if (pool.totalStaked == 0) { pool.lastRewardBlock = block.number; return; } uint256 accSquidgrowPerShare = pool.accSquidgrowPerShare; uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 SquidgrowReward = multiplier.mul(SquidgrowPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accSquidgrowPerShare = accSquidgrowPerShare.add(SquidgrowReward.mul(1e13).div(pool.totalStaked)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterChef for Squidgrow allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { require(!isBlackListed[msg.sender], "user is blacklisted"); require(_amount > 0 , "zero amount"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 equivalentAmount = getBoostEquivalentAmount(msg.sender, _pid); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && _pid == 0 && stakedNfts[msg.sender].amountStaked != 0) { pending = getPendingreward(pool, msg.sender, user); } else { pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } user.pendingReward += isHarvestingEnabled ? 0 : pending; if(pending > 0 && isHarvestingEnabled){ if (!isWhiteListed[msg.sender]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } safeSquidgrowTransfer(msg.sender, pending); } uint256 depositFee = 0; if (!isWhiteListed[msg.sender]) { depositFee = _amount.mul(depositTax).div(10000); if (depositFee > 0) pool.stakedToken.safeTransferFrom(msg.sender, feeAddress, depositFee); } uint256 balancebefore = pool.stakedToken.balanceOf(address(this)); pool.stakedToken.safeTransferFrom(msg.sender, address(this), _amount - depositFee ); // staked Tokens, might have transfer tax. uint256 amountReceived = pool.stakedToken.balanceOf(address(this)).sub(balancebefore); user.amount = user.amount.add(amountReceived); pool.totalStaked = pool.totalStaked.add(amountReceived); equivalentAmount = getBoostEquivalentAmount(msg.sender, _pid); user.rewardDebt = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13); user.lastRewardBlock = block.number; emit Deposited(msg.sender, _pid, amountReceived); } function getBoostEquivalentAmount(address _account, uint256 _pid) public view returns (uint256) { UserInfo memory user = userInfo[_pid][_account]; uint256 equivalentAmount = user.amount; if (_pid == squidStakingPoolId && nftBoostEnabled) { // NFT boost only for Squid staking pool (pid = 0) uint256 nftCount = _getWhitelistedNft(_account); equivalentAmount = getBoostedAmount(user.amount, nftCount); } return equivalentAmount; } // Harvest Reward function harvest(uint256 _pid) public nonReentrant { require(isHarvestingEnabled, "reward harvesting is not enabled, need to withdraw token to harvest reward!"); require(!isBlackListed[msg.sender], "user is blacklisted"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount > 0, "harvest: not good"); updatePool((_pid)); uint256 equivalentAmount = getBoostEquivalentAmount(msg.sender, _pid); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && _pid == 0 && stakedNfts[msg.sender].amountStaked != 0) { pending = getPendingreward(pool, msg.sender, user); } else { pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } pending += user.pendingReward; user.pendingReward = 0; if(pending > 0){ if (!isWhiteListed[msg.sender]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } safeSquidgrowTransfer(msg.sender, pending); } equivalentAmount = getBoostEquivalentAmount(msg.sender, _pid); user.rewardDebt = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13); user.lastRewardBlock = block.number; emit Harvested(msg.sender, _pid, pending); } function getPendingreward(PoolInfo memory pool, address account, UserInfo memory user) internal view returns(uint256){ uint256 index = checkpoints.length ; uint256 equivalentAmount = getBoostEquivalentAmount( account, 0); uint256 pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(equivalentAmount.mul(checkpoints[index -1].accSquidgrowPerSquidgrow).div(1e13)); uint256 nftCount = _getWhitelistedNft(account); uint256 boostedAmount = getBoostedAmount(user.amount, nftCount); bool boostEnable = nftBoostEnabled; for (uint256 i = index; i >= 1 ; --i) { if(user.lastRewardBlock > checkpoints[i-1].blockNumber) break; if(checkpoints[i-1].isToggleCheckpoint) { boostEnable = !boostEnable; if(boostEnable) { pending += boostedAmount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub(i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ? user.rewardDebt: boostedAmount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } else { pending += user.amount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub( i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ?user.rewardDebt : user.amount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } }else { uint256 amount = nftStaked[account][checkpoints[i-1].collection]; if(amount != 0) { nftCount = checkpoints[i-1].state ? nftCount - amount : nftCount + amount; boostedAmount = getBoostedAmount(user.amount, nftCount); } if(boostEnable) { pending += boostedAmount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub(i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ? user.rewardDebt: boostedAmount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } else { pending += user.amount.mul(checkpoints[i-1].accSquidgrowPerSquidgrow).div(1e13).sub( i == 1 || user.lastRewardBlock > checkpoints[i-2].blockNumber ?user.rewardDebt : user.amount.mul(checkpoints[i - 2].accSquidgrowPerSquidgrow).div(1e13)); } } } return pending; } function getBoostedAmount(uint256 amount, uint256 nftCount) public view returns (uint256) { // multiplying nftCount by 10^8 and dividing the result by sqrt(10^8) = 10^4 for precision return amount + (amount * Math.sqrt(nftCount * 100_000_000) * boostAPRPerNft) / (1000 * 10_000); } // Withdraw LP tokens from Staking. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 equivalentAmount = getBoostEquivalentAmount(msg.sender, _pid); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && _pid == squidStakingPoolId && stakedNfts[msg.sender].amountStaked != 0) { pending = getPendingreward(pool, msg.sender, user); } else { pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } user.pendingReward += isHarvestingEnabled ? 0 : pending; uint256 withdrawFee = 0; if(pending > 0 && isHarvestingEnabled){ if (!isWhiteListed[msg.sender]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } if(!isBlackListed[msg.sender]) { safeSquidgrowTransfer(msg.sender, pending); } } if (!isWhiteListed[msg.sender]) { withdrawFee = (_amount * withdrawTax) / 10000; if(withdrawFee > 0) pool.stakedToken.safeTransfer(feeAddress, withdrawFee); } pool.stakedToken.safeTransfer(msg.sender, _amount - withdrawFee); pool.totalStaked=pool.totalStaked.sub(_amount); user.amount = user.amount.sub(_amount); equivalentAmount = getBoostEquivalentAmount(msg.sender, _pid); user.rewardDebt = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13); user.lastRewardBlock = block.number; if(user.amount == 0) { pending = user.pendingReward; if(pending> 0 && !isHarvestingEnabled) { if (!isWhiteListed[msg.sender]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } if(!isBlackListed[msg.sender]) { safeSquidgrowTransfer(msg.sender, pending); } } if( _pid == squidStakingPoolId && stakedNfts[msg.sender].amountStaked != 0) { _withdrawAllNft(msg.sender); } } emit Withdrawn(msg.sender, _pid, _amount); } // Deposit NFT token to Staking function depositNft(address _collection, uint256[] calldata _tokenIds) public nonReentrant { require(!isBlackListed[msg.sender], "user is blacklisted"); require(nftBoostEnabled, "NFT staking is turned off."); require(isNftWhitelisted[_collection], "Collection not whitelisted"); updatePool(squidStakingPoolId); PoolInfo storage pool = poolInfo[squidStakingPoolId]; // pool id = 0 --> Squid staking pool UserInfo storage user = userInfo[squidStakingPoolId][msg.sender]; require(user.amount > 0, "You should stake squid to deposit NFT."); uint256 equivalentAmount = getBoostEquivalentAmount(msg.sender, squidStakingPoolId); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && stakedNfts[msg.sender].amountStaked != 0) { pending = getPendingreward(pool, msg.sender, user); } else { pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } user.pendingReward += isHarvestingEnabled ? 0 : pending; if(pending > 0 && isHarvestingEnabled){ if (!isWhiteListed[msg.sender]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } safeSquidgrowTransfer(msg.sender, pending); } uint256 stakeAmount = _tokenIds.length; for (uint256 i = 0; i < stakeAmount; i++) { require(IERC721(_collection).ownerOf(_tokenIds[i]) == msg.sender, "Sender not owner"); IERC721(_collection).safeTransferFrom(msg.sender, address(this), _tokenIds[i]); vault[_collection][_tokenIds[i]] = msg.sender; StakedNft memory stakedNft = StakedNft(msg.sender, _tokenIds[i], _collection); stakedNfts[msg.sender].stakedNfts.push(stakedNft); } stakedNfts[msg.sender].amountStaked += stakeAmount; nftStaked[msg.sender][_collection] += stakeAmount; equivalentAmount = getBoostEquivalentAmount(msg.sender, squidStakingPoolId); user.rewardDebt = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13); user.lastRewardBlock = block.number; emit DepositedNFTs(msg.sender, _collection, _tokenIds.length); } // Withdraw Nft Token from staking function withdrawNft(address _collection, uint256[] calldata _tokenIds) public nonReentrant { require( stakedNfts[msg.sender].amountStaked > 0, "You have no NFT staked" ); updatePool(squidStakingPoolId); PoolInfo storage pool = poolInfo[squidStakingPoolId]; // pool id = 0 --> Squid staking pool UserInfo storage user = userInfo[squidStakingPoolId][msg.sender]; uint256 equivalentAmount = getBoostEquivalentAmount(msg.sender, squidStakingPoolId); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && stakedNfts[msg.sender].amountStaked != 0) { pending = getPendingreward(pool, msg.sender, user); } else { pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } user.pendingReward += isHarvestingEnabled ? 0 : pending; if(pending > 0 && isHarvestingEnabled){ if (!isWhiteListed[msg.sender]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } if (!isBlackListed[msg.sender]) { safeSquidgrowTransfer(msg.sender, pending); } } uint256 unstakeAmount = _tokenIds.length; for (uint256 i = 0; i < unstakeAmount; i++) { require(vault[_collection][_tokenIds[i]] == msg.sender, "You don't own this token!"); // Find the index of this token id in the stakedTokens array uint256 index = 0; for (uint256 j = 0; i < stakedNfts[msg.sender].stakedNfts.length; j++) { if ( stakedNfts[msg.sender].stakedNfts[j].collection == _collection && stakedNfts[msg.sender].stakedNfts[j].tokenId == _tokenIds[i] && stakedNfts[msg.sender].stakedNfts[j].staker != address(0) ) { index = j; break; } } stakedNfts[msg.sender].stakedNfts[index].staker = address(0); vault[_collection][_tokenIds[i]] = address(0); IERC721(_collection).safeTransferFrom(address(this), msg.sender, _tokenIds[i]); } stakedNfts[msg.sender].amountStaked -= unstakeAmount; nftStaked[msg.sender][_collection] -= unstakeAmount; equivalentAmount = getBoostEquivalentAmount(msg.sender, squidStakingPoolId); user.rewardDebt = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13); user.lastRewardBlock = block.number; emit WithdrawnNFTs(msg.sender, _collection, _tokenIds.length); } function withdrawAllNft() external nonReentrant{ require( stakedNfts[msg.sender].amountStaked > 0, "You have no NFT staked" ); _withdrawAllNft(msg.sender); } function _withdrawAllNft(address account) internal { updatePool(squidStakingPoolId); PoolInfo storage pool = poolInfo[squidStakingPoolId]; // pool id = 0 --> Squid staking pool UserInfo storage user = userInfo[squidStakingPoolId][account]; uint256 equivalentAmount = getBoostEquivalentAmount(account, squidStakingPoolId); uint256 pending = 0; if ( checkpoints.length!= 0 && user.lastRewardBlock <= checkpoints[checkpoints.length - 1].blockNumber && stakedNfts[msg.sender].amountStaked != 0) { pending = getPendingreward(pool, msg.sender, user); } else { pending = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13).sub(user.rewardDebt); } user.pendingReward += isHarvestingEnabled ? 0 : pending; if(pending > 0 && isHarvestingEnabled){ if (!isWhiteListed[account]) { uint256 harvestFee = pending.mul(harvestTax).div(10000); pending = pending - harvestFee; if(harvestFee > 0) safeSquidgrowTransfer(feeAddress, harvestFee); } if (!isBlackListed[account]) { safeSquidgrowTransfer(account, pending); } } emit WithdrawnAllNFTs(account, stakedNfts[msg.sender].amountStaked); stakedNfts[account].amountStaked = 0; for (uint256 i = 0; i < stakedNfts[account].stakedNfts.length; i++) { if (stakedNfts[account].stakedNfts[i].staker != address(0)) { stakedNfts[account].stakedNfts[i].staker = address(0); vault[stakedNfts[account].stakedNfts[i].collection][stakedNfts[account].stakedNfts[i].tokenId] = address(0); nftStaked[account][stakedNfts[account].stakedNfts[i].collection] = 0; IERC721(stakedNfts[account].stakedNfts[i].collection).safeTransferFrom(address(this), account,stakedNfts[account].stakedNfts[i].tokenId); } } equivalentAmount = getBoostEquivalentAmount(account, squidStakingPoolId); user.rewardDebt = equivalentAmount.mul(pool.accSquidgrowPerShare).div(1e13); user.lastRewardBlock = block.number; } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; pool.totalStaked = pool.totalStaked.sub(amount); uint256 withdrawFee = 0; if (!isWhiteListed[msg.sender]) { withdrawFee = (amount * withdrawTax) / 10000; if(withdrawFee > 0) pool.stakedToken.safeTransfer(feeAddress, withdrawFee); } pool.stakedToken.safeTransfer(msg.sender, amount - withdrawFee); if(_pid == squidStakingPoolId && stakedNfts[msg.sender].amountStaked != 0) { _withdrawAllNft(msg.sender); } emit EmergencyWithdrawn(msg.sender, _pid); } // Safe Squidgrow transfer function, just in case if rounding error causes pool to not have enough FOXs. function safeSquidgrowTransfer(address _to, uint256 _amount) internal { uint256 SquidgrowBal = Squidgrow.balanceOf(address(this)); PoolInfo storage pool = poolInfo[squidStakingPoolId]; uint256 rewardBalance = SquidgrowBal - pool.totalStaked; bool transferSuccess = false; if (_amount > rewardBalance) { transferSuccess = Squidgrow.transfer(_to, rewardBalance); } else { transferSuccess = Squidgrow.transfer(_to, _amount); } require(transferSuccess, "safeSquidgrowTransfer: Transfer failed"); } function updateSquidStakingPoolId(uint256 _newId) external onlyOwner { squidStakingPoolId = _newId; } function changeSquidgrowAddress(address _squidgrow, bool _withUpdate) external onlyOwner { require(_squidgrow != address(0), "Can't be zero address"); Squidgrow = IERC20(_squidgrow); if (_withUpdate) { massUpdatePools(); } emit UpdatedSquidgrowAddress(_squidgrow); } // Recover unsupported tokens that are sent accidently. function recoverUnsupportedToken(address _addr, uint256 _amount) external onlyOwner { require(_addr != address(0), "non-zero address"); uint256 totalDeposit = 0; uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { if (poolInfo[pid].stakedToken == IERC20(_addr)) { totalDeposit = poolInfo[pid].totalStaked; break; } } uint256 balance = IERC20(_addr).balanceOf(address(this)); uint256 amt = balance.sub(totalDeposit); if (_amount > 0 && _amount <= amt) { IERC20(_addr).safeTransfer(msg.sender, _amount); } emit UnsupportedTokenRecovered(msg.sender, _addr, _amount); } // set fee address function setFeeAddress(address _feeAddress) external onlyOwner { require(_feeAddress != address(0),"non-zero"); emit FeeAddressUpdated(feeAddress, _feeAddress); feeAddress = _feeAddress; } // update reward per block function updateEmissionRate(uint256 _SquidgrowPerBlock) external onlyOwner { massUpdatePools(); emit UpdatedEmissionRate(SquidgrowPerBlock, _SquidgrowPerBlock); SquidgrowPerBlock = _SquidgrowPerBlock; } // add peoples to whitelist for deposit fee function whiteList(address[] memory _addresses) external onlyOwner { uint256 count = _addresses.length; for (uint256 i =0 ; i< count; i++) { isWhiteListed[_addresses[i]] = true; emit Whitelisted(_addresses[i]); } } // remove peoples from whitelist for deposit fee function removeWhiteList(address[] memory _addresses) external onlyOwner { uint256 count = _addresses.length; for (uint256 i =0 ; i< count; i++) { isWhiteListed[_addresses[i]] = false; emit Unwhitelisted(_addresses[i]); } } // add peoples to blacklist for reward function blackList(address[] memory _addresses) external onlyOwner { uint256 count = _addresses.length; for (uint256 i =0 ; i< count; i++) { isBlackListed[_addresses[i]] = true; emit Blacklisted(_addresses[i]); } } // remove peoples from blacklist function removeBlackList(address[] memory _addresses) external onlyOwner { uint256 count = _addresses.length; for (uint256 i =0 ; i< count; i++) { isBlackListed[_addresses[i]] = false; emit Unblacklisted(_addresses[i]); } } function enableRewardHarvesting() external onlyOwner { require(!isHarvestingEnabled, "already enabled"); isHarvestingEnabled = true; emit HarvestingEnabled(); } function disableRewardHarvesting() external onlyOwner { require(isHarvestingEnabled, "already disabled"); isHarvestingEnabled = false; emit HarvestingDisabled(); } // get pool length function poolLength() external view returns (uint256) { return poolInfo.length; } // Turn on Nft staking function turnOnNftStaking() external onlyOwner { require(!nftBoostEnabled, "already enable"); nftBoostEnabled = true; updatePool(squidStakingPoolId); Checkpoint memory newcheckpoint = Checkpoint (block.number, poolInfo[squidStakingPoolId].accSquidgrowPerShare, true, true, address(0)); checkpoints.push(newcheckpoint); emit NftBoostingEnabled(poolInfo[squidStakingPoolId].accSquidgrowPerShare); } // Turn off Nft staking function turnOffNftStaking() external onlyOwner { require(nftBoostEnabled, "already disable"); nftBoostEnabled = false; updatePool(squidStakingPoolId); Checkpoint memory newcheckpoint = Checkpoint (block.number, poolInfo[squidStakingPoolId].accSquidgrowPerShare, true, false, address(0)); checkpoints.push(newcheckpoint); emit NftBoostingDisabled(poolInfo[squidStakingPoolId].accSquidgrowPerShare); } function updateBoostAPRPerNft(uint256 _newBoostAPRPerNft) external onlyOwner { require(_newBoostAPRPerNft > 0 , "should be greater than zero"); emit BoostAPRPerNftUpdated(boostAPRPerNft, _newBoostAPRPerNft); boostAPRPerNft = _newBoostAPRPerNft; } function setStakingTax(uint256 _newWithdrawTax, uint256 _newDepositTax, uint256 _newHarvestTax) external onlyOwner { require(_newWithdrawTax + _newDepositTax + _newHarvestTax <= MAXIMUM_FEE_RATE, "Tax mustn't be greater than 10%"); withdrawTax = _newWithdrawTax; depositTax = _newDepositTax; harvestTax = _newHarvestTax; emit StakingTaxUpdated(_newWithdrawTax, _newDepositTax, _newHarvestTax); } function getStakedNfts(address _user) public view returns (uint256[] memory, address[] memory) { // Check if we know this user if (stakedNfts[_user].amountStaked > 0) { // Return all the tokens in the stakedToken Array for this user that are not -1 uint256[] memory _stakedNfts = new uint256[](stakedNfts[_user].amountStaked); address[] memory _collection = new address[](stakedNfts[_user].amountStaked); uint256 _index = 0; for (uint256 j = 0; j < stakedNfts[_user].stakedNfts.length; j++) { if (stakedNfts[_user].stakedNfts[j].staker != (address(0))) { _stakedNfts[_index] = stakedNfts[_user].stakedNfts[j].tokenId; _collection[_index] = stakedNfts[_user].stakedNfts[j].collection; _index++; } } return (_stakedNfts, _collection); } // Otherwise, return empty array else { return (new uint256[](0), new address[](0)); } } function _getWhitelistedNft(address user) internal view returns(uint256) { uint256 count = whitelistedNFTs.length; uint256 nftCount = 0; for (uint256 i = 0 ; i< count ; i++) { nftCount += nftStaked[user][whitelistedNFTs[i]]; } return nftCount; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_squidgrow","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_squidPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBoostAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBoostAPR","type":"uint256"}],"name":"BoostAPRPerNftUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"nftCollection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositedNFTs","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"EmergencyWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldFeeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newFeeAddress","type":"address"}],"name":"FeeAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[],"name":"HarvestingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"HarvestingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"accSquidgrowPerSquidgrow","type":"uint256"}],"name":"NftBoostingDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"accSquidgrowPerSquidgrow","type":"uint256"}],"name":"NftBoostingEnabled","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":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"stakedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAllocPoint","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAllocPoint","type":"uint256"}],"name":"PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestTax","type":"uint256"}],"name":"StakingTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Unblacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnsupportedTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Unwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftCollection","type":"address"}],"name":"UnwhitelistedNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldEmissionRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEmissionRate","type":"uint256"}],"name":"UpdatedEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"squidgrow","type":"address"}],"name":"UpdatedSquidgrowAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftCollection","type":"address"}],"name":"WhitelistedNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnAllNFTs","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"nftCollection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnNFTs","type":"event"},{"inputs":[],"name":"MAXIMUM_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Squidgrow","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SquidgrowPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakedToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"boostAPRPerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_squidgrow","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"changeSquidgrowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"accSquidgrowPerSquidgrow","type":"uint256"},{"internalType":"bool","name":"isToggleCheckpoint","type":"bool"},{"internalType":"bool","name":"state","type":"bool"},{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"depositNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableRewardHarvesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableRewardHarvesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getBoostEquivalentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nftCount","type":"uint256"}],"name":"getBoostedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getStakedNfts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHarvestingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNftWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftBoostEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"nftStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"pendingSquidgrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"stakedToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSquidgrowPerShare","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverUnsupportedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftCollection","type":"address"}],"name":"removeWhitelistNFT","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":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWithdrawTax","type":"uint256"},{"internalType":"uint256","name":"_newDepositTax","type":"uint256"},{"internalType":"uint256","name":"_newHarvestTax","type":"uint256"}],"name":"setStakingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"squidStakingPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedNfts","outputs":[{"internalType":"uint256","name":"amountStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"turnOffNftStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"turnOnNftStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBoostAPRPerNft","type":"uint256"}],"name":"updateBoostAPRPerNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_SquidgrowPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newId","type":"uint256"}],"name":"updateSquidStakingPoolId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"pendingReward","type":"uint256"},{"internalType":"uint256","name":"nftStaked","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"whiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftCollection","type":"address"}],"name":"whitelistNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedNFTs","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"withdrawAllNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawNft","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526000600481905560068054600160ff199182168117909255600b929092556012805490921617905560c8601381905560148190556015556102586016553480156200004e57600080fd5b5060405162006297380380620062978339810160408190526200007191620002da565b6200007c3362000271565b600180556001600160a01b038416620000db5760405162461bcd60e51b815260206004820152601560248201527f43616e2774206265207a65726f20616464726573730000000000000000000000604482015260640160405180910390fd5b600280546001600160a01b038087166001600160a01b0319928316811790935560038054878316908416179055600585815560808581526040805160a0810182528681526103e8602082018181528451838501908152600060608501818152968501818152600780546001810182559083529551959098027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6888101805496909a1695909a1694909417909755517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68988015594517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a87015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b86015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c90940193909355600b829055517fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d916200025f918190918252602082015260400190565b60405180910390a35050505062000327565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620002d757600080fd5b50565b60008060008060808587031215620002f157600080fd5b8451620002fe81620002c1565b60208601519094506200031181620002c1565b6040860151606090960151949790965092505050565b608051615f46620003516000396000818161048901528181610b500152610b770152615f466000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c8062ccb66a146102975780630112d431146102a1578063016d00d8146102b457806305adfd5d146102d6578063081e3eda1461030f5780630ba84cd2146103175780630dec23121461032a57806311216ea11461033d578063150b7a02146103455780631526fe271461037d57806317caf6f1146103c2578063254e5c94146103cb57806336470542146103e757806339745791146103fa5780633fa16d991461040d578063441a3e701461044e57806348473e571461046157806348cd4cb11461048457806351eb05a6146104ab5780635312ea8e146104be578063630b5ba1146104d157806364482f79146104d95780636f9170f6146104ec578063715018a61461050f57806376098761146105175780637e78ab7c1461052a578063817fd5131461053d57806382c8028b1461055057806382da4c3b146105635780638705fcd414610576578063895698a6146105895780638da5cb5b1461059c5780638dbb1e3a146105a457806391942f23146105b757806391c5f4a6146105ca57806393f1a40b146105dd57806399d5cc0e1461064d5780639bf4113514610660578063a01ea1b414610673578063a071bf1314610686578063a787ca29146106a6578063a9fba703146106b9578063ac261d8e146106c2578063b8a24252146106cb578063bb90f1a014610715578063bcdbfe681461071e578063c5ccceb914610731578063cbe7159f14610739578063db0c7f2b14610746578063ddc632621461074e578063e2bbb15814610761578063e47d606014610774578063e6cfc67a14610797578063eba705951461079f578063f137eeb8146107b2578063f2fde38b146107c5578063feece0ab146107d8575b600080fd5b61029f6107f9565b005b61029f6102af3660046157cc565b61084a565b6012546102c19060ff1681565b60405190151581526020015b60405180910390f35b6103016102e43660046157f8565b601160209081526000928352604080842090915290825290205481565b6040519081526020016102cd565b600754610301565b61029f610325366004615831565b610a25565b61029f610338366004615858565b610a75565b61029f610d1d565b61036461035336600461589a565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102cd565b61039061038b366004615831565b610d9f565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102cd565b610301600b5481565b6103d46103e881565b60405161ffff90911681526020016102cd565b6103016103f5366004615938565b610dea565b61029f610408366004615973565b61158e565b61044161041b3660046157cc565b600f6020908152600092835260408084209091529082529020546001600160a01b031681565b6040516102cd9190615a2b565b61029f61045c366004615a3f565b611660565b6102c161046f366004615a61565b600c6020526000908152604090205460ff1681565b6103017f000000000000000000000000000000000000000000000000000000000000000081565b61029f6104b9366004615831565b611b06565b61029f6104cc366004615831565b611bcc565b61029f611d16565b61029f6104e7366004615a7e565b611d3d565b6102c16104fa366004615a61565b60096020526000908152604090205460ff1681565b61029f611e0b565b600254610441906001600160a01b031681565b610301610538366004615a3f565b611e1d565b61044161054b366004615831565b611e6d565b61029f61055e366004615973565b611e97565b61029f610571366004615831565b611f64565b61029f610584366004615a61565b611ffa565b61029f610597366004615aac565b6120ac565b61044161213e565b6103016105b2366004615a3f565b61214d565b61029f6105c5366004615831565b612159565b61029f6105d8366004615973565b612166565b6106256105eb366004615938565b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102cd565b61029f61065b366004615ada565b612233565b61029f61066e366004615973565b612939565b61029f610681366004615ada565b612a06565b610301610694366004615a61565b60106020526000908152604090205481565b61029f6106b4366004615b61565b613084565b61030160045481565b61030160135481565b6106de6106d9366004615831565b613147565b6040805195865260208601949094529115159284019290925290151560608301526001600160a01b0316608082015260a0016102cd565b61030160055481565b61029f61072c366004615a61565b613198565b61029f6133c2565b6006546102c19060ff1681565b61029f613586565b61029f61075c366004615831565b61371b565b61029f61076f366004615a3f565b613ac9565b6102c1610782366004615a61565b600a6020526000908152604090205460ff1681565b61029f613fb4565b61029f6107ad366004615a61565b614039565b6103016107c03660046157cc565b614326565b61029f6107d3366004615a61565b6143c2565b6107eb6107e6366004615a61565b614438565b6040516102cd929190615b8d565b6108016146b7565b336000908152601060205260409020546108365760405162461bcd60e51b815260040161082d90615c11565b60405180910390fd5b61083f33614711565b61084860018055565b565b610852614d2d565b6001600160a01b03821661089b5760405162461bcd60e51b815260206004820152601060248201526f6e6f6e2d7a65726f206164647265737360801b604482015260640161082d565b600754600090815b8181101561092457846001600160a01b0316600782815481106108c8576108c8615c41565b60009182526020909120600590910201546001600160a01b0316141561091457600781815481106108fb576108fb615c41565b9060005260206000209060050201600401549250610924565b61091d81615c6d565b90506108a3565b506040516370a0823160e01b81526000906001600160a01b038616906370a0823190610954903090600401615a2b565b60206040518083038186803b15801561096c57600080fd5b505afa158015610980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a49190615c88565b905060006109b28285614d8c565b90506000851180156109c45750808511155b156109dd576109dd6001600160a01b0387163387614d98565b6040518581526001600160a01b0387169033907f0bec8af1e4aaf435321e7041133dfbf5f5b6742217ae28770c66657df0da54539060200160405180910390a3505050505050565b610a2d614d2d565b610a35611d16565b7f345ebf2744639e33d1b51c7277781ae0380afc2dd8b5645a1a535431c48fd13060055482604051610a68929190615ca1565b60405180910390a1600555565b610a7d614d2d565b6001600160a01b038316610aa35760405162461bcd60e51b815260040161082d90615caf565b8015610ab157610ab1611d16565b60075460005b81811015610b4b57846001600160a01b031660078281548110610adc57610adc615c41565b60009182526020909120600590910201546001600160a01b03161415610b395760405162461bcd60e51b8152602060048201526012602482015271141bdbdb08105b1c9958591e48185919195960721b604482015260640161082d565b80610b4381615c6d565b915050610ab7565b5060007f00000000000000000000000000000000000000000000000000000000000000004311610b9b577f0000000000000000000000000000000000000000000000000000000000000000610b9d565b435b905083600b54610bad9190615cde565b600b556040805160a0810182526001600160a01b03878116808352602083018881529383018581526000606085018181526080860182815260078054600180820183559482905297517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600590990298890180546001600160a01b031916919098161790965596517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68987015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a86015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b85015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c90930192909255549091610cdb91615cf6565b7fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d86600b54604051610d0e929190615ca1565b60405180910390a35050505050565b610d25614d2d565b60065460ff16610d6a5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48191a5cd8589b195960821b604482015260640161082d565b6006805460ff191690556040517fa812cff88cc269622acf35c5790553954500f95fc0451c77fc80c97753d81d9e90600090a1565b60078181548110610daf57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60008060078481548110610e0057610e00615c41565b90600052602060002090600502016040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000600860008681526020019081526020016000206000856001600160a01b03166001600160a01b031681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600082606001519050826040015143118015610f085750608083015115155b15610f83576000610f1d84604001514361214d565b90506000600b54856020015160055484610f379190615d0d565b610f419190615d0d565b610f4b9190615d42565b9050610f7e610f778660800151610f716509184e72a00085614dee90919063ffffffff16565b90614dfa565b8490614e06565b925050505b6000610f8f8688614326565b600e5490915060009015801590610fdb5750600e8054610fb190600190615cf6565b81548110610fc157610fc1615c41565b906000526020600020906003020160000154846080015111155b8015610fe5575087155b8015610fff57503360009081526010602052604090205415155b1561155357600e80549061107390611059906509184e72a00090610f7190611028600187615cf6565b8154811061103857611038615c41565b90600052602060002090600302016001015487614dee90919063ffffffff16565b61106d6509184e72a000610f718789614dee565b90614d8c565b9150600061108089614e12565b90506000611092876000015183611e1d565b60125490915060ff16835b6001811061154957600e6110b2600183615cf6565b815481106110c2576110c2615c41565b906000526020600020906003020160000154896080015111156110e457611549565b600e6110f1600183615cf6565b8154811061110157611101615c41565b600091825260209091206002600390920201015460ff16156112cc5790159081156111ee576111dd81600114806111695750600e611140600284615cf6565b8154811061115057611150615c41565b9060005260206000209060030201600001548a60800151115b61118c576111876509184e72a000610f71600e611028600287615cf6565b611192565b89602001515b61106d6509184e72a000610f71600e6111ac600188615cf6565b815481106111bc576111bc615c41565b90600052602060002090600302016001015488614dee90919063ffffffff16565b6111e79087615cde565b9550611539565b6111dd81600114806112315750600e611208600284615cf6565b8154811061121857611218615c41565b9060005260206000209060030201600001548a60800151115b6112805761127b6509184e72a000610f71600e61124f600287615cf6565b8154811061125f5761125f615c41565b60009182526020909120600160039092020101548d5190614dee565b611286565b89602001515b61106d6509184e72a000610f71600e6112a0600188615cf6565b815481106112b0576112b0615c41565b60009182526020909120600160039092020101548e5190614dee565b6001600160a01b038c16600090815260116020526040812081600e6112f2600186615cf6565b8154811061130257611302615c41565b60009182526020808320600392909202909101600201546201000090046001600160a01b03168352820192909252604001902054905080156113aa57600e61134b600184615cf6565b8154811061135b5761135b615c41565b906000526020600020906003020160020160019054906101000a900460ff1661138d576113888186615cde565b611397565b6113978186615cf6565b94506113a78a6000015186611e1d565b93505b82156114785761146782600114806113f35750600e6113ca600285615cf6565b815481106113da576113da615c41565b9060005260206000209060030201600001548b60800151115b611416576114116509184e72a000610f71600e6111ac600288615cf6565b61141c565b8a602001515b61106d6509184e72a000610f71600e611436600189615cf6565b8154811061144657611446615c41565b90600052602060002090600302016001015489614dee90919063ffffffff16565b6114719088615cde565b9650611537565b61152a82600114806114bb5750600e611492600285615cf6565b815481106114a2576114a2615c41565b9060005260206000209060030201600001548b60800151115b6114de576114d96509184e72a000610f71600e6112a0600288615cf6565b6114e4565b8a602001515b61106d6509184e72a000610f71600e6114fe600189615cf6565b8154811061150e5761150e615c41565b60009182526020909120600160039092020101548f5190614dee565b6115349088615cde565b96505b505b61154281615d64565b905061109d565b5050505050611573565b60208401516115709061106d6509184e72a000610f718688614dee565b90505b60408401516115829082615cde565b98975050505050505050565b611596614d2d565b805160005b8181101561165b576000600960008584815181106115bb576115bb615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555082818151811061160c5761160c615c41565b60200260200101516001600160a01b03167f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da4679160405160405180910390a28061165381615c6d565b91505061159b565b505050565b6116686146b7565b60006007838154811061167d5761167d615c41565b6000918252602080832086845260088252604080852033865290925292208054600590920290920192508311156116eb5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015260640161082d565b6116f484611b06565b60006117003386614326565b600e549091506000901580159061174c5750600e805461172290600190615cf6565b8154811061173257611732615c41565b906000526020600020906003020160000154836004015411155b8015611759575060045486145b801561177357503360009081526010602052604090205415155b1561182957611822846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b9050611855565b611852836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff166118655780611868565b60005b83600201600082825461187b9190615cde565b90915550600090508115801590611894575060065460ff165b1561191a573360009081526009602052604090205460ff166118f95760006118cd612710610f7160165486614dee90919063ffffffff16565b90506118d98184615cf6565b925080156118f7576003546118f7906001600160a01b031682615170565b505b336000908152600a602052604090205460ff1661191a5761191a3383615170565b3360009081526009602052604090205460ff1661197057612710601554876119429190615d0d565b61194c9190615d42565b90508015611970576003548554611970916001600160a01b03918216911683614d98565b6119903361197e8389615cf6565b87546001600160a01b03169190614d98565b600485015461199f9087614d8c565b600486015583546119b09087614d8c565b84556119bc3388614326565b92506119df6509184e72a000610f71876003015486614dee90919063ffffffff16565b60018501554360048501558354611abd5783600201549150600082118015611a0a575060065460ff16155b15611a90573360009081526009602052604090205460ff16611a6f576000611a43612710610f7160165486614dee90919063ffffffff16565b9050611a4f8184615cf6565b92508015611a6d57600354611a6d906001600160a01b031682615170565b505b336000908152600a602052604090205460ff16611a9057611a903383615170565b60045487148015611aaf57503360009081526010602052604090205415155b15611abd57611abd33614711565b604051868152879033907f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc69060200160405180910390a35050505050611b0260018055565b5050565b600060078281548110611b1b57611b1b615c41565b9060005260206000209060050201905080600201544311611b3a575050565b6004810154611b4d574360029091015550565b60038101546002820154600090611b64904361214d565b90506000611b91600b54610f718660010154611b8b60055487614dee90919063ffffffff16565b90614dee565b9050611bb7610f778560040154610f716509184e72a00085614dee90919063ffffffff16565b60038501555050436002909201919091555050565b611bd46146b7565b600060078281548110611be957611be9615c41565b6000918252602080832085845260088252604080852033865290925290832080548482556001820194909455600592909202016004810154909350909190611c319082614d8c565b60048401553360009081526009602052604081205460ff16611c8c5761271060155483611c5e9190615d0d565b611c689190615d42565b90508015611c8c576003548454611c8c916001600160a01b03918216911683614d98565b611cac33611c9a8385615cf6565b86546001600160a01b03169190614d98565b60045485148015611ccb57503360009081526010602052604090205415155b15611cd957611cd933614711565b604051859033907f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e5190600090a350505050611d1360018055565b50565b60075460005b81811015611b0257611d2d81611b06565b611d3681615c6d565b9050611d1c565b611d45614d2d565b8015611d5357611d53611d16565b600060078481548110611d6857611d68615c41565b90600052602060002090600502016001015490508260078581548110611d9057611d90615c41565b906000526020600020906005020160010181905550828114611dc9578281600b54611dbb9190615cf6565b611dc59190615cde565b600b555b837f17b8644f386d1c7c7138ef98b3c8035622bbe94d7be9b26f71d2654a547c294384600b54604051611dfd929190615ca1565b60405180910390a250505050565b611e13614d2d565b61084860006153ae565b600062989680601354611e3e846305f5e100611e399190615d0d565b6153fe565b611e489086615d0d565b611e529190615d0d565b611e5c9190615d42565b611e669084615cde565b9392505050565b600d8181548110611e7d57600080fd5b6000918252602090912001546001600160a01b0316905081565b611e9f614d2d565b805160005b8181101561165b576001600a6000858481518110611ec457611ec4615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110611f1557611f15615c41565b60200260200101516001600160a01b03167fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85560405160405180910390a280611f5c81615c6d565b915050611ea4565b611f6c614d2d565b60008111611fba5760405162461bcd60e51b815260206004820152601b60248201527a73686f756c642062652067726561746572207468616e207a65726f60281b604482015260640161082d565b7fd3ac2d872770cc6046cfd0df1cb07eee1ab4d7ca7af23c544b77c8eb57a0187f60135482604051611fed929190615ca1565b60405180910390a1601355565b612002614d2d565b6001600160a01b0381166120435760405162461bcd60e51b81526020600482015260086024820152676e6f6e2d7a65726f60c01b604482015260640161082d565b600354604080516001600160a01b03928316815291831660208301527f11f35a22548bcd4c3788ab4a7e4fba427a2014f02e5d5e2da9af62212c03183f910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b6120b4614d2d565b6001600160a01b0382166120da5760405162461bcd60e51b815260040161082d90615caf565b600280546001600160a01b0319166001600160a01b038416179055801561210357612103611d16565b7ff1378587e7ed13c7c228c8f0dfe2d4bc457d0ab13e880da789cfa3bfb612b8f2826040516121329190615a2b565b60405180910390a15050565b6000546001600160a01b031690565b6000611e668383615cf6565b612161614d2d565b600455565b61216e614d2d565b805160005b8181101561165b5760016009600085848151811061219357612193615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106121e4576121e4615c41565b60200260200101516001600160a01b03167faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a5460405160405180910390a28061222b81615c6d565b915050612173565b61223b6146b7565b336000908152600a602052604090205460ff161561226b5760405162461bcd60e51b815260040161082d90615d7b565b60125460ff166122ba5760405162461bcd60e51b815260206004820152601a60248201527927232a1039ba30b5b4b7339034b9903a3ab93732b21037b3331760311b604482015260640161082d565b6001600160a01b0383166000908152600c602052604090205460ff1661231f5760405162461bcd60e51b815260206004820152601a60248201527910dbdb1b1958dd1a5bdb881b9bdd081dda1a5d195b1a5cdd195960321b604482015260640161082d565b61232a600454611b06565b600060076004548154811061234157612341615c41565b60009182526020808320600454845260088252604080852033865290925292208054600590920290920192506123c85760405162461bcd60e51b815260206004820152602660248201527f596f752073686f756c64207374616b6520737175696420746f206465706f73696044820152653a1027232a1760d11b606482015260840161082d565b60006123d633600454614326565b600e54909150600090158015906124225750600e80546123f890600190615cf6565b8154811061240857612408615c41565b906000526020600020906003020160000154836004015411155b801561243c57503360009081526010602052604090205415155b156124f2576124eb846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b905061251e565b61251b836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff1661252e5780612531565b60005b8360020160008282546125449190615cde565b9091555050801580159061255a575060065460ff165b156125c9573360009081526009602052604090205460ff166125bf576000612593612710610f7160165485614dee90919063ffffffff16565b905061259f8183615cf6565b915080156125bd576003546125bd906001600160a01b031682615170565b505b6125c93382615170565b8460005b8181101561285157336001600160a01b038a16636352211e8a8a858181106125f7576125f7615c41565b905060200201356040518263ffffffff1660e01b815260040161261c91815260200190565b60206040518083038186803b15801561263457600080fd5b505afa158015612648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266c9190615da8565b6001600160a01b0316146126b55760405162461bcd60e51b815260206004820152601060248201526f29b2b73232b9103737ba1037bbb732b960811b604482015260640161082d565b886001600160a01b03166342842e0e33308b8b868181106126d8576126d8615c41565b905060200201356040518463ffffffff1660e01b81526004016126fd93929190615dc5565b600060405180830381600087803b15801561271757600080fd5b505af115801561272b573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600f6020526040812033918a8a8581811061275b5761275b615c41565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060006040518060600160405280336001600160a01b031681526020018a8a858181106127c2576127c2615c41565b602090810292909201358352506001600160a01b03808e169282019290925233600090815260108252604080822060019081018054808301825590845292849020865160039094020180549386166001600160a01b031994851617815593860151908401559093015160029091018054919092169216919091179055508061284981615c6d565b9150506125cd565b503360009081526010602052604081208054839290612871908490615cde565b90915550503360009081526011602090815260408083206001600160a01b038c168452909152812080548392906128a9908490615cde565b925050819055506128bc33600454614326565b92506128df6509184e72a000610f71876003015486614dee90919063ffffffff16565b60018501554360048501556040518681526001600160a01b0389169033907f61844abf440c7c5054f7c4806b549c2b53df8cace24f9937bdd044d14a3a4b07906020015b60405180910390a3505050505061165b60018055565b612941614d2d565b805160005b8181101561165b576000600a600085848151811061296657612966615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106129b7576129b7615c41565b60200260200101516001600160a01b03167f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b60405160405180910390a2806129fe81615c6d565b915050612946565b612a0e6146b7565b33600090815260106020526040902054612a3a5760405162461bcd60e51b815260040161082d90615c11565b612a45600454611b06565b6000600760045481548110612a5c57612a5c615c41565b60009182526020808320600454808552600883526040808620338088529452852060059094029091019450919291612a949190614326565b600e5490915060009015801590612ae05750600e8054612ab690600190615cf6565b81548110612ac657612ac6615c41565b906000526020600020906003020160000154836004015411155b8015612afa57503360009081526010602052604090205415155b15612bb057612ba9846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b9050612bdc565b612bd9836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff16612bec5780612bef565b60005b836002016000828254612c029190615cde565b90915550508015801590612c18575060065460ff165b15612c9e573360009081526009602052604090205460ff16612c7d576000612c51612710610f7160165485614dee90919063ffffffff16565b9050612c5d8183615cf6565b91508015612c7b57600354612c7b906001600160a01b031682615170565b505b336000908152600a602052604090205460ff16612c9e57612c9e3382615170565b8460005b81811015612fae576001600160a01b0389166000908152600f6020526040812033918a8a85818110612cd657612cd6615c41565b60209081029290920135835250810191909152604001600020546001600160a01b031614612d425760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b604482015260640161082d565b6000805b33600090815260106020526040902060010154831015612e825733600090815260106020526040902060010180546001600160a01b038d16919083908110612d9057612d90615c41565b60009182526020909120600260039092020101546001600160a01b0316148015612e1b5750898984818110612dc757612dc7615c41565b9050602002013560106000336001600160a01b03166001600160a01b031681526020019081526020016000206001018281548110612e0757612e07615c41565b906000526020600020906003020160010154145b8015612e635750336000908152601060205260408120600101805483908110612e4657612e46615c41565b60009182526020909120600390910201546001600160a01b031614155b15612e7057809150612e82565b80612e7a81615c6d565b915050612d46565b50336000908152601060205260408120600101805483908110612ea757612ea7615c41565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b03948516179055918c168152600f90915260408120818b8b86818110612ef557612ef5615c41565b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b039283161790558a166342842e0e30338c8c87818110612f4357612f43615c41565b905060200201356040518463ffffffff1660e01b8152600401612f6893929190615dc5565b600060405180830381600087803b158015612f8257600080fd5b505af1158015612f96573d6000803e3d6000fd5b50505050508080612fa690615c6d565b915050612ca2565b503360009081526010602052604081208054839290612fce908490615cf6565b90915550503360009081526011602090815260408083206001600160a01b038c16845290915281208054839290613006908490615cf6565b9250508190555061301933600454614326565b925061303c6509184e72a000610f71876003015486614dee90919063ffffffff16565b60018501554360048501556040518681526001600160a01b0389169033907f082338eeac0c81f88cffe8f4eed2acf4749c33235744a3c9d2e817f0260487cf90602001612923565b61308c614d2d565b6103e88161309a8486615cde565b6130a49190615cde565b11156130f25760405162461bcd60e51b815260206004820152601f60248201527f546178206d7573746e27742062652067726561746572207468616e2031302500604482015260640161082d565b60158390556014829055601681905560408051848152602081018490529081018290527f70af09a5cf3b34e649695a37b0c9e08fa8dd6844bac23db87408302c91bcd3da9060600160405180910390a1505050565b600e818154811061315757600080fd5b600091825260209091206003909102018054600182015460029092015490925060ff808216916101008104909116906201000090046001600160a01b031685565b6131a0614d2d565b6001600160a01b0381166131c65760405162461bcd60e51b815260040161082d90615caf565b6001600160a01b0381166000908152600c602052604090205460ff16156132245760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481dda1a5d1b1a5cdd195960721b604482015260640161082d565b6001600160a01b0381166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b031916909117905560045461329590611b06565b60006040518060a001604052804381526020016007600454815481106132bd576132bd615c41565b6000918252602080832060036005909302018201548452838101839052600160408086018290526001600160a01b03808a166060978801819052600e805494850181558752885193909502600080516020615eb183398151915281019390935592870151600080516020615ed183398151915283015586810151600080516020615ef18339815191529092018054968801516080890151909416620100000262010000600160b01b03199415156101000261ff00199415159490941661ffff1990981697909717929092179290921694909417909355915192935090917ffd3e65bdba4b863169e2c5f8526861de00f2a4067a831e3f128f30be65e819989190a25050565b6133ca614d2d565b60125460ff161561340e5760405162461bcd60e51b815260206004820152600e60248201526d616c726561647920656e61626c6560901b604482015260640161082d565b6012805460ff1916600117905560045461342790611b06565b60006040518060a0016040528043815260200160076004548154811061344f5761344f615c41565b6000918252602080832060036005909302018201548452600184820181905260408086018290526060958601859052600e8054928301815590945285519202600080516020615eb1833981519152810192909255840151600080516020615ed183398151915282015590830151600080516020615ef183398151915290910180549284015160808501516001600160a01b0316620100000262010000600160b01b03199115156101000261ff00199415159490941661ffff19909516949094179290921791909116919091179055600454600780549293507ff8cf2f8fd8b9978f10cd1774d8e10de4e8e5b663256efa422d44c840ebca3f7592909190811061355a5761355a615c41565b90600052602060002090600502016003015460405161357b91815260200190565b60405180910390a150565b61358e614d2d565b60125460ff166135d25760405162461bcd60e51b815260206004820152600f60248201526e616c72656164792064697361626c6560881b604482015260640161082d565b6012805460ff191690556004546135e890611b06565b60006040518060a0016040528043815260200160076004548154811061361057613610615c41565b6000918252602080832060036005909302018201548452600184820181905260408086018590526060958601859052600e8054928301815590945285519202600080516020615eb1833981519152810192909255840151600080516020615ed183398151915282015590830151600080516020615ef183398151915290910180549284015160808501516001600160a01b0316620100000262010000600160b01b03199115156101000261ff00199415159490941661ffff19909516949094179290921791909116919091179055600454600780549293507f75cd668f49a00fc3385ce960013085e54aa4959874de13f90efd9a968b4ec5b392909190811061355a5761355a615c41565b6137236146b7565b60065460ff166137af5760405162461bcd60e51b815260206004820152604b60248201527f7265776172642068617276657374696e67206973206e6f7420656e61626c656460448201527f2c206e65656420746f20776974686472617720746f6b656e20746f206861727660648201526a657374207265776172642160a81b608482015260a40161082d565b336000908152600a602052604090205460ff16156137df5760405162461bcd60e51b815260040161082d90615d7b565b6000600782815481106137f4576137f4615c41565b60009182526020808320858452600882526040808520338652909252922080546005909202909201925061385e5760405162461bcd60e51b81526020600482015260116024820152701a185c9d995cdd0e881b9bdd0819dbdbd9607a1b604482015260640161082d565b61386783611b06565b60006138733385614326565b600e54909150600090158015906138bf5750600e805461389590600190615cf6565b815481106138a5576138a5615c41565b906000526020600020906003020160000154836004015411155b80156138c9575084155b80156138e357503360009081526010602052604090205415155b1561399957613992846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b90506139c5565b6139c2836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60028301546139d49082615cde565b6000600285015590508015613a4d573360009081526009602052604090205460ff16613a43576000613a17612710610f7160165485614dee90919063ffffffff16565b9050613a238183615cf6565b91508015613a4157600354613a41906001600160a01b031682615170565b505b613a4d3382615170565b613a573386614326565b9150613a7a6509184e72a000610f71866003015485614dee90919063ffffffff16565b6001840155436004840155604051818152859033907f81ca9b2c230070eaa84787556b1aaf18bf1e2f07ea5d3dae4819db77a1a5b2249060200160405180910390a350505050611d1360018055565b613ad16146b7565b336000908152600a602052604090205460ff1615613b015760405162461bcd60e51b815260040161082d90615d7b565b60008111613b3f5760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc8185b5bdd5b9d60aa1b604482015260640161082d565b600060078381548110613b5457613b54615c41565b60009182526020808320868452600882526040808520338652909252922060059091029091019150613b8584611b06565b6000613b913386614326565b600e5490915060009015801590613bdd5750600e8054613bb390600190615cf6565b81548110613bc357613bc3615c41565b906000526020600020906003020160000154836004015411155b8015613be7575085155b8015613c0157503360009081526010602052604090205415155b15613cb757613cb0846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b9050613ce3565b613ce0836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff16613cf35780613cf6565b60005b836002016000828254613d099190615cde565b90915550508015801590613d1f575060065460ff165b15613d8e573360009081526009602052604090205460ff16613d84576000613d58612710610f7160165485614dee90919063ffffffff16565b9050613d648183615cf6565b91508015613d8257600354613d82906001600160a01b031682615170565b505b613d8e3382615170565b3360009081526009602052604081205460ff16613de657613dc0612710610f7160145489614dee90919063ffffffff16565b90508015613de6576003548554613de6916001600160a01b0391821691339116846154e3565b84546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613e16903090600401615a2b565b60206040518083038186803b158015613e2e57600080fd5b505afa158015613e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e669190615c88565b9050613e8a3330613e77858b615cf6565b89546001600160a01b03169291906154e3565b85546040516370a0823160e01b8152600091613f109184916001600160a01b0316906370a0823190613ec0903090600401615a2b565b60206040518083038186803b158015613ed857600080fd5b505afa158015613eec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190615c88565b8654909150613f1f9082614e06565b86556004870154613f309082614e06565b6004880155613f3f338a614326565b9450613f626509184e72a000610f71896003015488614dee90919063ffffffff16565b6001870155436004870155604051818152899033907f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca9060200160405180910390a350505050505050611b0260018055565b613fbc614d2d565b60065460ff16156140015760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b604482015260640161082d565b6006805460ff191660011790556040517ffaaf3db5ae119e7364070c3d19193e6a034281da8840f52ff5ba7d6973f49a1490600090a1565b614041614d2d565b6001600160a01b0381166140675760405162461bcd60e51b815260040161082d90615caf565b6001600160a01b0381166000908152600c602052604090205460ff166140ca5760405162461bcd60e51b8152602060048201526018602482015277105b1c9958591e481b9bdb880b481dda1a5d1b1a5cdd195960421b604482015260640161082d565b6001600160a01b0381166000908152600c60205260408120805460ff19169055600d54905b818110156141bd57826001600160a01b0316600d828154811061411457614114615c41565b6000918252602090912001546001600160a01b031614156141ab57600d61413c600184615cf6565b8154811061414c5761414c615c41565b600091825260209091200154600d80546001600160a01b03909216918390811061417857614178615c41565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506141bd565b806141b581615c6d565b9150506140ef565b50600d8054806141cf576141cf615de9565b600082815260209020810160001990810180546001600160a01b03191690550190556004546141fd90611b06565b60006040518060a0016040528043815260200160076004548154811061422557614225615c41565b600091825260208083206003600590930201820154845283810183905260408085018490526001600160a01b03808a166060968701819052600e805460018101825590875288519502600080516020615eb183398151915281019590955592870151600080516020615ed183398151915285015586820151600080516020615ef18339815191529094018054968801516080890151909216620100000262010000600160b01b03199215156101000261ff00199615159690961661ffff1990981697909717949094171694909417909155915192935090917f1aa298a598f00805d83c9762acb08ee6fe4383582baa50875d3e7628646e75bc9190a2505050565b60008181526008602090815260408083206001600160a01b03861684528252808320815160a08101835281548082526001830154948201949094526002820154928101929092526003810154606083015260049081015460808301525490919084148015614396575060125460ff165b156143ba5760006143a686614e12565b90506143b6836000015182611e1d565b9150505b949350505050565b6143ca614d2d565b6001600160a01b03811661442f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082d565b611d13816153ae565b6001600160a01b038116600090815260106020526040902054606090819015614699576001600160a01b0383166000908152601060205260408120546001600160401b0381111561448b5761448b61595d565b6040519080825280602002602001820160405280156144b4578160200160208202803683370190505b506001600160a01b038516600090815260106020526040812054919250906001600160401b038111156144e9576144e961595d565b604051908082528060200260200182016040528015614512578160200160208202803683370190505b5090506000805b6001600160a01b03871660009081526010602052604090206001015481101561468d576001600160a01b038716600090815260106020526040812060010180548390811061456957614569615c41565b60009182526020909120600390910201546001600160a01b03161461467b576001600160a01b03871660009081526010602052604090206001018054829081106145b5576145b5615c41565b9060005260206000209060030201600101548483815181106145d9576145d9615c41565b60200260200101818152505060106000886001600160a01b03166001600160a01b03168152602001908152602001600020600101818154811061461e5761461e615c41565b906000526020600020906003020160020160009054906101000a90046001600160a01b031683838151811061465557614655615c41565b6001600160a01b03909216602092830291909101909101528161467781615c6d565b9250505b8061468581615c6d565b915050614519565b50919590945092505050565b50506040805160008082526020820190815281830190925292909150565b6002600154141561470a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161082d565b6002600155565b61471c600454611b06565b600060076004548154811061473357614733615c41565b600091825260208083206004548085526008835260408086206001600160a01b03891687529093529184206005909302019350909190614774908590614326565b600e54909150600090158015906147c05750600e805461479690600190615cf6565b815481106147a6576147a6615c41565b906000526020600020906003020160000154836004015411155b80156147da57503360009081526010602052604090205415155b1561489057614889846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b90506148bc565b6148b9836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff166148cc57806148cf565b60005b8360020160008282546148e29190615cde565b909155505080158015906148f8575060065460ff165b15614990576001600160a01b03851660009081526009602052604090205460ff1661496657600061493a612710610f7160165485614dee90919063ffffffff16565b90506149468183615cf6565b9150801561496457600354614964906001600160a01b031682615170565b505b6001600160a01b0385166000908152600a602052604090205460ff16614990576149908582615170565b33600090815260106020526040908190205490516001600160a01b038716917f4139fae8d97181e6ae21323d4f522437780cbec409d1489abe4d92a018bcfbf8916149dd91815260200190565b60405180910390a26001600160a01b03851660009081526010602052604081208190555b6001600160a01b038616600090815260106020526040902060010154811015614ceb576001600160a01b0386166000908152601060205260408120600101805483908110614a5157614a51615c41565b60009182526020909120600390910201546001600160a01b031614614cd9576001600160a01b0386166000908152601060205260408120600101805483908110614a9d57614a9d615c41565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b0394851617905591881681526010909152604081206001018054600f91839185908110614af257614af2615c41565b60009182526020808320600260039093020191909101546001600160a01b0390811684528382019490945260409283018220938b16825260109052908120600101805485908110614b4557614b45615c41565b6000918252602080832060016003909302018201548452838101949094526040928301822080546001600160a01b039687166001600160a01b0319909116179055938a168152601183528181206010909352908120909201805483919085908110614bb257614bb2615c41565b60009182526020808320600260039093020191909101546001600160a01b0390811684528382019490945260409283018220949094559189168252601090925220600101805482908110614c0857614c08615c41565b906000526020600020906003020160020160009054906101000a90046001600160a01b03166001600160a01b03166342842e0e3088601060008b6001600160a01b03166001600160a01b031681526020019081526020016000206001018581548110614c7657614c76615c41565b9060005260206000209060030201600101546040518463ffffffff1660e01b8152600401614ca693929190615dc5565b600060405180830381600087803b158015614cc057600080fd5b505af1158015614cd4573d6000803e3d6000fd5b505050505b80614ce381615c6d565b915050614a01565b50614cf885600454614326565b9150614d1b6509184e72a000610f71866003015485614dee90919063ffffffff16565b60018401555050436004909101555050565b33614d3661213e565b6001600160a01b0316146108485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082d565b6000611e668284615cf6565b61165b8363a9059cbb60e01b8484604051602401614db7929190615dff565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261550a565b6000611e668284615d0d565b6000611e668284615d42565b6000611e668284615cde565b600d5460009081805b82811015614e95576001600160a01b0385166000908152601160205260408120600d805491929184908110614e5257614e52615c41565b60009182526020808320909101546001600160a01b03168352820192909252604001902054614e819083615cde565b915080614e8d81615c6d565b915050614e1b565b509392505050565b600e5460009081614eae8582614326565b90506000614f21614f006509184e72a000610f71600e614ecf600189615cf6565b81548110614edf57614edf615c41565b90600052602060002090600302016001015486614dee90919063ffffffff16565b61106d6509184e72a000610f718b6060015187614dee90919063ffffffff16565b90506000614f2e87614e12565b90506000614f40876000015183611e1d565b60125490915060ff16855b6001811061516157600e614f60600183615cf6565b81548110614f7057614f70615c41565b90600052602060002090600302016000015489608001511115614f9257615161565b600e614f9f600183615cf6565b81548110614faf57614faf615c41565b600091825260209091206002600390920201015460ff1615615019579015908115614fff57614fee81600114806111695750600e611140600284615cf6565b614ff89086615cde565b9450615151565b614fee81600114806112315750600e611208600284615cf6565b6001600160a01b038a16600090815260116020526040812081600e61503f600186615cf6565b8154811061504f5761504f615c41565b60009182526020808320600392909202909101600201546201000090046001600160a01b03168352820192909252604001902054905080156150f757600e615098600184615cf6565b815481106150a8576150a8615c41565b906000526020600020906003020160020160019054906101000a900460ff166150da576150d58186615cde565b6150e4565b6150e48186615cf6565b94506150f48a6000015186611e1d565b93505b82156151285761511782600114806113f35750600e6113ca600285615cf6565b6151219087615cde565b955061514f565b61514282600114806114bb5750600e611492600285615cf6565b61514c9087615cde565b95505b505b61515a81615d64565b9050614f4b565b50929998505050505050505050565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a08231906151a1903090600401615a2b565b60206040518083038186803b1580156151b957600080fd5b505afa1580156151cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151f19190615c88565b9050600060076004548154811061520a5761520a615c41565b90600052602060002090600502019050600081600401548361522c9190615cf6565b90506000818511156152c35760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061526a9089908690600401615dff565b602060405180830381600087803b15801561528457600080fd5b505af1158015615298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152bc9190615e18565b905061534a565b60025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906152f59089908990600401615dff565b602060405180830381600087803b15801561530f57600080fd5b505af1158015615323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153479190615e18565b90505b806153a65760405162461bcd60e51b815260206004820152602660248201527f73616665537175696467726f775472616e736665723a205472616e736665722060448201526519985a5b195960d21b606482015260840161082d565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008161540d57506000919050565b6000600161541a846155dc565b901c6001901b9050600181848161543357615433615d2c565b048201901c9050600181848161544b5761544b615d2c565b048201901c9050600181848161546357615463615d2c565b048201901c9050600181848161547b5761547b615d2c565b048201901c9050600181848161549357615493615d2c565b048201901c905060018184816154ab576154ab615d2c565b048201901c905060018184816154c3576154c3615d2c565b048201901c9050611e66818285816154dd576154dd615d2c565b04615671565b615504846323b872dd60e01b858585604051602401614db793929190615dc5565b50505050565b600061555f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166156879092919063ffffffff16565b80519091501561165b578080602001905181019061557d9190615e18565b61165b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161082d565b600080608083901c156155f157608092831c92015b604083901c1561560357604092831c92015b602083901c1561561557602092831c92015b601083901c1561562757601092831c92015b600883901c1561563957600892831c92015b600483901c1561564b57600492831c92015b600283901c1561565d57600292831c92015b600183901c1561566b576001015b92915050565b60008183106156805781611e66565b5090919050565b60606143ba848460008585600080866001600160a01b031685876040516156ae9190615e61565b60006040518083038185875af1925050503d80600081146156eb576040519150601f19603f3d011682016040523d82523d6000602084013e6156f0565b606091505b50915091506157018783838761570c565b979650505050505050565b60608315615778578251615771576001600160a01b0385163b6157715760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161082d565b50816143ba565b6143ba838381511561578d5781518083602001fd5b8060405162461bcd60e51b815260040161082d9190615e7d565b6001600160a01b0381168114611d1357600080fd5b80356157c7816157a7565b919050565b600080604083850312156157df57600080fd5b82356157ea816157a7565b946020939093013593505050565b6000806040838503121561580b57600080fd5b8235615816816157a7565b91506020830135615826816157a7565b809150509250929050565b60006020828403121561584357600080fd5b5035919050565b8015158114611d1357600080fd5b60008060006060848603121561586d57600080fd5b8335615878816157a7565b925060208401359150604084013561588f8161584a565b809150509250925092565b6000806000806000608086880312156158b257600080fd5b85356158bd816157a7565b945060208601356158cd816157a7565b93506040860135925060608601356001600160401b03808211156158f057600080fd5b818801915088601f83011261590457600080fd5b81358181111561591357600080fd5b89602082850101111561592557600080fd5b9699959850939650602001949392505050565b6000806040838503121561594b57600080fd5b823591506020830135615826816157a7565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561598657600080fd5b82356001600160401b038082111561599d57600080fd5b818501915085601f8301126159b157600080fd5b8135818111156159c3576159c361595d565b8060051b604051601f19603f830116810181811085821117156159e8576159e861595d565b604052918252848201925083810185019188831115615a0657600080fd5b938501935b8285101561158257615a1c856157bc565b84529385019392850192615a0b565b6001600160a01b0391909116815260200190565b60008060408385031215615a5257600080fd5b50508035926020909101359150565b600060208284031215615a7357600080fd5b8135611e66816157a7565b600080600060608486031215615a9357600080fd5b8335925060208401359150604084013561588f8161584a565b60008060408385031215615abf57600080fd5b8235615aca816157a7565b915060208301356158268161584a565b600080600060408486031215615aef57600080fd5b8335615afa816157a7565b925060208401356001600160401b0380821115615b1657600080fd5b818601915086601f830112615b2a57600080fd5b813581811115615b3957600080fd5b8760208260051b8501011115615b4e57600080fd5b6020830194508093505050509250925092565b600080600060608486031215615b7657600080fd5b505081359360208301359350604090920135919050565b604080825283519082018190526000906020906060840190828701845b82811015615bc657815184529284019290840190600101615baa565b5050508381038285015284518082528583019183019060005b81811015615c045783516001600160a01b031683529284019291840191600101615bdf565b5090979650505050505050565b602080825260169082015275165bdd481a185d99481b9bc8139195081cdd185ad95960521b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615c8157615c81615c57565b5060010190565b600060208284031215615c9a57600080fd5b5051919050565b918252602082015260400190565b60208082526015908201527443616e2774206265207a65726f206164647265737360581b604082015260600190565b60008219821115615cf157615cf1615c57565b500190565b600082821015615d0857615d08615c57565b500390565b6000816000190483118215151615615d2757615d27615c57565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615d5f57634e487b7160e01b600052601260045260246000fd5b500490565b600081615d7357615d73615c57565b506000190190565b6020808252601390820152721d5cd95c881a5cc8189b1858dadb1a5cdd1959606a1b604082015260600190565b600060208284031215615dba57600080fd5b8151611e66816157a7565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060208284031215615e2a57600080fd5b8151611e668161584a565b60005b83811015615e50578181015183820152602001615e38565b838111156155045750506000910152565b60008251615e73818460208701615e35565b9190910192915050565b6020815260008251806020840152615e9c816040850160208701615e35565b601f01601f1916919091016040019291505056febb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fdbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3febb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ffa264697066735822122095c8007a4d86eeeb0855c91935d9f95bc9dfdab06aae9624cc4d407d3f259e2964736f6c63430008090033000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a0000000000000000000000001cddea8931ecf9499296863d949aecdd23b41a4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001063adb
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102925760003560e01c8062ccb66a146102975780630112d431146102a1578063016d00d8146102b457806305adfd5d146102d6578063081e3eda1461030f5780630ba84cd2146103175780630dec23121461032a57806311216ea11461033d578063150b7a02146103455780631526fe271461037d57806317caf6f1146103c2578063254e5c94146103cb57806336470542146103e757806339745791146103fa5780633fa16d991461040d578063441a3e701461044e57806348473e571461046157806348cd4cb11461048457806351eb05a6146104ab5780635312ea8e146104be578063630b5ba1146104d157806364482f79146104d95780636f9170f6146104ec578063715018a61461050f57806376098761146105175780637e78ab7c1461052a578063817fd5131461053d57806382c8028b1461055057806382da4c3b146105635780638705fcd414610576578063895698a6146105895780638da5cb5b1461059c5780638dbb1e3a146105a457806391942f23146105b757806391c5f4a6146105ca57806393f1a40b146105dd57806399d5cc0e1461064d5780639bf4113514610660578063a01ea1b414610673578063a071bf1314610686578063a787ca29146106a6578063a9fba703146106b9578063ac261d8e146106c2578063b8a24252146106cb578063bb90f1a014610715578063bcdbfe681461071e578063c5ccceb914610731578063cbe7159f14610739578063db0c7f2b14610746578063ddc632621461074e578063e2bbb15814610761578063e47d606014610774578063e6cfc67a14610797578063eba705951461079f578063f137eeb8146107b2578063f2fde38b146107c5578063feece0ab146107d8575b600080fd5b61029f6107f9565b005b61029f6102af3660046157cc565b61084a565b6012546102c19060ff1681565b60405190151581526020015b60405180910390f35b6103016102e43660046157f8565b601160209081526000928352604080842090915290825290205481565b6040519081526020016102cd565b600754610301565b61029f610325366004615831565b610a25565b61029f610338366004615858565b610a75565b61029f610d1d565b61036461035336600461589a565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102cd565b61039061038b366004615831565b610d9f565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102cd565b610301600b5481565b6103d46103e881565b60405161ffff90911681526020016102cd565b6103016103f5366004615938565b610dea565b61029f610408366004615973565b61158e565b61044161041b3660046157cc565b600f6020908152600092835260408084209091529082529020546001600160a01b031681565b6040516102cd9190615a2b565b61029f61045c366004615a3f565b611660565b6102c161046f366004615a61565b600c6020526000908152604090205460ff1681565b6103017f0000000000000000000000000000000000000000000000000000000001063adb81565b61029f6104b9366004615831565b611b06565b61029f6104cc366004615831565b611bcc565b61029f611d16565b61029f6104e7366004615a7e565b611d3d565b6102c16104fa366004615a61565b60096020526000908152604090205460ff1681565b61029f611e0b565b600254610441906001600160a01b031681565b610301610538366004615a3f565b611e1d565b61044161054b366004615831565b611e6d565b61029f61055e366004615973565b611e97565b61029f610571366004615831565b611f64565b61029f610584366004615a61565b611ffa565b61029f610597366004615aac565b6120ac565b61044161213e565b6103016105b2366004615a3f565b61214d565b61029f6105c5366004615831565b612159565b61029f6105d8366004615973565b612166565b6106256105eb366004615938565b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102cd565b61029f61065b366004615ada565b612233565b61029f61066e366004615973565b612939565b61029f610681366004615ada565b612a06565b610301610694366004615a61565b60106020526000908152604090205481565b61029f6106b4366004615b61565b613084565b61030160045481565b61030160135481565b6106de6106d9366004615831565b613147565b6040805195865260208601949094529115159284019290925290151560608301526001600160a01b0316608082015260a0016102cd565b61030160055481565b61029f61072c366004615a61565b613198565b61029f6133c2565b6006546102c19060ff1681565b61029f613586565b61029f61075c366004615831565b61371b565b61029f61076f366004615a3f565b613ac9565b6102c1610782366004615a61565b600a6020526000908152604090205460ff1681565b61029f613fb4565b61029f6107ad366004615a61565b614039565b6103016107c03660046157cc565b614326565b61029f6107d3366004615a61565b6143c2565b6107eb6107e6366004615a61565b614438565b6040516102cd929190615b8d565b6108016146b7565b336000908152601060205260409020546108365760405162461bcd60e51b815260040161082d90615c11565b60405180910390fd5b61083f33614711565b61084860018055565b565b610852614d2d565b6001600160a01b03821661089b5760405162461bcd60e51b815260206004820152601060248201526f6e6f6e2d7a65726f206164647265737360801b604482015260640161082d565b600754600090815b8181101561092457846001600160a01b0316600782815481106108c8576108c8615c41565b60009182526020909120600590910201546001600160a01b0316141561091457600781815481106108fb576108fb615c41565b9060005260206000209060050201600401549250610924565b61091d81615c6d565b90506108a3565b506040516370a0823160e01b81526000906001600160a01b038616906370a0823190610954903090600401615a2b565b60206040518083038186803b15801561096c57600080fd5b505afa158015610980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a49190615c88565b905060006109b28285614d8c565b90506000851180156109c45750808511155b156109dd576109dd6001600160a01b0387163387614d98565b6040518581526001600160a01b0387169033907f0bec8af1e4aaf435321e7041133dfbf5f5b6742217ae28770c66657df0da54539060200160405180910390a3505050505050565b610a2d614d2d565b610a35611d16565b7f345ebf2744639e33d1b51c7277781ae0380afc2dd8b5645a1a535431c48fd13060055482604051610a68929190615ca1565b60405180910390a1600555565b610a7d614d2d565b6001600160a01b038316610aa35760405162461bcd60e51b815260040161082d90615caf565b8015610ab157610ab1611d16565b60075460005b81811015610b4b57846001600160a01b031660078281548110610adc57610adc615c41565b60009182526020909120600590910201546001600160a01b03161415610b395760405162461bcd60e51b8152602060048201526012602482015271141bdbdb08105b1c9958591e48185919195960721b604482015260640161082d565b80610b4381615c6d565b915050610ab7565b5060007f0000000000000000000000000000000000000000000000000000000001063adb4311610b9b577f0000000000000000000000000000000000000000000000000000000001063adb610b9d565b435b905083600b54610bad9190615cde565b600b556040805160a0810182526001600160a01b03878116808352602083018881529383018581526000606085018181526080860182815260078054600180820183559482905297517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600590990298890180546001600160a01b031916919098161790965596517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68987015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a86015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b85015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c90930192909255549091610cdb91615cf6565b7fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d86600b54604051610d0e929190615ca1565b60405180910390a35050505050565b610d25614d2d565b60065460ff16610d6a5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48191a5cd8589b195960821b604482015260640161082d565b6006805460ff191690556040517fa812cff88cc269622acf35c5790553954500f95fc0451c77fc80c97753d81d9e90600090a1565b60078181548110610daf57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60008060078481548110610e0057610e00615c41565b90600052602060002090600502016040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000600860008681526020019081526020016000206000856001600160a01b03166001600160a01b031681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600082606001519050826040015143118015610f085750608083015115155b15610f83576000610f1d84604001514361214d565b90506000600b54856020015160055484610f379190615d0d565b610f419190615d0d565b610f4b9190615d42565b9050610f7e610f778660800151610f716509184e72a00085614dee90919063ffffffff16565b90614dfa565b8490614e06565b925050505b6000610f8f8688614326565b600e5490915060009015801590610fdb5750600e8054610fb190600190615cf6565b81548110610fc157610fc1615c41565b906000526020600020906003020160000154846080015111155b8015610fe5575087155b8015610fff57503360009081526010602052604090205415155b1561155357600e80549061107390611059906509184e72a00090610f7190611028600187615cf6565b8154811061103857611038615c41565b90600052602060002090600302016001015487614dee90919063ffffffff16565b61106d6509184e72a000610f718789614dee565b90614d8c565b9150600061108089614e12565b90506000611092876000015183611e1d565b60125490915060ff16835b6001811061154957600e6110b2600183615cf6565b815481106110c2576110c2615c41565b906000526020600020906003020160000154896080015111156110e457611549565b600e6110f1600183615cf6565b8154811061110157611101615c41565b600091825260209091206002600390920201015460ff16156112cc5790159081156111ee576111dd81600114806111695750600e611140600284615cf6565b8154811061115057611150615c41565b9060005260206000209060030201600001548a60800151115b61118c576111876509184e72a000610f71600e611028600287615cf6565b611192565b89602001515b61106d6509184e72a000610f71600e6111ac600188615cf6565b815481106111bc576111bc615c41565b90600052602060002090600302016001015488614dee90919063ffffffff16565b6111e79087615cde565b9550611539565b6111dd81600114806112315750600e611208600284615cf6565b8154811061121857611218615c41565b9060005260206000209060030201600001548a60800151115b6112805761127b6509184e72a000610f71600e61124f600287615cf6565b8154811061125f5761125f615c41565b60009182526020909120600160039092020101548d5190614dee565b611286565b89602001515b61106d6509184e72a000610f71600e6112a0600188615cf6565b815481106112b0576112b0615c41565b60009182526020909120600160039092020101548e5190614dee565b6001600160a01b038c16600090815260116020526040812081600e6112f2600186615cf6565b8154811061130257611302615c41565b60009182526020808320600392909202909101600201546201000090046001600160a01b03168352820192909252604001902054905080156113aa57600e61134b600184615cf6565b8154811061135b5761135b615c41565b906000526020600020906003020160020160019054906101000a900460ff1661138d576113888186615cde565b611397565b6113978186615cf6565b94506113a78a6000015186611e1d565b93505b82156114785761146782600114806113f35750600e6113ca600285615cf6565b815481106113da576113da615c41565b9060005260206000209060030201600001548b60800151115b611416576114116509184e72a000610f71600e6111ac600288615cf6565b61141c565b8a602001515b61106d6509184e72a000610f71600e611436600189615cf6565b8154811061144657611446615c41565b90600052602060002090600302016001015489614dee90919063ffffffff16565b6114719088615cde565b9650611537565b61152a82600114806114bb5750600e611492600285615cf6565b815481106114a2576114a2615c41565b9060005260206000209060030201600001548b60800151115b6114de576114d96509184e72a000610f71600e6112a0600288615cf6565b6114e4565b8a602001515b61106d6509184e72a000610f71600e6114fe600189615cf6565b8154811061150e5761150e615c41565b60009182526020909120600160039092020101548f5190614dee565b6115349088615cde565b96505b505b61154281615d64565b905061109d565b5050505050611573565b60208401516115709061106d6509184e72a000610f718688614dee565b90505b60408401516115829082615cde565b98975050505050505050565b611596614d2d565b805160005b8181101561165b576000600960008584815181106115bb576115bb615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555082818151811061160c5761160c615c41565b60200260200101516001600160a01b03167f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da4679160405160405180910390a28061165381615c6d565b91505061159b565b505050565b6116686146b7565b60006007838154811061167d5761167d615c41565b6000918252602080832086845260088252604080852033865290925292208054600590920290920192508311156116eb5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015260640161082d565b6116f484611b06565b60006117003386614326565b600e549091506000901580159061174c5750600e805461172290600190615cf6565b8154811061173257611732615c41565b906000526020600020906003020160000154836004015411155b8015611759575060045486145b801561177357503360009081526010602052604090205415155b1561182957611822846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b9050611855565b611852836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff166118655780611868565b60005b83600201600082825461187b9190615cde565b90915550600090508115801590611894575060065460ff165b1561191a573360009081526009602052604090205460ff166118f95760006118cd612710610f7160165486614dee90919063ffffffff16565b90506118d98184615cf6565b925080156118f7576003546118f7906001600160a01b031682615170565b505b336000908152600a602052604090205460ff1661191a5761191a3383615170565b3360009081526009602052604090205460ff1661197057612710601554876119429190615d0d565b61194c9190615d42565b90508015611970576003548554611970916001600160a01b03918216911683614d98565b6119903361197e8389615cf6565b87546001600160a01b03169190614d98565b600485015461199f9087614d8c565b600486015583546119b09087614d8c565b84556119bc3388614326565b92506119df6509184e72a000610f71876003015486614dee90919063ffffffff16565b60018501554360048501558354611abd5783600201549150600082118015611a0a575060065460ff16155b15611a90573360009081526009602052604090205460ff16611a6f576000611a43612710610f7160165486614dee90919063ffffffff16565b9050611a4f8184615cf6565b92508015611a6d57600354611a6d906001600160a01b031682615170565b505b336000908152600a602052604090205460ff16611a9057611a903383615170565b60045487148015611aaf57503360009081526010602052604090205415155b15611abd57611abd33614711565b604051868152879033907f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc69060200160405180910390a35050505050611b0260018055565b5050565b600060078281548110611b1b57611b1b615c41565b9060005260206000209060050201905080600201544311611b3a575050565b6004810154611b4d574360029091015550565b60038101546002820154600090611b64904361214d565b90506000611b91600b54610f718660010154611b8b60055487614dee90919063ffffffff16565b90614dee565b9050611bb7610f778560040154610f716509184e72a00085614dee90919063ffffffff16565b60038501555050436002909201919091555050565b611bd46146b7565b600060078281548110611be957611be9615c41565b6000918252602080832085845260088252604080852033865290925290832080548482556001820194909455600592909202016004810154909350909190611c319082614d8c565b60048401553360009081526009602052604081205460ff16611c8c5761271060155483611c5e9190615d0d565b611c689190615d42565b90508015611c8c576003548454611c8c916001600160a01b03918216911683614d98565b611cac33611c9a8385615cf6565b86546001600160a01b03169190614d98565b60045485148015611ccb57503360009081526010602052604090205415155b15611cd957611cd933614711565b604051859033907f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e5190600090a350505050611d1360018055565b50565b60075460005b81811015611b0257611d2d81611b06565b611d3681615c6d565b9050611d1c565b611d45614d2d565b8015611d5357611d53611d16565b600060078481548110611d6857611d68615c41565b90600052602060002090600502016001015490508260078581548110611d9057611d90615c41565b906000526020600020906005020160010181905550828114611dc9578281600b54611dbb9190615cf6565b611dc59190615cde565b600b555b837f17b8644f386d1c7c7138ef98b3c8035622bbe94d7be9b26f71d2654a547c294384600b54604051611dfd929190615ca1565b60405180910390a250505050565b611e13614d2d565b61084860006153ae565b600062989680601354611e3e846305f5e100611e399190615d0d565b6153fe565b611e489086615d0d565b611e529190615d0d565b611e5c9190615d42565b611e669084615cde565b9392505050565b600d8181548110611e7d57600080fd5b6000918252602090912001546001600160a01b0316905081565b611e9f614d2d565b805160005b8181101561165b576001600a6000858481518110611ec457611ec4615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110611f1557611f15615c41565b60200260200101516001600160a01b03167fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85560405160405180910390a280611f5c81615c6d565b915050611ea4565b611f6c614d2d565b60008111611fba5760405162461bcd60e51b815260206004820152601b60248201527a73686f756c642062652067726561746572207468616e207a65726f60281b604482015260640161082d565b7fd3ac2d872770cc6046cfd0df1cb07eee1ab4d7ca7af23c544b77c8eb57a0187f60135482604051611fed929190615ca1565b60405180910390a1601355565b612002614d2d565b6001600160a01b0381166120435760405162461bcd60e51b81526020600482015260086024820152676e6f6e2d7a65726f60c01b604482015260640161082d565b600354604080516001600160a01b03928316815291831660208301527f11f35a22548bcd4c3788ab4a7e4fba427a2014f02e5d5e2da9af62212c03183f910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b6120b4614d2d565b6001600160a01b0382166120da5760405162461bcd60e51b815260040161082d90615caf565b600280546001600160a01b0319166001600160a01b038416179055801561210357612103611d16565b7ff1378587e7ed13c7c228c8f0dfe2d4bc457d0ab13e880da789cfa3bfb612b8f2826040516121329190615a2b565b60405180910390a15050565b6000546001600160a01b031690565b6000611e668383615cf6565b612161614d2d565b600455565b61216e614d2d565b805160005b8181101561165b5760016009600085848151811061219357612193615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106121e4576121e4615c41565b60200260200101516001600160a01b03167faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a5460405160405180910390a28061222b81615c6d565b915050612173565b61223b6146b7565b336000908152600a602052604090205460ff161561226b5760405162461bcd60e51b815260040161082d90615d7b565b60125460ff166122ba5760405162461bcd60e51b815260206004820152601a60248201527927232a1039ba30b5b4b7339034b9903a3ab93732b21037b3331760311b604482015260640161082d565b6001600160a01b0383166000908152600c602052604090205460ff1661231f5760405162461bcd60e51b815260206004820152601a60248201527910dbdb1b1958dd1a5bdb881b9bdd081dda1a5d195b1a5cdd195960321b604482015260640161082d565b61232a600454611b06565b600060076004548154811061234157612341615c41565b60009182526020808320600454845260088252604080852033865290925292208054600590920290920192506123c85760405162461bcd60e51b815260206004820152602660248201527f596f752073686f756c64207374616b6520737175696420746f206465706f73696044820152653a1027232a1760d11b606482015260840161082d565b60006123d633600454614326565b600e54909150600090158015906124225750600e80546123f890600190615cf6565b8154811061240857612408615c41565b906000526020600020906003020160000154836004015411155b801561243c57503360009081526010602052604090205415155b156124f2576124eb846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b905061251e565b61251b836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff1661252e5780612531565b60005b8360020160008282546125449190615cde565b9091555050801580159061255a575060065460ff165b156125c9573360009081526009602052604090205460ff166125bf576000612593612710610f7160165485614dee90919063ffffffff16565b905061259f8183615cf6565b915080156125bd576003546125bd906001600160a01b031682615170565b505b6125c93382615170565b8460005b8181101561285157336001600160a01b038a16636352211e8a8a858181106125f7576125f7615c41565b905060200201356040518263ffffffff1660e01b815260040161261c91815260200190565b60206040518083038186803b15801561263457600080fd5b505afa158015612648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266c9190615da8565b6001600160a01b0316146126b55760405162461bcd60e51b815260206004820152601060248201526f29b2b73232b9103737ba1037bbb732b960811b604482015260640161082d565b886001600160a01b03166342842e0e33308b8b868181106126d8576126d8615c41565b905060200201356040518463ffffffff1660e01b81526004016126fd93929190615dc5565b600060405180830381600087803b15801561271757600080fd5b505af115801561272b573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600f6020526040812033918a8a8581811061275b5761275b615c41565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060006040518060600160405280336001600160a01b031681526020018a8a858181106127c2576127c2615c41565b602090810292909201358352506001600160a01b03808e169282019290925233600090815260108252604080822060019081018054808301825590845292849020865160039094020180549386166001600160a01b031994851617815593860151908401559093015160029091018054919092169216919091179055508061284981615c6d565b9150506125cd565b503360009081526010602052604081208054839290612871908490615cde565b90915550503360009081526011602090815260408083206001600160a01b038c168452909152812080548392906128a9908490615cde565b925050819055506128bc33600454614326565b92506128df6509184e72a000610f71876003015486614dee90919063ffffffff16565b60018501554360048501556040518681526001600160a01b0389169033907f61844abf440c7c5054f7c4806b549c2b53df8cace24f9937bdd044d14a3a4b07906020015b60405180910390a3505050505061165b60018055565b612941614d2d565b805160005b8181101561165b576000600a600085848151811061296657612966615c41565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106129b7576129b7615c41565b60200260200101516001600160a01b03167f7534c63860313c46c473e4e98328f37017e9674e2162faf1a3ad7a96236c3b7b60405160405180910390a2806129fe81615c6d565b915050612946565b612a0e6146b7565b33600090815260106020526040902054612a3a5760405162461bcd60e51b815260040161082d90615c11565b612a45600454611b06565b6000600760045481548110612a5c57612a5c615c41565b60009182526020808320600454808552600883526040808620338088529452852060059094029091019450919291612a949190614326565b600e5490915060009015801590612ae05750600e8054612ab690600190615cf6565b81548110612ac657612ac6615c41565b906000526020600020906003020160000154836004015411155b8015612afa57503360009081526010602052604090205415155b15612bb057612ba9846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b9050612bdc565b612bd9836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff16612bec5780612bef565b60005b836002016000828254612c029190615cde565b90915550508015801590612c18575060065460ff165b15612c9e573360009081526009602052604090205460ff16612c7d576000612c51612710610f7160165485614dee90919063ffffffff16565b9050612c5d8183615cf6565b91508015612c7b57600354612c7b906001600160a01b031682615170565b505b336000908152600a602052604090205460ff16612c9e57612c9e3382615170565b8460005b81811015612fae576001600160a01b0389166000908152600f6020526040812033918a8a85818110612cd657612cd6615c41565b60209081029290920135835250810191909152604001600020546001600160a01b031614612d425760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b604482015260640161082d565b6000805b33600090815260106020526040902060010154831015612e825733600090815260106020526040902060010180546001600160a01b038d16919083908110612d9057612d90615c41565b60009182526020909120600260039092020101546001600160a01b0316148015612e1b5750898984818110612dc757612dc7615c41565b9050602002013560106000336001600160a01b03166001600160a01b031681526020019081526020016000206001018281548110612e0757612e07615c41565b906000526020600020906003020160010154145b8015612e635750336000908152601060205260408120600101805483908110612e4657612e46615c41565b60009182526020909120600390910201546001600160a01b031614155b15612e7057809150612e82565b80612e7a81615c6d565b915050612d46565b50336000908152601060205260408120600101805483908110612ea757612ea7615c41565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b03948516179055918c168152600f90915260408120818b8b86818110612ef557612ef5615c41565b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b039283161790558a166342842e0e30338c8c87818110612f4357612f43615c41565b905060200201356040518463ffffffff1660e01b8152600401612f6893929190615dc5565b600060405180830381600087803b158015612f8257600080fd5b505af1158015612f96573d6000803e3d6000fd5b50505050508080612fa690615c6d565b915050612ca2565b503360009081526010602052604081208054839290612fce908490615cf6565b90915550503360009081526011602090815260408083206001600160a01b038c16845290915281208054839290613006908490615cf6565b9250508190555061301933600454614326565b925061303c6509184e72a000610f71876003015486614dee90919063ffffffff16565b60018501554360048501556040518681526001600160a01b0389169033907f082338eeac0c81f88cffe8f4eed2acf4749c33235744a3c9d2e817f0260487cf90602001612923565b61308c614d2d565b6103e88161309a8486615cde565b6130a49190615cde565b11156130f25760405162461bcd60e51b815260206004820152601f60248201527f546178206d7573746e27742062652067726561746572207468616e2031302500604482015260640161082d565b60158390556014829055601681905560408051848152602081018490529081018290527f70af09a5cf3b34e649695a37b0c9e08fa8dd6844bac23db87408302c91bcd3da9060600160405180910390a1505050565b600e818154811061315757600080fd5b600091825260209091206003909102018054600182015460029092015490925060ff808216916101008104909116906201000090046001600160a01b031685565b6131a0614d2d565b6001600160a01b0381166131c65760405162461bcd60e51b815260040161082d90615caf565b6001600160a01b0381166000908152600c602052604090205460ff16156132245760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481dda1a5d1b1a5cdd195960721b604482015260640161082d565b6001600160a01b0381166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b031916909117905560045461329590611b06565b60006040518060a001604052804381526020016007600454815481106132bd576132bd615c41565b6000918252602080832060036005909302018201548452838101839052600160408086018290526001600160a01b03808a166060978801819052600e805494850181558752885193909502600080516020615eb183398151915281019390935592870151600080516020615ed183398151915283015586810151600080516020615ef18339815191529092018054968801516080890151909416620100000262010000600160b01b03199415156101000261ff00199415159490941661ffff1990981697909717929092179290921694909417909355915192935090917ffd3e65bdba4b863169e2c5f8526861de00f2a4067a831e3f128f30be65e819989190a25050565b6133ca614d2d565b60125460ff161561340e5760405162461bcd60e51b815260206004820152600e60248201526d616c726561647920656e61626c6560901b604482015260640161082d565b6012805460ff1916600117905560045461342790611b06565b60006040518060a0016040528043815260200160076004548154811061344f5761344f615c41565b6000918252602080832060036005909302018201548452600184820181905260408086018290526060958601859052600e8054928301815590945285519202600080516020615eb1833981519152810192909255840151600080516020615ed183398151915282015590830151600080516020615ef183398151915290910180549284015160808501516001600160a01b0316620100000262010000600160b01b03199115156101000261ff00199415159490941661ffff19909516949094179290921791909116919091179055600454600780549293507ff8cf2f8fd8b9978f10cd1774d8e10de4e8e5b663256efa422d44c840ebca3f7592909190811061355a5761355a615c41565b90600052602060002090600502016003015460405161357b91815260200190565b60405180910390a150565b61358e614d2d565b60125460ff166135d25760405162461bcd60e51b815260206004820152600f60248201526e616c72656164792064697361626c6560881b604482015260640161082d565b6012805460ff191690556004546135e890611b06565b60006040518060a0016040528043815260200160076004548154811061361057613610615c41565b6000918252602080832060036005909302018201548452600184820181905260408086018590526060958601859052600e8054928301815590945285519202600080516020615eb1833981519152810192909255840151600080516020615ed183398151915282015590830151600080516020615ef183398151915290910180549284015160808501516001600160a01b0316620100000262010000600160b01b03199115156101000261ff00199415159490941661ffff19909516949094179290921791909116919091179055600454600780549293507f75cd668f49a00fc3385ce960013085e54aa4959874de13f90efd9a968b4ec5b392909190811061355a5761355a615c41565b6137236146b7565b60065460ff166137af5760405162461bcd60e51b815260206004820152604b60248201527f7265776172642068617276657374696e67206973206e6f7420656e61626c656460448201527f2c206e65656420746f20776974686472617720746f6b656e20746f206861727660648201526a657374207265776172642160a81b608482015260a40161082d565b336000908152600a602052604090205460ff16156137df5760405162461bcd60e51b815260040161082d90615d7b565b6000600782815481106137f4576137f4615c41565b60009182526020808320858452600882526040808520338652909252922080546005909202909201925061385e5760405162461bcd60e51b81526020600482015260116024820152701a185c9d995cdd0e881b9bdd0819dbdbd9607a1b604482015260640161082d565b61386783611b06565b60006138733385614326565b600e54909150600090158015906138bf5750600e805461389590600190615cf6565b815481106138a5576138a5615c41565b906000526020600020906003020160000154836004015411155b80156138c9575084155b80156138e357503360009081526010602052604090205415155b1561399957613992846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b90506139c5565b6139c2836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60028301546139d49082615cde565b6000600285015590508015613a4d573360009081526009602052604090205460ff16613a43576000613a17612710610f7160165485614dee90919063ffffffff16565b9050613a238183615cf6565b91508015613a4157600354613a41906001600160a01b031682615170565b505b613a4d3382615170565b613a573386614326565b9150613a7a6509184e72a000610f71866003015485614dee90919063ffffffff16565b6001840155436004840155604051818152859033907f81ca9b2c230070eaa84787556b1aaf18bf1e2f07ea5d3dae4819db77a1a5b2249060200160405180910390a350505050611d1360018055565b613ad16146b7565b336000908152600a602052604090205460ff1615613b015760405162461bcd60e51b815260040161082d90615d7b565b60008111613b3f5760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc8185b5bdd5b9d60aa1b604482015260640161082d565b600060078381548110613b5457613b54615c41565b60009182526020808320868452600882526040808520338652909252922060059091029091019150613b8584611b06565b6000613b913386614326565b600e5490915060009015801590613bdd5750600e8054613bb390600190615cf6565b81548110613bc357613bc3615c41565b906000526020600020906003020160000154836004015411155b8015613be7575085155b8015613c0157503360009081526010602052604090205415155b15613cb757613cb0846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b9050613ce3565b613ce0836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff16613cf35780613cf6565b60005b836002016000828254613d099190615cde565b90915550508015801590613d1f575060065460ff165b15613d8e573360009081526009602052604090205460ff16613d84576000613d58612710610f7160165485614dee90919063ffffffff16565b9050613d648183615cf6565b91508015613d8257600354613d82906001600160a01b031682615170565b505b613d8e3382615170565b3360009081526009602052604081205460ff16613de657613dc0612710610f7160145489614dee90919063ffffffff16565b90508015613de6576003548554613de6916001600160a01b0391821691339116846154e3565b84546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613e16903090600401615a2b565b60206040518083038186803b158015613e2e57600080fd5b505afa158015613e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e669190615c88565b9050613e8a3330613e77858b615cf6565b89546001600160a01b03169291906154e3565b85546040516370a0823160e01b8152600091613f109184916001600160a01b0316906370a0823190613ec0903090600401615a2b565b60206040518083038186803b158015613ed857600080fd5b505afa158015613eec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190615c88565b8654909150613f1f9082614e06565b86556004870154613f309082614e06565b6004880155613f3f338a614326565b9450613f626509184e72a000610f71896003015488614dee90919063ffffffff16565b6001870155436004870155604051818152899033907f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca9060200160405180910390a350505050505050611b0260018055565b613fbc614d2d565b60065460ff16156140015760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b604482015260640161082d565b6006805460ff191660011790556040517ffaaf3db5ae119e7364070c3d19193e6a034281da8840f52ff5ba7d6973f49a1490600090a1565b614041614d2d565b6001600160a01b0381166140675760405162461bcd60e51b815260040161082d90615caf565b6001600160a01b0381166000908152600c602052604090205460ff166140ca5760405162461bcd60e51b8152602060048201526018602482015277105b1c9958591e481b9bdb880b481dda1a5d1b1a5cdd195960421b604482015260640161082d565b6001600160a01b0381166000908152600c60205260408120805460ff19169055600d54905b818110156141bd57826001600160a01b0316600d828154811061411457614114615c41565b6000918252602090912001546001600160a01b031614156141ab57600d61413c600184615cf6565b8154811061414c5761414c615c41565b600091825260209091200154600d80546001600160a01b03909216918390811061417857614178615c41565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506141bd565b806141b581615c6d565b9150506140ef565b50600d8054806141cf576141cf615de9565b600082815260209020810160001990810180546001600160a01b03191690550190556004546141fd90611b06565b60006040518060a0016040528043815260200160076004548154811061422557614225615c41565b600091825260208083206003600590930201820154845283810183905260408085018490526001600160a01b03808a166060968701819052600e805460018101825590875288519502600080516020615eb183398151915281019590955592870151600080516020615ed183398151915285015586820151600080516020615ef18339815191529094018054968801516080890151909216620100000262010000600160b01b03199215156101000261ff00199615159690961661ffff1990981697909717949094171694909417909155915192935090917f1aa298a598f00805d83c9762acb08ee6fe4383582baa50875d3e7628646e75bc9190a2505050565b60008181526008602090815260408083206001600160a01b03861684528252808320815160a08101835281548082526001830154948201949094526002820154928101929092526003810154606083015260049081015460808301525490919084148015614396575060125460ff165b156143ba5760006143a686614e12565b90506143b6836000015182611e1d565b9150505b949350505050565b6143ca614d2d565b6001600160a01b03811661442f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082d565b611d13816153ae565b6001600160a01b038116600090815260106020526040902054606090819015614699576001600160a01b0383166000908152601060205260408120546001600160401b0381111561448b5761448b61595d565b6040519080825280602002602001820160405280156144b4578160200160208202803683370190505b506001600160a01b038516600090815260106020526040812054919250906001600160401b038111156144e9576144e961595d565b604051908082528060200260200182016040528015614512578160200160208202803683370190505b5090506000805b6001600160a01b03871660009081526010602052604090206001015481101561468d576001600160a01b038716600090815260106020526040812060010180548390811061456957614569615c41565b60009182526020909120600390910201546001600160a01b03161461467b576001600160a01b03871660009081526010602052604090206001018054829081106145b5576145b5615c41565b9060005260206000209060030201600101548483815181106145d9576145d9615c41565b60200260200101818152505060106000886001600160a01b03166001600160a01b03168152602001908152602001600020600101818154811061461e5761461e615c41565b906000526020600020906003020160020160009054906101000a90046001600160a01b031683838151811061465557614655615c41565b6001600160a01b03909216602092830291909101909101528161467781615c6d565b9250505b8061468581615c6d565b915050614519565b50919590945092505050565b50506040805160008082526020820190815281830190925292909150565b6002600154141561470a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161082d565b6002600155565b61471c600454611b06565b600060076004548154811061473357614733615c41565b600091825260208083206004548085526008835260408086206001600160a01b03891687529093529184206005909302019350909190614774908590614326565b600e54909150600090158015906147c05750600e805461479690600190615cf6565b815481106147a6576147a6615c41565b906000526020600020906003020160000154836004015411155b80156147da57503360009081526010602052604090205415155b1561489057614889846040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201548152602001600282015481526020016003820154815260200160048201548152505033856040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050614e9d565b90506148bc565b6148b9836001015461106d6509184e72a000610f71886003015487614dee90919063ffffffff16565b90505b60065460ff166148cc57806148cf565b60005b8360020160008282546148e29190615cde565b909155505080158015906148f8575060065460ff165b15614990576001600160a01b03851660009081526009602052604090205460ff1661496657600061493a612710610f7160165485614dee90919063ffffffff16565b90506149468183615cf6565b9150801561496457600354614964906001600160a01b031682615170565b505b6001600160a01b0385166000908152600a602052604090205460ff16614990576149908582615170565b33600090815260106020526040908190205490516001600160a01b038716917f4139fae8d97181e6ae21323d4f522437780cbec409d1489abe4d92a018bcfbf8916149dd91815260200190565b60405180910390a26001600160a01b03851660009081526010602052604081208190555b6001600160a01b038616600090815260106020526040902060010154811015614ceb576001600160a01b0386166000908152601060205260408120600101805483908110614a5157614a51615c41565b60009182526020909120600390910201546001600160a01b031614614cd9576001600160a01b0386166000908152601060205260408120600101805483908110614a9d57614a9d615c41565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b0394851617905591881681526010909152604081206001018054600f91839185908110614af257614af2615c41565b60009182526020808320600260039093020191909101546001600160a01b0390811684528382019490945260409283018220938b16825260109052908120600101805485908110614b4557614b45615c41565b6000918252602080832060016003909302018201548452838101949094526040928301822080546001600160a01b039687166001600160a01b0319909116179055938a168152601183528181206010909352908120909201805483919085908110614bb257614bb2615c41565b60009182526020808320600260039093020191909101546001600160a01b0390811684528382019490945260409283018220949094559189168252601090925220600101805482908110614c0857614c08615c41565b906000526020600020906003020160020160009054906101000a90046001600160a01b03166001600160a01b03166342842e0e3088601060008b6001600160a01b03166001600160a01b031681526020019081526020016000206001018581548110614c7657614c76615c41565b9060005260206000209060030201600101546040518463ffffffff1660e01b8152600401614ca693929190615dc5565b600060405180830381600087803b158015614cc057600080fd5b505af1158015614cd4573d6000803e3d6000fd5b505050505b80614ce381615c6d565b915050614a01565b50614cf885600454614326565b9150614d1b6509184e72a000610f71866003015485614dee90919063ffffffff16565b60018401555050436004909101555050565b33614d3661213e565b6001600160a01b0316146108485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082d565b6000611e668284615cf6565b61165b8363a9059cbb60e01b8484604051602401614db7929190615dff565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261550a565b6000611e668284615d0d565b6000611e668284615d42565b6000611e668284615cde565b600d5460009081805b82811015614e95576001600160a01b0385166000908152601160205260408120600d805491929184908110614e5257614e52615c41565b60009182526020808320909101546001600160a01b03168352820192909252604001902054614e819083615cde565b915080614e8d81615c6d565b915050614e1b565b509392505050565b600e5460009081614eae8582614326565b90506000614f21614f006509184e72a000610f71600e614ecf600189615cf6565b81548110614edf57614edf615c41565b90600052602060002090600302016001015486614dee90919063ffffffff16565b61106d6509184e72a000610f718b6060015187614dee90919063ffffffff16565b90506000614f2e87614e12565b90506000614f40876000015183611e1d565b60125490915060ff16855b6001811061516157600e614f60600183615cf6565b81548110614f7057614f70615c41565b90600052602060002090600302016000015489608001511115614f9257615161565b600e614f9f600183615cf6565b81548110614faf57614faf615c41565b600091825260209091206002600390920201015460ff1615615019579015908115614fff57614fee81600114806111695750600e611140600284615cf6565b614ff89086615cde565b9450615151565b614fee81600114806112315750600e611208600284615cf6565b6001600160a01b038a16600090815260116020526040812081600e61503f600186615cf6565b8154811061504f5761504f615c41565b60009182526020808320600392909202909101600201546201000090046001600160a01b03168352820192909252604001902054905080156150f757600e615098600184615cf6565b815481106150a8576150a8615c41565b906000526020600020906003020160020160019054906101000a900460ff166150da576150d58186615cde565b6150e4565b6150e48186615cf6565b94506150f48a6000015186611e1d565b93505b82156151285761511782600114806113f35750600e6113ca600285615cf6565b6151219087615cde565b955061514f565b61514282600114806114bb5750600e611492600285615cf6565b61514c9087615cde565b95505b505b61515a81615d64565b9050614f4b565b50929998505050505050505050565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a08231906151a1903090600401615a2b565b60206040518083038186803b1580156151b957600080fd5b505afa1580156151cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151f19190615c88565b9050600060076004548154811061520a5761520a615c41565b90600052602060002090600502019050600081600401548361522c9190615cf6565b90506000818511156152c35760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061526a9089908690600401615dff565b602060405180830381600087803b15801561528457600080fd5b505af1158015615298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152bc9190615e18565b905061534a565b60025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906152f59089908990600401615dff565b602060405180830381600087803b15801561530f57600080fd5b505af1158015615323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153479190615e18565b90505b806153a65760405162461bcd60e51b815260206004820152602660248201527f73616665537175696467726f775472616e736665723a205472616e736665722060448201526519985a5b195960d21b606482015260840161082d565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008161540d57506000919050565b6000600161541a846155dc565b901c6001901b9050600181848161543357615433615d2c565b048201901c9050600181848161544b5761544b615d2c565b048201901c9050600181848161546357615463615d2c565b048201901c9050600181848161547b5761547b615d2c565b048201901c9050600181848161549357615493615d2c565b048201901c905060018184816154ab576154ab615d2c565b048201901c905060018184816154c3576154c3615d2c565b048201901c9050611e66818285816154dd576154dd615d2c565b04615671565b615504846323b872dd60e01b858585604051602401614db793929190615dc5565b50505050565b600061555f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166156879092919063ffffffff16565b80519091501561165b578080602001905181019061557d9190615e18565b61165b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161082d565b600080608083901c156155f157608092831c92015b604083901c1561560357604092831c92015b602083901c1561561557602092831c92015b601083901c1561562757601092831c92015b600883901c1561563957600892831c92015b600483901c1561564b57600492831c92015b600283901c1561565d57600292831c92015b600183901c1561566b576001015b92915050565b60008183106156805781611e66565b5090919050565b60606143ba848460008585600080866001600160a01b031685876040516156ae9190615e61565b60006040518083038185875af1925050503d80600081146156eb576040519150601f19603f3d011682016040523d82523d6000602084013e6156f0565b606091505b50915091506157018783838761570c565b979650505050505050565b60608315615778578251615771576001600160a01b0385163b6157715760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161082d565b50816143ba565b6143ba838381511561578d5781518083602001fd5b8060405162461bcd60e51b815260040161082d9190615e7d565b6001600160a01b0381168114611d1357600080fd5b80356157c7816157a7565b919050565b600080604083850312156157df57600080fd5b82356157ea816157a7565b946020939093013593505050565b6000806040838503121561580b57600080fd5b8235615816816157a7565b91506020830135615826816157a7565b809150509250929050565b60006020828403121561584357600080fd5b5035919050565b8015158114611d1357600080fd5b60008060006060848603121561586d57600080fd5b8335615878816157a7565b925060208401359150604084013561588f8161584a565b809150509250925092565b6000806000806000608086880312156158b257600080fd5b85356158bd816157a7565b945060208601356158cd816157a7565b93506040860135925060608601356001600160401b03808211156158f057600080fd5b818801915088601f83011261590457600080fd5b81358181111561591357600080fd5b89602082850101111561592557600080fd5b9699959850939650602001949392505050565b6000806040838503121561594b57600080fd5b823591506020830135615826816157a7565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561598657600080fd5b82356001600160401b038082111561599d57600080fd5b818501915085601f8301126159b157600080fd5b8135818111156159c3576159c361595d565b8060051b604051601f19603f830116810181811085821117156159e8576159e861595d565b604052918252848201925083810185019188831115615a0657600080fd5b938501935b8285101561158257615a1c856157bc565b84529385019392850192615a0b565b6001600160a01b0391909116815260200190565b60008060408385031215615a5257600080fd5b50508035926020909101359150565b600060208284031215615a7357600080fd5b8135611e66816157a7565b600080600060608486031215615a9357600080fd5b8335925060208401359150604084013561588f8161584a565b60008060408385031215615abf57600080fd5b8235615aca816157a7565b915060208301356158268161584a565b600080600060408486031215615aef57600080fd5b8335615afa816157a7565b925060208401356001600160401b0380821115615b1657600080fd5b818601915086601f830112615b2a57600080fd5b813581811115615b3957600080fd5b8760208260051b8501011115615b4e57600080fd5b6020830194508093505050509250925092565b600080600060608486031215615b7657600080fd5b505081359360208301359350604090920135919050565b604080825283519082018190526000906020906060840190828701845b82811015615bc657815184529284019290840190600101615baa565b5050508381038285015284518082528583019183019060005b81811015615c045783516001600160a01b031683529284019291840191600101615bdf565b5090979650505050505050565b602080825260169082015275165bdd481a185d99481b9bc8139195081cdd185ad95960521b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615c8157615c81615c57565b5060010190565b600060208284031215615c9a57600080fd5b5051919050565b918252602082015260400190565b60208082526015908201527443616e2774206265207a65726f206164647265737360581b604082015260600190565b60008219821115615cf157615cf1615c57565b500190565b600082821015615d0857615d08615c57565b500390565b6000816000190483118215151615615d2757615d27615c57565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615d5f57634e487b7160e01b600052601260045260246000fd5b500490565b600081615d7357615d73615c57565b506000190190565b6020808252601390820152721d5cd95c881a5cc8189b1858dadb1a5cdd1959606a1b604082015260600190565b600060208284031215615dba57600080fd5b8151611e66816157a7565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060208284031215615e2a57600080fd5b8151611e668161584a565b60005b83811015615e50578181015183820152602001615e38565b838111156155045750506000910152565b60008251615e73818460208701615e35565b9190910192915050565b6020815260008251806020840152615e9c816040850160208701615e35565b601f01601f1916919091016040019291505056febb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fdbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3febb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ffa264697066735822122095c8007a4d86eeeb0855c91935d9f95bc9dfdab06aae9624cc4d407d3f259e2964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a0000000000000000000000001cddea8931ecf9499296863d949aecdd23b41a4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001063adb
-----Decoded View---------------
Arg [0] : _squidgrow (address): 0xd8Fa690304D2B2824D918C0c7376e2823704557A
Arg [1] : _feeAddress (address): 0x1CDdeA8931eCf9499296863d949aEcDD23b41A47
Arg [2] : _squidPerBlock (uint256): 0
Arg [3] : _startBlock (uint256): 17185499
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a
Arg [1] : 0000000000000000000000001cddea8931ecf9499296863d949aecdd23b41a47
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000001063adb
Deployed Bytecode Sourcemap
46914:41448:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77101:215;;;:::i;:::-;;81817:762;;;;;;:::i;:::-;;:::i;50389:34::-;;;;;;;;;;;;774:14:1;;767:22;749:41;;737:2;722:18;50389:34:0;;;;;;;;50289:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1340:25:1;;;1328:2;1313:18;50289:64:0;1194:177:1;84865:95:0;84937:8;:15;84865:95;;82871:234;;;;;;:::i;:::-;;:::i;53403:929::-;;;;;;:::i;:::-;;:::i;84638:195::-;;;:::i;88134:219::-;;;;;;:::i;:::-;-1:-1:-1;;;88134:219:0;;;;;;;;;;;-1:-1:-1;;;;;;3256:33:1;;;3238:52;;3226:2;3211:18;88134:219:0;3094:202:1;49269:26:0;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3592:32:1;;;3574:51;;3656:2;3641:18;;3634:34;;;;3684:18;;;3677:34;;;;3742:2;3727:18;;3720:34;3785:3;3770:19;;3763:35;3561:3;3546:19;49269:26:0;3301:503:1;49686:34:0;;;;;;49756:46;;49798:4;49756:46;;;;;3983:6:1;3971:19;;;3953:38;;3941:2;3926:18;49756:46:0;3809:188:1;56714:3460:0;;;;;;:::i;:::-;;:::i;83496:281::-;;;;;;:::i;:::-;;:::i;50051:61::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50051:61:0;;;;;;;;;;:::i;68704:2812::-;;;;;;:::i;:::-;;:::i;49847:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;50571:35;;;;;60513:729;;;;;;:::i;:::-;;:::i;79711:863::-;;;;;;:::i;:::-;;:::i;60257:180::-;;;:::i;54433:476::-;;;;;;:::i;:::-;;:::i;49456:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1525:103;;;:::i;48925:23::-;;;;;-1:-1:-1;;;;;48925:23:0;;;68351:304;;;;;;:::i;:::-;;:::i;49904:33::-;;;;;;:::i;:::-;;:::i;83831:272::-;;;;;;:::i;:::-;;:::i;85963:282::-;;;;;;:::i;:::-;;:::i;82611:220::-;;;;;;:::i;:::-;;:::i;81419:329::-;;;;;;:::i;:::-;;:::i;877:87::-;;;:::i;56527:118::-;;;;;;:::i;:::-;;:::i;81296:115::-;;;;;;:::i;:::-;;:::i;83162:272::-;;;;;;:::i;:::-;;:::i;49350:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7543:25:1;;;7599:2;7584:18;;7577:34;;;;7627:18;;;7620:34;;;;7685:2;7670:18;;7663:34;7728:3;7713:19;;7706:35;7530:3;7515:19;49350:64:0;7284:463:1;71561:2517:0;;;;;;:::i;:::-;;:::i;84149:281::-;;;;;;:::i;:::-;;:::i;74126:2967::-;;;;;;:::i;:::-;;:::i;50169:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;86257:448;;;;;;:::i;:::-;;:::i;48988:37::-;;;;;;50471:35;;;;;;49946:32;;;;;;:::i;:::-;;:::i;:::-;;;;9075:25:1;;;9131:2;9116:18;;9109:34;;;;9186:14;;9179:22;9159:18;;;9152:50;;;;9245:14;;9238:22;9233:2;9218:18;;9211:50;-1:-1:-1;;;;;9298:32:1;9292:3;9277:19;;9270:61;9062:3;9047:19;49946:32:0;8828:509:1;49078:32:0;;;;;;54990:592;;;;;;:::i;:::-;;:::i;84996:457::-;;;:::i;49195:38::-;;;;;;;;;85490:461;;;:::i;64176:1678::-;;;;;;:::i;:::-;;:::i;61316:2315::-;;;;;;:::i;:::-;;:::i;49544:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;84438:192;;;:::i;55590:861::-;;;;;;:::i;:::-;;:::i;63639:506::-;;;;;;:::i;:::-;;:::i;1783:201::-;;;;;;:::i;:::-;;:::i;86713:1097::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;77101:215::-;3744:21;:19;:21::i;:::-;77192:10:::1;77219:1;77181:22:::0;;;:10:::1;:22;::::0;;;;:35;77159:111:::1;;;;-1:-1:-1::0;;;77159:111:0::1;;;;;;;:::i;:::-;;;;;;;;;77281:27;77297:10;77281:15;:27::i;:::-;3788:20:::0;3182:1;4308:22;;4125:213;3788:20;77101:215::o;81817:762::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;81920:19:0;::::1;81912:48;;;::::0;-1:-1:-1;;;81912:48:0;;11078:2:1;81912:48:0::1;::::0;::::1;11060:21:1::0;11117:2;11097:18;;;11090:30;-1:-1:-1;;;11136:18:1;;;11129:46;11192:18;;81912:48:0::1;10876:340:1::0;81912:48:0::1;82023:8;:15:::0;81971:20:::1;::::0;;82049:216:::1;82077:6;82071:3;:12;82049:216;;;82147:5;-1:-1:-1::0;;;;;82111:42:0::1;:8;82120:3;82111:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:25:::0;-1:-1:-1;;;;;82111:25:0::1;:42;82107:147;;;82189:8;82198:3;82189:13;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;82174:40;;82233:5;;82107:147;82085:5;::::0;::::1;:::i;:::-;;;82049:216;;;-1:-1:-1::0;82293:38:0::1;::::0;-1:-1:-1;;;82293:38:0;;82275:15:::1;::::0;-1:-1:-1;;;;;82293:23:0;::::1;::::0;::::1;::::0;:38:::1;::::0;82325:4:::1;::::0;82293:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82275:56:::0;-1:-1:-1;82342:11:0::1;82356:25;82275:56:::0;82368:12;82356:11:::1;:25::i;:::-;82342:39;;82406:1;82396:7;:11;:29;;;;;82422:3;82411:7;:14;;82396:29;82392:109;;;82442:47;-1:-1:-1::0;;;;;82442:26:0;::::1;82469:10;82481:7:::0;82442:26:::1;:47::i;:::-;82518:53;::::0;1340:25:1;;;-1:-1:-1;;;;;82518:53:0;::::1;::::0;82544:10:::1;::::0;82518:53:::1;::::0;1328:2:1;1313:18;82518:53:0::1;;;;;;;81901:678;;;;81817:762:::0;;:::o;82871:234::-;763:13;:11;:13::i;:::-;82957:17:::1;:15;:17::i;:::-;82990:58;83010:17;;83029:18;82990:58;;;;;;;:::i;:::-;;;;;;;;83059:17;:38:::0;82871:234::o;53403:929::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;53514:35:0;::::1;53506:69;;;;-1:-1:-1::0;;;53506:69:0::1;;;;;;;:::i;:::-;53590:11;53586:61;;;53618:17;:15;:17::i;:::-;53676:8;:15:::0;53659:14:::1;53702:135;53727:6;53723:1;:10;53702:135;;;53790:12;-1:-1:-1::0;;;;;53763:39:0::1;:8;53772:1;53763:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:23:::0;-1:-1:-1;;;;;53763:23:0::1;:39;;53755:70;;;::::0;-1:-1:-1;;;53755:70:0;;12619:2:1;53755:70:0::1;::::0;::::1;12601:21:1::0;12658:2;12638:18;;;12631:30;-1:-1:-1;;;12677:18:1;;;12670:48;12735:18;;53755:70:0::1;12417:342:1::0;53755:70:0::1;53735:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53702:135;;;;53847:23;53888:10;53873:12;:25;:53;;53916:10;53873:53;;;53901:12;53873:53;53847:79;;53973:11;53955:15;;:29;;;;:::i;:::-;53937:15;:47:::0;54009:213:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;54009:213:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;54009:213:0;;;;;;;;;;;;53995:8:::1;:228:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;53995:228:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54251:15;54009:213;;54251:19:::1;::::0;::::1;:::i;:::-;54241:83;54295:11;54308:15;;54241:83;;;;;;;:::i;:::-;;;;;;;;53495:837;;53403:929:::0;;;:::o;84638:195::-;763:13;:11;:13::i;:::-;84711:19:::1;::::0;::::1;;84703:48;;;::::0;-1:-1:-1;;;84703:48:0;;13229:2:1;84703:48:0::1;::::0;::::1;13211:21:1::0;13268:2;13248:18;;;13241:30;-1:-1:-1;;;13287:18:1;;;13280:46;13343:18;;84703:48:0::1;13027:340:1::0;84703:48:0::1;84762:19;:27:::0;;-1:-1:-1;;84762:27:0::1;::::0;;84805:20:::1;::::0;::::1;::::0;84784:5:::1;::::0;84805:20:::1;84638:195::o:0;49269:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49269:26:0;;;;-1:-1:-1;49269:26:0;;;;;:::o;56714:3460::-;56792:7;56812:20;56835:8;56844:4;56835:14;;;;;;;;:::i;:::-;;;;;;;;;;;56812:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56812:37:0;-1:-1:-1;;;;;56812:37:0;-1:-1:-1;;;;;56812:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56860:20;56883:8;:14;56892:4;56883:14;;;;;;;;;;;:21;56898:5;-1:-1:-1;;;;;56883:21:0;-1:-1:-1;;;;;56883:21:0;;;;;;;;;;;;56860:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56927:28;56958:4;:25;;;56927:56;;57013:4;:20;;;56998:12;:35;:60;;;;-1:-1:-1;57037:16:0;;;;:21;;56998:60;56994:383;;;57075:18;57096:49;57110:4;:20;;;57132:12;57096:13;:49::i;:::-;57075:70;;57160:23;57239:15;;57220:4;:15;;;57200:17;;57187:10;:30;;;;:::i;:::-;:48;;;;:::i;:::-;57186:68;;;;:::i;:::-;57160:94;;57292:73;57317:47;57347:4;:16;;;57317:25;57337:4;57317:15;:19;;:25;;;;:::i;:::-;:29;;:47::i;:::-;57292:20;;:24;:73::i;:::-;57269:96;;57060:317;;56994:383;57387:24;57414:37;57439:5;57446:4;57414:24;:37::i;:::-;57499:11;:18;57387:64;;-1:-1:-1;57462:15:0;;57499:22;;;;:97;;-1:-1:-1;57549:11:0;57561:18;;:22;;57582:1;;57561:22;:::i;:::-;57549:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;57525:4;:20;;;:71;;57499:97;:110;;;;-1:-1:-1;57600:9:0;;57499:110;:154;;;;-1:-1:-1;57624:10:0;57613:22;;;;:10;:22;;;;;:35;:40;;57499:154;57494:2625;;;57688:11;:18;;;57732:136;;57789:78;;57862:4;;57789:68;;57822:8;57829:1;57688:18;57822:8;:::i;:::-;57810:21;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;57789:16;:20;;:68;;;;:::i;:78::-;57732:52;57779:4;57732:42;:16;57753:20;57732;:42::i;:52::-;:56;;:136::i;:::-;57722:146;;57883:16;57902:25;57921:5;57902:18;:25::i;:::-;57883:44;;57942:21;57966:39;57983:4;:11;;;57996:8;57966:16;:39::i;:::-;58039:15;;57942:63;;-1:-1:-1;58039:15:0;;58086:5;58069:1924;58098:1;58093;:6;58069:1924;;58152:11;58164:3;58166:1;58164;:3;:::i;:::-;58152:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;58129:4;:20;;;:51;58126:82;;;58203:5;;58126:82;58248:11;58260:3;58262:1;58260;:3;:::i;:::-;58248:16;;;;;;;;:::i;:::-;;;;;;;;;:35;:16;;;;;:35;;;;58245:1733;;;58322:12;;;58357:601;;;;58411:229;58486:1;58491;58486:6;:61;;;-1:-1:-1;58519:11:0;58531:3;58533:1;58531;:3;:::i;:::-;58519:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;58496:4;:20;;;:51;58486:61;:153;;58567:72;58634:4;58567:62;58585:11;58597:5;58601:1;58597;:5;:::i;58567:72::-;58486:153;;;58550:4;:15;;;58486:153;58411:70;58476:4;58411:60;58429:11;58441:3;58443:1;58441;:3;:::i;:::-;58429:16;;;;;;;;:::i;:::-;;;;;;;;;;;:41;;;58411:13;:17;;:60;;;;:::i;:229::-;58400:240;;;;:::i;:::-;;;58245:1733;;58357:601;58708:226;58782:1;58787;58782:6;:61;;;-1:-1:-1;58815:11:0;58827:3;58829:1;58827;:3;:::i;:::-;58815:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;58792:4;:20;;;:51;58782:61;:151;;58863:70;58928:4;58863:60;58879:11;58891:5;58895:1;58891;:5;:::i;:::-;58879:18;;;;;;;;:::i;:::-;;;;;;;;;:43;:18;;;;;:43;;58863:11;;;:15;:60::i;:70::-;58782:151;;;58845:4;:15;;;58782:151;58708:68;58771:4;58708:58;58724:11;58736:3;58738:1;58736;:3;:::i;:::-;58724:16;;;;;;;;:::i;:::-;;;;;;;;;:41;:16;;;;;:41;;58708:11;;;:15;:58::i;58245:1733::-;-1:-1:-1;;;;;59044:16:0;;59027:14;59044:16;;;:9;:16;;;;;59027:14;59061:11;59073:3;59075:1;59073;:3;:::i;:::-;59061:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:27;;;;;;-1:-1:-1;;;;;59061:27:0;59044:45;;;;;;;;;;;;;;-1:-1:-1;59115:11:0;;59112:222;;59166:11;59178:3;59180:1;59178;:3;:::i;:::-;59166:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;;;;;;;;;;:62;;59211:17;59222:6;59211:8;:17;:::i;:::-;59166:62;;;59191:17;59202:6;59191:8;:17;:::i;:::-;59155:73;;59271:39;59288:4;:11;;;59301:8;59271:16;:39::i;:::-;59255:55;;59112:222;59359:11;59356:601;;;59410:229;59485:1;59490;59485:6;:61;;;-1:-1:-1;59518:11:0;59530:3;59532:1;59530;:3;:::i;:::-;59518:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;59495:4;:20;;;:51;59485:61;:153;;59566:72;59633:4;59566:62;59584:11;59596:5;59600:1;59596;:5;:::i;59566:72::-;59485:153;;;59549:4;:15;;;59485:153;59410:70;59475:4;59410:60;59428:11;59440:3;59442:1;59440;:3;:::i;:::-;59428:16;;;;;;;;:::i;:::-;;;;;;;;;;;:41;;;59410:13;:17;;:60;;;;:::i;:229::-;59399:240;;;;:::i;:::-;;;59356:601;;;59707:226;59781:1;59786;59781:6;:61;;;-1:-1:-1;59814:11:0;59826:3;59828:1;59826;:3;:::i;:::-;59814:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;59791:4;:20;;;:51;59781:61;:151;;59862:70;59927:4;59862:60;59878:11;59890:5;59894:1;59890;:5;:::i;59862:70::-;59781:151;;;59844:4;:15;;;59781:151;59707:68;59770:4;59707:58;59723:11;59735:3;59737:1;59735;:3;:::i;:::-;59723:16;;;;;;;;:::i;:::-;;;;;;;;;:41;:16;;;;;:41;;59707:11;;;:15;:58::i;:226::-;59696:237;;;;:::i;:::-;;;59356:601;59004:974;58245:1733;58102:3;;;:::i;:::-;;;58069:1924;;;;57655:2349;;;;57494:2625;;;60091:15;;;;60034:73;;:52;60081:4;60034:42;:16;60055:20;60034;:42::i;:73::-;60024:83;;57494:2625;60146:18;;;;60136:28;;:7;:28;:::i;:::-;60129:35;56714:3460;-1:-1:-1;;;;;;;;56714:3460:0:o;83496:281::-;763:13;:11;:13::i;:::-;83596:17;;83580:13:::1;83624:146;83647:5;83644:1;:8;83624:146;;;83705:5;83674:13;:28;83688:10;83699:1;83688:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;83674:28:0::1;-1:-1:-1::0;;;;;83674:28:0::1;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;83744:10;83755:1;83744:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;83730:28:0::1;;;;;;;;;;;83654:3:::0;::::1;::::0;::::1;:::i;:::-;;;;83624:146;;;;83569:208;83496:281:::0;:::o;68704:2812::-;3744:21;:19;:21::i;:::-;68784::::1;68808:8;68817:4;68808:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;68857;;;:8:::1;:14:::0;;;;;;68872:10:::1;68857:26:::0;;;;;;;68902:11;;68808:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;68902:22:0;-1:-1:-1;68902:22:0::1;68894:53;;;::::0;-1:-1:-1;;;68894:53:0;;14242:2:1;68894:53:0::1;::::0;::::1;14224:21:1::0;14281:2;14261:18;;;14254:30;-1:-1:-1;;;14300:18:1;;;14293:48;14358:18;;68894:53:0::1;14040:342:1::0;68894:53:0::1;68958:16;68969:4;68958:10;:16::i;:::-;68994:24;69021:42;69046:10;69058:4;69021:24;:42::i;:::-;69121:11;:18:::0;68994:69;;-1:-1:-1;69076:15:0::1;::::0;69121:22;;::::1;::::0;:97:::1;;-1:-1:-1::0;69171:11:0::1;69183:18:::0;;:22:::1;::::0;69204:1:::1;::::0;69183:22:::1;:::i;:::-;69171:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;69147:4;:20;;;:71;;69121:97;:127;;;;;69230:18;;69222:4;:26;69121:127;:171;;;;-1:-1:-1::0;69263:10:0::1;69252:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;69121:171;69116:376;;;69319:40;69336:4;69319:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;69319:40:0::1;-1:-1:-1::0;;;;;69319:40:0::1;-1:-1:-1::0;;;;;69319:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;69342:10;69354:4;69319:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:16;:40::i;:::-;69309:50;;69116:376;;;69402:78;69464:4;:15;;;69402:57;69454:4;69402:47;69423:4;:25;;;69402:16;:20;;:47;;;;:::i;:78::-;69392:88;;69116:376;69530:19;::::0;::::1;;:33;;69556:7;69530:33;;;69552:1;69530:33;69508:4;:18;;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;69575:19:0::1;::::0;-1:-1:-1;69612:11:0;;;;;:34:::1;;-1:-1:-1::0;69627:19:0::1;::::0;::::1;;69612:34;69609:461;;;69681:10;69667:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;69662:275;;69713:18;69734:34;69762:5;69734:23;69746:10;;69734:7;:11;;:23;;;;:::i;:34::-;69713:55:::0;-1:-1:-1;69797:20:0::1;69713:55:::0;69797:7;:20:::1;:::i;:::-;69787:30:::0;-1:-1:-1;69839:14:0;;69836:85:::1;;69898:10;::::0;69876:45:::1;::::0;-1:-1:-1;;;;;69898:10:0::1;69910::::0;69876:21:::1;:45::i;:::-;69694:243;69662:275;69969:10;69955:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;69951:108;;70001:42;70023:10;70035:7;70001:21;:42::i;:::-;70101:10;70087:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;70082:210;;70169:5;70154:11;;70144:7;:21;;;;:::i;:::-;70143:31;;;;:::i;:::-;70129:45:::0;-1:-1:-1;70192:15:0;;70189:91:::1;;70256:10;::::0;70226:16;;:54:::1;::::0;-1:-1:-1;;;;;70226:16:0;;::::1;::::0;70256:10:::1;70268:11:::0;70226:29:::1;:54::i;:::-;70306:64;70336:10;70348:21;70358:11:::0;70348:7;:21:::1;:::i;:::-;70306:16:::0;;-1:-1:-1;;;;;70306:16:0::1;::::0;:64;:29:::1;:64::i;:::-;70398:16;::::0;::::1;::::0;:29:::1;::::0;70419:7;70398:20:::1;:29::i;:::-;70381:16;::::0;::::1;:46:::0;70452:11;;:24:::1;::::0;70468:7;70452:15:::1;:24::i;:::-;70438:38:::0;;70508:42:::1;70533:10;70545:4:::0;70508:24:::1;:42::i;:::-;70489:61;;70581:57;70633:4;70581:47;70602:4;:25;;;70581:16;:20;;:47;;;;:::i;:57::-;70563:15;::::0;::::1;:75:::0;70672:12:::1;70649:20;::::0;::::1;:35:::0;70700:11;;70697:748:::1;;70744:4;:18;;;70733:29;;70789:1;70780:7;:10;:34;;;;-1:-1:-1::0;70795:19:0::1;::::0;::::1;;70794:20;70780:34;70777:502;;;70854:10;70840:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;70835:295;;70890:18;70911:34;70939:5;70911:23;70923:10;;70911:7;:11;;:23;;;;:::i;:34::-;70890:55:::0;-1:-1:-1;70978:20:0::1;70890:55:::0;70978:7;:20:::1;:::i;:::-;70968:30:::0;-1:-1:-1;71024:14:0;;71021:89:::1;;71087:10;::::0;71065:45:::1;::::0;-1:-1:-1;;;;;71087:10:0::1;71099::::0;71065:21:::1;:45::i;:::-;70867:263;70835:295;71166:10;71152:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;71148:116;;71202:42;71224:10;71236:7;71202:21;:42::i;:::-;71307:18;;71299:4;:26;:70;;;;-1:-1:-1::0;71340:10:0::1;71329:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;71299:70;71295:139;;;71391:27;71407:10;71391:15;:27::i;:::-;71472:36;::::0;1340:25:1;;;71494:4:0;;71482:10:::1;::::0;71472:36:::1;::::0;1328:2:1;1313:18;71472:36:0::1;;;;;;;68773:2743;;;;;3788:20:::0;3182:1;4308:22;;4125:213;3788:20;68704:2812;;:::o;60513:729::-;60565:21;60589:8;60598:4;60589:14;;;;;;;;:::i;:::-;;;;;;;;;;;60565:38;;60634:4;:20;;;60618:12;:36;60614:75;;60671:7;60513:729;:::o;60614:75::-;60703:16;;;;60699:110;;60764:12;60741:20;;;;:35;-1:-1:-1;60513:729:0:o;60699:110::-;60850:25;;;;60921:20;;;;60819:28;;60907:49;;60943:12;60907:13;:49::i;:::-;60886:70;;60969:23;60995:75;61054:15;;60995:54;61033:4;:15;;;60995:33;61010:17;;60995:10;:14;;:33;;;;:::i;:::-;:37;;:54::i;:75::-;60969:101;;61113:73;61138:47;61168:4;:16;;;61138:25;61158:4;61138:15;:19;;:25;;;;:::i;61113:73::-;61085:25;;;:101;-1:-1:-1;;61220:12:0;61197:20;;;;:35;;;;-1:-1:-1;;60513:729:0:o;79711:863::-;3744:21;:19;:21::i;:::-;79783::::1;79807:8;79816:4;79807:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;79856;;;:8:::1;:14:::0;;;;;;79871:10:::1;79856:26:::0;;;;;;;;79910:11;;79932:15;;;-1:-1:-1;79958:15:0;::::1;:19:::0;;;;79807:14:::1;::::0;;;::::1;;80007:16;::::0;::::1;::::0;79807:14;;-1:-1:-1;79856:26:0;;79910:11;80007:28:::1;::::0;79910:11;80007:20:::1;:28::i;:::-;79988:16;::::0;::::1;:47:::0;80109:10:::1;80056:19;80095:25:::0;;;:13:::1;:25;::::0;;;;;::::1;;80090:209;;80176:5;80161:11;;80152:6;:20;;;;:::i;:::-;80151:30;;;;:::i;:::-;80137:44:::0;-1:-1:-1;80199:15:0;;80196:91:::1;;80263:10;::::0;80233:16;;:54:::1;::::0;-1:-1:-1;;;;;80233:16:0;;::::1;::::0;80263:10:::1;80275:11:::0;80233:29:::1;:54::i;:::-;80309:63;80339:10;80351:20;80360:11:::0;80351:6;:20:::1;:::i;:::-;80309:16:::0;;-1:-1:-1;;;;;80309:16:0::1;::::0;:63;:29:::1;:63::i;:::-;80396:18;;80388:4;:26;:70;;;;-1:-1:-1::0;80429:10:0::1;80418:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;80388:70;80385:129;;;80475:27;80491:10;80475:15;:27::i;:::-;80530:36;::::0;80561:4;;80549:10:::1;::::0;80530:36:::1;::::0;;;::::1;79772:802;;;;3788:20:::0;3182:1;4308:22;;4125:213;3788:20;79711:863;:::o;60257:180::-;60319:8;:15;60302:14;60345:85;60373:6;60367:3;:12;60345:85;;;60403:15;60414:3;60403:10;:15::i;:::-;60381:5;;;:::i;:::-;;;60345:85;;54433:476;763:13;:11;:13::i;:::-;54533:11:::1;54529:61;;;54561:17;:15;:17::i;:::-;54600:22;54625:8;54634:4;54625:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;54600:50;;54689:11;54661:8;54670:4;54661:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;54733:11;54715:14;:29;54711:126;;54814:11;54797:14;54779:15;;:32;;;;:::i;:::-;:46;;;;:::i;:::-;54761:15;:64:::0;54711:126:::1;54866:4;54854:47;54872:11;54885:15;;54854:47;;;;;;;:::i;:::-;;;;;;;;54518:391;54433:476:::0;;;:::o;1525:103::-;763:13;:11;:13::i;:::-;1590:30:::1;1617:1;1590:18;:30::i;68351:304::-:0;68432:7;68633:13;68614:14;;68578:33;68588:8;68599:11;68588:22;;;;:::i;:::-;68578:9;:33::i;:::-;68569:42;;:6;:42;:::i;:::-;:59;;;;:::i;:::-;68568:79;;;;:::i;:::-;68559:88;;:6;:88;:::i;:::-;68552:95;68351:304;-1:-1:-1;;;68351:304:0:o;49904:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49904:33:0;;-1:-1:-1;49904:33:0;:::o;83831:272::-;763:13;:11;:13::i;:::-;83925:17;;83909:13:::1;83953:143;83976:5;83973:1;:8;83953:143;;;84034:4;84003:13;:28;84017:10;84028:1;84017:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84003:28:0::1;-1:-1:-1::0;;;;;84003:28:0::1;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;84070:10;84081:1;84070:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84058:26:0::1;;;;;;;;;;;83983:3:::0;::::1;::::0;::::1;:::i;:::-;;;;83953:143;;85963:282:::0;763:13;:11;:13::i;:::-;86080:1:::1;86059:18;:22;86051:63;;;::::0;-1:-1:-1;;;86051:63:0;;14589:2:1;86051:63:0::1;::::0;::::1;14571:21:1::0;14628:2;14608:18;;;14601:30;-1:-1:-1;;;14647:18:1;;;14640:57;14714:18;;86051:63:0::1;14387:351:1::0;86051:63:0::1;86132:57;86154:14;;86170:18;86132:57;;;;;;;:::i;:::-;;;;;;;;86202:14;:35:::0;85963:282::o;82611:220::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;82693:25:0;::::1;82685:45;;;::::0;-1:-1:-1;;;82685:45:0;;14945:2:1;82685:45:0::1;::::0;::::1;14927:21:1::0;14984:1;14964:18;;;14957:29;-1:-1:-1;;;15002:18:1;;;14995:38;15050:18;;82685:45:0::1;14743:331:1::0;82685:45:0::1;82764:10;::::0;82746:42:::1;::::0;;-1:-1:-1;;;;;82764:10:0;;::::1;15291:34:1::0;;15361:15;;;15356:2;15341:18;;15334:43;82746:42:0::1;::::0;15226:18:1;82746:42:0::1;;;;;;;82799:10;:24:::0;;-1:-1:-1;;;;;;82799:24:0::1;-1:-1:-1::0;;;;;82799:24:0;;;::::1;::::0;;;::::1;::::0;;82611:220::o;81419:329::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;81527:24:0;::::1;81519:58;;;;-1:-1:-1::0;;;81519:58:0::1;;;;;;;:::i;:::-;81588:9;:30:::0;;-1:-1:-1;;;;;;81588:30:0::1;-1:-1:-1::0;;;;;81588:30:0;::::1;;::::0;;81629:61;::::1;;;81661:17;:15;:17::i;:::-;81705:35;81729:10;81705:35;;;;;;:::i;:::-;;;;;;;;81419:329:::0;;:::o;877:87::-;923:7;950:6;-1:-1:-1;;;;;950:6:0;;877:87::o;56527:118::-;56599:7;56626:11;56632:5;56626:3;:11;:::i;81296:115::-;763:13;:11;:13::i;:::-;81376:18:::1;:27:::0;81296:115::o;83162:272::-;763:13;:11;:13::i;:::-;83256:17;;83240:13:::1;83284:143;83307:5;83304:1;:8;83284:143;;;83365:4;83334:13;:28;83348:10;83359:1;83348:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;83334:28:0::1;-1:-1:-1::0;;;;;83334:28:0::1;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;83401:10;83412:1;83401:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;83389:26:0::1;;;;;;;;;;;83314:3:::0;::::1;::::0;::::1;:::i;:::-;;;;83284:143;;71561:2517:::0;3744:21;:19;:21::i;:::-;71686:10:::1;71672:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;71671:26;71663:58;;;;-1:-1:-1::0;;;71663:58:0::1;;;;;;;:::i;:::-;71740:15;::::0;::::1;;71732:54;;;::::0;-1:-1:-1;;;71732:54:0;;15938:2:1;71732:54:0::1;::::0;::::1;15920:21:1::0;15977:2;15957:18;;;15950:30;-1:-1:-1;;;15996:18:1;;;15989:56;16062:18;;71732:54:0::1;15736:350:1::0;71732:54:0::1;-1:-1:-1::0;;;;;71805:29:0;::::1;;::::0;;;:16:::1;:29;::::0;;;;;::::1;;71797:68;;;::::0;-1:-1:-1;;;71797:68:0;;16293:2:1;71797:68:0::1;::::0;::::1;16275:21:1::0;16332:2;16312:18;;;16305:30;-1:-1:-1;;;16351:18:1;;;16344:56;16417:18;;71797:68:0::1;16091:350:1::0;71797:68:0::1;71876:30;71887:18;;71876:10;:30::i;:::-;71919:21;71943:8;71952:18;;71943:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;72053:18:::1;::::0;72044:28;;:8:::1;:28:::0;;;;;;72073:10:::1;72044:40:::0;;;;;;;72103:11;;71943:28:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;72095:66:0::1;;;::::0;-1:-1:-1;;;72095:66:0;;16648:2:1;72095:66:0::1;::::0;::::1;16630:21:1::0;16687:2;16667:18;;;16660:30;16726:34;16706:18;;;16699:62;-1:-1:-1;;;16777:18:1;;;16770:36;16823:19;;72095:66:0::1;16446:402:1::0;72095:66:0::1;72172:24;72199:56;72224:10;72236:18;;72199:24;:56::i;:::-;72312:11;:18:::0;72172:83;;-1:-1:-1;72267:15:0::1;::::0;72312:22;;::::1;::::0;:97:::1;;-1:-1:-1::0;72362:11:0::1;72374:18:::0;;:22:::1;::::0;72395:1:::1;::::0;72374:22:::1;:::i;:::-;72362:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;72338:4;:20;;;:71;;72312:97;:141;;;;-1:-1:-1::0;72424:10:0::1;72413:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;72312:141;72307:346;;;72480:40;72497:4;72480:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;72480:40:0::1;-1:-1:-1::0;;;;;72480:40:0::1;-1:-1:-1::0;;;;;72480:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;72503:10;72515:4;72480:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:16;:40::i;:::-;72470:50;;72307:346;;;72563:78;72625:4;:15;;;72563:57;72615:4;72563:47;72584:4;:25;;;72563:16;:20;;:47;;;;:::i;:78::-;72553:88;;72307:346;72685:19;::::0;::::1;;:33;;72711:7;72685:33;;;72707:1;72685:33;72663:4;:18;;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;72733:11:0;;;;;:34:::1;;-1:-1:-1::0;72748:19:0::1;::::0;::::1;;72733:34;72730:396;;;72802:10;72788:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;72783:275;;72834:18;72855:34;72883:5;72855:23;72867:10;;72855:7;:11;;:23;;;;:::i;:34::-;72834:55:::0;-1:-1:-1;72918:20:0::1;72834:55:::0;72918:7;:20:::1;:::i;:::-;72908:30:::0;-1:-1:-1;72960:14:0;;72957:85:::1;;73019:10;::::0;72997:45:::1;::::0;-1:-1:-1;;;;;73019:10:0::1;73031::::0;72997:21:::1;:45::i;:::-;72815:243;72783:275;73072:42;73094:10;73106:7;73072:21;:42::i;:::-;73160:9:::0;73138:19:::1;73187:469;73211:11;73207:1;:15;73187:469;;;73298:10;-1:-1:-1::0;;;;;73252:28:0;::::1;;73281:9:::0;;73291:1;73281:12;;::::1;;;;;:::i;:::-;;;;;;;73252:42;;;;;;;;;;;;;1340:25:1::0;;1328:2;1313:18;;1194:177;73252:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;73252:56:0::1;;73244:85;;;::::0;-1:-1:-1;;;73244:85:0;;17311:2:1;73244:85:0::1;::::0;::::1;17293:21:1::0;17350:2;17330:18;;;17323:30;-1:-1:-1;;;17369:18:1;;;17362:46;17425:18;;73244:85:0::1;17109:340:1::0;73244:85:0::1;73352:11;-1:-1:-1::0;;;;;73344:37:0::1;;73382:10;73402:4;73409:9;;73419:1;73409:12;;;;;;;:::i;:::-;;;;;;;73344:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;73437:18:0;::::1;;::::0;;;:5:::1;:18;::::0;;;;73472:10:::1;::::0;73456:9;;73466:1;73456:12;;::::1;;;;;:::i;:::-;;;;;;;73437:32;;;;;;;;;;;;:45;;;;;-1:-1:-1::0;;;;;73437:45:0::1;;;;;-1:-1:-1::0;;;;;73437:45:0::1;;;;;;73503:26;73532:48;;;;;;;;73542:10;-1:-1:-1::0;;;;;73532:48:0::1;;;;;73554:9;;73564:1;73554:12;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;73532:48:::0;;-1:-1:-1;;;;;;73532:48:0;;::::1;::::0;;::::1;::::0;;;;73606:10:::1;-1:-1:-1::0;73595:22:0;;;:10:::1;:22:::0;;;;;;:33:::1;::::0;;::::1;:49:::0;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;;;;73595:49:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;73224:3:0;::::1;::::0;::::1;:::i;:::-;;;;73187:469;;;-1:-1:-1::0;73677:10:0::1;73666:22;::::0;;;:10:::1;:22;::::0;;;;:50;;73705:11;;73666:22;:50:::1;::::0;73705:11;;73666:50:::1;:::i;:::-;::::0;;;-1:-1:-1;;73737:10:0::1;73727:21;::::0;;;:9:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;73727:34:0;::::1;::::0;;;;;;;:49;;73765:11;;73727:21;:49:::1;::::0;73765:11;;73727:49:::1;:::i;:::-;;;;;;;;73808:56;73833:10;73845:18;;73808:24;:56::i;:::-;73789:75;;73893:57;73945:4;73893:47;73914:4;:25;;;73893:16;:20;;:47;;;;:::i;:57::-;73875:15;::::0;::::1;:75:::0;73984:12:::1;73961:20;::::0;::::1;:35:::0;74014:56:::1;::::0;1340:25:1;;;-1:-1:-1;;;;;74014:56:0;::::1;::::0;74028:10:::1;::::0;74014:56:::1;::::0;1328:2:1;1313:18;74014:56:0::1;;;;;;;;71652:2426;;;;;3788:20:::0;3182:1;4308:22;;4125:213;84149:281;763:13;:11;:13::i;:::-;84249:17;;84233:13:::1;84277:146;84300:5;84297:1;:8;84277:146;;;84358:5;84327:13;:28;84341:10;84352:1;84341:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84327:28:0::1;-1:-1:-1::0;;;;;84327:28:0::1;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;84397:10;84408:1;84397:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;84383:28:0::1;;;;;;;;;;;84307:3:::0;::::1;::::0;::::1;:::i;:::-;;;;84277:146;;74126:2967:::0;3744:21;:19;:21::i;:::-;74262:10:::1;74289:1;74251:22:::0;;;:10:::1;:22;::::0;;;;:35;74229:111:::1;;;;-1:-1:-1::0;;;74229:111:0::1;;;;;;;:::i;:::-;74351:30;74362:18;;74351:10;:30::i;:::-;74392:21;74416:8;74425:18;;74416:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;74526:18:::1;::::0;74517:28;;;:8:::1;:28:::0;;;;;;74546:10:::1;74517:40:::0;;;;;;;74416:28:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;74517:40:0;;74416:28;74595:56:::1;::::0;74546:10;74595:24:::1;:56::i;:::-;74709:11;:18:::0;74568:83;;-1:-1:-1;74664:15:0::1;::::0;74709:22;;::::1;::::0;:97:::1;;-1:-1:-1::0;74759:11:0::1;74771:18:::0;;:22:::1;::::0;74792:1:::1;::::0;74771:22:::1;:::i;:::-;74759:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;74735:4;:20;;;:71;;74709:97;:141;;;;-1:-1:-1::0;74821:10:0::1;74810:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;74709:141;74704:346;;;74877:40;74894:4;74877:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;74877:40:0::1;-1:-1:-1::0;;;;;74877:40:0::1;-1:-1:-1::0;;;;;74877:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;74900:10;74912:4;74877:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:16;:40::i;:::-;74867:50;;74704:346;;;74960:78;75022:4;:15;;;74960:57;75012:4;74960:47;74981:4;:25;;;74960:16;:20;;:47;;;;:::i;:78::-;74950:88;;74704:346;75082:19;::::0;::::1;;:33;;75108:7;75082:33;;;75104:1;75082:33;75060:4;:18;;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;75132:11:0;;;;;:34:::1;;-1:-1:-1::0;75147:19:0::1;::::0;::::1;;75132:34;75129:464;;;75201:10;75187:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;75182:275;;75233:18;75254:34;75282:5;75254:23;75266:10;;75254:7;:11;;:23;;;;:::i;:34::-;75233:55:::0;-1:-1:-1;75317:20:0::1;75233:55:::0;75317:7;:20:::1;:::i;:::-;75307:30:::0;-1:-1:-1;75359:14:0;;75356:85:::1;;75418:10;::::0;75396:45:::1;::::0;-1:-1:-1;;;;;75418:10:0::1;75430::::0;75396:21:::1;:45::i;:::-;75214:243;75182:275;75492:10;75478:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;75473:109;;75524:42;75546:10;75558:7;75524:21;:42::i;:::-;75627:9:::0;75603:21:::1;75654:1011;75678:13;75674:1;:17;75654:1011;;;-1:-1:-1::0;;;;;75721:18:0;::::1;;::::0;;;:5:::1;:18;::::0;;;;75757:10:::1;::::0;75740:9;;75750:1;75740:12;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;75721:32:::0;;-1:-1:-1;75721:32:0;::::1;::::0;;;;;;-1:-1:-1;75721:32:0;;-1:-1:-1;;;;;75721:32:0::1;:46;75713:84;;;::::0;-1:-1:-1;;;75713:84:0;;18036:2:1;75713:84:0::1;::::0;::::1;18018:21:1::0;18075:2;18055:18;;;18048:30;-1:-1:-1;;;18094:18:1;;;18087:55;18159:18;;75713:84:0::1;17834:349:1::0;75713:84:0::1;75888:13;75925:9:::0;75920:504:::1;75955:10;75944:22;::::0;;;:10:::1;:22;::::0;;;;:33:::1;;:40:::0;75940:44;::::1;75920:504;;;76047:10;76036:22;::::0;;;:10:::1;:22;::::0;;;;:33:::1;;:36:::0;;-1:-1:-1;;;;;76036:62:0;::::1;::::0;:33;76070:1;;76036:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:47:::1;:36;::::0;;::::1;;:47;::::0;-1:-1:-1;;;;;76036:47:0::1;:62;:168:::0;::::1;;;;76192:9;;76202:1;76192:12;;;;;;;:::i;:::-;;;;;;;76144:10;:22;76155:10;-1:-1:-1::0;;;;;76144:22:0::1;-1:-1:-1::0;;;;;76144:22:0::1;;;;;;;;;;;;:33;;76178:1;76144:36;;;;;;;;:::i;:::-;;;;;;;;;;;:44;;;:60;76036:168;:273;;;;-1:-1:-1::0;76263:10:0::1;76307:1;76252:22:::0;;;:10:::1;:22;::::0;;;;:33:::1;;:36:::0;;76286:1;;76252:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:43:::0;-1:-1:-1;;;;;76252:43:0::1;:57;;76036:273;76010:399;;;76360:1;76352:9;;76384:5;;76010:399;75986:3:::0;::::1;::::0;::::1;:::i;:::-;;;;75920:504;;;-1:-1:-1::0;76449:10:0::1;76496:1;76438:22:::0;;;:10:::1;:22;::::0;;;;:33:::1;;:40:::0;;76472:5;;76438:40;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;:60:::0;;-1:-1:-1;;;;;;76438:60:0::1;-1:-1:-1::0;;;;;76438:60:0;;::::1;;::::0;;76515:18;;::::1;::::0;;:5:::1;:18:::0;;;;;;76438:40;76534:9;;76544:1;76534:12;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;76515:32:::0;;-1:-1:-1;76515:32:0;::::1;::::0;;;;;;-1:-1:-1;76515:32:0;:45;;-1:-1:-1;;;;;;76515:45:0::1;-1:-1:-1::0;;;;;76515:45:0;;::::1;;::::0;;76575:37;::::1;;76621:4;76628:10;76640:9:::0;;76650:1;76640:12;;::::1;;;;;:::i;:::-;;;;;;;76575:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;75698:967;75693:3;;;;;:::i;:::-;;;;75654:1011;;;-1:-1:-1::0;76686:10:0::1;76675:22;::::0;;;:10:::1;:22;::::0;;;;:52;;76714:13;;76675:22;:52:::1;::::0;76714:13;;76675:52:::1;:::i;:::-;::::0;;;-1:-1:-1;;76748:10:0::1;76738:21;::::0;;;:9:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;76738:34:0;::::1;::::0;;;;;;;:51;;76776:13;;76738:21;:51:::1;::::0;76776:13;;76738:51:::1;:::i;:::-;;;;;;;;76821:56;76846:10;76858:18;;76821:24;:56::i;:::-;76802:75;;76906:57;76958:4;76906:47;76927:4;:25;;;76906:16;:20;;:47;;;;:::i;:57::-;76888:15;::::0;::::1;:75:::0;76997:12:::1;76974:20;::::0;::::1;:35:::0;77027:56:::1;::::0;1340:25:1;;;-1:-1:-1;;;;;77027:56:0;::::1;::::0;77041:10:::1;::::0;77027:56:::1;::::0;1328:2:1;1313:18;77027:56:0::1;1194:177:1::0;86257:448:0;763:13;:11;:13::i;:::-;49798:4:::1;86427:14:::0;86391:33:::1;86410:14:::0;86391:15;:33:::1;:::i;:::-;:50;;;;:::i;:::-;:70;;86383:114;;;::::0;-1:-1:-1;;;86383:114:0;;18390:2:1;86383:114:0::1;::::0;::::1;18372:21:1::0;18429:2;18409:18;;;18402:30;18468:33;18448:18;;;18441:61;18519:18;;86383:114:0::1;18188:355:1::0;86383:114:0::1;86508:11;:29:::0;;;86548:10:::1;:27:::0;;;86586:10:::1;:27:::0;;;86631:66:::1;::::0;;18750:25:1;;;18806:2;18791:18;;18784:34;;;18834:18;;;18827:34;;;86631:66:0::1;::::0;18738:2:1;18723:18;86631:66:0::1;;;;;;;86257:448:::0;;;:::o;49946:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49946:32:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49946:32:0;;:::o;54990:592::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;55073:27:0;::::1;55065:61;;;;-1:-1:-1::0;;;55065:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55146:31:0;::::1;;::::0;;;:16:::1;:31;::::0;;;;;::::1;;55145:32;55137:63;;;::::0;-1:-1:-1;;;55137:63:0;;19074:2:1;55137:63:0::1;::::0;::::1;19056:21:1::0;19113:2;19093:18;;;19086:30;-1:-1:-1;;;19132:18:1;;;19125:48;19190:18;;55137:63:0::1;18872:342:1::0;55137:63:0::1;-1:-1:-1::0;;;;;55211:31:0;::::1;;::::0;;;:16:::1;:31;::::0;;;;:38;;-1:-1:-1;;55211:38:0::1;55245:4;55211:38:::0;;::::1;::::0;;;55260:15:::1;:35:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;55260:35:0::1;::::0;;::::1;::::0;;55317:18:::1;::::0;55306:30:::1;::::0;:10:::1;:30::i;:::-;55347:31;55381:104;;;;;;;;55393:12;55381:104;;;;55407:8;55416:18;;55407:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:49:::1;:28;::::0;;::::1;;:49:::0;::::1;::::0;55381:104;;;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;55381:104:0;;::::1;::::0;;;;;;;55496:11:::1;:31:::0;;;;::::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;;;;;;;;;;;55496:31:0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;55496:31:0;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;55496:31:0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;55496:31:0;::::1;;;;-1:-1:-1::0;;55496:31:0;::::1;;::::0;;;;-1:-1:-1;;55496:31:0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;55545:29;;55347:138;;-1:-1:-1;55381:104:0;;55545:29:::1;::::0;55407:28;55545:29:::1;55054:528;54990:592:::0;:::o;84996:457::-;763:13;:11;:13::i;:::-;85063:15:::1;::::0;::::1;;85062:16;85054:43;;;::::0;-1:-1:-1;;;85054:43:0;;19421:2:1;85054:43:0::1;::::0;::::1;19403:21:1::0;19460:2;19440:18;;;19433:30;-1:-1:-1;;;19479:18:1;;;19472:44;19533:18;;85054:43:0::1;19219:338:1::0;85054:43:0::1;85108:15;:22:::0;;-1:-1:-1;;85108:22:0::1;85126:4;85108:22;::::0;;85152:18:::1;::::0;85141:30:::1;::::0;:10:::1;:30::i;:::-;85182:31;85216:100;;;;;;;;85228:12;85216:100;;;;85242:8;85251:18;;85242:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:49:::1;:28;::::0;;::::1;;:49:::0;::::1;::::0;85216:100;;85293:4:::1;85216:100:::0;;::::1;::::0;;;;;;;;;;;;;;;;;85327:11:::1;:31:::0;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;;;;;;;;;;85327:31:0;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;85327:31:0;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;85327:31:0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;85327:31:0::1;::::0;::::1;-1:-1:-1::0;;;;;;85327:31:0;::::1;;;;-1:-1:-1::0;;85327:31:0;::::1;;::::0;;;;-1:-1:-1;;85327:31:0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;85404:18:::1;::::0;85395:8:::1;:28:::0;;85182:134;;-1:-1:-1;85376:69:0::1;::::0;85395:8;;85404:18;85395:28;::::1;;;;;:::i;:::-;;;;;;;;;;;:49;;;85376:69;;;;1340:25:1::0;;1328:2;1313:18;;1194:177;85376:69:0::1;;;;;;;;85043:410;84996:457::o:0;85490:461::-;763:13;:11;:13::i;:::-;85557:15:::1;::::0;::::1;;85549:43;;;::::0;-1:-1:-1;;;85549:43:0;;19764:2:1;85549:43:0::1;::::0;::::1;19746:21:1::0;19803:2;19783:18;;;19776:30;-1:-1:-1;;;19822:18:1;;;19815:45;19877:18;;85549:43:0::1;19562:339:1::0;85549:43:0::1;85603:15;:23:::0;;-1:-1:-1;;85603:23:0::1;::::0;;85648:18:::1;::::0;85637:30:::1;::::0;:10:::1;:30::i;:::-;85678:31;85712:101;;;;;;;;85724:12;85712:101;;;;85738:8;85747:18;;85738:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:49:::1;:28;::::0;;::::1;;:49:::0;::::1;::::0;85712:101;;85789:4:::1;85712:101:::0;;::::1;::::0;;;;;;;;;;;;;;;;;85824:11:::1;:31:::0;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;;;;;;;;;;85824:31:0;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;85824:31:0;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;85824:31:0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;85824:31:0::1;::::0;::::1;-1:-1:-1::0;;;;;;85824:31:0;::::1;;;;-1:-1:-1::0;;85824:31:0;::::1;;::::0;;;;-1:-1:-1;;85824:31:0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;85902:18:::1;::::0;85893:8:::1;:28:::0;;85678:135;;-1:-1:-1;85873:70:0::1;::::0;85893:8;;85902:18;85893:28;::::1;;;;;:::i;64176:1678::-:0;3744:21;:19;:21::i;:::-;64246:19:::1;::::0;::::1;;64238:107;;;::::0;-1:-1:-1;;;64238:107:0;;20108:2:1;64238:107:0::1;::::0;::::1;20090:21:1::0;20147:2;20127:18;;;20120:30;20186:34;20166:18;;;20159:62;20257:34;20237:18;;;20230:62;-1:-1:-1;;;20308:19:1;;;20301:42;20360:19;;64238:107:0::1;19906:479:1::0;64238:107:0::1;64379:10;64365:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;64364:26;64356:58;;;;-1:-1:-1::0;;;64356:58:0::1;;;;;;;:::i;:::-;64425:21;64449:8;64458:4;64449:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;64498;;;:8:::1;:14:::0;;;;;;64513:10:::1;64498:26:::0;;;;;;;64543:11;;64449:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;64535:45:0::1;;;::::0;-1:-1:-1;;;64535:45:0;;20592:2:1;64535:45:0::1;::::0;::::1;20574:21:1::0;20631:2;20611:18;;;20604:30;-1:-1:-1;;;20650:18:1;;;20643:47;20707:18;;64535:45:0::1;20390:341:1::0;64535:45:0::1;64591:18;64603:4;64591:10;:18::i;:::-;64630:24;64657:42;64682:10;64694:4;64657:24;:42::i;:::-;64757:11;:18:::0;64630:69;;-1:-1:-1;64712:15:0::1;::::0;64757:22;;::::1;::::0;:97:::1;;-1:-1:-1::0;64807:11:0::1;64819:18:::0;;:22:::1;::::0;64840:1:::1;::::0;64819:22:::1;:::i;:::-;64807:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;64783:4;:20;;;:71;;64757:97;:110;;;;-1:-1:-1::0;64858:9:0;;64757:110:::1;:154;;;;-1:-1:-1::0;64882:10:0::1;64871:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;64757:154;64752:359;;;64938:40;64955:4;64938:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;64938:40:0::1;-1:-1:-1::0;;;;;64938:40:0::1;-1:-1:-1::0;;;;;64938:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;64961:10;64973:4;64938:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:16;:40::i;:::-;64928:50;;64752:359;;;65021:78;65083:4;:15;;;65021:57;65073:4;65021:47;65042:4;:25;;;65021:16;:20;;:47;;;;:::i;:78::-;65011:88;;64752:359;65134:18;::::0;::::1;::::0;65123:29:::1;::::0;;::::1;:::i;:::-;65184:1;65163:18;::::0;::::1;:22:::0;65123:29;-1:-1:-1;65199:11:0;;65196:391:::1;;65245:10;65231:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;65226:275;;65277:18;65298:34;65326:5;65298:23;65310:10;;65298:7;:11;;:23;;;;:::i;:34::-;65277:55:::0;-1:-1:-1;65361:20:0::1;65277:55:::0;65361:7;:20:::1;:::i;:::-;65351:30:::0;-1:-1:-1;65403:14:0;;65400:85:::1;;65462:10;::::0;65440:45:::1;::::0;-1:-1:-1;;;;;65462:10:0::1;65474::::0;65440:21:::1;:45::i;:::-;65258:243;65226:275;65533:42;65555:10;65567:7;65533:21;:42::i;:::-;65618;65643:10;65655:4;65618:24;:42::i;:::-;65599:61;;65689:57;65741:4;65689:47;65710:4;:25;;;65689:16;:20;;:47;;;;:::i;:57::-;65671:15;::::0;::::1;:75:::0;65780:12:::1;65757:20;::::0;::::1;:35:::0;65810:36:::1;::::0;1340:25:1;;;65832:4:0;;65820:10:::1;::::0;65810:36:::1;::::0;1328:2:1;1313:18;65810:36:0::1;;;;;;;64227:1627;;;;3788:20:::0;3182:1;4308:22;;4125:213;61316:2315;3744:21;:19;:21::i;:::-;61418:10:::1;61404:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;61403:26;61395:58;;;;-1:-1:-1::0;;;61395:58:0::1;;;;;;;:::i;:::-;61482:1;61472:7;:11;61464:36;;;::::0;-1:-1:-1;;;61464:36:0;;20938:2:1;61464:36:0::1;::::0;::::1;20920:21:1::0;20977:2;20957:18;;;20950:30;-1:-1:-1;;;20996:18:1;;;20989:41;21047:18;;61464:36:0::1;20736:335:1::0;61464:36:0::1;61511:21;61535:8;61544:4;61535:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;61584;;;:8:::1;:14:::0;;;;;;61599:10:::1;61584:26:::0;;;;;;;61535:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;61621:16:0::1;61593:4:::0;61621:10:::1;:16::i;:::-;61650:24;61677:42;61702:10;61714:4;61677:24;:42::i;:::-;61767:11;:18:::0;61650:69;;-1:-1:-1;61730:15:0::1;::::0;61767:22;;::::1;::::0;:97:::1;;-1:-1:-1::0;61817:11:0::1;61829:18:::0;;:22:::1;::::0;61850:1:::1;::::0;61829:22:::1;:::i;:::-;61817:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;61793:4;:20;;;:71;;61767:97;:110;;;;-1:-1:-1::0;61868:9:0;;61767:110:::1;:154;;;;-1:-1:-1::0;61892:10:0::1;61881:22;::::0;;;:10:::1;:22;::::0;;;;:35;:40;::::1;61767:154;61762:359;;;61948:40;61965:4;61948:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;61948:40:0::1;-1:-1:-1::0;;;;;61948:40:0::1;-1:-1:-1::0;;;;;61948:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;61971:10;61983:4;61948:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:16;:40::i;:::-;61938:50;;61762:359;;;62031:78;62093:4;:15;;;62031:57;62083:4;62031:47;62052:4;:25;;;62031:16;:20;;:47;;;;:::i;:78::-;62021:88;;61762:359;62153:19;::::0;::::1;;:33;;62179:7;62153:33;;;62175:1;62153:33;62131:4;:18;;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62202:11:0;;;;;:34:::1;;-1:-1:-1::0;62217:19:0::1;::::0;::::1;;62202:34;62199:398;;;62271:10;62257:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;62252:275;;62303:18;62324:34;62352:5;62324:23;62336:10;;62324:7;:11;;:23;;;;:::i;:34::-;62303:55:::0;-1:-1:-1;62387:20:0::1;62303:55:::0;62387:7;:20:::1;:::i;:::-;62377:30:::0;-1:-1:-1;62429:14:0;;62426:85:::1;;62488:10;::::0;62466:45:::1;::::0;-1:-1:-1;;;;;62488:10:0::1;62500::::0;62466:21:::1;:45::i;:::-;62284:243;62252:275;62543:42;62565:10;62577:7;62543:21;:42::i;:::-;62666:10;62612:18;62652:25:::0;;;:13:::1;:25;::::0;;;;;::::1;;62647:227;;62707:34;62735:5;62707:23;62719:10;;62707:7;:11;;:23;;;;:::i;:34::-;62694:47:::0;-1:-1:-1;62760:14:0;;62756:106:::1;;62839:10;::::0;62793:16;;:69:::1;::::0;-1:-1:-1;;;;;62793:16:0;;::::1;::::0;62827:10:::1;::::0;62839::::1;62851::::0;62793:33:::1;:69::i;:::-;62926:16:::0;;:41:::1;::::0;-1:-1:-1;;;62926:41:0;;62902:21:::1;::::0;-1:-1:-1;;;;;62926:16:0::1;::::0;:26:::1;::::0;:41:::1;::::0;62961:4:::1;::::0;62926:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62902:65:::0;-1:-1:-1;62980:83:0::1;63014:10;63034:4;63041:20;63051:10:::0;63041:7;:20:::1;:::i;:::-;62980:16:::0;;-1:-1:-1;;;;;62980:16:0::1;::::0;:83;;:33:::1;:83::i;:::-;63151:16:::0;;:41:::1;::::0;-1:-1:-1;;;63151:41:0;;63126:22:::1;::::0;63151:60:::1;::::0;63197:13;;-1:-1:-1;;;;;63151:16:0::1;::::0;:26:::1;::::0;:41:::1;::::0;63186:4:::1;::::0;63151:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:60::-;63236:11:::0;;63126:85;;-1:-1:-1;63236:31:0::1;::::0;63126:85;63236:15:::1;:31::i;:::-;63222:45:::0;;63297:16:::1;::::0;::::1;::::0;:36:::1;::::0;63318:14;63297:20:::1;:36::i;:::-;63278:16;::::0;::::1;:55:::0;63388:42:::1;63413:10;63425:4:::0;63388:24:::1;:42::i;:::-;63368:62;;63459:57;63511:4;63459:47;63480:4;:25;;;63459:16;:20;;:47;;;;:::i;:57::-;63441:15;::::0;::::1;:75:::0;63550:12:::1;63527:20;::::0;::::1;:35:::0;63580:43:::1;::::0;1340:25:1;;;63602:4:0;;63590:10:::1;::::0;63580:43:::1;::::0;1328:2:1;1313:18;63580:43:0::1;;;;;;;61384:2247;;;;;;;3788:20:::0;3182:1;4308:22;;4125:213;84438:192;763:13;:11;:13::i;:::-;84511:19:::1;::::0;::::1;;84510:20;84502:48;;;::::0;-1:-1:-1;;;84502:48:0;;21278:2:1;84502:48:0::1;::::0;::::1;21260:21:1::0;21317:2;21297:18;;;21290:30;-1:-1:-1;;;21336:18:1;;;21329:45;21391:18;;84502:48:0::1;21076:339:1::0;84502:48:0::1;84561:19;:26:::0;;-1:-1:-1;;84561:26:0::1;84583:4;84561:26;::::0;;84603:19:::1;::::0;::::1;::::0;84561::::1;::::0;84603::::1;84438:192::o:0;55590:861::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;55679:27:0;::::1;55671:61;;;;-1:-1:-1::0;;;55671:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55751:31:0;::::1;;::::0;;;:16:::1;:31;::::0;;;;;::::1;;55743:68;;;::::0;-1:-1:-1;;;55743:68:0;;21622:2:1;55743:68:0::1;::::0;::::1;21604:21:1::0;21661:2;21641:18;;;21634:30;-1:-1:-1;;;21680:18:1;;;21673:54;21744:18;;55743:68:0::1;21420:348:1::0;55743:68:0::1;-1:-1:-1::0;;;;;55822:31:0;::::1;55856:5;55822:31:::0;;;:16:::1;:31;::::0;;;;:39;;-1:-1:-1;;55822:39:0::1;::::0;;55889:15:::1;:22:::0;;55922:208:::1;55943:6;55940:1;:9;55922:208;;;55997:13;-1:-1:-1::0;;;;;55975:35:0::1;:15;55991:1;55975:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;55975:18:0::1;:35;55971:148;;;56052:15;56068:10;56077:1;56068:6:::0;:10:::1;:::i;:::-;56052:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;56031:15:::1;:18:::0;;-1:-1:-1;;;;;56052:27:0;;::::1;::::0;56047:1;;56031:18;::::1;;;;;:::i;:::-;;;;;;;;;:48;;;;;-1:-1:-1::0;;;;;56031:48:0::1;;;;;-1:-1:-1::0;;;;;56031:48:0::1;;;;;;56098:5;;55971:148;55951:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55922:208;;;;56140:15;:21;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;56140:21:0;;;;;-1:-1:-1;;;;;;56140:21:0::1;::::0;;;;;56183:18:::1;::::0;56172:30:::1;::::0;:10:::1;:30::i;:::-;56213:31;56247:105;;;;;;;;56259:12;56247:105;;;;56273:8;56282:18;;56273:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:49:::1;:28;::::0;;::::1;;:49:::0;::::1;::::0;56247:105;;;;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;56247:105:0;;::::1;::::0;;;;;;;56363:11:::1;:31:::0;;56247:105;56363:31;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;;;;;;;;;;56363:31:0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;56363:31:0;;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;56363:31:0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;56363:31:0;::::1;;;;-1:-1:-1::0;;56363:31:0;::::1;;::::0;;;;-1:-1:-1;;56363:31:0;;;;;;;;;;::::1;;::::0;;;::::1;::::0;;;56412;;56213:139;;-1:-1:-1;56247:105:0;;56412:31:::1;::::0;56273:28;56412:31:::1;55660:791;;55590:861:::0;:::o;63639:506::-;63726:7;63769:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;63769:24:0;;;;;;;;;63746:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63867:18;63746:47;;;63859:26;;:45;;;;-1:-1:-1;63889:15:0;;;;63859:45;63855:249;;;63972:16;63991:28;64010:8;63991:18;:28::i;:::-;63972:47;;64053:39;64070:4;:11;;;64083:8;64053:16;:39::i;:::-;64034:58;;63906:198;63855:249;64121:16;63639:506;-1:-1:-1;;;;63639:506:0:o;1783:201::-;763:13;:11;:13::i;:::-;-1:-1:-1;;;;;1872:22:0;::::1;1864:73;;;::::0;-1:-1:-1;;;1864:73:0;;22107:2:1;1864:73:0::1;::::0;::::1;22089:21:1::0;22146:2;22126:18;;;22119:30;22185:34;22165:18;;;22158:62;-1:-1:-1;;;22236:18:1;;;22229:36;22282:19;;1864:73:0::1;21905:402:1::0;1864:73:0::1;1948:28;1967:8;1948:18;:28::i;86713:1097::-:0;-1:-1:-1;;;;;86862:17:0;;86895:1;86862:17;;;:10;:17;;;;;:30;86772:16;;;;86862:34;86858:945;;-1:-1:-1;;;;;87051:17:0;;87006:28;87051:17;;;:10;:17;;;;;:30;-1:-1:-1;;;;;87037:45:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87037:45:0;-1:-1:-1;;;;;;87142:17:0;;87097:28;87142:17;;;:10;:17;;;;;:30;87006:76;;-1:-1:-1;87097:28:0;-1:-1:-1;;;;;87128:45:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87128:45:0;;87097:76;;87188:14;87228:9;87223:382;-1:-1:-1;;;;;87247:17:0;;;;;;:10;:17;;;;;:28;;:35;87243:39;;87223:382;;;-1:-1:-1;;;;;87312:17:0;;87363:1;87312:17;;;:10;:17;;;;;:28;;:31;;87341:1;;87312:31;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;-1:-1:-1;;;;;87312:38:0;:54;87308:282;;-1:-1:-1;;;;;87413:17:0;;;;;;:10;:17;;;;;:28;;:31;;87442:1;;87413:31;;;;;;:::i;:::-;;;;;;;;;;;:39;;;87391:11;87403:6;87391:19;;;;;;;;:::i;:::-;;;;;;:61;;;;;87497:10;:17;87508:5;-1:-1:-1;;;;;87497:17:0;-1:-1:-1;;;;;87497:17:0;;;;;;;;;;;;:28;;87526:1;87497:31;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;;;;;;;;-1:-1:-1;;;;;87497:42:0;87475:11;87487:6;87475:19;;;;;;;;:::i;:::-;-1:-1:-1;;;;;87475:64:0;;;:19;;;;;;;;;;;:64;87562:8;;;;:::i;:::-;;;;87308:282;87284:3;;;;:::i;:::-;;;;87223:382;;;-1:-1:-1;87629:11:0;;87642;;-1:-1:-1;86713:1097:0;-1:-1:-1;;;86713:1097:0:o;86858:945::-;-1:-1:-1;;87756:16:0;;;87770:1;87756:16;;;;;;87774;;;;;;;;;87756;;;-1:-1:-1;86713:1097:0:o;3824:293::-;3226:1;3958:7;;:19;;3950:63;;;;-1:-1:-1;;;3950:63:0;;22514:2:1;3950:63:0;;;22496:21:1;22553:2;22533:18;;;22526:30;22592:33;22572:18;;;22565:61;22643:18;;3950:63:0;22312:355:1;3950:63:0;3226:1;4091:7;:18;3824:293::o;77324:2316::-;77396:30;77407:18;;77396:10;:30::i;:::-;77447:21;77471:8;77480:18;;77471:28;;;;;;;;:::i;:::-;;;;;;;;;77581:18;;77572:28;;;:8;:28;;;;;;-1:-1:-1;;;;;77572:37:0;;;;;;;;;;77471:28;;;;;;-1:-1:-1;77572:37:0;;77471:28;77647:53;;77601:7;;77647:24;:53::i;:::-;77758:11;:18;77620:80;;-1:-1:-1;77713:15:0;;77758:22;;;;:97;;-1:-1:-1;77808:11:0;77820:18;;:22;;77841:1;;77820:22;:::i;:::-;77808:35;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;77784:4;:20;;;:71;;77758:97;:141;;;;-1:-1:-1;77870:10:0;77859:22;;;;:10;:22;;;;;:35;:40;;77758:141;77753:346;;;77926:40;77943:4;77926:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77926:40:0;-1:-1:-1;;;;;77926:40:0;-1:-1:-1;;;;;77926:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77949:10;77961:4;77926:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:40::i;:::-;77916:50;;77753:346;;;78009:78;78071:4;:15;;;78009:57;78061:4;78009:47;78030:4;:25;;;78009:16;:20;;:47;;;;:::i;:78::-;77999:88;;77753:346;78131:19;;;;:33;;78157:7;78131:33;;;78153:1;78131:33;78109:4;:18;;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;78181:11:0;;;;;:34;;-1:-1:-1;78196:19:0;;;;78181:34;78178:455;;;-1:-1:-1;;;;;78236:22:0;;;;;;:13;:22;;;;;;;;78231:272;;78279:18;78300:34;78328:5;78300:23;78312:10;;78300:7;:11;;:23;;;;:::i;:34::-;78279:55;-1:-1:-1;78363:20:0;78279:55;78363:7;:20;:::i;:::-;78353:30;-1:-1:-1;78405:14:0;;78402:85;;78464:10;;78442:45;;-1:-1:-1;;;;;78464:10:0;78476;78442:21;:45::i;:::-;78260:243;78231:272;-1:-1:-1;;;;;78524:22:0;;;;;;:13;:22;;;;;;;;78519:103;;78567:39;78589:7;78598;78567:21;:39::i;:::-;78687:10;78676:22;;;;:10;:22;;;;;;;:35;78650:62;;-1:-1:-1;;;;;78650:62:0;;;;;;;1340:25:1;;1328:2;1313:18;;1194:177;78650:62:0;;;;;;;;-1:-1:-1;;;;;78723:19:0;;78758:1;78723:19;;;:10;:19;;;;;:36;;;78772:628;-1:-1:-1;;;;;78796:19:0;;;;;;:10;:19;;;;;:30;;:37;78792:41;;78772:628;;;-1:-1:-1;;;;;78859:19:0;;78911:1;78859:19;;;:10;:19;;;;;:30;;:33;;78890:1;;78859:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:40;-1:-1:-1;;;;;78859:40:0;:54;78855:534;;-1:-1:-1;;;;;78934:19:0;;78985:1;78934:19;;;:10;:19;;;;;:30;;:33;;78965:1;;78934:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:53;;-1:-1:-1;;;;;;78934:53:0;-1:-1:-1;;;;;78934:53:0;;;;;;79030:19;;;;;:10;:19;;;;;;-1:-1:-1;79030:30:0;:33;;79024:5;;78934:33;;79061:1;;79030:33;;;;;;:::i;:::-;;;;;;;;;:44;:33;;;;;:44;;;;;-1:-1:-1;;;;;79030:44:0;;;79024:51;;;;;;;;;;;;;;;79076:19;;;;;:10;:19;;;;;79030:44;79076:30;:33;;79107:1;;79076:33;;;;;;:::i;:::-;;;;;;;;;:41;:33;;;;;:41;;;79024:94;;;;;;;;;;;;;;;:107;;-1:-1:-1;;;;;79024:107:0;;;-1:-1:-1;;;;;;79024:107:0;;;;;;79150:18;;;;;:9;:18;;;;;79169:10;:19;;;;;;:30;;;:33;;79076;;79169:30;79200:1;;79169:33;;;;;;:::i;:::-;;;;;;;;;:44;:33;;;;;:44;;;;;-1:-1:-1;;;;;79169:44:0;;;79150:64;;;;;;;;;;;;;;;:68;;;;79245:19;;;;;:10;:19;;;;79169:44;79245:30;:33;;79276:1;;79245:33;;;;;;:::i;:::-;;;;;;;;;;;:44;;;;;;;;;;-1:-1:-1;;;;;79245:44:0;-1:-1:-1;;;;;79237:70:0;;79316:4;79323:7;79331:10;:19;79342:7;-1:-1:-1;;;;;79331:19:0;-1:-1:-1;;;;;79331:19:0;;;;;;;;;;;;:30;;79362:1;79331:33;;;;;;;;:::i;:::-;;;;;;;;;;;:41;;;79237:136;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78855:534;78835:3;;;;:::i;:::-;;;;78772:628;;;;79445:53;79470:7;79479:18;;79445:24;:53::i;:::-;79426:72;;79527:57;79579:4;79527:47;79548:4;:25;;;79527:16;:20;;:47;;;;:::i;:57::-;79509:15;;;:75;-1:-1:-1;;79618:12:0;79595:20;;;;:35;-1:-1:-1;;77324:2316:0:o;1042:132::-;173:10;1106:7;:5;:7::i;:::-;-1:-1:-1;;;;;1106:23:0;;1098:68;;;;-1:-1:-1;;;1098:68:0;;22874:2:1;1098:68:0;;;22856:21:1;;;22893:18;;;22886:30;22952:34;22932:18;;;22925:62;23004:18;;1098:68:0;22672:356:1;24450:98:0;24508:7;24535:5;24539:1;24535;:5;:::i;17929:211::-;18046:86;18066:5;18096:23;;;18121:2;18125:5;18073:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18073:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18073:58:0;-1:-1:-1;;;;;;18073:58:0;;;;;;;;;;18046:19;:86::i;24807:98::-;24865:7;24892:5;24896:1;24892;:5;:::i;25206:98::-;25264:7;25291:5;25295:1;25291;:5;:::i;24069:98::-;24127:7;24154:5;24158:1;24154;:5;:::i;87818:308::-;87918:15;:22;87882:7;;;;87982:111;88006:5;88003:1;:8;87982:111;;;-1:-1:-1;;;;;88046:15:0;;;;;;:9;:15;;;;;88062;:18;;88046:15;;;88078:1;;88062:18;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;88062:18:0;88046:35;;;;;;;;;;;;;88034:47;;;;:::i;:::-;;-1:-1:-1;88014:3:0;;;;:::i;:::-;;;;87982:111;;;-1:-1:-1;88110:8:0;87818:308;-1:-1:-1;;;87818:308:0:o;65862:2481::-;66006:11;:18;65971:7;;;66063:37;66089:7;65971;66063:24;:37::i;:::-;66036:64;-1:-1:-1;66111:15:0;66129:141;66191:78;66264:4;66191:68;66212:11;66224:8;66231:1;66224:5;:8;:::i;:::-;66212:21;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;66191:16;:20;;:68;;;;:::i;:78::-;66129:57;66181:4;66129:47;66150:4;:25;;;66129:16;:20;;:47;;;;:::i;:141::-;66111:159;;66281:16;66300:27;66319:7;66300:18;:27::i;:::-;66281:46;;66338:21;66362:39;66379:4;:11;;;66392:8;66362:16;:39::i;:::-;66431:15;;66338:63;;-1:-1:-1;66431:15:0;;66474:5;66457:1852;66486:1;66481;:6;66457:1852;;66536:11;66548:3;66550:1;66548;:3;:::i;:::-;66536:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;66513:4;:20;;;:51;66510:78;;;66583:5;;66510:78;66620:11;66632:3;66634:1;66632;:3;:::i;:::-;66620:16;;;;;;;;:::i;:::-;;;;;;;;;:35;:16;;;;;:35;;;;66617:1677;;;66690:12;;;66721:585;;;;66771:229;66846:1;66851;66846:6;:61;;;-1:-1:-1;66879:11:0;66891:3;66893:1;66891;:3;:::i;66771:229::-;66760:240;;;;:::i;:::-;;;66617:1677;;66721:585;67060:226;67134:1;67139;67134:6;:61;;;-1:-1:-1;67167:11:0;67179:3;67181:1;67179;:3;:::i;66617:1677::-;-1:-1:-1;;;;;67398:18:0;;67381:14;67398:18;;;:9;:18;;;;;67381:14;67417:11;67429:3;67431:1;67429;:3;:::i;:::-;67417:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:27;;;;;;-1:-1:-1;;;;;67417:27:0;67398:47;;;;;;;;;;;;;;-1:-1:-1;67467:11:0;;67464:210;;67514:11;67526:3;67528:1;67526;:3;:::i;:::-;67514:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;;;;;;;;;;:62;;67559:17;67570:6;67559:8;:17;:::i;:::-;67514:62;;;67539:17;67550:6;67539:8;:17;:::i;:::-;67503:73;;67615:39;67632:4;:11;;;67645:8;67615:16;:39::i;:::-;67599:55;;67464:210;67695:11;67692:585;;;67742:229;67817:1;67822;67817:6;:61;;;-1:-1:-1;67850:11:0;67862:3;67864:1;67862;:3;:::i;67742:229::-;67731:240;;;;:::i;:::-;;;67692:585;;;68031:226;68105:1;68110;68105:6;:61;;;-1:-1:-1;68138:11:0;68150:3;68152:1;68150;:3;:::i;68031:226::-;68020:237;;;;:::i;:::-;;;67692:585;67362:932;66617:1677;66490:3;;;:::i;:::-;;;66457:1852;;;-1:-1:-1;68326:7:0;;65862:2481;-1:-1:-1;;;;;;;;;65862:2481:0:o;80692:596::-;80796:9;;:34;;-1:-1:-1;;;80796:34:0;;80773:20;;-1:-1:-1;;;;;80796:9:0;;:19;;:34;;80824:4;;80796:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80773:57;;80841:21;80865:8;80874:18;;80865:28;;;;;;;;:::i;:::-;;;;;;;;;;;80841:52;;80904:21;80943:4;:16;;;80928:12;:31;;;;:::i;:::-;80904:55;;80970:20;81023:13;81013:7;:23;81009:195;;;81071:9;;:38;;-1:-1:-1;;;81071:38:0;;-1:-1:-1;;;;;81071:9:0;;;;:18;;:38;;81090:3;;81095:13;;81071:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81053:56;;81009:195;;;81160:9;;:32;;-1:-1:-1;;;81160:32:0;;-1:-1:-1;;;;;81160:9:0;;;;:18;;:32;;81179:3;;81184:7;;81160:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81142:50;;81009:195;81222:15;81214:66;;;;-1:-1:-1;;;81214:66:0;;23764:2:1;81214:66:0;;;23746:21:1;23803:2;23783:18;;;23776:30;23842:34;23822:18;;;23815:62;-1:-1:-1;;;23893:18:1;;;23886:36;23939:19;;81214:66:0;23562:402:1;81214:66:0;80762:526;;;;80692:596;;:::o;2144:191::-;2218:16;2237:6;;-1:-1:-1;;;;;2254:17:0;;;-1:-1:-1;;;;;;2254:17:0;;;;;;2287:40;;2237:6;;;;;;;2287:40;;2218:16;2287:40;2207:128;2144:191;:::o;34461:1673::-;34509:7;34533:6;34529:47;;-1:-1:-1;34563:1:0;;34461:1673;-1:-1:-1;34461:1673:0:o;34529:47::-;35267:14;35301:1;35290:7;35295:1;35290:4;:7::i;:::-;:12;;35284:1;:19;;35267:36;;35769:1;35758:6;35754:1;:10;;;;;:::i;:::-;;35745:6;:19;35744:26;;35735:35;;35819:1;35808:6;35804:1;:10;;;;;:::i;:::-;;35795:6;:19;35794:26;;35785:35;;35869:1;35858:6;35854:1;:10;;;;;:::i;:::-;;35845:6;:19;35844:26;;35835:35;;35919:1;35908:6;35904:1;:10;;;;;:::i;:::-;;35895:6;:19;35894:26;;35885:35;;35969:1;35958:6;35954:1;:10;;;;;:::i;:::-;;35945:6;:19;35944:26;;35935:35;;36019:1;36008:6;36004:1;:10;;;;;:::i;:::-;;35995:6;:19;35994:26;;35985:35;;36069:1;36058:6;36054:1;:10;;;;;:::i;:::-;;36045:6;:19;36044:26;;36035:35;;36092:23;36096:6;36108;36104:1;:10;;;;;:::i;:::-;;36092:3;:23::i;18148:248::-;18292:96;18312:5;18342:27;;;18371:4;18377:2;18381:5;18319:68;;;;;;;;;;:::i;18292:96::-;18148:248;;;;:::o;20996:716::-;21420:23;21446:69;21474:4;21446:69;;;;;;;;;;;;;;;;;21454:5;-1:-1:-1;;;;;21446:27:0;;;:69;;;;;:::i;:::-;21530:17;;21420:95;;-1:-1:-1;21530:21:0;21526:179;;21627:10;21616:30;;;;;;;;;;;;:::i;:::-;21608:85;;;;-1:-1:-1;;;21608:85:0;;24171:2:1;21608:85:0;;;24153:21:1;24210:2;24190:18;;;24183:30;24249:34;24229:18;;;24222:62;-1:-1:-1;;;24300:18:1;;;24293:40;24350:19;;21608:85:0;23969:406:1;36611:1019:0;36663:7;;36750:3;36741:12;;;:16;36737:102;;36788:3;36778:13;;;;36810;36737:102;36866:2;36857:11;;;:15;36853:99;;36903:2;36893:12;;;;36924;36853:99;36979:2;36970:11;;;:15;36966:99;;37016:2;37006:12;;;;37037;36966:99;37092:2;37083:11;;;:15;37079:99;;37129:2;37119:12;;;;37150;37079:99;37205:1;37196:10;;;:14;37192:96;;37241:1;37231:11;;;;37261;37192:96;37315:1;37306:10;;;:14;37302:96;;37351:1;37341:11;;;;37371;37302:96;37425:1;37416:10;;;:14;37412:96;;37461:1;37451:11;;;;37481;37412:96;37535:1;37526:10;;;:14;37522:66;;37571:1;37561:11;37522:66;37616:6;36611:1019;-1:-1:-1;;36611:1019:0:o;28637:106::-;28695:7;28726:1;28722;:5;:13;;28734:1;28722:13;;;-1:-1:-1;28730:1:0;;28637:106;-1:-1:-1;28637:106:0:o;12432:229::-;12569:12;12601:52;12623:6;12631:4;12637:1;12640:12;12569;13840;13854:23;13881:6;-1:-1:-1;;;;;13881:11:0;13900:5;13907:4;13881:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13839:73;;;;13930:69;13957:6;13965:7;13974:10;13986:12;13930:26;:69::i;:::-;13923:76;13552:455;-1:-1:-1;;;;;;;13552:455:0:o;16125:644::-;16310:12;16339:7;16335:427;;;16367:17;;16363:290;;-1:-1:-1;;;;;9970:19:0;;;16577:60;;;;-1:-1:-1;;;16577:60:0;;25531:2:1;16577:60:0;;;25513:21:1;25570:2;25550:18;;;25543:30;25609:31;25589:18;;;25582:59;25658:18;;16577:60:0;25329:353:1;16577:60:0;-1:-1:-1;16674:10:0;16667:17;;16335:427;16717:33;16725:10;16737:12;17472:17;;:21;17468:388;;17704:10;17698:17;17761:15;17748:10;17744:2;17740:19;17733:44;17468:388;17831:12;17824:20;;-1:-1:-1;;;17824:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:1:o;801:388::-;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;-1:-1:-1;1111:2:1;1096:18;;1083:32;1124:33;1083:32;1124:33;:::i;:::-;1176:7;1166:17;;;801:388;;;;;:::o;1376:180::-;1435:6;1488:2;1476:9;1467:7;1463:23;1459:32;1456:52;;;1504:1;1501;1494:12;1456:52;-1:-1:-1;1527:23:1;;1376:180;-1:-1:-1;1376:180:1:o;1561:118::-;1647:5;1640:13;1633:21;1626:5;1623:32;1613:60;;1669:1;1666;1659:12;1684:464;1772:6;1780;1788;1841:2;1829:9;1820:7;1816:23;1812:32;1809:52;;;1857:1;1854;1847:12;1809:52;1896:9;1883:23;1915:31;1940:5;1915:31;:::i;:::-;1965:5;-1:-1:-1;2017:2:1;2002:18;;1989:32;;-1:-1:-1;2073:2:1;2058:18;;2045:32;2086:30;2045:32;2086:30;:::i;:::-;2135:7;2125:17;;;1684:464;;;;;:::o;2153:936::-;2250:6;2258;2266;2274;2282;2335:3;2323:9;2314:7;2310:23;2306:33;2303:53;;;2352:1;2349;2342:12;2303:53;2391:9;2378:23;2410:31;2435:5;2410:31;:::i;:::-;2460:5;-1:-1:-1;2517:2:1;2502:18;;2489:32;2530:33;2489:32;2530:33;:::i;:::-;2582:7;-1:-1:-1;2636:2:1;2621:18;;2608:32;;-1:-1:-1;2691:2:1;2676:18;;2663:32;-1:-1:-1;;;;;2744:14:1;;;2741:34;;;2771:1;2768;2761:12;2741:34;2809:6;2798:9;2794:22;2784:32;;2854:7;2847:4;2843:2;2839:13;2835:27;2825:55;;2876:1;2873;2866:12;2825:55;2916:2;2903:16;2942:2;2934:6;2931:14;2928:34;;;2958:1;2955;2948:12;2928:34;3003:7;2998:2;2989:6;2985:2;2981:15;2977:24;2974:37;2971:57;;;3024:1;3021;3014:12;2971:57;2153:936;;;;-1:-1:-1;2153:936:1;;-1:-1:-1;3055:2:1;3047:11;;3077:6;2153:936;-1:-1:-1;;;2153:936:1:o;4002:315::-;4070:6;4078;4131:2;4119:9;4110:7;4106:23;4102:32;4099:52;;;4147:1;4144;4137:12;4099:52;4183:9;4170:23;4160:33;;4243:2;4232:9;4228:18;4215:32;4256:31;4281:5;4256:31;:::i;4322:127::-;4383:10;4378:3;4374:20;4371:1;4364:31;4414:4;4411:1;4404:15;4438:4;4435:1;4428:15;4454:1121;4538:6;4569:2;4612;4600:9;4591:7;4587:23;4583:32;4580:52;;;4628:1;4625;4618:12;4580:52;4655:23;;-1:-1:-1;;;;;4727:14:1;;;4724:34;;;4754:1;4751;4744:12;4724:34;4792:6;4781:9;4777:22;4767:32;;4837:7;4830:4;4826:2;4822:13;4818:27;4808:55;;4859:1;4856;4849:12;4808:55;4895:2;4882:16;4917:2;4913;4910:10;4907:36;;;4923:18;;:::i;:::-;4969:2;4966:1;4962:10;5001:2;4995:9;5064:2;5060:7;5055:2;5051;5047:11;5043:25;5035:6;5031:38;5119:6;5107:10;5104:22;5099:2;5087:10;5084:18;5081:46;5078:72;;;5130:18;;:::i;:::-;5166:2;5159:22;5216:18;;;5250:15;;;;-1:-1:-1;5292:11:1;;;5288:20;;;5320:19;;;5317:39;;;5352:1;5349;5342:12;5317:39;5376:11;;;;5396:148;5412:6;5407:3;5404:15;5396:148;;;5478:23;5497:3;5478:23;:::i;:::-;5466:36;;5429:12;;;;5522;;;;5396:148;;5580:203;-1:-1:-1;;;;;5744:32:1;;;;5726:51;;5714:2;5699:18;;5580:203::o;5788:248::-;5856:6;5864;5917:2;5905:9;5896:7;5892:23;5888:32;5885:52;;;5933:1;5930;5923:12;5885:52;-1:-1:-1;;5956:23:1;;;6026:2;6011:18;;;5998:32;;-1:-1:-1;5788:248:1:o;6041:247::-;6100:6;6153:2;6141:9;6132:7;6128:23;6124:32;6121:52;;;6169:1;6166;6159:12;6121:52;6208:9;6195:23;6227:31;6252:5;6227:31;:::i;6293:377::-;6367:6;6375;6383;6436:2;6424:9;6415:7;6411:23;6407:32;6404:52;;;6452:1;6449;6442:12;6404:52;6488:9;6475:23;6465:33;;6545:2;6534:9;6530:18;6517:32;6507:42;;6599:2;6588:9;6584:18;6571:32;6612:28;6634:5;6612:28;:::i;6897:382::-;6962:6;6970;7023:2;7011:9;7002:7;6998:23;6994:32;6991:52;;;7039:1;7036;7029:12;6991:52;7078:9;7065:23;7097:31;7122:5;7097:31;:::i;:::-;7147:5;-1:-1:-1;7204:2:1;7189:18;;7176:32;7217:30;7176:32;7217:30;:::i;7752:750::-;7847:6;7855;7863;7916:2;7904:9;7895:7;7891:23;7887:32;7884:52;;;7932:1;7929;7922:12;7884:52;7971:9;7958:23;7990:31;8015:5;7990:31;:::i;:::-;8040:5;-1:-1:-1;8096:2:1;8081:18;;8068:32;-1:-1:-1;;;;;8149:14:1;;;8146:34;;;8176:1;8173;8166:12;8146:34;8214:6;8203:9;8199:22;8189:32;;8259:7;8252:4;8248:2;8244:13;8240:27;8230:55;;8281:1;8278;8271:12;8230:55;8321:2;8308:16;8347:2;8339:6;8336:14;8333:34;;;8363:1;8360;8353:12;8333:34;8416:7;8411:2;8401:6;8398:1;8394:14;8390:2;8386:23;8382:32;8379:45;8376:65;;;8437:1;8434;8427:12;8376:65;8468:2;8464;8460:11;8450:21;;8490:6;8480:16;;;;;7752:750;;;;;:::o;8507:316::-;8584:6;8592;8600;8653:2;8641:9;8632:7;8628:23;8624:32;8621:52;;;8669:1;8666;8659:12;8621:52;-1:-1:-1;;8692:23:1;;;8762:2;8747:18;;8734:32;;-1:-1:-1;8813:2:1;8798:18;;;8785:32;;8507:316;-1:-1:-1;8507:316:1:o;9342:1178::-;9610:2;9622:21;;;9692:13;;9595:18;;;9714:22;;;9562:4;;9789;;9767:2;9752:18;;;9816:15;;;9562:4;9859:169;9873:6;9870:1;9867:13;9859:169;;;9934:13;;9922:26;;9968:12;;;;10003:15;;;;9895:1;9888:9;9859:169;;;-1:-1:-1;;;10064:19:1;;;10044:18;;;10037:47;10134:13;;10156:21;;;10232:15;;;;10195:12;;;10267:1;10277:215;10293:8;10288:3;10285:17;10277:215;;;10366:15;;-1:-1:-1;;;;;10362:41:1;10348:56;;10465:17;;;;10426:14;;;;10400:1;10312:11;10277:215;;;-1:-1:-1;10509:5:1;;9342:1178;-1:-1:-1;;;;;;;9342:1178:1:o;10525:346::-;10727:2;10709:21;;;10766:2;10746:18;;;10739:30;-1:-1:-1;;;10800:2:1;10785:18;;10778:52;10862:2;10847:18;;10525:346::o;11221:127::-;11282:10;11277:3;11273:20;11270:1;11263:31;11313:4;11310:1;11303:15;11337:4;11334:1;11327:15;11353:127;11414:10;11409:3;11405:20;11402:1;11395:31;11445:4;11442:1;11435:15;11469:4;11466:1;11459:15;11485:135;11524:3;-1:-1:-1;;11545:17:1;;11542:43;;;11565:18;;:::i;:::-;-1:-1:-1;11612:1:1;11601:13;;11485:135::o;11625:184::-;11695:6;11748:2;11736:9;11727:7;11723:23;11719:32;11716:52;;;11764:1;11761;11754:12;11716:52;-1:-1:-1;11787:16:1;;11625:184;-1:-1:-1;11625:184:1:o;11814:248::-;11988:25;;;12044:2;12029:18;;12022:34;11976:2;11961:18;;11814:248::o;12067:345::-;12269:2;12251:21;;;12308:2;12288:18;;;12281:30;-1:-1:-1;;;12342:2:1;12327:18;;12320:51;12403:2;12388:18;;12067:345::o;12764:128::-;12804:3;12835:1;12831:6;12828:1;12825:13;12822:39;;;12841:18;;:::i;:::-;-1:-1:-1;12877:9:1;;12764:128::o;12897:125::-;12937:4;12965:1;12962;12959:8;12956:34;;;12970:18;;:::i;:::-;-1:-1:-1;13007:9:1;;12897:125::o;13372:168::-;13412:7;13478:1;13474;13470:6;13466:14;13463:1;13460:21;13455:1;13448:9;13441:17;13437:45;13434:71;;;13485:18;;:::i;:::-;-1:-1:-1;13525:9:1;;13372:168::o;13545:127::-;13606:10;13601:3;13597:20;13594:1;13587:31;13637:4;13634:1;13627:15;13661:4;13658:1;13651:15;13677:217;13717:1;13743;13733:132;;13787:10;13782:3;13778:20;13775:1;13768:31;13822:4;13819:1;13812:15;13850:4;13847:1;13840:15;13733:132;-1:-1:-1;13879:9:1;;13677:217::o;13899:136::-;13938:3;13966:5;13956:39;;13975:18;;:::i;:::-;-1:-1:-1;;;14011:18:1;;13899:136::o;15388:343::-;15590:2;15572:21;;;15629:2;15609:18;;;15602:30;-1:-1:-1;;;15663:2:1;15648:18;;15641:49;15722:2;15707:18;;15388:343::o;16853:251::-;16923:6;16976:2;16964:9;16955:7;16951:23;16947:32;16944:52;;;16992:1;16989;16982:12;16944:52;17024:9;17018:16;17043:31;17068:5;17043:31;:::i;17454:375::-;-1:-1:-1;;;;;17712:15:1;;;17694:34;;17764:15;;;;17759:2;17744:18;;17737:43;17811:2;17796:18;;17789:34;;;;17644:2;17629:18;;17454:375::o;21773:127::-;21834:10;21829:3;21825:20;21822:1;21815:31;21865:4;21862:1;21855:15;21889:4;21886:1;21879:15;23033:274;-1:-1:-1;;;;;23225:32:1;;;;23207:51;;23289:2;23274:18;;23267:34;23195:2;23180:18;;23033:274::o;23312:245::-;23379:6;23432:2;23420:9;23411:7;23407:23;23403:32;23400:52;;;23448:1;23445;23438:12;23400:52;23480:9;23474:16;23499:28;23521:5;23499:28;:::i;24787:258::-;24859:1;24869:113;24883:6;24880:1;24877:13;24869:113;;;24959:11;;;24953:18;24940:11;;;24933:39;24905:2;24898:10;24869:113;;;25000:6;24997:1;24994:13;24991:48;;;-1:-1:-1;;25035:1:1;25017:16;;25010:27;24787:258::o;25050:274::-;25179:3;25217:6;25211:13;25233:53;25279:6;25274:3;25267:4;25259:6;25255:17;25233:53;:::i;:::-;25302:16;;;;;25050:274;-1:-1:-1;;25050:274:1:o;25687:383::-;25836:2;25825:9;25818:21;25799:4;25868:6;25862:13;25911:6;25906:2;25895:9;25891:18;25884:34;25927:66;25986:6;25981:2;25970:9;25966:18;25961:2;25953:6;25949:15;25927:66;:::i;:::-;26054:2;26033:15;-1:-1:-1;;26029:29:1;26014:45;;;;26061:2;26010:54;;25687:383;-1:-1:-1;;25687:383:1:o
Swarm Source
ipfs://95c8007a4d86eeeb0855c91935d9f95bc9dfdab06aae9624cc4d407d3f259e29
Loading...
Loading
Loading...
Loading
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.