Source Code
Overview
S Balance
S Value
$0.00Cross-Chain Transactions
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at SonicScan.org on 2025-03-30
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
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) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 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 256, 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 << 3) < value ? 1 : 0);
}
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
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));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
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");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
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");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation 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).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// 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 cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
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].
*
* CAUTION: See Security Considerations above.
*/
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);
}
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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://consensys.net/diligence/blog/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.8.0/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);
}
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
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;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
pragma solidity ^0.8.0;
library Babylonian {
function sqrt(uint256 y) internal pure returns (uint256 z) {
if (y > 3) {
z = y;
uint256 x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
// else z = 0
}
}
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev 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. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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);
}
}
pragma solidity ^0.8.0;
contract Operator is Context, Ownable {
address private _operator;
event OperatorTransferred(address indexed previousOperator, address indexed newOperator);
constructor() {
_operator = _msgSender();
emit OperatorTransferred(address(0), _operator);
}
function operator() public view returns (address) {
return _operator;
}
modifier onlyOperator() {
require(_operator == msg.sender, "operator: caller is not the operator");
_;
}
function isOperator() public view returns (bool) {
return _msgSender() == _operator;
}
function transferOperator(address newOperator_) public onlyOwner {
_transferOperator(newOperator_);
}
function _transferOperator(address newOperator_) internal {
require(newOperator_ != address(0), "operator: zero address given for new operator");
emit OperatorTransferred(address(0), newOperator_);
_operator = newOperator_;
}
function _renounceOperator() public onlyOwner {
emit OperatorTransferred(_operator, address(0));
_operator = address(0);
}
}
pragma solidity ^0.8.0;
contract ContractGuard {
mapping(uint256 => mapping(address => bool)) private _status;
function checkSameOriginReentranted() internal view returns (bool) {
return _status[block.number][tx.origin];
}
function checkSameSenderReentranted() internal view returns (bool) {
return _status[block.number][msg.sender];
}
modifier onlyOneBlock() {
require(!checkSameOriginReentranted(), "ContractGuard: one block, one function");
require(!checkSameSenderReentranted(), "ContractGuard: one block, one function");
_;
_status[block.number][tx.origin] = true;
_status[block.number][msg.sender] = true;
}
}
pragma solidity ^0.8.0;
interface IBasisAsset {
function mint(address recipient, uint256 amount) external returns (bool);
function burn(uint256 amount) external;
function burnFrom(address from, uint256 amount) external;
function isOperator() external returns (bool);
function operator() external view returns (address);
function transferOperator(address newOperator_) external;
}
pragma solidity ^0.8.0;
interface IOracle {
function update() external;
function consult(address _token, uint256 _amountIn) external view returns (uint256 amountOut);
function twap(address _token, uint256 _amountIn) external view returns (uint256 _amountOut);
}
pragma solidity ^0.8.0;
interface IBoardroom {
function balanceOf(address _andras) external view returns (uint256);
function earned(address _andras) external view returns (uint256);
function canWithdraw(address _andras) external view returns (bool);
function canClaimReward(address _andras) external view returns (bool);
function epoch() external view returns (uint256);
function nextEpochPoint() external view returns (uint256);
function getUnicornPrice() external view returns (uint256);
function setOperator(address _operator) external;
function setLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs) external;
function stake(uint256 _amount) external;
function withdraw(uint256 _amount) external;
function exit() external;
function claimReward() external;
function allocateSeigniorage(uint256 _amount) external;
function governanceRecoverUnsupported(address _token, uint256 _amount, address _to) external;
}
// File contracts/Treasury.sol
pragma solidity ^0.8.0;
contract Treasury is ContractGuard, Operator {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
/* ========= CONSTANT VARIABLES ======== */
uint256 public constant PERIOD = 6 hours;
/* ========== STATE VARIABLES ========== */
// flags
bool public initialized = false;
// epoch
uint256 public startTime;
uint256 public epoch = 0;
uint256 public epochSupplyContractionLeft = 0;
// exclusions from total supply
address[] public excludedFromTotalSupply;
// core components
address public canyon;
address public dbond;
address public fear;
address public deadAddress = 0x000000000000000000000000000000000000dEaD;
address public boardroom;
address public canyonOracle;
// price
uint256 public canyonPriceOne;
uint256 public canyonPriceCeiling;
uint256 public seigniorageSaved;
uint256[] public supplyTiers;
uint256[] public maxExpansionTiers;
uint256 public maxSupplyExpansionPercent;
uint256 public bondDepletionFloorPercent;
uint256 public seigniorageExpansionFloorPercent;
uint256 public maxSupplyContractionPercent;
uint256 public maxDebtRatioPercent;
// 28 first epochs (1 week) with 4.5% expansion regardless of CANYON price
uint256 public bootstrapEpochs;
uint256 public bootstrapSupplyExpansionPercent;
/* =================== Added variables =================== */
uint256 public previousEpochCanyonPrice;
uint256 public maxDiscountRate; // when purchasing bond
uint256 public maxPremiumRate; // when redeeming bond
uint256 public discountPercent;
uint256 public premiumThreshold;
uint256 public premiumPercent;
uint256 public mintingFactorForPayingDebt; // print extra CANYON during debt phase
address public daoFund;
uint256 public daoFundSharedPercent;
address public devFund;
uint256 public devFundSharedPercent;
address public teamFund;
uint256 public teamFundSharedPercent;
/* =================== Events =================== */
event Initialized(address indexed executor, uint256 at);
event BurnedBonds(address indexed from, uint256 bondAmount);
event RedeemedBonds(address indexed from, uint256 canyonAmount, uint256 bondAmount);
event BoughtBonds(address indexed from, uint256 canyonAmount, uint256 bondAmount);
event TreasuryFunded(uint256 timestamp, uint256 seigniorage);
event BoardroomFunded(uint256 timestamp, uint256 seigniorage);
event DaoFundFunded(uint256 timestamp, uint256 seigniorage);
event DevFundFunded(uint256 timestamp, uint256 seigniorage);
event TeamFundFunded(uint256 timestamp, uint256 seigniorage);
/* =================== Modifier =================== */
modifier checkCondition() {
require(block.timestamp >= startTime, "Treasury: not started yet");
_;
}
modifier checkEpoch() {
require(block.timestamp >= nextEpochPoint(), "Treasury: not opened yet");
_;
epoch = epoch.add(1);
epochSupplyContractionLeft = (getCanyonPrice() > canyonPriceCeiling) ? 0 : getCanyonCirculatingSupply().mul(maxSupplyContractionPercent).div(10000);
}
modifier checkOperator() {
require(
IBasisAsset(canyon).operator() == address(this) &&
IBasisAsset(dbond).operator() == address(this) &&
IBasisAsset(fear).operator() == address(this) &&
Operator(boardroom).operator() == address(this),
"Treasury: need more permission"
);
_;
}
modifier notInitialized() {
require(!initialized, "Treasury: already initialized");
_;
}
/* ========== VIEW FUNCTIONS ========== */
function isInitialized() public view returns (bool) {
return initialized;
}
// epoch
function nextEpochPoint() public view returns (uint256) {
return startTime.add(epoch.mul(PERIOD));
}
// oracle
function getCanyonPrice() public view returns (uint256 canyonPrice) {
try IOracle(canyonOracle).consult(canyon, 1e18) returns (uint256 price) {
return uint256(price);
} catch {
revert("Treasury: failed to consult canyon price from the oracle");
}
}
function getCanyonUpdatedPrice() public view returns (uint256 _canyonPrice) {
try IOracle(canyonOracle).twap(canyon, 1e18) returns (uint256 price) {
return uint256(price);
} catch {
revert("Treasury: failed to consult canyon price from the oracle");
}
}
// budget
function getReserve() public view returns (uint256) {
return seigniorageSaved;
}
function getBurnableCanyonLeft() public view returns (uint256 _burnableCanyonLeft) {
uint256 _canyonPrice = getCanyonPrice();
if (_canyonPrice <= canyonPriceOne) {
uint256 _canyonSupply = getCanyonCirculatingSupply();
uint256 _bondMaxSupply = _canyonSupply.mul(maxDebtRatioPercent).div(10000);
uint256 _bondSupply = IERC20(dbond).totalSupply();
if (_bondMaxSupply > _bondSupply) {
uint256 _maxMintableBond = _bondMaxSupply.sub(_bondSupply);
uint256 _maxBurnableCanyon = _maxMintableBond.mul(_canyonPrice).div(1e18);
_burnableCanyonLeft = Math.min(epochSupplyContractionLeft, _maxBurnableCanyon);
}
}
}
function getRedeemableBonds() public view returns (uint256 _redeemableBonds) {
uint256 _canyonPrice = getCanyonPrice();
if (_canyonPrice > canyonPriceCeiling) {
uint256 _totalCanyon = IERC20(canyon).balanceOf(address(this));
uint256 _rate = getBondPremiumRate();
if (_rate > 0) {
_redeemableBonds = _totalCanyon.mul(1e18).div(_rate);
}
}
}
function getBondDiscountRate() public view returns (uint256 _rate) {
uint256 _canyonPrice = getCanyonPrice();
if (_canyonPrice <= canyonPriceOne) {
if (discountPercent == 0) {
// no discount
_rate = canyonPriceOne;
} else {
uint256 _bondAmount = canyonPriceOne.mul(1e18).div(_canyonPrice); // to burn 1 CANYON
uint256 _discountAmount = _bondAmount.sub(canyonPriceOne).mul(discountPercent).div(10000);
_rate = canyonPriceOne.add(_discountAmount);
if (maxDiscountRate > 0 && _rate > maxDiscountRate) {
_rate = maxDiscountRate;
}
}
}
}
function getBondPremiumRate() public view returns (uint256 _rate) {
uint256 _canyonPrice = getCanyonPrice();
if (_canyonPrice > canyonPriceCeiling) {
uint256 _canyonPricePremiumThreshold = canyonPriceOne.mul(premiumThreshold).div(100);
if (_canyonPrice >= _canyonPricePremiumThreshold) {
//Price > 1.10
uint256 _premiumAmount = _canyonPrice.sub(canyonPriceOne).mul(premiumPercent).div(10000);
_rate = canyonPriceOne.add(_premiumAmount);
if (maxPremiumRate > 0 && _rate > maxPremiumRate) {
_rate = maxPremiumRate;
}
} else {
// no premium bonus
_rate = canyonPriceOne;
}
}
}
/* ========== GOVERNANCE ========== */
function initialize(
address _canyon,
address _dbond,
address _fear,
address _canyonOracle,
address _boardroom,
address _genesis,
uint256 _startTime
) public notInitialized {
canyon = _canyon;
dbond = _dbond;
fear = _fear;
canyonOracle = _canyonOracle;
boardroom = _boardroom;
startTime = _startTime;
excludedFromTotalSupply = [_genesis, deadAddress];
canyonPriceCeiling = canyonPriceOne.mul(101).div(100);
// Dynamic max expansion percent
supplyTiers = [0 ether, 10000 ether, 15000 ether, 25000 ether, 35000 ether, 60000 ether, 250000 ether, 500000 ether, 1000000 ether];
maxExpansionTiers = [450, 400, 350, 300, 250, 200, 150, 125, 100];
maxSupplyExpansionPercent = 400; // Upto 4.0% supply for expansion
bondDepletionFloorPercent = 10000; // 100% of Bond supply for depletion floor
seigniorageExpansionFloorPercent = 3500; // At least 35% of expansion reserved for boardroom
maxSupplyContractionPercent = 300; // Upto 3.0% supply for contraction (to burn CANYON and mint DBOND)
maxDebtRatioPercent = 4000; // Upto 40% supply of DBOND to purchase
premiumThreshold = 110;
premiumPercent = 7000;
// First 28 epochs with 2.5% expansion
bootstrapEpochs = 28;
bootstrapSupplyExpansionPercent = 250; //2.5% to account for canyon reward emissions during this time
// set seigniorageSaved to it's balance
seigniorageSaved = IERC20(canyon).balanceOf(address(this));
initialized = true;
emit Initialized(msg.sender, block.number);
}
function setOperator(address _operator) external onlyOperator {
transferOperator(_operator);
}
function setBoardroom(address _boardroom) external onlyOperator {
boardroom = _boardroom;
}
function setCanyonOracle(address _canyonOracle) external onlyOperator {
canyonOracle = _canyonOracle;
}
function setCanyonPriceCeiling(uint256 _canyonPriceCeiling) external onlyOperator {
require(_canyonPriceCeiling >= canyonPriceOne && _canyonPriceCeiling <= canyonPriceOne.mul(120).div(100), "out of range"); // [$1.0, $1.2]
canyonPriceCeiling = _canyonPriceCeiling;
}
function setMaxSupplyExpansionPercents(uint256 _maxSupplyExpansionPercent) external onlyOperator {
require(_maxSupplyExpansionPercent >= 10 && _maxSupplyExpansionPercent <= 1000, "_maxSupplyExpansionPercent: out of range"); // [0.1%, 10%]
maxSupplyExpansionPercent = _maxSupplyExpansionPercent;
}
function setSupplyTiersEntry(uint8 _index, uint256 _value) external onlyOperator returns (bool) {
require(_index >= 0, "Index has to be higher than 0");
require(_index < 9, "Index has to be lower than count of tiers");
if (_index > 0) {
require(_value > supplyTiers[_index - 1]);
}
if (_index < 8) {
require(_value < supplyTiers[_index + 1]);
}
supplyTiers[_index] = _value;
return true;
}
function setMaxExpansionTiersEntry(uint8 _index, uint256 _value) external onlyOperator returns (bool) {
require(_index >= 0, "Index has to be higher than 0");
require(_index < 9, "Index has to be lower than count of tiers");
require(_value >= 10 && _value <= 1000, "_value: out of range"); // [0.1%, 10%]
maxExpansionTiers[_index] = _value;
return true;
}
function setBondDepletionFloorPercent(uint256 _bondDepletionFloorPercent) external onlyOperator {
require(_bondDepletionFloorPercent >= 500 && _bondDepletionFloorPercent <= 10000, "out of range"); // [5%, 100%]
bondDepletionFloorPercent = _bondDepletionFloorPercent;
}
function setMaxSupplyContractionPercent(uint256 _maxSupplyContractionPercent) external onlyOperator {
require(_maxSupplyContractionPercent >= 100 && _maxSupplyContractionPercent <= 1500, "out of range"); // [0.1%, 15%]
maxSupplyContractionPercent = _maxSupplyContractionPercent;
}
function setMaxDebtRatioPercent(uint256 _maxDebtRatioPercent) external onlyOperator {
require(_maxDebtRatioPercent >= 1000 && _maxDebtRatioPercent <= 10000, "out of range"); // [10%, 100%]
maxDebtRatioPercent = _maxDebtRatioPercent;
}
function setBootstrap(uint256 _bootstrapEpochs, uint256 _bootstrapSupplyExpansionPercent) external onlyOperator {
require(_bootstrapEpochs <= 120, "_bootstrapEpochs: out of range"); // <= 1 month
require(_bootstrapSupplyExpansionPercent >= 100 && _bootstrapSupplyExpansionPercent <= 1000, "_bootstrapSupplyExpansionPercent: out of range"); // [1%, 10%]
bootstrapEpochs = _bootstrapEpochs;
bootstrapSupplyExpansionPercent = _bootstrapSupplyExpansionPercent;
}
function setExtraFunds(
address _daoFund,
uint256 _daoFundSharedPercent,
address _devFund,
uint256 _devFundSharedPercent,
address _teamFund,
uint256 _teamFundSharedPercent
) external onlyOperator {
require(_daoFund != address(0), "zero");
require(_daoFundSharedPercent <= 2500, "out of range"); // <= 25%
require(_devFund != address(0), "zero");
require(_devFundSharedPercent <= 2000, "out of range"); // <= 20%
require(_teamFund != address(0), "zero");
require(_teamFundSharedPercent <= 5500, "out of range");
daoFund = _daoFund;
daoFundSharedPercent = _daoFundSharedPercent;
devFund = _devFund;
devFundSharedPercent = _devFundSharedPercent;
teamFund = _teamFund;
teamFundSharedPercent = _teamFundSharedPercent;
}
function setMaxDiscountRate(uint256 _maxDiscountRate) external onlyOperator {
maxDiscountRate = _maxDiscountRate;
}
function setMaxPremiumRate(uint256 _maxPremiumRate) external onlyOperator {
maxPremiumRate = _maxPremiumRate;
}
function setDiscountPercent(uint256 _discountPercent) external onlyOperator {
require(_discountPercent <= 20000, "_discountPercent is over 200%");
discountPercent = _discountPercent;
}
function setPremiumThreshold(uint256 _premiumThreshold) external onlyOperator {
require(_premiumThreshold >= canyonPriceCeiling, "_premiumThreshold exceeds canyonPriceCeiling");
require(_premiumThreshold <= 150, "_premiumThreshold is higher than 1.5");
premiumThreshold = _premiumThreshold;
}
function setPremiumPercent(uint256 _premiumPercent) external onlyOperator {
require(_premiumPercent <= 20000, "_premiumPercent is over 200%");
premiumPercent = _premiumPercent;
}
function setMintingFactorForPayingDebt(uint256 _mintingFactorForPayingDebt) external onlyOperator {
require(_mintingFactorForPayingDebt >= 10000 && _mintingFactorForPayingDebt <= 20000, "_mintingFactorForPayingDebt: out of range"); // [100%, 200%]
mintingFactorForPayingDebt = _mintingFactorForPayingDebt;
}
/* ========== MUTABLE FUNCTIONS ========== */
function _updateCanyonPrice() internal {
try IOracle(canyonOracle).update() {} catch {}
}
function getCanyonCirculatingSupply() public view returns (uint256) {
IERC20 canyonErc20 = IERC20(canyon);
uint256 totalSupply = canyonErc20.totalSupply();
uint256 balanceExcluded = 0;
for (uint8 entryId = 0; entryId < excludedFromTotalSupply.length; ++entryId) {
balanceExcluded = balanceExcluded.add(canyonErc20.balanceOf(excludedFromTotalSupply[entryId]));
}
return totalSupply.sub(balanceExcluded);
}
function buyBonds(uint256 _canyonAmount, uint256 targetPrice) external onlyOneBlock checkCondition checkOperator {
require(_canyonAmount > 0, "Treasury: cannot purchase bonds with zero amount");
uint256 canyonPrice = getCanyonPrice();
require(canyonPrice == targetPrice, "Treasury: CANYON price moved");
require(
canyonPrice < canyonPriceOne, // price < $1
"Treasury: canyonPrice not eligible for bond purchase"
);
require(_canyonAmount <= epochSupplyContractionLeft, "Treasury: not enough bond left to purchase");
uint256 _rate = getBondDiscountRate();
require(_rate > 0, "Treasury: invalid bond rate");
uint256 _bondAmount = _canyonAmount.mul(_rate).div(1e18);
uint256 canyonSupply = getCanyonCirculatingSupply();
uint256 newBondSupply = IERC20(dbond).totalSupply().add(_bondAmount);
require(newBondSupply <= canyonSupply.mul(maxDebtRatioPercent).div(10000), "over max debt ratio");
IBasisAsset(canyon).burnFrom(msg.sender, _canyonAmount);
IBasisAsset(dbond).mint(msg.sender, _bondAmount);
epochSupplyContractionLeft = epochSupplyContractionLeft.sub(_canyonAmount);
_updateCanyonPrice();
emit BoughtBonds(msg.sender, _canyonAmount, _bondAmount);
}
function redeemBonds(uint256 _bondAmount, uint256 targetPrice) external onlyOneBlock checkCondition checkOperator {
require(_bondAmount > 0, "Treasury: cannot redeem bonds with zero amount");
uint256 canyonPrice = getCanyonPrice();
require(canyonPrice == targetPrice, "Treasury: CANYON price moved");
require(
canyonPrice > canyonPriceCeiling, // price > $1.01
"Treasury: canyonPrice not eligible for bond sale"
);
uint256 _rate = getBondPremiumRate();
require(_rate > 0, "Treasury: invalid bond rate");
uint256 _canyonAmount = _bondAmount.mul(_rate).div(1e18);
require(IERC20(canyon).balanceOf(address(this)) >= _canyonAmount, "Treasury: treasury has no more budget");
seigniorageSaved = seigniorageSaved.sub(Math.min(seigniorageSaved, _canyonAmount));
IBasisAsset(dbond).burnFrom(msg.sender, _bondAmount);
IERC20(canyon).safeTransfer(msg.sender, _canyonAmount);
_updateCanyonPrice();
emit RedeemedBonds(msg.sender, _canyonAmount, _bondAmount);
}
function _sendToBoardroom(uint256 _amount) internal {
IBasisAsset(canyon).mint(address(this), _amount);
uint256 _daoFundSharedAmount = 0;
if (daoFundSharedPercent > 0) {
_daoFundSharedAmount = _amount.mul(daoFundSharedPercent).div(10000);
IERC20(canyon).transfer(daoFund, _daoFundSharedAmount);
emit DaoFundFunded(block.timestamp, _daoFundSharedAmount);
}
uint256 _devFundSharedAmount = 0;
if (devFundSharedPercent > 0) {
_devFundSharedAmount = _amount.mul(devFundSharedPercent).div(10000);
IERC20(canyon).transfer(devFund, _devFundSharedAmount);
emit DevFundFunded(block.timestamp, _devFundSharedAmount);
}
uint256 _teamFundSharedAmount = 0;
if (teamFundSharedPercent > 0) {
_teamFundSharedAmount = _amount.mul(teamFundSharedPercent).div(10000);
IERC20(canyon).transfer(teamFund, _teamFundSharedAmount);
emit TeamFundFunded(block.timestamp, _teamFundSharedAmount);
}
_amount = _amount.sub(_daoFundSharedAmount).sub(_devFundSharedAmount);
IERC20(canyon).safeApprove(boardroom, 0);
IERC20(canyon).safeApprove(boardroom, _amount);
IBoardroom(boardroom).allocateSeigniorage(_amount);
emit BoardroomFunded(block.timestamp, _amount);
}
function _calculateMaxSupplyExpansionPercent(uint256 _canyonSupply) internal returns (uint256) {
for (uint8 tierId = 8; tierId >= 0; --tierId) {
if (_canyonSupply >= supplyTiers[tierId]) {
maxSupplyExpansionPercent = maxExpansionTiers[tierId];
break;
}
}
return maxSupplyExpansionPercent;
}
function allocateSeigniorage() external onlyOneBlock checkCondition checkEpoch checkOperator {
_updateCanyonPrice();
previousEpochCanyonPrice = getCanyonPrice();
uint256 canyonSupply = getCanyonCirculatingSupply().sub(seigniorageSaved);
if (epoch < bootstrapEpochs) {
// 28 first epochs with 4.5% expansion
_sendToBoardroom(canyonSupply.mul(bootstrapSupplyExpansionPercent).div(10000));
} else {
if (previousEpochCanyonPrice > canyonPriceCeiling) {
// Expansion ($CANYON Price > 1 $MIM): there is some seigniorage to be allocated
uint256 bondSupply = IERC20(dbond).totalSupply();
uint256 _percentage = previousEpochCanyonPrice.sub(canyonPriceOne);
uint256 _savedForBond;
uint256 _savedForBoardroom;
uint256 _mse = _calculateMaxSupplyExpansionPercent(canyonSupply).mul(1e14);
if (_percentage > _mse) {
_percentage = _mse;
}
if (seigniorageSaved >= bondSupply.mul(bondDepletionFloorPercent).div(10000)) {
// saved enough to pay debt, mint as usual rate
_savedForBoardroom = canyonSupply.mul(_percentage).div(1e18);
} else {
// have not saved enough to pay debt, mint more
uint256 _seigniorage = canyonSupply.mul(_percentage).div(1e18);
_savedForBoardroom = _seigniorage.mul(seigniorageExpansionFloorPercent).div(10000);
_savedForBond = _seigniorage.sub(_savedForBoardroom);
if (mintingFactorForPayingDebt > 0) {
_savedForBond = _savedForBond.mul(mintingFactorForPayingDebt).div(10000);
}
}
if (_savedForBoardroom > 0) {
_sendToBoardroom(_savedForBoardroom);
}
if (_savedForBond > 0) {
seigniorageSaved = seigniorageSaved.add(_savedForBond);
IBasisAsset(canyon).mint(address(this), _savedForBond);
emit TreasuryFunded(block.timestamp, _savedForBond);
}
}
}
}
function boardroomSetOperator(address _operator) external onlyOperator {
IBoardroom(boardroom).setOperator(_operator);
}
function boardroomSetLockUp(uint256 _withdrawLockupEpochs, uint256 _rewardLockupEpochs) external onlyOperator {
IBoardroom(boardroom).setLockUp(_withdrawLockupEpochs, _rewardLockupEpochs);
}
function boardroomAllocateSeigniorage(uint256 amount) external onlyOperator {
IBoardroom(boardroom).allocateSeigniorage(amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"BoardroomFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"canyonAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BoughtBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"BurnedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"DaoFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"DevFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"at","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"canyonAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondAmount","type":"uint256"}],"name":"RedeemedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TeamFundFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TreasuryFunded","type":"event"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"boardroom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"boardroomAllocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawLockupEpochs","type":"uint256"},{"internalType":"uint256","name":"_rewardLockupEpochs","type":"uint256"}],"name":"boardroomSetLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"boardroomSetOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bondDepletionFloorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapSupplyExpansionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_canyonAmount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"buyBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canyon","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canyonOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canyonPriceCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canyonPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dbond","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochSupplyContractionLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"excludedFromTotalSupply","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fear","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondDiscountRate","outputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondPremiumRate","outputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnableCanyonLeft","outputs":[{"internalType":"uint256","name":"_burnableCanyonLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCanyonCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCanyonPrice","outputs":[{"internalType":"uint256","name":"canyonPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCanyonUpdatedPrice","outputs":[{"internalType":"uint256","name":"_canyonPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedeemableBonds","outputs":[{"internalType":"uint256","name":"_redeemableBonds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_canyon","type":"address"},{"internalType":"address","name":"_dbond","type":"address"},{"internalType":"address","name":"_fear","type":"address"},{"internalType":"address","name":"_canyonOracle","type":"address"},{"internalType":"address","name":"_boardroom","type":"address"},{"internalType":"address","name":"_genesis","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDebtRatioPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDiscountRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxExpansionTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPremiumRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyContractionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyExpansionPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFactorForPayingDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousEpochCanyonPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"redeemBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seigniorageExpansionFloorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seigniorageSaved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_boardroom","type":"address"}],"name":"setBoardroom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bondDepletionFloorPercent","type":"uint256"}],"name":"setBondDepletionFloorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bootstrapEpochs","type":"uint256"},{"internalType":"uint256","name":"_bootstrapSupplyExpansionPercent","type":"uint256"}],"name":"setBootstrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_canyonOracle","type":"address"}],"name":"setCanyonOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_canyonPriceCeiling","type":"uint256"}],"name":"setCanyonPriceCeiling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_discountPercent","type":"uint256"}],"name":"setDiscountPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daoFund","type":"address"},{"internalType":"uint256","name":"_daoFundSharedPercent","type":"uint256"},{"internalType":"address","name":"_devFund","type":"address"},{"internalType":"uint256","name":"_devFundSharedPercent","type":"uint256"},{"internalType":"address","name":"_teamFund","type":"address"},{"internalType":"uint256","name":"_teamFundSharedPercent","type":"uint256"}],"name":"setExtraFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDebtRatioPercent","type":"uint256"}],"name":"setMaxDebtRatioPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDiscountRate","type":"uint256"}],"name":"setMaxDiscountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxExpansionTiersEntry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPremiumRate","type":"uint256"}],"name":"setMaxPremiumRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyContractionPercent","type":"uint256"}],"name":"setMaxSupplyContractionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyExpansionPercent","type":"uint256"}],"name":"setMaxSupplyExpansionPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintingFactorForPayingDebt","type":"uint256"}],"name":"setMintingFactorForPayingDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumPercent","type":"uint256"}],"name":"setPremiumPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_premiumThreshold","type":"uint256"}],"name":"setPremiumThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setSupplyTiersEntry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFundSharedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526002805460ff60a01b191690555f6004819055600555600a80546001600160a01b03191661dead1790553480156038575f80fd5b506040336083565b600280546001600160a01b031916339081179091556040515f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a360d4565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61413a806100e15f395ff3fe608060405234801561000f575f80fd5b5060043610610464575f3560e01c806382cad8381161024d578063b3ab15fb11610140578063c9f1a2e4116100bf578063e90b245411610084578063e90b2454146108c9578063f14698de146108d2578063f2fde38b146108db578063f8cd4d72146108ee578063fcb6f00814610901575f80fd5b8063c9f1a2e414610888578063cecce38e14610891578063d4b14944146108a4578063d98f2495146108b7578063da3ed419146108c0575f80fd5b8063b8a878f911610105578063b8a878f91461085d578063c5967c2614610866578063c8412d021461086e578063c8f5ed8d14610877578063c8f987f31461087f575f80fd5b8063b3ab15fb14610812578063b3ffc77714610825578063b49cf83814610838578063b4d1d7951461084b578063b692267014610854575f80fd5b8063900cf0cf116101cc578063998200251161019157806399820025146107b3578063a0487eea146107c6578063a204452b146107d9578063a3876056146107ec578063b06ce14a146107ff575f80fd5b8063900cf0cf146107685780639177f23b1461077157806391bbfed51461077a578063940e60641461078d57806398b762a1146107a0575f80fd5b80638c6402e5116102125780638c6402e51461070b5780638c664db61461071e5780638d476c94146107315780638d934f74146107445780638da5cb5b14610757575f80fd5b806382cad838146106cc578063874106cc146106df578063878fd42c146106e85780638893b9dd146106fb5780638a27f10314610703575f80fd5b806340af7ba511610365578063591663e1116102e4578063715018a6116102a9578063715018a6146106a257806372c054f9146106aa57806378e97925146106b25780637e39af80146106bb57806381d11eaf146106c3575f80fd5b8063591663e11461066357806359bf5d39146106765780635a0fc79c1461067e5780635b756179146106875780635e02c51e1461068f575f80fd5b80635346f3141161032a5780635346f314146106105780635495699f1461062357806354f04a111461063657806355ebdeef14610649578063570ca73514610652575f80fd5b806340af7ba5146105bb5780634390d2a8146105ce5780634456eda2146105e1578063499f3f19146105f45780634c109ce014610607575f80fd5b8063158ef93e116103f157806329ef1919116103b657806329ef1919146105865780632e9c7b651461058f57806335ed184a14610598578063392e53cd146105a05780634013a08e146105b2575f80fd5b8063158ef93e146105085780631b0fb35f1461052c57806322f832cd1461053f57806327c8f8351461054857806329605e7714610573575f80fd5b80630cf60175116104375780630cf60175146104bf5780630db7eb0b146104c7578063118ebbf9146104cf5780631460e390146104e2578063154ec2db146104f5575f80fd5b806301a937831461046857806303be7e761461047d57806304e5c7b1146104995780630b5bcec7146104ac575b5f80fd5b61047b610476366004613c5a565b61090a565b005b61048660235481565b6040519081526020015b60405180910390f35b61047b6104a7366004613c5a565b61099a565b61047b6104ba366004613c5a565b610a8d565b610486610b2c565b610486610bda565b61047b6104dd366004613c71565b610c76565b61047b6104f0366004613ca5565b61128a565b61047b610503366004613c5a565b611578565b60025461051c90600160a01b900460ff1681565b6040519015158152602001610490565b61047b61053a366004613d2e565b6115f9565b61048660145481565b600a5461055b906001600160a01b031681565b6040516001600160a01b039091168152602001610490565b61047b610581366004613d91565b61174a565b610486601c5481565b610486601b5481565b61048661175e565b600254600160a01b900460ff1661051c565b610486601f5481565b61047b6105c9366004613c5a565b611859565b60225461055b906001600160a01b031681565b6002546001600160a01b0316331461051c565b61047b610602366004613c5a565b6118da565b61048660255481565b600c5461055b906001600160a01b031681565b60245461055b906001600160a01b031681565b61047b610644366004613c71565b61197b565b61048660215481565b6002546001600160a01b031661055b565b61047b610671366004613c5a565b61206f565b600f54610486565b610486600f5481565b61047b6120ce565b600b5461055b906001600160a01b031681565b61047b6126d3565b6104866126e6565b61048660035481565b610486612797565b61048660135481565b61055b6106da366004613c5a565b612888565b61048660185481565b60085461055b906001600160a01b031681565b6104866128b0565b61047b6128f1565b61047b610719366004613c5a565b612942565b61047b61072c366004613c5a565b6129b9565b60095461055b906001600160a01b031681565b60205461055b906001600160a01b031681565b6001546001600160a01b031661055b565b61048660045481565b61048660195481565b61047b610788366004613c71565b612a18565b61051c61079b366004613dac565b612b14565b61047b6107ae366004613c5a565b612c0a565b6104866107c1366004613c5a565b612c39565b6104866107d4366004613c5a565b612c58565b61047b6107e7366004613c5a565b612c67565b60075461055b906001600160a01b031681565b61047b61080d366004613d91565b612c96565b61047b610820366004613d91565b612cf2565b61047b610833366004613d91565b612d25565b61047b610846366004613d91565b612d71565b61048661546081565b610486600e5481565b610486601a5481565b610486612dbd565b610486601e5481565b610486612de6565b610486601d5481565b610486600d5481565b61047b61089f366004613c5a565b612f24565b61051c6108b2366004613dac565b612f82565b61048660125481565b61048660165481565b61048660155481565b61048660175481565b61047b6108e9366004613d91565b61303e565b61047b6108fc366004613c71565b6130b4565b61048660055481565b6002546001600160a01b0316331461093d5760405162461bcd60e51b815260040161093490613ddb565b60405180910390fd5b600b546040516397ffe1d760e01b8152600481018390526001600160a01b03909116906397ffe1d7906024015b5f604051808303815f87803b158015610981575f80fd5b505af1158015610993573d5f803e3d5ffd5b5050505050565b6002546001600160a01b031633146109c45760405162461bcd60e51b815260040161093490613ddb565b600e54811015610a2b5760405162461bcd60e51b815260206004820152602c60248201527f5f7072656d69756d5468726573686f6c6420657863656564732063616e796f6e60448201526b50726963654365696c696e6760a01b6064820152608401610934565b6096811115610a885760405162461bcd60e51b8152602060048201526024808201527f5f7072656d69756d5468726573686f6c6420697320686967686572207468616e60448201526320312e3560e01b6064820152608401610934565b601d55565b6002546001600160a01b03163314610ab75760405162461bcd60e51b815260040161093490613ddb565b600a8110158015610aca57506103e88111155b610b275760405162461bcd60e51b815260206004820152602860248201527f5f6d6178537570706c79457870616e73696f6e50657263656e743a206f7574206044820152676f662072616e676560c01b6064820152608401610934565b601255565b5f80610b36612797565b9050600d548111610bd657601c545f03610b52575050600d5490565b5f610b7a82610b74670de0b6b3a7640000600d5461314290919063ffffffff16565b90613154565b90505f610ba4612710610b74601c54610b9e600d548761315f90919063ffffffff16565b90613142565b600d54909150610bb4908261316a565b93505f601a54118015610bc85750601a5484115b15610bd357601a5493505b50505b5090565b5f80610be4612797565b9050600e54811115610bd6575f610c0d6064610b74601d54600d5461314290919063ffffffff16565b9050808210610c6c575f610c38612710610b74601e54610b9e600d548861315f90919063ffffffff16565b600d54909150610c48908261316a565b93505f601b54118015610c5c5750601b5484115b15610bd357601b54935050505090565b600d549250505090565b435f9081526020818152604080832032845290915290205460ff1615610cae5760405162461bcd60e51b815260040161093490613e1f565b435f9081526020818152604080832033845290915290205460ff1615610ce65760405162461bcd60e51b815260040161093490613e1f565b600354421015610d085760405162461bcd60e51b815260040161093490613e65565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610d4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d739190613e9c565b6001600160a01b0316148015610dfa57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610dcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610def9190613e9c565b6001600160a01b0316145b8015610e7757506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610e48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6c9190613e9c565b6001600160a01b0316145b8015610ef45750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610ec5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee99190613e9c565b6001600160a01b0316145b610f105760405162461bcd60e51b815260040161093490613eb7565b5f8211610f765760405162461bcd60e51b815260206004820152602e60248201527f54726561737572793a2063616e6e6f742072656465656d20626f6e647320776960448201526d1d1a081e995c9bc8185b5bdd5b9d60921b6064820152608401610934565b5f610f7f612797565b9050818114610fd05760405162461bcd60e51b815260206004820152601c60248201527f54726561737572793a2043414e594f4e207072696365206d6f766564000000006044820152606401610934565b600e54811161103a5760405162461bcd60e51b815260206004820152603060248201527f54726561737572793a2063616e796f6e5072696365206e6f7420656c6967696260448201526f6c6520666f7220626f6e642073616c6560801b6064820152608401610934565b5f611043610bda565b90505f81116110945760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e64207261746500000000006044820152606401610934565b5f6110ab670de0b6b3a7640000610b748785613142565b6007546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190613eee565b10156111765760405162461bcd60e51b815260206004820152602560248201527f54726561737572793a20747265617375727920686173206e6f206d6f726520626044820152641d5919d95d60da1b6064820152608401610934565b61118e611185600f5483613175565b600f549061315f565b600f5560085460405163079cc67960e41b81526001600160a01b03909116906379cc6790906111c39033908990600401613f05565b5f604051808303815f87803b1580156111da575f80fd5b505af11580156111ec573d5f803e3d5ffd5b505060075461120892506001600160a01b03169050338361318a565b6112106131e5565b604080518281526020810187905233917f51e0d16595cabc591e64da08e45bb223577e5b9a39cd947b4ddc3472b2dd8878910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055505050565b600254600160a01b900460ff16156112e45760405162461bcd60e51b815260206004820152601d60248201527f54726561737572793a20616c726561647920696e697469616c697a65640000006044820152606401610934565b600780546001600160a01b03199081166001600160a01b038a811691909117909255600880548216898416179055600980548216888416179055600c80548216878416179055600b80549091168583161790556003829055604080518082019091528382168152600a549091166020820152611364906006906002613b61565b506113806064610b746065600d5461314290919063ffffffff16565b600e5560408051610120810182525f815269021e19e0c9bab2400000602082015269032d26d12e980b6000009181019190915269054b40b1f852bda0000060608201526907695a92c20d6fe000006080820152690cb49b44ba602d80000060a08201526934f086f3b33b6840000060c08201526969e10de76676d080000060e082015269d3c21bcecceda1000000610100820152611422906010906009613bc0565b5060408051610120810182526101c28152610190602082015261015e9181019190915261012c606082015260fa608082015260c860a0820152609660c0820152607d60e0820152606461010082015261147f906011906009613c07565b50610190601255612710601355610dac60145561012c601555610fa0601655606e601d55611b58601e55601c60175560fa6018556007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151d9190613eee565b600f556002805460ff60a01b1916600160a01b17905560405133907f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79906115679043815260200190565b60405180910390a250505050505050565b6002546001600160a01b031633146115a25760405162461bcd60e51b815260040161093490613ddb565b614e208111156115f45760405162461bcd60e51b815260206004820152601d60248201527f5f646973636f756e7450657263656e74206973206f76657220323030250000006044820152606401610934565b601c55565b6002546001600160a01b031633146116235760405162461bcd60e51b815260040161093490613ddb565b6001600160a01b0386166116495760405162461bcd60e51b815260040161093490613f1e565b6109c485111561166b5760405162461bcd60e51b815260040161093490613f3c565b6001600160a01b0384166116915760405162461bcd60e51b815260040161093490613f1e565b6107d08311156116b35760405162461bcd60e51b815260040161093490613f3c565b6001600160a01b0382166116d95760405162461bcd60e51b815260040161093490613f1e565b61157c8111156116fb5760405162461bcd60e51b815260040161093490613f3c565b602080546001600160a01b03199081166001600160a01b039889161790915560219590955560228054861694871694909417909355602391909155602480549093169316929092179055602555565b611752613249565b61175b816132a3565b50565b5f80611768612797565b9050600d548111610bd6575f61177c612de6565b90505f61179a612710610b746016548561314290919063ffffffff16565b90505f60085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118119190613eee565b905080821115611852575f611826838361315f565b90505f61183f670de0b6b3a7640000610b748489613142565b905061184d60055482613175565b965050505b5050505090565b6002546001600160a01b031633146118835760405162461bcd60e51b815260040161093490613ddb565b614e208111156118d55760405162461bcd60e51b815260206004820152601c60248201527f5f7072656d69756d50657263656e74206973206f7665722032303025000000006044820152606401610934565b601e55565b6002546001600160a01b031633146119045760405162461bcd60e51b815260040161093490613ddb565b61271081101580156119185750614e208111155b6119765760405162461bcd60e51b815260206004820152602960248201527f5f6d696e74696e67466163746f72466f72506179696e67446562743a206f7574604482015268206f662072616e676560b81b6064820152608401610934565b601f55565b435f9081526020818152604080832032845290915290205460ff16156119b35760405162461bcd60e51b815260040161093490613e1f565b435f9081526020818152604080832033845290915290205460ff16156119eb5760405162461bcd60e51b815260040161093490613e1f565b600354421015611a0d5760405162461bcd60e51b815260040161093490613e65565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611a54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a789190613e9c565b6001600160a01b0316148015611aff57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611ad0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af49190613e9c565b6001600160a01b0316145b8015611b7c57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611b4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b719190613e9c565b6001600160a01b0316145b8015611bf95750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611bca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bee9190613e9c565b6001600160a01b0316145b611c155760405162461bcd60e51b815260040161093490613eb7565b5f8211611c7d5760405162461bcd60e51b815260206004820152603060248201527f54726561737572793a2063616e6e6f7420707572636861736520626f6e64732060448201526f1dda5d1a081e995c9bc8185b5bdd5b9d60821b6064820152608401610934565b5f611c86612797565b9050818114611cd75760405162461bcd60e51b815260206004820152601c60248201527f54726561737572793a2043414e594f4e207072696365206d6f766564000000006044820152606401610934565b600d548110611d455760405162461bcd60e51b815260206004820152603460248201527f54726561737572793a2063616e796f6e5072696365206e6f7420656c696769626044820152736c6520666f7220626f6e6420707572636861736560601b6064820152608401610934565b600554831115611daa5760405162461bcd60e51b815260206004820152602a60248201527f54726561737572793a206e6f7420656e6f75676820626f6e64206c65667420746044820152696f20707572636861736560b01b6064820152608401610934565b5f611db3610b2c565b90505f8111611e045760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e64207261746500000000006044820152606401610934565b5f611e1b670de0b6b3a7640000610b748785613142565b90505f611e26612de6565b90505f611ea78360085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea19190613eee565b9061316a565b9050611ec4612710610b746016548561314290919063ffffffff16565b811115611f095760405162461bcd60e51b81526020600482015260136024820152726f766572206d6178206465627420726174696f60681b6044820152606401610934565b60075460405163079cc67960e41b81526001600160a01b03909116906379cc679090611f3b9033908b90600401613f05565b5f604051808303815f87803b158015611f52575f80fd5b505af1158015611f64573d5f803e3d5ffd5b50506008546040516340c10f1960e01b81526001600160a01b0390911692506340c10f199150611f9a9033908790600401613f05565b6020604051808303815f875af1158015611fb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fda9190613f62565b50600554611fe8908861315f565b600555611ff36131e5565b604080518881526020810185905233917f73017f1b70789e2e66759eeb3c7ec11f59e6eedb55d921cfaec5410dd42a4799910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050505050565b6002546001600160a01b031633146120995760405162461bcd60e51b815260040161093490613ddb565b6103e881101580156120ad57506127108111155b6120c95760405162461bcd60e51b815260040161093490613f3c565b601655565b435f9081526020818152604080832032845290915290205460ff16156121065760405162461bcd60e51b815260040161093490613e1f565b435f9081526020818152604080832033845290915290205460ff161561213e5760405162461bcd60e51b815260040161093490613e1f565b6003544210156121605760405162461bcd60e51b815260040161093490613e65565b612168612dbd565b4210156121b75760405162461bcd60e51b815260206004820152601860248201527f54726561737572793a206e6f74206f70656e65642079657400000000000000006044820152606401610934565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156121fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122229190613e9c565b6001600160a01b03161480156122a957506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa15801561227a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061229e9190613e9c565b6001600160a01b0316145b801561232657506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156122f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231b9190613e9c565b6001600160a01b0316145b80156123a35750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612374573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123989190613e9c565b6001600160a01b0316145b6123bf5760405162461bcd60e51b815260040161093490613eb7565b6123c76131e5565b6123cf612797565b601955600f545f906123e9906123e3612de6565b9061315f565b9050601754600454101561241f5761241a612415612710610b746018548561314290919063ffffffff16565b613366565b612659565b600e54601954111561265957600854604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612472573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124969190613eee565b90505f6124b0600d5460195461315f90919063ffffffff16565b90505f805f6124c8655af3107a4000610b9e88613745565b9050808411156124d6578093505b6124f1612710610b746013548861314290919063ffffffff16565b600f54106125165761250f670de0b6b3a7640000610b748887613142565b9150612581565b5f61252d670de0b6b3a7640000610b748988613142565b905061254a612710610b746014548461314290919063ffffffff16565b9250612556818461315f565b601f549094501561257f5761257c612710610b74601f548761314290919063ffffffff16565b93505b505b81156125905761259082613366565b821561265357600f546125a3908461316a565b600f556007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906125d89030908790600401613f05565b6020604051808303815f875af11580156125f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126189190613f62565b5060408051428152602081018590527ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2910160405180910390a15b50505050505b5060045461266890600161316a565b600455600e54612676612797565b116126945761268f612710610b74601554610b9e612de6565b612696565b5f5b600555435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6126db613249565b6126e45f6137b1565b565b5f806126f0612797565b9050600e54811115610bd6576007546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612742573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127669190613eee565b90505f612771610bda565b90508015610bd35761278f81610b7484670de0b6b3a7640000613142565b935050505090565b600c54600754604051633ddac95360e01b81525f926001600160a01b0390811692633ddac953926127d89290911690670de0b6b3a764000090600401613f05565b602060405180830381865afa925050508015612811575060408051601f3d908101601f1916820190925261280e91810190613eee565b60015b6128835760405162461bcd60e51b815260206004820152603860248201527f54726561737572793a206661696c656420746f20636f6e73756c742063616e7960448201527f6f6e2070726963652066726f6d20746865206f7261636c6500000000000000006064820152608401610934565b919050565b60068181548110612897575f80fd5b5f918252602090912001546001600160a01b0316905081565b600c54600754604051630d01142560e31b81525f926001600160a01b0390811692636808a128926127d89290911690670de0b6b3a764000090600401613f05565b6128f9613249565b6002546040515f916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600280546001600160a01b0319169055565b6002546001600160a01b0316331461296c5760405162461bcd60e51b815260040161093490613ddb565b600d54811015801561299857506129946064610b746078600d5461314290919063ffffffff16565b8111155b6129b45760405162461bcd60e51b815260040161093490613f3c565b600e55565b6002546001600160a01b031633146129e35760405162461bcd60e51b815260040161093490613ddb565b6101f481101580156129f757506127108111155b612a135760405162461bcd60e51b815260040161093490613f3c565b601355565b6002546001600160a01b03163314612a425760405162461bcd60e51b815260040161093490613ddb565b6078821115612a935760405162461bcd60e51b815260206004820152601e60248201527f5f626f6f74737472617045706f6368733a206f7574206f662072616e676500006044820152606401610934565b60648110158015612aa657506103e88111155b612b095760405162461bcd60e51b815260206004820152602e60248201527f5f626f6f747374726170537570706c79457870616e73696f6e50657263656e7460448201526d3a206f7574206f662072616e676560901b6064820152608401610934565b601791909155601855565b6002545f906001600160a01b03163314612b405760405162461bcd60e51b815260040161093490613ddb565b60098360ff1610612b635760405162461bcd60e51b815260040161093490613f81565b60ff831615612b9f576010612b79600185613fde565b60ff1681548110612b8c57612b8c613ff7565b905f5260205f2001548211612b9f575f80fd5b60088360ff161015612bde576010612bb884600161400b565b60ff1681548110612bcb57612bcb613ff7565b905f5260205f2001548210612bde575f80fd5b8160108460ff1681548110612bf557612bf5613ff7565b5f918252602090912001555060015b92915050565b6002546001600160a01b03163314612c345760405162461bcd60e51b815260040161093490613ddb565b601a55565b60108181548110612c48575f80fd5b5f91825260209091200154905081565b60118181548110612c48575f80fd5b6002546001600160a01b03163314612c915760405162461bcd60e51b815260040161093490613ddb565b601b55565b6002546001600160a01b03163314612cc05760405162461bcd60e51b815260040161093490613ddb565b600b5460405163b3ab15fb60e01b81526001600160a01b0383811660048301529091169063b3ab15fb9060240161096a565b6002546001600160a01b03163314612d1c5760405162461bcd60e51b815260040161093490613ddb565b61175b8161174a565b6002546001600160a01b03163314612d4f5760405162461bcd60e51b815260040161093490613ddb565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314612d9b5760405162461bcd60e51b815260040161093490613ddb565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b5f612de1612dd861546060045461314290919063ffffffff16565b6003549061316a565b905090565b600754604080516318160ddd60e01b815290515f926001600160a01b031691839183916318160ddd9160048083019260209291908290030181865afa158015612e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e559190613eee565b90505f805b60065460ff82161015612f1957612f07846001600160a01b03166370a0823160068460ff1681548110612e8f57612e8f613ff7565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa158015612edc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f009190613eee565b839061316a565b9150612f1281614024565b9050612e5a565b5061278f828261315f565b6002546001600160a01b03163314612f4e5760405162461bcd60e51b815260040161093490613ddb565b60648110158015612f6157506105dc8111155b612f7d5760405162461bcd60e51b815260040161093490613f3c565b601555565b6002545f906001600160a01b03163314612fae5760405162461bcd60e51b815260040161093490613ddb565b60098360ff1610612fd15760405162461bcd60e51b815260040161093490613f81565b600a8210158015612fe457506103e88211155b6130275760405162461bcd60e51b81526020600482015260146024820152735f76616c75653a206f7574206f662072616e676560601b6044820152606401610934565b8160118460ff1681548110612bf557612bf5613ff7565b613046613249565b6001600160a01b0381166130ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610934565b61175b816137b1565b6002546001600160a01b031633146130de5760405162461bcd60e51b815260040161093490613ddb565b600b54604051632ffaaa0960e01b815260048101849052602481018390526001600160a01b0390911690632ffaaa09906044015f604051808303815f87803b158015613128575f80fd5b505af115801561313a573d5f803e3d5ffd5b505050505050565b5f61314d8284614042565b9392505050565b5f61314d8284614059565b5f61314d8284614078565b5f61314d828461408b565b5f818310613183578161314d565b5090919050565b6131e08363a9059cbb60e01b84846040516024016131a9929190613f05565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613802565b505050565b600c5f9054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613231575f80fd5b505af1925050508015613242575060015b156126e457565b6001546001600160a01b031633146126e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811661330f5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610934565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906133989030908590600401613f05565b6020604051808303815f875af11580156133b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d89190613f62565b506021545f90156134b1576133fe612710610b746021548561314290919063ffffffff16565b60075460205460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926134369216908590600401613f05565b6020604051808303815f875af1158015613452573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134769190613f62565b5060408051428152602081018390527fcb3f34aaa3445b461e6da5492dc89e5c257a59fa598131f3b6bbc97a3638e409910160405180910390a15b6023545f9015613589576134d6612710610b746023548661314290919063ffffffff16565b60075460225460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb9261350e9216908590600401613f05565b6020604051808303815f875af115801561352a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354e9190613f62565b5060408051428152602081018390527fdc8b715b18523e58b7fd0da53259dfa91efd91df4a854d94b136e3333a3b9395910160405180910390a15b6025545f9015613661576135ae612710610b746025548761314290919063ffffffff16565b60075460245460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926135e69216908590600401613f05565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136269190613f62565b5060408051428152602081018390527f2dfe5937647c787f9c6bddefedb6b3273b627227b0493e9a83b5441fb11ee00c910160405180910390a15b61366f826123e3868661315f565b600b5460075491955061368f916001600160a01b0390811691165f6138d5565b600b546007546136ac916001600160a01b039182169116866138d5565b600b546040516397ffe1d760e01b8152600481018690526001600160a01b03909116906397ffe1d7906024015f604051808303815f87803b1580156136ef575f80fd5b505af1158015613701573d5f803e3d5ffd5b505060408051428152602081018890527f03ca7276ab7799bf73fb79d27ff0610cd7049574f2508ef8445162833d439aea935001905060405180910390a150505050565b5f60085b60108160ff168154811061375f5761375f613ff7565b905f5260205f20015483106137975760118160ff168154811061378457613784613ff7565b5f918252602090912001546012556137a7565b6137a08161409e565b9050613749565b5050601254919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f613856826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139d79092919063ffffffff16565b905080515f14806138765750808060200190518101906138769190613f62565b6131e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610934565b80158061394d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613927573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061394b9190613eee565b155b6139b85760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610934565b6131e08363095ea7b360e01b84846040516024016131a9929190613f05565b60606139e584845f856139ed565b949350505050565b606082471015613a4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610934565b5f80866001600160a01b03168587604051613a6991906140b9565b5f6040518083038185875af1925050503d805f8114613aa3576040519150601f19603f3d011682016040523d82523d5f602084013e613aa8565b606091505b5091509150613ab987838387613ac4565b979650505050505050565b60608315613b325782515f03613b2b576001600160a01b0385163b613b2b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b50816139e5565b6139e58383815115613b475781518083602001fd5b8060405162461bcd60e51b815260040161093491906140cf565b828054828255905f5260205f20908101928215613bb4579160200282015b82811115613bb457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613b7f565b50610bd6929150613c46565b828054828255905f5260205f20908101928215613bb4579160200282015b82811115613bb4578251829069ffffffffffffffffffff16905591602001919060010190613bde565b828054828255905f5260205f20908101928215613bb4579160200282015b82811115613bb4578251829061ffff16905591602001919060010190613c25565b5b80821115610bd6575f8155600101613c47565b5f60208284031215613c6a575f80fd5b5035919050565b5f8060408385031215613c82575f80fd5b50508035926020909101359150565b6001600160a01b038116811461175b575f80fd5b5f805f805f805f60e0888a031215613cbb575f80fd5b8735613cc681613c91565b96506020880135613cd681613c91565b95506040880135613ce681613c91565b94506060880135613cf681613c91565b93506080880135613d0681613c91565b925060a0880135613d1681613c91565b96999598509396929591949193505060c09091013590565b5f805f805f8060c08789031215613d43575f80fd5b8635613d4e81613c91565b9550602087013594506040870135613d6581613c91565b9350606087013592506080870135613d7c81613c91565b9598949750929591949360a090920135925050565b5f60208284031215613da1575f80fd5b813561314d81613c91565b5f8060408385031215613dbd575f80fd5b823560ff81168114613dcd575f80fd5b946020939093013593505050565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b60208082526019908201527f54726561737572793a206e6f7420737461727465642079657400000000000000604082015260600190565b5f60208284031215613eac575f80fd5b815161314d81613c91565b6020808252601e908201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604082015260600190565b5f60208284031215613efe575f80fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252600490820152637a65726f60e01b604082015260600190565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b5f60208284031215613f72575f80fd5b8151801515811461314d575f80fd5b60208082526029908201527f496e6465782068617320746f206265206c6f776572207468616e20636f756e74604082015268206f6620746965727360b81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115612c0457612c04613fca565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612c0457612c04613fca565b5f60ff821660ff810361403957614039613fca565b60010192915050565b8082028115828204841417612c0457612c04613fca565b5f8261407357634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115612c0457612c04613fca565b80820180821115612c0457612c04613fca565b5f60ff8216806140b0576140b0613fca565b5f190192915050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea2646970667358221220c4cba81492c79f04e2c4efc24fab3853826eec307351819f860b85b12014c0fd64736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610464575f3560e01c806382cad8381161024d578063b3ab15fb11610140578063c9f1a2e4116100bf578063e90b245411610084578063e90b2454146108c9578063f14698de146108d2578063f2fde38b146108db578063f8cd4d72146108ee578063fcb6f00814610901575f80fd5b8063c9f1a2e414610888578063cecce38e14610891578063d4b14944146108a4578063d98f2495146108b7578063da3ed419146108c0575f80fd5b8063b8a878f911610105578063b8a878f91461085d578063c5967c2614610866578063c8412d021461086e578063c8f5ed8d14610877578063c8f987f31461087f575f80fd5b8063b3ab15fb14610812578063b3ffc77714610825578063b49cf83814610838578063b4d1d7951461084b578063b692267014610854575f80fd5b8063900cf0cf116101cc578063998200251161019157806399820025146107b3578063a0487eea146107c6578063a204452b146107d9578063a3876056146107ec578063b06ce14a146107ff575f80fd5b8063900cf0cf146107685780639177f23b1461077157806391bbfed51461077a578063940e60641461078d57806398b762a1146107a0575f80fd5b80638c6402e5116102125780638c6402e51461070b5780638c664db61461071e5780638d476c94146107315780638d934f74146107445780638da5cb5b14610757575f80fd5b806382cad838146106cc578063874106cc146106df578063878fd42c146106e85780638893b9dd146106fb5780638a27f10314610703575f80fd5b806340af7ba511610365578063591663e1116102e4578063715018a6116102a9578063715018a6146106a257806372c054f9146106aa57806378e97925146106b25780637e39af80146106bb57806381d11eaf146106c3575f80fd5b8063591663e11461066357806359bf5d39146106765780635a0fc79c1461067e5780635b756179146106875780635e02c51e1461068f575f80fd5b80635346f3141161032a5780635346f314146106105780635495699f1461062357806354f04a111461063657806355ebdeef14610649578063570ca73514610652575f80fd5b806340af7ba5146105bb5780634390d2a8146105ce5780634456eda2146105e1578063499f3f19146105f45780634c109ce014610607575f80fd5b8063158ef93e116103f157806329ef1919116103b657806329ef1919146105865780632e9c7b651461058f57806335ed184a14610598578063392e53cd146105a05780634013a08e146105b2575f80fd5b8063158ef93e146105085780631b0fb35f1461052c57806322f832cd1461053f57806327c8f8351461054857806329605e7714610573575f80fd5b80630cf60175116104375780630cf60175146104bf5780630db7eb0b146104c7578063118ebbf9146104cf5780631460e390146104e2578063154ec2db146104f5575f80fd5b806301a937831461046857806303be7e761461047d57806304e5c7b1146104995780630b5bcec7146104ac575b5f80fd5b61047b610476366004613c5a565b61090a565b005b61048660235481565b6040519081526020015b60405180910390f35b61047b6104a7366004613c5a565b61099a565b61047b6104ba366004613c5a565b610a8d565b610486610b2c565b610486610bda565b61047b6104dd366004613c71565b610c76565b61047b6104f0366004613ca5565b61128a565b61047b610503366004613c5a565b611578565b60025461051c90600160a01b900460ff1681565b6040519015158152602001610490565b61047b61053a366004613d2e565b6115f9565b61048660145481565b600a5461055b906001600160a01b031681565b6040516001600160a01b039091168152602001610490565b61047b610581366004613d91565b61174a565b610486601c5481565b610486601b5481565b61048661175e565b600254600160a01b900460ff1661051c565b610486601f5481565b61047b6105c9366004613c5a565b611859565b60225461055b906001600160a01b031681565b6002546001600160a01b0316331461051c565b61047b610602366004613c5a565b6118da565b61048660255481565b600c5461055b906001600160a01b031681565b60245461055b906001600160a01b031681565b61047b610644366004613c71565b61197b565b61048660215481565b6002546001600160a01b031661055b565b61047b610671366004613c5a565b61206f565b600f54610486565b610486600f5481565b61047b6120ce565b600b5461055b906001600160a01b031681565b61047b6126d3565b6104866126e6565b61048660035481565b610486612797565b61048660135481565b61055b6106da366004613c5a565b612888565b61048660185481565b60085461055b906001600160a01b031681565b6104866128b0565b61047b6128f1565b61047b610719366004613c5a565b612942565b61047b61072c366004613c5a565b6129b9565b60095461055b906001600160a01b031681565b60205461055b906001600160a01b031681565b6001546001600160a01b031661055b565b61048660045481565b61048660195481565b61047b610788366004613c71565b612a18565b61051c61079b366004613dac565b612b14565b61047b6107ae366004613c5a565b612c0a565b6104866107c1366004613c5a565b612c39565b6104866107d4366004613c5a565b612c58565b61047b6107e7366004613c5a565b612c67565b60075461055b906001600160a01b031681565b61047b61080d366004613d91565b612c96565b61047b610820366004613d91565b612cf2565b61047b610833366004613d91565b612d25565b61047b610846366004613d91565b612d71565b61048661546081565b610486600e5481565b610486601a5481565b610486612dbd565b610486601e5481565b610486612de6565b610486601d5481565b610486600d5481565b61047b61089f366004613c5a565b612f24565b61051c6108b2366004613dac565b612f82565b61048660125481565b61048660165481565b61048660155481565b61048660175481565b61047b6108e9366004613d91565b61303e565b61047b6108fc366004613c71565b6130b4565b61048660055481565b6002546001600160a01b0316331461093d5760405162461bcd60e51b815260040161093490613ddb565b60405180910390fd5b600b546040516397ffe1d760e01b8152600481018390526001600160a01b03909116906397ffe1d7906024015b5f604051808303815f87803b158015610981575f80fd5b505af1158015610993573d5f803e3d5ffd5b5050505050565b6002546001600160a01b031633146109c45760405162461bcd60e51b815260040161093490613ddb565b600e54811015610a2b5760405162461bcd60e51b815260206004820152602c60248201527f5f7072656d69756d5468726573686f6c6420657863656564732063616e796f6e60448201526b50726963654365696c696e6760a01b6064820152608401610934565b6096811115610a885760405162461bcd60e51b8152602060048201526024808201527f5f7072656d69756d5468726573686f6c6420697320686967686572207468616e60448201526320312e3560e01b6064820152608401610934565b601d55565b6002546001600160a01b03163314610ab75760405162461bcd60e51b815260040161093490613ddb565b600a8110158015610aca57506103e88111155b610b275760405162461bcd60e51b815260206004820152602860248201527f5f6d6178537570706c79457870616e73696f6e50657263656e743a206f7574206044820152676f662072616e676560c01b6064820152608401610934565b601255565b5f80610b36612797565b9050600d548111610bd657601c545f03610b52575050600d5490565b5f610b7a82610b74670de0b6b3a7640000600d5461314290919063ffffffff16565b90613154565b90505f610ba4612710610b74601c54610b9e600d548761315f90919063ffffffff16565b90613142565b600d54909150610bb4908261316a565b93505f601a54118015610bc85750601a5484115b15610bd357601a5493505b50505b5090565b5f80610be4612797565b9050600e54811115610bd6575f610c0d6064610b74601d54600d5461314290919063ffffffff16565b9050808210610c6c575f610c38612710610b74601e54610b9e600d548861315f90919063ffffffff16565b600d54909150610c48908261316a565b93505f601b54118015610c5c5750601b5484115b15610bd357601b54935050505090565b600d549250505090565b435f9081526020818152604080832032845290915290205460ff1615610cae5760405162461bcd60e51b815260040161093490613e1f565b435f9081526020818152604080832033845290915290205460ff1615610ce65760405162461bcd60e51b815260040161093490613e1f565b600354421015610d085760405162461bcd60e51b815260040161093490613e65565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610d4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d739190613e9c565b6001600160a01b0316148015610dfa57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610dcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610def9190613e9c565b6001600160a01b0316145b8015610e7757506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610e48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6c9190613e9c565b6001600160a01b0316145b8015610ef45750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015610ec5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee99190613e9c565b6001600160a01b0316145b610f105760405162461bcd60e51b815260040161093490613eb7565b5f8211610f765760405162461bcd60e51b815260206004820152602e60248201527f54726561737572793a2063616e6e6f742072656465656d20626f6e647320776960448201526d1d1a081e995c9bc8185b5bdd5b9d60921b6064820152608401610934565b5f610f7f612797565b9050818114610fd05760405162461bcd60e51b815260206004820152601c60248201527f54726561737572793a2043414e594f4e207072696365206d6f766564000000006044820152606401610934565b600e54811161103a5760405162461bcd60e51b815260206004820152603060248201527f54726561737572793a2063616e796f6e5072696365206e6f7420656c6967696260448201526f6c6520666f7220626f6e642073616c6560801b6064820152608401610934565b5f611043610bda565b90505f81116110945760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e64207261746500000000006044820152606401610934565b5f6110ab670de0b6b3a7640000610b748785613142565b6007546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190613eee565b10156111765760405162461bcd60e51b815260206004820152602560248201527f54726561737572793a20747265617375727920686173206e6f206d6f726520626044820152641d5919d95d60da1b6064820152608401610934565b61118e611185600f5483613175565b600f549061315f565b600f5560085460405163079cc67960e41b81526001600160a01b03909116906379cc6790906111c39033908990600401613f05565b5f604051808303815f87803b1580156111da575f80fd5b505af11580156111ec573d5f803e3d5ffd5b505060075461120892506001600160a01b03169050338361318a565b6112106131e5565b604080518281526020810187905233917f51e0d16595cabc591e64da08e45bb223577e5b9a39cd947b4ddc3472b2dd8878910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055505050565b600254600160a01b900460ff16156112e45760405162461bcd60e51b815260206004820152601d60248201527f54726561737572793a20616c726561647920696e697469616c697a65640000006044820152606401610934565b600780546001600160a01b03199081166001600160a01b038a811691909117909255600880548216898416179055600980548216888416179055600c80548216878416179055600b80549091168583161790556003829055604080518082019091528382168152600a549091166020820152611364906006906002613b61565b506113806064610b746065600d5461314290919063ffffffff16565b600e5560408051610120810182525f815269021e19e0c9bab2400000602082015269032d26d12e980b6000009181019190915269054b40b1f852bda0000060608201526907695a92c20d6fe000006080820152690cb49b44ba602d80000060a08201526934f086f3b33b6840000060c08201526969e10de76676d080000060e082015269d3c21bcecceda1000000610100820152611422906010906009613bc0565b5060408051610120810182526101c28152610190602082015261015e9181019190915261012c606082015260fa608082015260c860a0820152609660c0820152607d60e0820152606461010082015261147f906011906009613c07565b50610190601255612710601355610dac60145561012c601555610fa0601655606e601d55611b58601e55601c60175560fa6018556007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151d9190613eee565b600f556002805460ff60a01b1916600160a01b17905560405133907f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79906115679043815260200190565b60405180910390a250505050505050565b6002546001600160a01b031633146115a25760405162461bcd60e51b815260040161093490613ddb565b614e208111156115f45760405162461bcd60e51b815260206004820152601d60248201527f5f646973636f756e7450657263656e74206973206f76657220323030250000006044820152606401610934565b601c55565b6002546001600160a01b031633146116235760405162461bcd60e51b815260040161093490613ddb565b6001600160a01b0386166116495760405162461bcd60e51b815260040161093490613f1e565b6109c485111561166b5760405162461bcd60e51b815260040161093490613f3c565b6001600160a01b0384166116915760405162461bcd60e51b815260040161093490613f1e565b6107d08311156116b35760405162461bcd60e51b815260040161093490613f3c565b6001600160a01b0382166116d95760405162461bcd60e51b815260040161093490613f1e565b61157c8111156116fb5760405162461bcd60e51b815260040161093490613f3c565b602080546001600160a01b03199081166001600160a01b039889161790915560219590955560228054861694871694909417909355602391909155602480549093169316929092179055602555565b611752613249565b61175b816132a3565b50565b5f80611768612797565b9050600d548111610bd6575f61177c612de6565b90505f61179a612710610b746016548561314290919063ffffffff16565b90505f60085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118119190613eee565b905080821115611852575f611826838361315f565b90505f61183f670de0b6b3a7640000610b748489613142565b905061184d60055482613175565b965050505b5050505090565b6002546001600160a01b031633146118835760405162461bcd60e51b815260040161093490613ddb565b614e208111156118d55760405162461bcd60e51b815260206004820152601c60248201527f5f7072656d69756d50657263656e74206973206f7665722032303025000000006044820152606401610934565b601e55565b6002546001600160a01b031633146119045760405162461bcd60e51b815260040161093490613ddb565b61271081101580156119185750614e208111155b6119765760405162461bcd60e51b815260206004820152602960248201527f5f6d696e74696e67466163746f72466f72506179696e67446562743a206f7574604482015268206f662072616e676560b81b6064820152608401610934565b601f55565b435f9081526020818152604080832032845290915290205460ff16156119b35760405162461bcd60e51b815260040161093490613e1f565b435f9081526020818152604080832033845290915290205460ff16156119eb5760405162461bcd60e51b815260040161093490613e1f565b600354421015611a0d5760405162461bcd60e51b815260040161093490613e65565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611a54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a789190613e9c565b6001600160a01b0316148015611aff57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611ad0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af49190613e9c565b6001600160a01b0316145b8015611b7c57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611b4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b719190613e9c565b6001600160a01b0316145b8015611bf95750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611bca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bee9190613e9c565b6001600160a01b0316145b611c155760405162461bcd60e51b815260040161093490613eb7565b5f8211611c7d5760405162461bcd60e51b815260206004820152603060248201527f54726561737572793a2063616e6e6f7420707572636861736520626f6e64732060448201526f1dda5d1a081e995c9bc8185b5bdd5b9d60821b6064820152608401610934565b5f611c86612797565b9050818114611cd75760405162461bcd60e51b815260206004820152601c60248201527f54726561737572793a2043414e594f4e207072696365206d6f766564000000006044820152606401610934565b600d548110611d455760405162461bcd60e51b815260206004820152603460248201527f54726561737572793a2063616e796f6e5072696365206e6f7420656c696769626044820152736c6520666f7220626f6e6420707572636861736560601b6064820152608401610934565b600554831115611daa5760405162461bcd60e51b815260206004820152602a60248201527f54726561737572793a206e6f7420656e6f75676820626f6e64206c65667420746044820152696f20707572636861736560b01b6064820152608401610934565b5f611db3610b2c565b90505f8111611e045760405162461bcd60e51b815260206004820152601b60248201527f54726561737572793a20696e76616c696420626f6e64207261746500000000006044820152606401610934565b5f611e1b670de0b6b3a7640000610b748785613142565b90505f611e26612de6565b90505f611ea78360085f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea19190613eee565b9061316a565b9050611ec4612710610b746016548561314290919063ffffffff16565b811115611f095760405162461bcd60e51b81526020600482015260136024820152726f766572206d6178206465627420726174696f60681b6044820152606401610934565b60075460405163079cc67960e41b81526001600160a01b03909116906379cc679090611f3b9033908b90600401613f05565b5f604051808303815f87803b158015611f52575f80fd5b505af1158015611f64573d5f803e3d5ffd5b50506008546040516340c10f1960e01b81526001600160a01b0390911692506340c10f199150611f9a9033908790600401613f05565b6020604051808303815f875af1158015611fb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fda9190613f62565b50600554611fe8908861315f565b600555611ff36131e5565b604080518881526020810185905233917f73017f1b70789e2e66759eeb3c7ec11f59e6eedb55d921cfaec5410dd42a4799910160405180910390a25050435f908152602081815260408083203284529091528082208054600160ff19918216811790925533845291909220805490911690911790555050505050565b6002546001600160a01b031633146120995760405162461bcd60e51b815260040161093490613ddb565b6103e881101580156120ad57506127108111155b6120c95760405162461bcd60e51b815260040161093490613f3c565b601655565b435f9081526020818152604080832032845290915290205460ff16156121065760405162461bcd60e51b815260040161093490613e1f565b435f9081526020818152604080832033845290915290205460ff161561213e5760405162461bcd60e51b815260040161093490613e1f565b6003544210156121605760405162461bcd60e51b815260040161093490613e65565b612168612dbd565b4210156121b75760405162461bcd60e51b815260206004820152601860248201527f54726561737572793a206e6f74206f70656e65642079657400000000000000006044820152606401610934565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156121fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122229190613e9c565b6001600160a01b03161480156122a957506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa15801561227a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061229e9190613e9c565b6001600160a01b0316145b801561232657506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156122f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231b9190613e9c565b6001600160a01b0316145b80156123a35750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015612374573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123989190613e9c565b6001600160a01b0316145b6123bf5760405162461bcd60e51b815260040161093490613eb7565b6123c76131e5565b6123cf612797565b601955600f545f906123e9906123e3612de6565b9061315f565b9050601754600454101561241f5761241a612415612710610b746018548561314290919063ffffffff16565b613366565b612659565b600e54601954111561265957600854604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612472573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124969190613eee565b90505f6124b0600d5460195461315f90919063ffffffff16565b90505f805f6124c8655af3107a4000610b9e88613745565b9050808411156124d6578093505b6124f1612710610b746013548861314290919063ffffffff16565b600f54106125165761250f670de0b6b3a7640000610b748887613142565b9150612581565b5f61252d670de0b6b3a7640000610b748988613142565b905061254a612710610b746014548461314290919063ffffffff16565b9250612556818461315f565b601f549094501561257f5761257c612710610b74601f548761314290919063ffffffff16565b93505b505b81156125905761259082613366565b821561265357600f546125a3908461316a565b600f556007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906125d89030908790600401613f05565b6020604051808303815f875af11580156125f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126189190613f62565b5060408051428152602081018590527ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2910160405180910390a15b50505050505b5060045461266890600161316a565b600455600e54612676612797565b116126945761268f612710610b74601554610b9e612de6565b612696565b5f5b600555435f908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6126db613249565b6126e45f6137b1565b565b5f806126f0612797565b9050600e54811115610bd6576007546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612742573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127669190613eee565b90505f612771610bda565b90508015610bd35761278f81610b7484670de0b6b3a7640000613142565b935050505090565b600c54600754604051633ddac95360e01b81525f926001600160a01b0390811692633ddac953926127d89290911690670de0b6b3a764000090600401613f05565b602060405180830381865afa925050508015612811575060408051601f3d908101601f1916820190925261280e91810190613eee565b60015b6128835760405162461bcd60e51b815260206004820152603860248201527f54726561737572793a206661696c656420746f20636f6e73756c742063616e7960448201527f6f6e2070726963652066726f6d20746865206f7261636c6500000000000000006064820152608401610934565b919050565b60068181548110612897575f80fd5b5f918252602090912001546001600160a01b0316905081565b600c54600754604051630d01142560e31b81525f926001600160a01b0390811692636808a128926127d89290911690670de0b6b3a764000090600401613f05565b6128f9613249565b6002546040515f916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600280546001600160a01b0319169055565b6002546001600160a01b0316331461296c5760405162461bcd60e51b815260040161093490613ddb565b600d54811015801561299857506129946064610b746078600d5461314290919063ffffffff16565b8111155b6129b45760405162461bcd60e51b815260040161093490613f3c565b600e55565b6002546001600160a01b031633146129e35760405162461bcd60e51b815260040161093490613ddb565b6101f481101580156129f757506127108111155b612a135760405162461bcd60e51b815260040161093490613f3c565b601355565b6002546001600160a01b03163314612a425760405162461bcd60e51b815260040161093490613ddb565b6078821115612a935760405162461bcd60e51b815260206004820152601e60248201527f5f626f6f74737472617045706f6368733a206f7574206f662072616e676500006044820152606401610934565b60648110158015612aa657506103e88111155b612b095760405162461bcd60e51b815260206004820152602e60248201527f5f626f6f747374726170537570706c79457870616e73696f6e50657263656e7460448201526d3a206f7574206f662072616e676560901b6064820152608401610934565b601791909155601855565b6002545f906001600160a01b03163314612b405760405162461bcd60e51b815260040161093490613ddb565b60098360ff1610612b635760405162461bcd60e51b815260040161093490613f81565b60ff831615612b9f576010612b79600185613fde565b60ff1681548110612b8c57612b8c613ff7565b905f5260205f2001548211612b9f575f80fd5b60088360ff161015612bde576010612bb884600161400b565b60ff1681548110612bcb57612bcb613ff7565b905f5260205f2001548210612bde575f80fd5b8160108460ff1681548110612bf557612bf5613ff7565b5f918252602090912001555060015b92915050565b6002546001600160a01b03163314612c345760405162461bcd60e51b815260040161093490613ddb565b601a55565b60108181548110612c48575f80fd5b5f91825260209091200154905081565b60118181548110612c48575f80fd5b6002546001600160a01b03163314612c915760405162461bcd60e51b815260040161093490613ddb565b601b55565b6002546001600160a01b03163314612cc05760405162461bcd60e51b815260040161093490613ddb565b600b5460405163b3ab15fb60e01b81526001600160a01b0383811660048301529091169063b3ab15fb9060240161096a565b6002546001600160a01b03163314612d1c5760405162461bcd60e51b815260040161093490613ddb565b61175b8161174a565b6002546001600160a01b03163314612d4f5760405162461bcd60e51b815260040161093490613ddb565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314612d9b5760405162461bcd60e51b815260040161093490613ddb565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b5f612de1612dd861546060045461314290919063ffffffff16565b6003549061316a565b905090565b600754604080516318160ddd60e01b815290515f926001600160a01b031691839183916318160ddd9160048083019260209291908290030181865afa158015612e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e559190613eee565b90505f805b60065460ff82161015612f1957612f07846001600160a01b03166370a0823160068460ff1681548110612e8f57612e8f613ff7565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa158015612edc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f009190613eee565b839061316a565b9150612f1281614024565b9050612e5a565b5061278f828261315f565b6002546001600160a01b03163314612f4e5760405162461bcd60e51b815260040161093490613ddb565b60648110158015612f6157506105dc8111155b612f7d5760405162461bcd60e51b815260040161093490613f3c565b601555565b6002545f906001600160a01b03163314612fae5760405162461bcd60e51b815260040161093490613ddb565b60098360ff1610612fd15760405162461bcd60e51b815260040161093490613f81565b600a8210158015612fe457506103e88211155b6130275760405162461bcd60e51b81526020600482015260146024820152735f76616c75653a206f7574206f662072616e676560601b6044820152606401610934565b8160118460ff1681548110612bf557612bf5613ff7565b613046613249565b6001600160a01b0381166130ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610934565b61175b816137b1565b6002546001600160a01b031633146130de5760405162461bcd60e51b815260040161093490613ddb565b600b54604051632ffaaa0960e01b815260048101849052602481018390526001600160a01b0390911690632ffaaa09906044015f604051808303815f87803b158015613128575f80fd5b505af115801561313a573d5f803e3d5ffd5b505050505050565b5f61314d8284614042565b9392505050565b5f61314d8284614059565b5f61314d8284614078565b5f61314d828461408b565b5f818310613183578161314d565b5090919050565b6131e08363a9059cbb60e01b84846040516024016131a9929190613f05565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613802565b505050565b600c5f9054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613231575f80fd5b505af1925050508015613242575060015b156126e457565b6001546001600160a01b031633146126e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811661330f5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610934565b6040516001600160a01b038216905f907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906133989030908590600401613f05565b6020604051808303815f875af11580156133b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d89190613f62565b506021545f90156134b1576133fe612710610b746021548561314290919063ffffffff16565b60075460205460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926134369216908590600401613f05565b6020604051808303815f875af1158015613452573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134769190613f62565b5060408051428152602081018390527fcb3f34aaa3445b461e6da5492dc89e5c257a59fa598131f3b6bbc97a3638e409910160405180910390a15b6023545f9015613589576134d6612710610b746023548661314290919063ffffffff16565b60075460225460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb9261350e9216908590600401613f05565b6020604051808303815f875af115801561352a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354e9190613f62565b5060408051428152602081018390527fdc8b715b18523e58b7fd0da53259dfa91efd91df4a854d94b136e3333a3b9395910160405180910390a15b6025545f9015613661576135ae612710610b746025548761314290919063ffffffff16565b60075460245460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926135e69216908590600401613f05565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136269190613f62565b5060408051428152602081018390527f2dfe5937647c787f9c6bddefedb6b3273b627227b0493e9a83b5441fb11ee00c910160405180910390a15b61366f826123e3868661315f565b600b5460075491955061368f916001600160a01b0390811691165f6138d5565b600b546007546136ac916001600160a01b039182169116866138d5565b600b546040516397ffe1d760e01b8152600481018690526001600160a01b03909116906397ffe1d7906024015f604051808303815f87803b1580156136ef575f80fd5b505af1158015613701573d5f803e3d5ffd5b505060408051428152602081018890527f03ca7276ab7799bf73fb79d27ff0610cd7049574f2508ef8445162833d439aea935001905060405180910390a150505050565b5f60085b60108160ff168154811061375f5761375f613ff7565b905f5260205f20015483106137975760118160ff168154811061378457613784613ff7565b5f918252602090912001546012556137a7565b6137a08161409e565b9050613749565b5050601254919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f613856826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139d79092919063ffffffff16565b905080515f14806138765750808060200190518101906138769190613f62565b6131e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610934565b80158061394d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613927573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061394b9190613eee565b155b6139b85760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610934565b6131e08363095ea7b360e01b84846040516024016131a9929190613f05565b60606139e584845f856139ed565b949350505050565b606082471015613a4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610934565b5f80866001600160a01b03168587604051613a6991906140b9565b5f6040518083038185875af1925050503d805f8114613aa3576040519150601f19603f3d011682016040523d82523d5f602084013e613aa8565b606091505b5091509150613ab987838387613ac4565b979650505050505050565b60608315613b325782515f03613b2b576001600160a01b0385163b613b2b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610934565b50816139e5565b6139e58383815115613b475781518083602001fd5b8060405162461bcd60e51b815260040161093491906140cf565b828054828255905f5260205f20908101928215613bb4579160200282015b82811115613bb457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613b7f565b50610bd6929150613c46565b828054828255905f5260205f20908101928215613bb4579160200282015b82811115613bb4578251829069ffffffffffffffffffff16905591602001919060010190613bde565b828054828255905f5260205f20908101928215613bb4579160200282015b82811115613bb4578251829061ffff16905591602001919060010190613c25565b5b80821115610bd6575f8155600101613c47565b5f60208284031215613c6a575f80fd5b5035919050565b5f8060408385031215613c82575f80fd5b50508035926020909101359150565b6001600160a01b038116811461175b575f80fd5b5f805f805f805f60e0888a031215613cbb575f80fd5b8735613cc681613c91565b96506020880135613cd681613c91565b95506040880135613ce681613c91565b94506060880135613cf681613c91565b93506080880135613d0681613c91565b925060a0880135613d1681613c91565b96999598509396929591949193505060c09091013590565b5f805f805f8060c08789031215613d43575f80fd5b8635613d4e81613c91565b9550602087013594506040870135613d6581613c91565b9350606087013592506080870135613d7c81613c91565b9598949750929591949360a090920135925050565b5f60208284031215613da1575f80fd5b813561314d81613c91565b5f8060408385031215613dbd575f80fd5b823560ff81168114613dcd575f80fd5b946020939093013593505050565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b60208082526019908201527f54726561737572793a206e6f7420737461727465642079657400000000000000604082015260600190565b5f60208284031215613eac575f80fd5b815161314d81613c91565b6020808252601e908201527f54726561737572793a206e656564206d6f7265207065726d697373696f6e0000604082015260600190565b5f60208284031215613efe575f80fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252600490820152637a65726f60e01b604082015260600190565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b5f60208284031215613f72575f80fd5b8151801515811461314d575f80fd5b60208082526029908201527f496e6465782068617320746f206265206c6f776572207468616e20636f756e74604082015268206f6620746965727360b81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115612c0457612c04613fca565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612c0457612c04613fca565b5f60ff821660ff810361403957614039613fca565b60010192915050565b8082028115828204841417612c0457612c04613fca565b5f8261407357634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115612c0457612c04613fca565b80820180821115612c0457612c04613fca565b5f60ff8216806140b0576140b0613fca565b5f190192915050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea2646970667358221220c4cba81492c79f04e2c4efc24fab3853826eec307351819f860b85b12014c0fd64736f6c634300081a0033
Deployed Bytecode Sourcemap
54099:22773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76723:144;;;;;;:::i;:::-;;:::i;:::-;;56089:35;;;;;;;;;391:25:1;;;379:2;364:18;56089:35:0;;;;;;;;68211:324;;;;;;:::i;:::-;;:::i;64210:319::-;;;;;;:::i;:::-;;:::i;60209:743::-;;;:::i;60960:797::-;;;:::i;71093:1118::-;;;;;;:::i;:::-;;:::i;61811:1740::-;;;;;;:::i;:::-;;:::i;67996:207::-;;;;;;:::i;:::-;;:::i;54423:31::-;;;;;-1:-1:-1;;;54423:31:0;;;;;;;;;2160:14:1;;2153:22;2135:41;;2123:2;2108:18;54423:31:0;1995:187:1;66832:886:0;;;;;;:::i;:::-;;:::i;55235:47::-;;;;;;54784:71;;;;;-1:-1:-1;;;;;54784:71:0;;;;;;-1:-1:-1;;;;;3248:32:1;;;3230:51;;3218:2;3203:18;54784:71:0;3084:203:1;51001:115:0;;;;;;:::i;:::-;;:::i;55786:30::-;;;;;;55727:29;;;;;;59004:749;;;:::i;58006:89::-;58076:11;;-1:-1:-1;;;58076:11:0;;;;58006:89;;55897:41;;;;;;68543:201;;;;;;:::i;:::-;;:::i;56060:22::-;;;;;-1:-1:-1;;;;;56060:22:0;;;50893:100;50976:9;;-1:-1:-1;;;;;50976:9:0;47458:10;50960:25;50893:100;;68752:330;;;;;;:::i;:::-;;:::i;56165:36::-;;;;;;54895:27;;;;;-1:-1:-1;;;;;54895:27:0;;;56133:23;;;;;-1:-1:-1;;;;;56133:23:0;;;69738:1347;;;;;;:::i;:::-;;:::i;56016:35::-;;;;;;50665:85;50733:9;;-1:-1:-1;;;;;50733:9:0;50665:85;;66060:257;;;;;;:::i;:::-;;:::i;58902:94::-;58972:16;;58902:94;;55023:31;;;;;;74040:2319;;;:::i;54864:24::-;;;;;-1:-1:-1;;;;;54864:24:0;;;49518:103;;;:::i;59761:440::-;;;:::i;54477:24::-;;;;;;58254:306;;;:::i;55188:40::-;;;;;;54630;;;;;;:::i;:::-;;:::i;55498:46::-;;;;;;54731:20;;;;;-1:-1:-1;;;;;54731:20:0;;;58568:311;;;:::i;51389:145::-;;;:::i;63913:289::-;;;;;;:::i;:::-;;:::i;65450:291::-;;;;;;:::i;:::-;;:::i;54758:19::-;;;;;-1:-1:-1;;;;;54758:19:0;;;55987:22;;;;;-1:-1:-1;;;;;55987:22:0;;;48877:87;48950:6;;-1:-1:-1;;;;;48950:6:0;48877:87;;54508:24;;;;;;55620:39;;;;;;66325:499;;;;;;:::i;:::-;;:::i;64537:492::-;;;;;;:::i;:::-;;:::i;67726:129::-;;;;;;:::i;:::-;;:::i;55063:28::-;;;;;;:::i;:::-;;:::i;55098:34::-;;;;;;:::i;:::-;;:::i;67863:125::-;;;;;;:::i;:::-;;:::i;54703:21::-;;;;;-1:-1:-1;;;;;54703:21:0;;;76369:134;;;;;;:::i;:::-;;:::i;63559:108::-;;;;;;:::i;:::-;;:::i;63675:105::-;;;;;;:::i;:::-;;:::i;63788:117::-;;;;;;:::i;:::-;;:::i;54302:40::-;;54335:7;54302:40;;54981:33;;;;;;55666:30;;;;;;58117:114;;;:::i;55861:29::-;;;;;;69254:476;;;:::i;55823:31::-;;;;;;54945:29;;;;;;65749:303;;;;;;:::i;:::-;;:::i;65037:405::-;;;;;;:::i;:::-;;:::i;55141:40::-;;;;;;55338:34;;;;;;55289:42;;;;;;55461:30;;;;;;49776:201;;;;;;:::i;:::-;;:::i;76511:204::-;;;;;;:::i;:::-;;:::i;54539:45::-;;;;;;76723:144;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;;;;;;;;;76821:9:::1;::::0;76810:49:::1;::::0;-1:-1:-1;;;76810:49:0;;::::1;::::0;::::1;391:25:1::0;;;-1:-1:-1;;;;;76821:9:0;;::::1;::::0;76810:41:::1;::::0;364:18:1;;76810:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;76723:144:::0;:::o;68211:324::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;68329:18:::1;;68308:17;:39;;68300:96;;;::::0;-1:-1:-1;;;68300:96:0;;4545:2:1;68300:96:0::1;::::0;::::1;4527:21:1::0;4584:2;4564:18;;;4557:30;4623:34;4603:18;;;4596:62;-1:-1:-1;;;4674:18:1;;;4667:42;4726:19;;68300:96:0::1;4343:408:1::0;68300:96:0::1;68436:3;68415:17;:24;;68407:73;;;::::0;-1:-1:-1;;;68407:73:0;;4958:2:1;68407:73:0::1;::::0;::::1;4940:21:1::0;4997:2;4977:18;;;4970:30;5036:34;5016:18;;;5009:62;-1:-1:-1;;;5087:18:1;;;5080:34;5131:19;;68407:73:0::1;4756:400:1::0;68407:73:0::1;68491:16;:36:::0;68211:324::o;64210:319::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;64356:2:::1;64326:26;:32;;:70;;;;;64392:4;64362:26;:34;;64326:70;64318:123;;;::::0;-1:-1:-1;;;64318:123:0;;5363:2:1;64318:123:0::1;::::0;::::1;5345:21:1::0;5402:2;5382:18;;;5375:30;5441:34;5421:18;;;5414:62;-1:-1:-1;;;5492:18:1;;;5485:38;5540:19;;64318:123:0::1;5161:404:1::0;64318:123:0::1;64467:25;:54:::0;64210:319::o;60209:743::-;60261:13;60287:20;60310:16;:14;:16::i;:::-;60287:39;;60357:14;;60341:12;:30;60337:608;;60392:15;;60411:1;60392:20;60388:546;;-1:-1:-1;;60473:14:0;;;60209:743::o;60388:546::-;60528:19;60550:42;60579:12;60550:24;60569:4;60550:14;;:18;;:24;;;;:::i;:::-;:28;;:42::i;:::-;60528:64;;60631:23;60657:63;60714:5;60657:52;60693:15;;60657:31;60673:14;;60657:11;:15;;:31;;;;:::i;:::-;:35;;:52::i;:63::-;60747:14;;60631:89;;-1:-1:-1;60747:35:0;;60631:89;60747:18;:35::i;:::-;60739:43;;60823:1;60805:15;;:19;:46;;;;;60836:15;;60828:5;:23;60805:46;60801:118;;;60884:15;;60876:23;;60801:118;60509:425;;60388:546;60276:676;60209:743;:::o;60960:797::-;61011:13;61037:20;61060:16;:14;:16::i;:::-;61037:39;;61106:18;;61091:12;:33;61087:663;;;61141:36;61180:45;61221:3;61180:36;61199:16;;61180:14;;:18;;:36;;;;:::i;:45::-;61141:84;;61260:28;61244:12;:44;61240:499;;61341:22;61366:63;61423:5;61366:52;61403:14;;61366:32;61383:14;;61366:12;:16;;:32;;;;:::i;:63::-;61456:14;;61341:88;;-1:-1:-1;61456:34:0;;61341:88;61456:18;:34::i;:::-;61448:42;;61530:1;61513:14;;:18;:44;;;;;61543:14;;61535:5;:22;61513:44;61509:115;;;61590:14;;61582:22;;61290:349;61126:624;61026:731;60960:797;:::o;61240:499::-;61709:14;;61701:22;;61126:624;61026:731;60960:797;:::o;71093:1118::-;51762:12;51730:4;51754:21;;;;;;;;;;;51776:9;51754:32;;;;;;;;;;51979:29;51971:80;;;;-1:-1:-1;;;51971:80:0;;;;;;;:::i;:::-;51895:12;51863:4;51887:21;;;;;;;;;;;51909:10;51887:33;;;;;;;;;;52070:29;52062:80;;;;-1:-1:-1;;;52062:80:0;;;;;;;:::i;:::-;57044:9:::1;;57025:15;:28;;57017:66;;;;-1:-1:-1::0;;;57017:66:0::1;;;;;;;:::i;:::-;57509:6:::2;::::0;57497:30:::2;::::0;;-1:-1:-1;;;57497:30:0;;;;57539:4:::2;::::0;-1:-1:-1;;;;;57509:6:0::2;::::0;57497:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57509:6;57497:30:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57497:47:0::2;;:114;;;;-1:-1:-1::0;57577:5:0::2;::::0;57565:29:::2;::::0;;-1:-1:-1;;;57565:29:0;;;;57606:4:::2;::::0;-1:-1:-1;;;;;57577:5:0::2;::::0;57565:27:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57577:5;57565:29:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57565:46:0::2;;57497:114;:180;;;;-1:-1:-1::0;57644:4:0::2;::::0;57632:28:::2;::::0;;-1:-1:-1;;;57632:28:0;;;;57672:4:::2;::::0;-1:-1:-1;;;;;57644:4:0::2;::::0;57632:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57644:4;57632:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57632:45:0::2;;57497:180;:248;;;;-1:-1:-1::0;57707:9:0::2;::::0;57698:30:::2;::::0;;-1:-1:-1;;;57698:30:0;;;;57740:4:::2;::::0;-1:-1:-1;;;;;57707:9:0::2;::::0;57698:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57707:9;57698:30:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57698:47:0::2;;57497:248;57475:328;;;;-1:-1:-1::0;;;57475:328:0::2;;;;;;;:::i;:::-;71240:1:::3;71226:11;:15;71218:74;;;::::0;-1:-1:-1;;;71218:74:0;;7148:2:1;71218:74:0::3;::::0;::::3;7130:21:1::0;7187:2;7167:18;;;7160:30;7226:34;7206:18;;;7199:62;-1:-1:-1;;;7277:18:1;;;7270:44;7331:19;;71218:74:0::3;6946:410:1::0;71218:74:0::3;71305:19;71327:16;:14;:16::i;:::-;71305:38;;71377:11;71362;:26;71354:67;;;::::0;-1:-1:-1;;;71354:67:0;;7563:2:1;71354:67:0::3;::::0;::::3;7545:21:1::0;7602:2;7582:18;;;7575:30;7641;7621:18;;;7614:58;7689:18;;71354:67:0::3;7361:352:1::0;71354:67:0::3;71468:18;;71454:11;:32;71432:147;;;::::0;-1:-1:-1;;;71432:147:0;;7920:2:1;71432:147:0::3;::::0;::::3;7902:21:1::0;7959:2;7939:18;;;7932:30;7998:34;7978:18;;;7971:62;-1:-1:-1;;;8049:18:1;;;8042:46;8105:19;;71432:147:0::3;7718:412:1::0;71432:147:0::3;71592:13;71608:20;:18;:20::i;:::-;71592:36;;71655:1;71647:5;:9;71639:49;;;::::0;-1:-1:-1;;;71639:49:0;;8337:2:1;71639:49:0::3;::::0;::::3;8319:21:1::0;8376:2;8356:18;;;8349:30;8415:29;8395:18;;;8388:57;8462:18;;71639:49:0::3;8135:351:1::0;71639:49:0::3;71701:21;71725:32;71752:4;71725:22;:11:::0;71741:5;71725:15:::3;:22::i;:32::-;71783:6;::::0;71776:39:::3;::::0;-1:-1:-1;;;71776:39:0;;71809:4:::3;71776:39;::::0;::::3;3230:51:1::0;71701:56:0;;-1:-1:-1;71701:56:0;;-1:-1:-1;;;;;71783:6:0;;::::3;::::0;71776:24:::3;::::0;3203:18:1;;71776:39:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;71768:106;;;::::0;-1:-1:-1;;;71768:106:0;;8882:2:1;71768:106:0::3;::::0;::::3;8864:21:1::0;8921:2;8901:18;;;8894:30;8960:34;8940:18;;;8933:62;-1:-1:-1;;;9011:18:1;;;9004:35;9056:19;;71768:106:0::3;8680:401:1::0;71768:106:0::3;71906:63;71927:41;71936:16;;71954:13;71927:8;:41::i;:::-;71906:16;::::0;;:20:::3;:63::i;:::-;71887:16;:82:::0;71994:5:::3;::::0;71982:52:::3;::::0;-1:-1:-1;;;71982:52:0;;-1:-1:-1;;;;;71994:5:0;;::::3;::::0;71982:27:::3;::::0;:52:::3;::::0;72010:10:::3;::::0;72022:11;;71982:52:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;72052:6:0::3;::::0;72045:54:::3;::::0;-1:-1:-1;;;;;;72052:6:0::3;::::0;-1:-1:-1;72073:10:0::3;72085:13:::0;72045:27:::3;:54::i;:::-;72112:20;:18;:20::i;:::-;72150:53;::::0;;9539:25:1;;;9595:2;9580:18;;9573:34;;;72164:10:0::3;::::0;72150:53:::3;::::0;9512:18:1;72150:53:0::3;;;;;;;-1:-1:-1::0;;52177:12:0;52169:7;:21;;;;;;;;;;;52191:9;52169:32;;;;;;;;:39;;52204:4;-1:-1:-1;;52169:39:0;;;;;;;;52241:10;52219:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;;71093:1118:0:o;61811:1740::-;57881:11;;-1:-1:-1;;;57881:11:0;;;;57880:12;57872:54;;;;-1:-1:-1;;;57872:54:0;;9820:2:1;57872:54:0;;;9802:21:1;9859:2;9839:18;;;9832:30;9898:31;9878:18;;;9871:59;9947:18;;57872:54:0;9618:353:1;57872:54:0;62063:6:::1;:16:::0;;-1:-1:-1;;;;;;62063:16:0;;::::1;-1:-1:-1::0;;;;;62063:16:0;;::::1;::::0;;;::::1;::::0;;;62090:5:::1;:14:::0;;;::::1;::::0;;::::1;;::::0;;62115:4:::1;:12:::0;;;::::1;::::0;;::::1;;::::0;;62138::::1;:28:::0;;;::::1;::::0;;::::1;;::::0;;62177:9:::1;:22:::0;;;;::::1;::::0;;::::1;;::::0;;62210:9:::1;:22:::0;;;62245:49:::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;62282:11:::1;::::0;;;::::1;62245:49;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;62245:49:0::1;;:::i;:::-;;62328:32;62356:3;62328:23;62347:3;62328:14;;:18;;:23;;;;:::i;:32::-;62307:18;:53:::0;62415:131:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;62415:131:0;;62439:11:::1;62415:131;::::0;::::1;::::0;62452:11:::1;62415:131:::0;;;;;;;62465:11:::1;62415:131:::0;;;;62478:11:::1;62415:131:::0;;;;62491:11:::1;62415:131:::0;;;;62504:12:::1;62415:131:::0;;;;62518:12:::1;62415:131:::0;;;;62532:13:::1;62415:131:::0;;;;::::1;::::0;:11:::1;::::0;:131:::1;;:::i;:::-;-1:-1:-1::0;62557:65:0::1;::::0;;::::1;::::0;::::1;::::0;;62578:3:::1;62557:65:::0;;62583:3:::1;62557:65;::::0;::::1;::::0;62588:3:::1;62557:65:::0;;;;;;;62593:3:::1;62557:65:::0;;;;62598:3:::1;62557:65:::0;;;;62603:3:::1;62557:65:::0;;;;62608:3:::1;62557:65:::0;;;;62613:3:::1;62557:65:::0;;;;62618:3:::1;62557:65:::0;;;;::::1;::::0;:17:::1;::::0;:65:::1;;:::i;:::-;-1:-1:-1::0;62663:3:0::1;62635:25;:31:::0;62741:5:::1;62713:25;:33:::0;62835:4:::1;62800:32;:39:::0;62932:3:::1;62902:27;:33:::0;63036:4:::1;63014:19;:26:::0;63112:3:::1;63093:16;:22:::0;63143:4:::1;63126:14;:21:::0;63226:2:::1;63208:15;:20:::0;63273:3:::1;63239:31;:37:::0;-1:-1:-1;63427:6:0;63420:39:::1;::::0;-1:-1:-1;;;63420:39:0;;63453:4:::1;63420:39;::::0;::::1;3230:51:1::0;-1:-1:-1;;;;;63427:6:0;;::::1;::::0;63420:24:::1;::::0;3203:18:1;;63420:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63401:16;:58:::0;63472:11:::1;:18:::0;;-1:-1:-1;;;;63472:18:0::1;-1:-1:-1::0;;;63472:18:0::1;::::0;;63506:37:::1;::::0;63518:10:::1;::::0;63506:37:::1;::::0;::::1;::::0;63530:12:::1;391:25:1::0;;379:2;364:18;;245:177;63506:37:0::1;;;;;;;;61811:1740:::0;;;;;;;:::o;67996:207::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;68111:5:::1;68091:16;:25;;68083:67;;;::::0;-1:-1:-1;;;68083:67:0;;10178:2:1;68083:67:0::1;::::0;::::1;10160:21:1::0;10217:2;10197:18;;;10190:30;10256:31;10236:18;;;10229:59;10305:18;;68083:67:0::1;9976:353:1::0;68083:67:0::1;68161:15;:34:::0;67996:207::o;66832:886::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;67106:22:0;::::1;67098:39;;;;-1:-1:-1::0;;;67098:39:0::1;;;;;;;:::i;:::-;67181:4;67156:21;:29;;67148:54;;;;-1:-1:-1::0;;;67148:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67231:22:0;::::1;67223:39;;;;-1:-1:-1::0;;;67223:39:0::1;;;;;;;:::i;:::-;67306:4;67281:21;:29;;67273:54;;;;-1:-1:-1::0;;;67273:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67356:23:0;::::1;67348:40;;;;-1:-1:-1::0;;;67348:40:0::1;;;;;;;:::i;:::-;67433:4;67407:22;:30;;67399:55;;;;-1:-1:-1::0;;;67399:55:0::1;;;;;;;:::i;:::-;67465:7;:18:::0;;-1:-1:-1;;;;;;67465:18:0;;::::1;-1:-1:-1::0;;;;;67465:18:0;;::::1;;::::0;;;67494:20:::1;:44:::0;;;;67549:7:::1;:18:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;67578:20:::1;:44:::0;;;;67633:8:::1;:20:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;67664:21:::1;:46:::0;66832:886::o;51001:115::-;48763:13;:11;:13::i;:::-;51077:31:::1;51095:12;51077:17;:31::i;:::-;51001:115:::0;:::o;59004:749::-;59058:27;59098:20;59121:16;:14;:16::i;:::-;59098:39;;59168:14;;59152:12;:30;59148:598;;59199:21;59223:28;:26;:28::i;:::-;59199:52;;59266:22;59291:49;59334:5;59291:38;59309:19;;59291:13;:17;;:38;;;;:::i;:49::-;59266:74;;59355:19;59384:5;;;;;;;;;-1:-1:-1;;;;;59384:5:0;-1:-1:-1;;;;;59377:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59355:49;;59440:11;59423:14;:28;59419:316;;;59472:24;59499:31;:14;59518:11;59499:18;:31::i;:::-;59472:58;-1:-1:-1;59549:26:0;59578:44;59617:4;59578:34;59472:58;59599:12;59578:20;:34::i;:44::-;59549:73;;59663:56;59672:26;;59700:18;59663:8;:56::i;:::-;59641:78;;59453:282;;59419:316;59184:562;;;59087:666;59004:749;:::o;68543:201::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;68655:5:::1;68636:15;:24;;68628:65;;;::::0;-1:-1:-1;;;68628:65:0;;11209:2:1;68628:65:0::1;::::0;::::1;11191:21:1::0;11248:2;11228:18;;;11221:30;11287;11267:18;;;11260:58;11335:18;;68628:65:0::1;11007:352:1::0;68628:65:0::1;68704:14;:32:::0;68543:201::o;68752:330::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;68900:5:::1;68869:27;:36;;:76;;;;;68940:5;68909:27;:36;;68869:76;68861:130;;;::::0;-1:-1:-1;;;68861:130:0;;11566:2:1;68861:130:0::1;::::0;::::1;11548:21:1::0;11605:2;11585:18;;;11578:30;11644:34;11624:18;;;11617:62;-1:-1:-1;;;11695:18:1;;;11688:39;11744:19;;68861:130:0::1;11364:405:1::0;68861:130:0::1;69018:26;:56:::0;68752:330::o;69738:1347::-;51762:12;51730:4;51754:21;;;;;;;;;;;51776:9;51754:32;;;;;;;;;;51979:29;51971:80;;;;-1:-1:-1;;;51971:80:0;;;;;;;:::i;:::-;51895:12;51863:4;51887:21;;;;;;;;;;;51909:10;51887:33;;;;;;;;;;52070:29;52062:80;;;;-1:-1:-1;;;52062:80:0;;;;;;;:::i;:::-;57044:9:::1;;57025:15;:28;;57017:66;;;;-1:-1:-1::0;;;57017:66:0::1;;;;;;;:::i;:::-;57509:6:::2;::::0;57497:30:::2;::::0;;-1:-1:-1;;;57497:30:0;;;;57539:4:::2;::::0;-1:-1:-1;;;;;57509:6:0::2;::::0;57497:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57509:6;57497:30:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57497:47:0::2;;:114;;;;-1:-1:-1::0;57577:5:0::2;::::0;57565:29:::2;::::0;;-1:-1:-1;;;57565:29:0;;;;57606:4:::2;::::0;-1:-1:-1;;;;;57577:5:0::2;::::0;57565:27:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57577:5;57565:29:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57565:46:0::2;;57497:114;:180;;;;-1:-1:-1::0;57644:4:0::2;::::0;57632:28:::2;::::0;;-1:-1:-1;;;57632:28:0;;;;57672:4:::2;::::0;-1:-1:-1;;;;;57644:4:0::2;::::0;57632:26:::2;::::0;:28:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57644:4;57632:28:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57632:45:0::2;;57497:180;:248;;;;-1:-1:-1::0;57707:9:0::2;::::0;57698:30:::2;::::0;;-1:-1:-1;;;57698:30:0;;;;57740:4:::2;::::0;-1:-1:-1;;;;;57707:9:0::2;::::0;57698:28:::2;::::0;:30:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;57707:9;57698:30:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57698:47:0::2;;57497:248;57475:328;;;;-1:-1:-1::0;;;57475:328:0::2;;;;;;;:::i;:::-;69886:1:::3;69870:13;:17;69862:78;;;::::0;-1:-1:-1;;;69862:78:0;;11976:2:1;69862:78:0::3;::::0;::::3;11958:21:1::0;12015:2;11995:18;;;11988:30;12054:34;12034:18;;;12027:62;-1:-1:-1;;;12105:18:1;;;12098:46;12161:19;;69862:78:0::3;11774:412:1::0;69862:78:0::3;69953:19;69975:16;:14;:16::i;:::-;69953:38;;70025:11;70010;:26;70002:67;;;::::0;-1:-1:-1;;;70002:67:0;;7563:2:1;70002:67:0::3;::::0;::::3;7545:21:1::0;7602:2;7582:18;;;7575:30;7641;7621:18;;;7614:58;7689:18;;70002:67:0::3;7361:352:1::0;70002:67:0::3;70116:14;;70102:11;:28;70080:144;;;::::0;-1:-1:-1;;;70080:144:0;;12393:2:1;70080:144:0::3;::::0;::::3;12375:21:1::0;12432:2;12412:18;;;12405:30;12471:34;12451:18;;;12444:62;-1:-1:-1;;;12522:18:1;;;12515:50;12582:19;;70080:144:0::3;12191:416:1::0;70080:144:0::3;70262:26;;70245:13;:43;;70237:98;;;::::0;-1:-1:-1;;;70237:98:0;;12814:2:1;70237:98:0::3;::::0;::::3;12796:21:1::0;12853:2;12833:18;;;12826:30;12892:34;12872:18;;;12865:62;-1:-1:-1;;;12943:18:1;;;12936:40;12993:19;;70237:98:0::3;12612:406:1::0;70237:98:0::3;70348:13;70364:21;:19;:21::i;:::-;70348:37;;70412:1;70404:5;:9;70396:49;;;::::0;-1:-1:-1;;;70396:49:0;;8337:2:1;70396:49:0::3;::::0;::::3;8319:21:1::0;8376:2;8356:18;;;8349:30;8415:29;8395:18;;;8388:57;8462:18;;70396:49:0::3;8135:351:1::0;70396:49:0::3;70458:19;70480:34;70509:4;70480:24;:13:::0;70498:5;70480:17:::3;:24::i;:34::-;70458:56;;70525:20;70548:28;:26;:28::i;:::-;70525:51;;70587:21;70611:44;70643:11;70618:5;;;;;;;;;-1:-1:-1::0;;;;;70618:5:0::3;-1:-1:-1::0;;;;;70611:25:0::3;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31:::0;::::3;:44::i;:::-;70587:68;;70691:48;70733:5;70691:37;70708:19;;70691:12;:16;;:37;;;;:::i;:48::-;70674:13;:65;;70666:97;;;::::0;-1:-1:-1;;;70666:97:0;;13225:2:1;70666:97:0::3;::::0;::::3;13207:21:1::0;13264:2;13244:18;;;13237:30;-1:-1:-1;;;13283:18:1;;;13276:49;13342:18;;70666:97:0::3;13023:343:1::0;70666:97:0::3;70788:6;::::0;70776:55:::3;::::0;-1:-1:-1;;;70776:55:0;;-1:-1:-1;;;;;70788:6:0;;::::3;::::0;70776:28:::3;::::0;:55:::3;::::0;70805:10:::3;::::0;70817:13;;70776:55:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;70854:5:0::3;::::0;70842:48:::3;::::0;-1:-1:-1;;;70842:48:0;;-1:-1:-1;;;;;70854:5:0;;::::3;::::0;-1:-1:-1;70842:23:0::3;::::0;-1:-1:-1;70842:48:0::3;::::0;70866:10:::3;::::0;70878:11;;70842:48:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;70932:26:0::3;::::0;:45:::3;::::0;70963:13;70932:30:::3;:45::i;:::-;70903:26;:74:::0;70988:20:::3;:18;:20::i;:::-;71026:51;::::0;;9539:25:1;;;9595:2;9580:18;;9573:34;;;71038:10:0::3;::::0;71026:51:::3;::::0;9512:18:1;71026:51:0::3;;;;;;;-1:-1:-1::0;;52177:12:0;52169:7;:21;;;;;;;;;;;52191:9;52169:32;;;;;;;;:39;;52204:4;-1:-1:-1;;52169:39:0;;;;;;;;52241:10;52219:33;;;;;;:40;;;;;;;;;;-1:-1:-1;;;;;69738:1347:0:o;66060:257::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;66187:4:::1;66163:20;:28;;:61;;;;;66219:5;66195:20;:29;;66163:61;66155:86;;;;-1:-1:-1::0;;;66155:86:0::1;;;;;;;:::i;:::-;66267:19;:42:::0;66060:257::o;74040:2319::-;51762:12;51730:4;51754:21;;;;;;;;;;;51776:9;51754:32;;;;;;;;;;51979:29;51971:80;;;;-1:-1:-1;;;51971:80:0;;;;;;;:::i;:::-;51895:12;51863:4;51887:21;;;;;;;;;;;51909:10;51887:33;;;;;;;;;;52070:29;52062:80;;;;-1:-1:-1;;;52062:80:0;;;;;;;:::i;:::-;57044:9:::1;;57025:15;:28;;57017:66;;;;-1:-1:-1::0;;;57017:66:0::1;;;;;;;:::i;:::-;57173:16:::2;:14;:16::i;:::-;57154:15;:35;;57146:72;;;::::0;-1:-1:-1;;;57146:72:0;;13855:2:1;57146:72:0::2;::::0;::::2;13837:21:1::0;13894:2;13874:18;;;13867:30;13933:26;13913:18;;;13906:54;13977:18;;57146:72:0::2;13653:348:1::0;57146:72:0::2;57509:6:::3;::::0;57497:30:::3;::::0;;-1:-1:-1;;;57497:30:0;;;;57539:4:::3;::::0;-1:-1:-1;;;;;57509:6:0::3;::::0;57497:28:::3;::::0;:30:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;57509:6;57497:30:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57497:47:0::3;;:114;;;;-1:-1:-1::0;57577:5:0::3;::::0;57565:29:::3;::::0;;-1:-1:-1;;;57565:29:0;;;;57606:4:::3;::::0;-1:-1:-1;;;;;57577:5:0::3;::::0;57565:27:::3;::::0;:29:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;57577:5;57565:29:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57565:46:0::3;;57497:114;:180;;;;-1:-1:-1::0;57644:4:0::3;::::0;57632:28:::3;::::0;;-1:-1:-1;;;57632:28:0;;;;57672:4:::3;::::0;-1:-1:-1;;;;;57644:4:0::3;::::0;57632:26:::3;::::0;:28:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;57644:4;57632:28:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57632:45:0::3;;57497:180;:248;;;;-1:-1:-1::0;57707:9:0::3;::::0;57698:30:::3;::::0;;-1:-1:-1;;;57698:30:0;;;;57740:4:::3;::::0;-1:-1:-1;;;;;57707:9:0::3;::::0;57698:28:::3;::::0;:30:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;57707:9;57698:30:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57698:47:0::3;;57497:248;57475:328;;;;-1:-1:-1::0;;;57475:328:0::3;;;;;;;:::i;:::-;74144:20:::4;:18;:20::i;:::-;74202:16;:14;:16::i;:::-;74175:24;:43:::0;74285:16:::4;::::0;74229:20:::4;::::0;74252:50:::4;::::0;:28:::4;:26;:28::i;:::-;:32:::0;::::4;:50::i;:::-;74229:73;;74325:15;;74317:5;;:23;74313:2039;;;74409:78;74426:60;74480:5;74426:49;74443:31;;74426:12;:16;;:49;;;;:::i;:60::-;74409:16;:78::i;:::-;74313:2039;;;74551:18;;74524:24;;:45;74520:1821;;;74716:5;::::0;74709:27:::4;::::0;;-1:-1:-1;;;74709:27:0;;;;74688:18:::4;::::0;-1:-1:-1;;;;;74716:5:0::4;::::0;74709:25:::4;::::0;:27:::4;::::0;;::::4;::::0;::::4;::::0;;;;;;;;74716:5;74709:27:::4;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74688:48;;74755:19;74777:44;74806:14;;74777:24;;:28;;:44;;;;:::i;:::-;74755:66;;74840:21;74880:26:::0;74925:12:::4;74940:59;74994:4;74940:49;74976:12;74940:35;:49::i;:59::-;74925:74;;75036:4;75022:11;:18;75018:85;;;75079:4;75065:18;;75018:85;75145:52;75191:5;75145:41;75160:25;;75145:10;:14;;:41;;;;:::i;:52::-;75125:16;;:72;75121:791;;75312:39;75346:4;75312:29;:12:::0;75329:11;75312:16:::4;:29::i;:39::-;75291:60;;75121:791;;;75469:20;75492:39;75526:4;75492:29;:12:::0;75509:11;75492:16:::4;:29::i;:39::-;75469:62;;75575:61;75630:5;75575:50;75592:32;;75575:12;:16;;:50;;;;:::i;:61::-;75554:82:::0;-1:-1:-1;75675:36:0::4;:12:::0;75554:82;75675:16:::4;:36::i;:::-;75738:26;::::0;75659:52;;-1:-1:-1;75738:30:0;75734:159:::4;;75813:56;75863:5;75813:45;75831:26;;75813:13;:17;;:45;;;;:::i;:56::-;75797:72;;75734:159;75377:535;75121:791;75934:22:::0;;75930:107:::4;;75981:36;75998:18;75981:16;:36::i;:::-;76059:17:::0;;76055:271:::4;;76120:16;::::0;:35:::4;::::0;76141:13;76120:20:::4;:35::i;:::-;76101:16;:54:::0;76190:6:::4;::::0;76178:54:::4;::::0;-1:-1:-1;;;76178:54:0;;-1:-1:-1;;;;;76190:6:0;;::::4;::::0;76178:24:::4;::::0;:54:::4;::::0;76211:4:::4;::::0;76218:13;;76178:54:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;76260:46:0::4;::::0;;76275:15:::4;9539:25:1::0;;9595:2;9580:18;;9573:34;;;76260:46:0::4;::::0;9512:18:1;76260:46:0::4;;;;;;;76055:271;74571:1770;;;;;74520:1821;-1:-1:-1::0;57253:5:0::2;::::0;:12:::2;::::0;57263:1:::2;57253:9;:12::i;:::-;57245:5;:20:::0;57325:18:::2;::::0;57306:16:::2;:14;:16::i;:::-;:37;57305:118;;57351:72;57417:5;57351:61;57384:27;;57351:28;:26;:28::i;:72::-;57305:118;;;57347:1;57305:118;57276:26;:147:::0;52177:12;52169:7;:21;;;;;;;;;;;52191:9;52169:32;;;;;;;;:39;;52204:4;-1:-1:-1;;52169:39:0;;;;;;;;52241:10;52219:33;;;;;;:40;;;;;;;;;;74040:2319::o;49518:103::-;48763:13;:11;:13::i;:::-;49583:30:::1;49610:1;49583:18;:30::i;:::-;49518:103::o:0;59761:440::-;59812:24;59849:20;59872:16;:14;:16::i;:::-;59849:39;;59918:18;;59903:12;:33;59899:295;;;59983:6;;59976:39;;-1:-1:-1;;;59976:39:0;;60009:4;59976:39;;;3230:51:1;59953:20:0;;-1:-1:-1;;;;;59983:6:0;;59976:24;;3203:18:1;;59976:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59953:62;;60030:13;60046:20;:18;:20::i;:::-;60030:36;-1:-1:-1;60085:9:0;;60081:102;;60134:33;60161:5;60134:22;:12;60151:4;60134:16;:22::i;:33::-;60115:52;;59938:256;;59838:363;59761:440;:::o;58254:306::-;58345:12;;58367:6;;58337:43;;-1:-1:-1;;;58337:43:0;;58301:19;;-1:-1:-1;;;;;58345:12:0;;;;58337:29;;:43;;58367:6;;;;58375:4;;58337:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;58337:43:0;;;;;;;;-1:-1:-1;;58337:43:0;;;;;;;;;;;;:::i;:::-;;;58333:220;;58475:66;;-1:-1:-1;;;58475:66:0;;14513:2:1;58475:66:0;;;14495:21:1;14552:2;14532:18;;;14525:30;14591:34;14571:18;;;14564:62;14662:26;14642:18;;;14635:54;14706:19;;58475:66:0;14311:420:1;58333:220:0;58435:5;58254:306;-1:-1:-1;58254:306:0:o;54630:40::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54630:40:0;;-1:-1:-1;54630:40:0;:::o;58568:311::-;58667:12;;58686:6;;58659:40;;-1:-1:-1;;;58659:40:0;;58622:20;;-1:-1:-1;;;;;58667:12:0;;;;58659:26;;:40;;58686:6;;;;58694:4;;58659:40;;;:::i;51389:145::-;48763:13;:11;:13::i;:::-;51471:9:::1;::::0;51451:42:::1;::::0;51490:1:::1;::::0;-1:-1:-1;;;;;51471:9:0::1;::::0;51451:42:::1;::::0;51490:1;;51451:42:::1;51504:9;:22:::0;;-1:-1:-1;;;;;;51504:22:0::1;::::0;;51389:145::o;63913:289::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;64037:14:::1;;64014:19;:37;;:96;;;;;64078:32;64106:3;64078:23;64097:3;64078:14;;:18;;:23;;;;:::i;:32::-;64055:19;:55;;64014:96;64006:121;;;;-1:-1:-1::0;;;64006:121:0::1;;;;;;;:::i;:::-;64154:18;:40:::0;63913:289::o;65450:291::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;65595:3:::1;65565:26;:33;;:72;;;;;65632:5;65602:26;:35;;65565:72;65557:97;;;;-1:-1:-1::0;;;65557:97:0::1;;;;;;;:::i;:::-;65679:25;:54:::0;65450:291::o;66325:499::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;66476:3:::1;66456:16;:23;;66448:66;;;::::0;-1:-1:-1;;;66448:66:0;;14938:2:1;66448:66:0::1;::::0;::::1;14920:21:1::0;14977:2;14957:18;;;14950:30;15016:32;14996:18;;;14989:60;15066:18;;66448:66:0::1;14736:354:1::0;66448:66:0::1;66583:3;66547:32;:39;;:83;;;;;66626:4;66590:32;:40;;66547:83;66539:142;;;::::0;-1:-1:-1;;;66539:142:0;;15297:2:1;66539:142:0::1;::::0;::::1;15279:21:1::0;15336:2;15316:18;;;15309:30;15375:34;15355:18;;;15348:62;-1:-1:-1;;;15426:18:1;;;15419:44;15480:19;;66539:142:0::1;15095:410:1::0;66539:142:0::1;66705:15;:34:::0;;;;66750:31:::1;:66:::0;66325:499::o;64537:492::-;50801:9;;64627:4;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;64725:1:::1;64716:6;:10;;;64708:64;;;;-1:-1:-1::0;;;64708:64:0::1;;;;;;;:::i;:::-;64787:10;::::0;::::1;::::0;64783:84:::1;;64831:11;64843:10;64852:1;64843:6:::0;:10:::1;:::i;:::-;64831:23;;;;;;;;;;:::i;:::-;;;;;;;;;64822:6;:32;64814:41;;;::::0;::::1;;64890:1;64881:6;:10;;;64877:84;;;64925:11;64937:10;:6:::0;64946:1:::1;64937:10;:::i;:::-;64925:23;;;;;;;;;;:::i;:::-;;;;;;;;;64916:6;:32;64908:41;;;::::0;::::1;;64993:6;64971:11;64983:6;64971:19;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:28:::0;-1:-1:-1;65017:4:0::1;50876:1;64537:492:::0;;;;:::o;67726:129::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;67813:15:::1;:34:::0;67726:129::o;55063:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55063:28:0;:::o;55098:34::-;;;;;;;;;;;;67863:125;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;67948:14:::1;:32:::0;67863:125::o;76369:134::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;76462:9:::1;::::0;76451:44:::1;::::0;-1:-1:-1;;;76451:44:0;;-1:-1:-1;;;;;3248:32:1;;;76451:44:0::1;::::0;::::1;3230:51:1::0;76462:9:0;;::::1;::::0;76451:33:::1;::::0;3203:18:1;;76451:44:0::1;3084:203:1::0;63559:108:0;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;63632:27:::1;63649:9;63632:16;:27::i;63675:105::-:0;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;63750:9:::1;:22:::0;;-1:-1:-1;;;;;;63750:22:0::1;-1:-1:-1::0;;;;;63750:22:0;;;::::1;::::0;;;::::1;::::0;;63675:105::o;63788:117::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;63869:12:::1;:28:::0;;-1:-1:-1;;;;;;63869:28:0::1;-1:-1:-1::0;;;;;63869:28:0;;;::::1;::::0;;;::::1;::::0;;63788:117::o;58117:114::-;58164:7;58191:32;58205:17;54335:7;58205:5;;:9;;:17;;;;:::i;:::-;58191:9;;;:13;:32::i;:::-;58184:39;;58117:114;:::o;69254:476::-;69361:6;;69401:25;;;-1:-1:-1;;;69401:25:0;;;;69313:7;;-1:-1:-1;;;;;69361:6:0;;69313:7;;69361:6;;69401:23;;:25;;;;;;;;;;;;;;69361:6;69401:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69379:47;;69437:23;69480:13;69475:198;69509:23;:30;69499:40;;;;69475:198;;;69585:76;69605:11;-1:-1:-1;;;;;69605:21:0;;69627:23;69651:7;69627:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;69605:55;;;;;;-1:-1:-1;;;;;;69605:55:0;;;-1:-1:-1;;;;;69627:32:0;;;69605:55;;;3230:51:1;3203:18;;69605:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69585:15;;:19;:76::i;:::-;69567:94;-1:-1:-1;69541:9:0;;;:::i;:::-;;;69475:198;;;-1:-1:-1;69690:32:0;:11;69706:15;69690;:32::i;65749:303::-;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;65900:3:::1;65868:28;:35;;:75;;;;;65939:4;65907:28;:36;;65868:75;65860:100;;;;-1:-1:-1::0;;;65860:100:0::1;;;;;;;:::i;:::-;65986:27;:58:::0;65749:303::o;65037:405::-;50801:9;;65133:4;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;65231:1:::1;65222:6;:10;;;65214:64;;;;-1:-1:-1::0;;;65214:64:0::1;;;;;;;:::i;:::-;65307:2;65297:6;:12;;:30;;;;;65323:4;65313:6;:14;;65297:30;65289:63;;;::::0;-1:-1:-1;;;65289:63:0;;17233:2:1;65289:63:0::1;::::0;::::1;17215:21:1::0;17272:2;17252:18;;;17245:30;-1:-1:-1;;;17291:18:1;;;17284:50;17351:18;;65289:63:0::1;17031:344:1::0;65289:63:0::1;65406:6;65378:17;65396:6;65378:25;;;;;;;;;;:::i;49776:201::-:0;48763:13;:11;:13::i;:::-;-1:-1:-1;;;;;49865:22:0;::::1;49857:73;;;::::0;-1:-1:-1;;;49857:73:0;;17582:2:1;49857:73:0::1;::::0;::::1;17564:21:1::0;17621:2;17601:18;;;17594:30;17660:34;17640:18;;;17633:62;-1:-1:-1;;;17711:18:1;;;17704:36;17757:19;;49857:73:0::1;17380:402:1::0;49857:73:0::1;49941:28;49960:8;49941:18;:28::i;76511:204::-:0;50801:9;;-1:-1:-1;;;;;50801:9:0;50814:10;50801:23;50793:72;;;;-1:-1:-1;;;50793:72:0;;;;;;;:::i;:::-;76643:9:::1;::::0;76632:75:::1;::::0;-1:-1:-1;;;76632:75:0;;::::1;::::0;::::1;9539:25:1::0;;;9580:18;;;9573:34;;;-1:-1:-1;;;;;76643:9:0;;::::1;::::0;76632:31:::1;::::0;9512:18:1;;76632:75:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;76511:204:::0;;:::o;16678:98::-;16736:7;16763:5;16767:1;16763;:5;:::i;:::-;16756:12;16678:98;-1:-1:-1;;;16678:98:0:o;17077:::-;17135:7;17162:5;17166:1;17162;:5;:::i;16321:98::-;16379:7;16406:5;16410:1;16406;:5;:::i;15940:98::-;15998:7;16025:5;16029:1;16025;:5;:::i;613:106::-;671:7;702:1;698;:5;:13;;710:1;698:13;;;-1:-1:-1;706:1:0;;613:106;-1:-1:-1;613:106:0:o;23617:177::-;23700:86;23720:5;23750:23;;;23775:2;23779:5;23727:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23727:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23727:58:0;-1:-1:-1;;;;;;23727:58:0;;;;;;;;;;23700:19;:86::i;:::-;23617:177;;;:::o;69143:103::-;69205:12;;;;;;;;;-1:-1:-1;;;;;69205:12:0;-1:-1:-1;;;;;69197:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69193:46;;;69143:103::o;49042:132::-;48950:6;;-1:-1:-1;;;;;48950:6:0;47458:10;49106:23;49098:68;;;;-1:-1:-1;;;49098:68:0;;18647:2:1;49098:68:0;;;18629:21:1;;;18666:18;;;18659:30;18725:34;18705:18;;;18698:62;18777:18;;49098:68:0;18445:356:1;51124:257:0;-1:-1:-1;;;;;51201:26:0;;51193:84;;;;-1:-1:-1;;;51193:84:0;;19008:2:1;51193:84:0;;;18990:21:1;19047:2;19027:18;;;19020:30;19086:34;19066:18;;;19059:62;-1:-1:-1;;;19137:18:1;;;19130:43;19190:19;;51193:84:0;18806:409:1;51193:84:0;51293:45;;-1:-1:-1;;;;;51293:45:0;;;51321:1;;51293:45;;51321:1;;51293:45;51349:9;:24;;-1:-1:-1;;;;;;51349:24:0;-1:-1:-1;;;;;51349:24:0;;;;;;;;;;51124:257::o;72219:1423::-;72294:6;;72282:48;;-1:-1:-1;;;72282:48:0;;-1:-1:-1;;;;;72294:6:0;;;;72282:24;;:48;;72315:4;;72322:7;;72282:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;72390:20:0;;72343:28;;72390:24;72386:265;;72454:44;72492:5;72454:33;72466:20;;72454:7;:11;;:33;;;;:::i;:44::-;72520:6;;72537:7;;72513:54;;-1:-1:-1;;;72513:54:0;;72431:67;;-1:-1:-1;;;;;;72520:6:0;;;;72513:23;;:54;;72537:7;;72431:67;;72513:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;72587:52:0;;;72601:15;9539:25:1;;9595:2;9580:18;;9573:34;;;72587:52:0;;9512:18:1;72587:52:0;;;;;;;72386:265;72710:20;;72663:28;;72710:24;72706:265;;72774:44;72812:5;72774:33;72786:20;;72774:7;:11;;:33;;;;:::i;:44::-;72840:6;;72857:7;;72833:54;;-1:-1:-1;;;72833:54:0;;72751:67;;-1:-1:-1;;;;;;72840:6:0;;;;72833:23;;:54;;72857:7;;72751:67;;72833:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;72907:52:0;;;72921:15;9539:25:1;;9595:2;9580:18;;9573:34;;;72907:52:0;;9512:18:1;72907:52:0;;;;;;;72706:265;73039:21;;72985:29;;73039:25;73035:290;;73109:45;73148:5;73109:34;73121:21;;73109:7;:11;;:34;;;;:::i;:45::-;73180:6;;73197:8;;73173:56;;-1:-1:-1;;;73173:56:0;;73085:69;;-1:-1:-1;;;;;;73180:6:0;;;;73173:23;;:56;;73197:8;;73085:69;;73173:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;73253:54:0;;;73268:15;9539:25:1;;9595:2;9580:18;;9573:34;;;73253:54:0;;9512:18:1;73253:54:0;;;;;;;73035:290;73347:59;73385:20;73347:33;:7;73359:20;73347:11;:33::i;:59::-;73446:9;;73426:6;;73337:69;;-1:-1:-1;73419:40:0;;-1:-1:-1;;;;;73426:6:0;;;;73446:9;;73419:26;:40::i;:::-;73497:9;;73477:6;;73470:46;;-1:-1:-1;;;;;73477:6:0;;;;73497:9;73508:7;73470:26;:46::i;:::-;73538:9;;73527:50;;-1:-1:-1;;;73527:50:0;;;;;391:25:1;;;-1:-1:-1;;;;;73538:9:0;;;;73527:41;;364:18:1;;73527:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73593:41:0;;;73609:15;9539:25:1;;9595:2;9580:18;;9573:34;;;73593:41:0;;-1:-1:-1;9512:18:1;;-1:-1:-1;73593:41:0;;;;;;;72271:1371;;;72219:1423;:::o;73650:382::-;73736:7;73776:1;73756:226;73838:11;73850:6;73838:19;;;;;;;;;;:::i;:::-;;;;;;;;;73821:13;:36;73817:154;;73906:17;73924:6;73906:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;73878;:53;73950:5;;73817:154;73792:8;;;:::i;:::-;;;73756:226;;;-1:-1:-1;;73999:25:0;;;73650:382;-1:-1:-1;73650:382:0:o;50137:191::-;50230:6;;;-1:-1:-1;;;;;50247:17:0;;;-1:-1:-1;;;;;;50247:17:0;;;;;;;50280:40;;50230:6;;;50247:17;50230:6;;50280:40;;50211:16;;50280:40;50200:128;50137:191;:::o;27963:649::-;28387:23;28413:69;28441:4;28413:69;;;;;;;;;;;;;;;;;28421:5;-1:-1:-1;;;;;28413:27:0;;;:69;;;;;:::i;:::-;28387:95;;28501:10;:17;28522:1;28501:22;:56;;;;28538:10;28527:30;;;;;;;;;;;;:::i;:::-;28493:111;;;;-1:-1:-1;;;28493:111:0;;19605:2:1;28493:111:0;;;19587:21:1;19644:2;19624:18;;;19617:30;19683:34;19663:18;;;19656:62;-1:-1:-1;;;19734:18:1;;;19727:40;19784:19;;28493:111:0;19403:406:1;24513:582:0;24843:10;;;24842:62;;-1:-1:-1;24859:39:0;;-1:-1:-1;;;24859:39:0;;24883:4;24859:39;;;19988:51:1;-1:-1:-1;;;;;20075:32:1;;;20055:18;;;20048:60;24859:15:0;;;;;19961:18:1;;24859:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;24842:62;24820:166;;;;-1:-1:-1;;;24820:166:0;;20321:2:1;24820:166:0;;;20303:21:1;20360:2;20340:18;;;20333:30;20399:34;20379:18;;;20372:62;-1:-1:-1;;;20450:18:1;;;20443:52;20512:19;;24820:166:0;20119:418:1;24820:166:0;24997:90;25017:5;25047:22;;;25071:7;25080:5;25024:62;;;;;;;;;:::i;37766:229::-;37903:12;37935:52;37957:6;37965:4;37971:1;37974:12;37935:21;:52::i;:::-;37928:59;37766:229;-1:-1:-1;;;;37766:229:0:o;38852:455::-;39022:12;39080:5;39055:21;:30;;39047:81;;;;-1:-1:-1;;;39047:81:0;;20744:2:1;39047:81:0;;;20726:21:1;20783:2;20763:18;;;20756:30;20822:34;20802:18;;;20795:62;-1:-1:-1;;;20873:18:1;;;20866:36;20919:19;;39047:81:0;20542:402:1;39047:81:0;39140:12;39154:23;39181:6;-1:-1:-1;;;;;39181:11:0;39200:5;39207:4;39181:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39139:73;;;;39230:69;39257:6;39265:7;39274:10;39286:12;39230:26;:69::i;:::-;39223:76;38852:455;-1:-1:-1;;;;;;;38852:455:0:o;41425:644::-;41610:12;41639:7;41635:427;;;41667:10;:17;41688:1;41667:22;41663:290;;-1:-1:-1;;;;;35306:19:0;;;41877:60;;;;-1:-1:-1;;;41877:60:0;;21457:2:1;41877:60:0;;;21439:21:1;21496:2;21476:18;;;21469:30;21535:31;21515:18;;;21508:59;21584:18;;41877:60:0;21255:353:1;41877:60:0;-1:-1:-1;41974:10:0;41967:17;;41635:427;42017:33;42025:10;42037:12;42772:17;;:21;42768:388;;43004:10;42998:17;43061:15;43048:10;43044:2;43040:19;43033:44;42768:388;43131:12;43124:20;;-1:-1:-1;;;43124:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:226:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:1;;14:226;-1:-1:-1;14:226:1:o;427:346::-;495:6;503;556:2;544:9;535:7;531:23;527:32;524:52;;;572:1;569;562:12;524:52;-1:-1:-1;;617:23:1;;;737:2;722:18;;;709:32;;-1:-1:-1;427:346:1:o;778:131::-;-1:-1:-1;;;;;853:31:1;;843:42;;833:70;;899:1;896;889:12;914:1076;1027:6;1035;1043;1051;1059;1067;1075;1128:3;1116:9;1107:7;1103:23;1099:33;1096:53;;;1145:1;1142;1135:12;1096:53;1184:9;1171:23;1203:31;1228:5;1203:31;:::i;:::-;1253:5;-1:-1:-1;1310:2:1;1295:18;;1282:32;1323:33;1282:32;1323:33;:::i;:::-;1375:7;-1:-1:-1;1434:2:1;1419:18;;1406:32;1447:33;1406:32;1447:33;:::i;:::-;1499:7;-1:-1:-1;1558:2:1;1543:18;;1530:32;1571:33;1530:32;1571:33;:::i;:::-;1623:7;-1:-1:-1;1682:3:1;1667:19;;1654:33;1696;1654;1696;:::i;:::-;1748:7;-1:-1:-1;1807:3:1;1792:19;;1779:33;1821;1779;1821;:::i;:::-;914:1076;;;;-1:-1:-1;914:1076:1;;;;;;;;-1:-1:-1;;1953:3:1;1938:19;;;1925:33;;914:1076::o;2187:892::-;2291:6;2299;2307;2315;2323;2331;2384:3;2372:9;2363:7;2359:23;2355:33;2352:53;;;2401:1;2398;2391:12;2352:53;2440:9;2427:23;2459:31;2484:5;2459:31;:::i;:::-;2509:5;-1:-1:-1;2587:2:1;2572:18;;2559:32;;-1:-1:-1;2669:2:1;2654:18;;2641:32;2682:33;2641:32;2682:33;:::i;:::-;2734:7;-1:-1:-1;2814:2:1;2799:18;;2786:32;;-1:-1:-1;2896:3:1;2881:19;;2868:33;2910;2868;2910;:::i;:::-;2187:892;;;;-1:-1:-1;2187:892:1;;;;;3042:3;3027:19;;;3014:33;;-1:-1:-1;;2187:892:1:o;3292:247::-;3351:6;3404:2;3392:9;3383:7;3379:23;3375:32;3372:52;;;3420:1;3417;3410:12;3372:52;3459:9;3446:23;3478:31;3503:5;3478:31;:::i;3544:389::-;3610:6;3618;3671:2;3659:9;3650:7;3646:23;3642:32;3639:52;;;3687:1;3684;3677:12;3639:52;3726:9;3713:23;3776:4;3769:5;3765:16;3758:5;3755:27;3745:55;;3796:1;3793;3786:12;3745:55;3819:5;3897:2;3882:18;;;;3869:32;;-1:-1:-1;;;3544:389:1:o;3938:400::-;4140:2;4122:21;;;4179:2;4159:18;;;4152:30;4218:34;4213:2;4198:18;;4191:62;-1:-1:-1;;;4284:2:1;4269:18;;4262:34;4328:3;4313:19;;3938:400::o;5570:402::-;5772:2;5754:21;;;5811:2;5791:18;;;5784:30;5850:34;5845:2;5830:18;;5823:62;-1:-1:-1;;;5916:2:1;5901:18;;5894:36;5962:3;5947:19;;5570:402::o;5977:349::-;6179:2;6161:21;;;6218:2;6198:18;;;6191:30;6257:27;6252:2;6237:18;;6230:55;6317:2;6302:18;;5977:349::o;6331:251::-;6401:6;6454:2;6442:9;6433:7;6429:23;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6502:9;6496:16;6521:31;6546:5;6521:31;:::i;6587:354::-;6789:2;6771:21;;;6828:2;6808:18;;;6801:30;6867:32;6862:2;6847:18;;6840:60;6932:2;6917:18;;6587:354::o;8491:184::-;8561:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:52;;;8630:1;8627;8620:12;8582:52;-1:-1:-1;8653:16:1;;8491:184;-1:-1:-1;8491:184:1:o;9086:274::-;-1:-1:-1;;;;;9278:32:1;;;;9260:51;;9342:2;9327:18;;9320:34;9248:2;9233:18;;9086:274::o;10334:327::-;10536:2;10518:21;;;10575:1;10555:18;;;10548:29;-1:-1:-1;;;10608:2:1;10593:18;;10586:34;10652:2;10637:18;;10334:327::o;10666:336::-;10868:2;10850:21;;;10907:2;10887:18;;;10880:30;-1:-1:-1;;;10941:2:1;10926:18;;10919:42;10993:2;10978:18;;10666:336::o;13371:277::-;13438:6;13491:2;13479:9;13470:7;13466:23;13462:32;13459:52;;;13507:1;13504;13497:12;13459:52;13539:9;13533:16;13592:5;13585:13;13578:21;13571:5;13568:32;13558:60;;13614:1;13611;13604:12;15868:405;16070:2;16052:21;;;16109:2;16089:18;;;16082:30;16148:34;16143:2;16128:18;;16121:62;-1:-1:-1;;;16214:2:1;16199:18;;16192:39;16263:3;16248:19;;15868:405::o;16278:127::-;16339:10;16334:3;16330:20;16327:1;16320:31;16370:4;16367:1;16360:15;16394:4;16391:1;16384:15;16410:151;16500:4;16493:12;;;16479;;;16475:31;;16518:14;;16515:40;;;16535:18;;:::i;16566:127::-;16627:10;16622:3;16618:20;16615:1;16608:31;16658:4;16655:1;16648:15;16682:4;16679:1;16672:15;16698:148;16786:4;16765:12;;;16779;;;16761:31;;16804:13;;16801:39;;;16820:18;;:::i;16851:175::-;16888:3;16932:4;16925:5;16921:16;16961:4;16952:7;16949:17;16946:43;;16969:18;;:::i;:::-;17018:1;17005:15;;16851:175;-1:-1:-1;;16851:175:1:o;17787:168::-;17860:9;;;17891;;17908:15;;;17902:22;;17888:37;17878:71;;17929:18;;:::i;17960:217::-;18000:1;18026;18016:132;;18070:10;18065:3;18061:20;18058:1;18051:31;18105:4;18102:1;18095:15;18133:4;18130:1;18123:15;18016:132;-1:-1:-1;18162:9:1;;17960:217::o;18182:128::-;18249:9;;;18270:11;;;18267:37;;;18284:18;;:::i;18315:125::-;18380:9;;;18401:10;;;18398:36;;;18414:18;;:::i;19220:178::-;19257:3;19301:4;19294:5;19290:16;19325:7;19315:41;;19336:18;;:::i;:::-;-1:-1:-1;;19372:20:1;;19220:178;-1:-1:-1;;19220:178:1:o;20949:301::-;21078:3;21116:6;21110:13;21162:6;21155:4;21147:6;21143:17;21138:3;21132:37;21224:1;21188:16;;21213:13;;;-1:-1:-1;21188:16:1;20949:301;-1:-1:-1;20949:301:1:o;21613:418::-;21762:2;21751:9;21744:21;21725:4;21794:6;21788:13;21837:6;21832:2;21821:9;21817:18;21810:34;21896:6;21891:2;21883:6;21879:15;21874:2;21863:9;21859:18;21853:50;21952:1;21947:2;21938:6;21927:9;21923:22;21919:31;21912:42;22022:2;22015;22011:7;22006:2;21998:6;21994:15;21990:29;21979:9;21975:45;21971:54;21963:62;;;21613:418;;;;:::o
Swarm Source
ipfs://c4cba81492c79f04e2c4efc24fab3853826eec307351819f860b85b12014c0fd
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.