More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 71 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 3954609 | 13 hrs ago | IN | 2.5 S | 0.00797028 | ||||
Mint | 3954497 | 13 hrs ago | IN | 2.5 S | 0.00797028 | ||||
Mint | 3951081 | 14 hrs ago | IN | 2.5 S | 0.0078852 | ||||
Withdraw | 3849473 | 33 hrs ago | IN | 0 S | 0.00017086 | ||||
Mint | 3843189 | 34 hrs ago | IN | 2.5 S | 0.00144562 | ||||
Mint | 3615893 | 3 days ago | IN | 2.5 S | 0.00152203 | ||||
Mint | 3593610 | 3 days ago | IN | 2.5 S | 0.0015219 | ||||
Mint | 3450128 | 3 days ago | IN | 2.5 S | 0.00152197 | ||||
Debilitate | 3365569 | 4 days ago | IN | 0 S | 0.00127191 | ||||
Assault | 3365436 | 4 days ago | IN | 0 S | 0.00127251 | ||||
Debilitate | 3365223 | 4 days ago | IN | 0 S | 0.00250236 | ||||
Assault | 3362664 | 4 days ago | IN | 0 S | 0.00127251 | ||||
Transfer From | 3361131 | 4 days ago | IN | 0 S | 0.00047256 | ||||
Transfer From | 3361016 | 4 days ago | IN | 0 S | 0.000532 | ||||
Update Required ... | 3356628 | 4 days ago | IN | 0 S | 0.00015808 | ||||
Update Activatin... | 3356515 | 4 days ago | IN | 0 S | 0.00015851 | ||||
Mint | 3345878 | 4 days ago | IN | 2.5 S | 0.00208197 | ||||
Withdraw | 3273920 | 5 days ago | IN | 0 S | 0.00017093 | ||||
Set GAME Address | 3267785 | 5 days ago | IN | 0 S | 0.00016091 | ||||
Mint | 3238322 | 5 days ago | IN | 2.5 S | 0.0017955 | ||||
Mint | 3201815 | 5 days ago | IN | 2.5 S | 0.00210948 | ||||
Mint | 3195798 | 5 days ago | IN | 2.5 S | 0.00146161 | ||||
Mint | 3195743 | 5 days ago | IN | 2.5 S | 0.00146121 | ||||
Mint | 3195661 | 5 days ago | IN | 2.5 S | 0.00144575 | ||||
Debilitate | 3186767 | 5 days ago | IN | 0 S | 0.00146691 |
Loading...
Loading
Contract Name:
battledog
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-02 */ // SPDX-License-Identifier: No license // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // 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; } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.0) (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. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // 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); } // File: abdk-libraries-solidity/ABDKMath64x64.sol /* * ABDK Math 64.64 Smart Contract Library. Copyright © 2019 by ABDK Consulting. * Author: Mikhail Vladimirov <[email protected]> */ pragma solidity ^0.8.0; /** * Smart contract library of mathematical functions operating with signed * 64.64-bit fixed point numbers. Signed 64.64-bit fixed point number is * basically a simple fraction whose numerator is signed 128-bit integer and * denominator is 2^64. As long as denominator is always the same, there is no * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are * represented by int128 type holding only the numerator. */ library ABDKMath64x64 { /* * Minimum value signed 64.64-bit fixed point number may have. */ int128 private constant MIN_64x64 = -0x80000000000000000000000000000000; /* * Maximum value signed 64.64-bit fixed point number may have. */ int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; /** * Convert signed 256-bit integer number into signed 64.64-bit fixed point * number. Revert on overflow. * * @param x signed 256-bit integer number * @return signed 64.64-bit fixed point number */ function fromInt (int256 x) internal pure returns (int128) { unchecked { require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF); return int128 (x << 64); } } /** * Convert signed 64.64 fixed point number into signed 64-bit integer number * rounding down. * * @param x signed 64.64-bit fixed point number * @return signed 64-bit integer number */ function toInt (int128 x) internal pure returns (int64) { unchecked { return int64 (x >> 64); } } /** * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point * number. Revert on overflow. * * @param x unsigned 256-bit integer number * @return signed 64.64-bit fixed point number */ function fromUInt (uint256 x) internal pure returns (int128) { unchecked { require (x <= 0x7FFFFFFFFFFFFFFF); return int128 (int256 (x << 64)); } } /** * Convert signed 64.64 fixed point number into unsigned 64-bit integer * number rounding down. Revert on underflow. * * @param x signed 64.64-bit fixed point number * @return unsigned 64-bit integer number */ function toUInt (int128 x) internal pure returns (uint64) { unchecked { require (x >= 0); return uint64 (uint128 (x >> 64)); } } /** * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point * number rounding down. Revert on overflow. * * @param x signed 128.128-bin fixed point number * @return signed 64.64-bit fixed point number */ function from128x128 (int256 x) internal pure returns (int128) { unchecked { int256 result = x >> 64; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Convert signed 64.64 fixed point number into signed 128.128 fixed point * number. * * @param x signed 64.64-bit fixed point number * @return signed 128.128 fixed point number */ function to128x128 (int128 x) internal pure returns (int256) { unchecked { return int256 (x) << 64; } } /** * Calculate x + y. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function add (int128 x, int128 y) internal pure returns (int128) { unchecked { int256 result = int256(x) + y; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Calculate x - y. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function sub (int128 x, int128 y) internal pure returns (int128) { unchecked { int256 result = int256(x) - y; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Calculate x * y rounding down. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function mul (int128 x, int128 y) internal pure returns (int128) { unchecked { int256 result = int256(x) * y >> 64; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point * number and y is signed 256-bit integer number. Revert on overflow. * * @param x signed 64.64 fixed point number * @param y signed 256-bit integer number * @return signed 256-bit integer number */ function muli (int128 x, int256 y) internal pure returns (int256) { unchecked { if (x == MIN_64x64) { require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF && y <= 0x1000000000000000000000000000000000000000000000000); return -y << 63; } else { bool negativeResult = false; if (x < 0) { x = -x; negativeResult = true; } if (y < 0) { y = -y; // We rely on overflow behavior here negativeResult = !negativeResult; } uint256 absoluteResult = mulu (x, uint256 (y)); if (negativeResult) { require (absoluteResult <= 0x8000000000000000000000000000000000000000000000000000000000000000); return -int256 (absoluteResult); // We rely on overflow behavior here } else { require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return int256 (absoluteResult); } } } } /** * Calculate x * y rounding down, where x is signed 64.64 fixed point number * and y is unsigned 256-bit integer number. Revert on overflow. * * @param x signed 64.64 fixed point number * @param y unsigned 256-bit integer number * @return unsigned 256-bit integer number */ function mulu (int128 x, uint256 y) internal pure returns (uint256) { unchecked { if (y == 0) return 0; require (x >= 0); uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64; uint256 hi = uint256 (int256 (x)) * (y >> 128); require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); hi <<= 64; require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo); return hi + lo; } } /** * Calculate x / y rounding towards zero. Revert on overflow or when y is * zero. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function div (int128 x, int128 y) internal pure returns (int128) { unchecked { require (y != 0); int256 result = (int256 (x) << 64) / y; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Calculate x / y rounding towards zero, where x and y are signed 256-bit * integer numbers. Revert on overflow or when y is zero. * * @param x signed 256-bit integer number * @param y signed 256-bit integer number * @return signed 64.64-bit fixed point number */ function divi (int256 x, int256 y) internal pure returns (int128) { unchecked { require (y != 0); bool negativeResult = false; if (x < 0) { x = -x; // We rely on overflow behavior here negativeResult = true; } if (y < 0) { y = -y; // We rely on overflow behavior here negativeResult = !negativeResult; } uint128 absoluteResult = divuu (uint256 (x), uint256 (y)); if (negativeResult) { require (absoluteResult <= 0x80000000000000000000000000000000); return -int128 (absoluteResult); // We rely on overflow behavior here } else { require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return int128 (absoluteResult); // We rely on overflow behavior here } } } /** * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit * integer numbers. Revert on overflow or when y is zero. * * @param x unsigned 256-bit integer number * @param y unsigned 256-bit integer number * @return signed 64.64-bit fixed point number */ function divu (uint256 x, uint256 y) internal pure returns (int128) { unchecked { require (y != 0); uint128 result = divuu (x, y); require (result <= uint128 (MAX_64x64)); return int128 (result); } } /** * Calculate -x. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function neg (int128 x) internal pure returns (int128) { unchecked { require (x != MIN_64x64); return -x; } } /** * Calculate |x|. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function abs (int128 x) internal pure returns (int128) { unchecked { require (x != MIN_64x64); return x < 0 ? -x : x; } } /** * Calculate 1 / x rounding towards zero. Revert on overflow or when x is * zero. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function inv (int128 x) internal pure returns (int128) { unchecked { require (x != 0); int256 result = int256 (0x100000000000000000000000000000000) / x; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function avg (int128 x, int128 y) internal pure returns (int128) { unchecked { return int128 ((int256 (x) + int256 (y)) >> 1); } } /** * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down. * Revert on overflow or in case x * y is negative. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function gavg (int128 x, int128 y) internal pure returns (int128) { unchecked { int256 m = int256 (x) * int256 (y); require (m >= 0); require (m < 0x4000000000000000000000000000000000000000000000000000000000000000); return int128 (sqrtu (uint256 (m))); } } /** * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number * and y is unsigned 256-bit integer number. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y uint256 value * @return signed 64.64-bit fixed point number */ function pow (int128 x, uint256 y) internal pure returns (int128) { unchecked { bool negative = x < 0 && y & 1 == 1; uint256 absX = uint128 (x < 0 ? -x : x); uint256 absResult; absResult = 0x100000000000000000000000000000000; if (absX <= 0x10000000000000000) { absX <<= 63; while (y != 0) { if (y & 0x1 != 0) { absResult = absResult * absX >> 127; } absX = absX * absX >> 127; if (y & 0x2 != 0) { absResult = absResult * absX >> 127; } absX = absX * absX >> 127; if (y & 0x4 != 0) { absResult = absResult * absX >> 127; } absX = absX * absX >> 127; if (y & 0x8 != 0) { absResult = absResult * absX >> 127; } absX = absX * absX >> 127; y >>= 4; } absResult >>= 64; } else { uint256 absXShift = 63; if (absX < 0x1000000000000000000000000) { absX <<= 32; absXShift -= 32; } if (absX < 0x10000000000000000000000000000) { absX <<= 16; absXShift -= 16; } if (absX < 0x1000000000000000000000000000000) { absX <<= 8; absXShift -= 8; } if (absX < 0x10000000000000000000000000000000) { absX <<= 4; absXShift -= 4; } if (absX < 0x40000000000000000000000000000000) { absX <<= 2; absXShift -= 2; } if (absX < 0x80000000000000000000000000000000) { absX <<= 1; absXShift -= 1; } uint256 resultShift = 0; while (y != 0) { require (absXShift < 64); if (y & 0x1 != 0) { absResult = absResult * absX >> 127; resultShift += absXShift; if (absResult > 0x100000000000000000000000000000000) { absResult >>= 1; resultShift += 1; } } absX = absX * absX >> 127; absXShift <<= 1; if (absX >= 0x100000000000000000000000000000000) { absX >>= 1; absXShift += 1; } y >>= 1; } require (resultShift < 64); absResult >>= 64 - resultShift; } int256 result = negative ? -int256 (absResult) : int256 (absResult); require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } } /** * Calculate sqrt (x) rounding down. Revert if x < 0. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function sqrt (int128 x) internal pure returns (int128) { unchecked { require (x >= 0); return int128 (sqrtu (uint256 (int256 (x)) << 64)); } } /** * Calculate binary logarithm of x. Revert if x <= 0. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function log_2 (int128 x) internal pure returns (int128) { unchecked { require (x > 0); int256 msb = 0; int256 xc = x; if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; } if (xc >= 0x100000000) { xc >>= 32; msb += 32; } if (xc >= 0x10000) { xc >>= 16; msb += 16; } if (xc >= 0x100) { xc >>= 8; msb += 8; } if (xc >= 0x10) { xc >>= 4; msb += 4; } if (xc >= 0x4) { xc >>= 2; msb += 2; } if (xc >= 0x2) msb += 1; // No need to shift xc anymore int256 result = msb - 64 << 64; uint256 ux = uint256 (int256 (x)) << uint256 (127 - msb); for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) { ux *= ux; uint256 b = ux >> 255; ux >>= 127 + b; result += bit * int256 (b); } return int128 (result); } } /** * Calculate natural logarithm of x. Revert if x <= 0. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function ln (int128 x) internal pure returns (int128) { unchecked { require (x > 0); return int128 (int256 ( uint256 (int256 (log_2 (x))) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128)); } } /** * Calculate binary exponent of x. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function exp_2 (int128 x) internal pure returns (int128) { unchecked { require (x < 0x400000000000000000); // Overflow if (x < -0x400000000000000000) return 0; // Underflow uint256 result = 0x80000000000000000000000000000000; if (x & 0x8000000000000000 > 0) result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128; if (x & 0x4000000000000000 > 0) result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128; if (x & 0x2000000000000000 > 0) result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128; if (x & 0x1000000000000000 > 0) result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128; if (x & 0x800000000000000 > 0) result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128; if (x & 0x400000000000000 > 0) result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128; if (x & 0x200000000000000 > 0) result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128; if (x & 0x100000000000000 > 0) result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128; if (x & 0x80000000000000 > 0) result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128; if (x & 0x40000000000000 > 0) result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128; if (x & 0x20000000000000 > 0) result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128; if (x & 0x10000000000000 > 0) result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128; if (x & 0x8000000000000 > 0) result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128; if (x & 0x4000000000000 > 0) result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128; if (x & 0x2000000000000 > 0) result = result * 0x1000162E525EE054754457D5995292026 >> 128; if (x & 0x1000000000000 > 0) result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128; if (x & 0x800000000000 > 0) result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128; if (x & 0x400000000000 > 0) result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128; if (x & 0x200000000000 > 0) result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128; if (x & 0x100000000000 > 0) result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128; if (x & 0x80000000000 > 0) result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128; if (x & 0x40000000000 > 0) result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128; if (x & 0x20000000000 > 0) result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128; if (x & 0x10000000000 > 0) result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128; if (x & 0x8000000000 > 0) result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128; if (x & 0x4000000000 > 0) result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128; if (x & 0x2000000000 > 0) result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128; if (x & 0x1000000000 > 0) result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128; if (x & 0x800000000 > 0) result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128; if (x & 0x400000000 > 0) result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128; if (x & 0x200000000 > 0) result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128; if (x & 0x100000000 > 0) result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128; if (x & 0x80000000 > 0) result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128; if (x & 0x40000000 > 0) result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128; if (x & 0x20000000 > 0) result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128; if (x & 0x10000000 > 0) result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128; if (x & 0x8000000 > 0) result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128; if (x & 0x4000000 > 0) result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128; if (x & 0x2000000 > 0) result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128; if (x & 0x1000000 > 0) result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128; if (x & 0x800000 > 0) result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128; if (x & 0x400000 > 0) result = result * 0x100000000002C5C85FDF477B662B26945 >> 128; if (x & 0x200000 > 0) result = result * 0x10000000000162E42FEFA3AE53369388C >> 128; if (x & 0x100000 > 0) result = result * 0x100000000000B17217F7D1D351A389D40 >> 128; if (x & 0x80000 > 0) result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128; if (x & 0x40000 > 0) result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128; if (x & 0x20000 > 0) result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128; if (x & 0x10000 > 0) result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128; if (x & 0x8000 > 0) result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128; if (x & 0x4000 > 0) result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128; if (x & 0x2000 > 0) result = result * 0x1000000000000162E42FEFA39F02B772C >> 128; if (x & 0x1000 > 0) result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128; if (x & 0x800 > 0) result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128; if (x & 0x400 > 0) result = result * 0x100000000000002C5C85FDF473DEA871F >> 128; if (x & 0x200 > 0) result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128; if (x & 0x100 > 0) result = result * 0x100000000000000B17217F7D1CF79E949 >> 128; if (x & 0x80 > 0) result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128; if (x & 0x40 > 0) result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128; if (x & 0x20 > 0) result = result * 0x100000000000000162E42FEFA39EF366F >> 128; if (x & 0x10 > 0) result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128; if (x & 0x8 > 0) result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128; if (x & 0x4 > 0) result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128; if (x & 0x2 > 0) result = result * 0x1000000000000000162E42FEFA39EF358 >> 128; if (x & 0x1 > 0) result = result * 0x10000000000000000B17217F7D1CF79AB >> 128; result >>= uint256 (int256 (63 - (x >> 64))); require (result <= uint256 (int256 (MAX_64x64))); return int128 (int256 (result)); } } /** * Calculate natural exponent of x. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function exp (int128 x) internal pure returns (int128) { unchecked { require (x < 0x400000000000000000); // Overflow if (x < -0x400000000000000000) return 0; // Underflow return exp_2 ( int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128)); } } /** * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit * integer numbers. Revert on overflow or when y is zero. * * @param x unsigned 256-bit integer number * @param y unsigned 256-bit integer number * @return unsigned 64.64-bit fixed point number */ function divuu (uint256 x, uint256 y) private pure returns (uint128) { unchecked { require (y != 0); uint256 result; if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) result = (x << 64) / y; else { uint256 msb = 192; uint256 xc = x >> 192; if (xc >= 0x100000000) { xc >>= 32; msb += 32; } if (xc >= 0x10000) { xc >>= 16; msb += 16; } if (xc >= 0x100) { xc >>= 8; msb += 8; } if (xc >= 0x10) { xc >>= 4; msb += 4; } if (xc >= 0x4) { xc >>= 2; msb += 2; } if (xc >= 0x2) msb += 1; // No need to shift xc anymore result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1); require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); uint256 hi = result * (y >> 128); uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); uint256 xh = x >> 192; uint256 xl = x << 64; if (xl < lo) xh -= 1; xl -= lo; // We rely on overflow behavior here lo = hi << 128; if (xl < lo) xh -= 1; xl -= lo; // We rely on overflow behavior here result += xh == hi >> 128 ? xl / y : 1; } require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return uint128 (result); } } /** * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer * number. * * @param x unsigned 256-bit integer number * @return unsigned 128-bit integer number */ function sqrtu (uint256 x) private pure returns (uint128) { unchecked { if (x == 0) return 0; else { uint256 xx = x; uint256 r = 1; if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } if (xx >= 0x10000) { xx >>= 16; r <<= 8; } if (xx >= 0x100) { xx >>= 8; r <<= 4; } if (xx >= 0x10) { xx >>= 4; r <<= 2; } if (xx >= 0x4) { r <<= 1; } r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; // Seven iterations should be enough uint256 r1 = x / r; return uint128 (r < r1 ? r : r1); } } } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // 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; } } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // 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); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (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; } } // File: @openzeppelin/contracts/access/Ownable.sol // 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); } } // File: @openzeppelin/contracts/utils/Address.sol // 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); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // 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)); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/Battledogs.sol // @title NFT Game by OxSorcerers for Battledog Games // https://twitter.com/0xSorcerers | https://github.com/Dark-Viper | https://t.me/Oxsorcerer | https://t.me/battousainakamoto | https://t.me/darcViper pragma solidity ^0.8.17; interface Iburn { function Burn(uint256 _amount) external; } contract battledog is ERC721Enumerable, Ownable, ReentrancyGuard { constructor(string memory _name, string memory _symbol, address GAMEAddress, address _newGuard) ERC721(_name, _symbol) { GAME = GAMEAddress; guard = _newGuard; } using Math for uint256; using ABDKMath64x64 for uint256; using SafeERC20 for IERC20; uint256 COUNTER = 0; uint256 public mintFee = 0.00001 ether; uint256 public _pid = 0; uint256 public _pay = 1; uint256 public requiredAmount = 2000000 * 10**6; uint256 public activatingAmount = 20000000 * 10**6; uint256 private divisor = 1 * 10**6; uint256 public TotalContractBurns = 0; uint256 public TotalGAMEBurns = 0; uint256 public BattlesTotal = 0; using Strings for uint256; string public baseURI; address private guard; address public GAME; string public Author = "0xSorcerer | Battousai Nakamoto | Dark-Viper"; bool public paused = false; address payable public developmentAddress; address payable public bobbAddress; address public burnAddress; uint256 public deadtax; uint256 public bobbtax; uint256 public devtax; uint256 public gametax; uint256 public activatetax; uint256 public sos; modifier onlyGuard() { require(msg.sender == guard, "Not authorized."); _; } modifier onlyBurner() { require(msg.sender == GAME, "Not authorized."); _; } struct Player { string name; uint256 id; uint256 level; uint256 attack; uint256 defence; uint256 fights; uint256 wins; uint256 payout; uint256 activate; uint256 history; } struct TokenInfo { IERC20 paytoken; } struct Assaulter { uint256 attackerId; uint256 defenderId; uint256 stolenPoints; uint256 timestamp; } struct Debilitator { uint256 attackerId; uint256 defenderId; uint256 stolenPoints; uint256 timestamp; } struct BlackList { bool blacklist; } //Arrays TokenInfo[] public AllowedCrypto; // Mapping mapping (uint256 => Player) public players; mapping (uint256 => BlackList) public blacklisted; mapping (uint256 => uint256) public functionCalls; mapping (uint256 => uint256) private lastReset; mapping (uint256 => mapping (uint256 => uint256)) public fightTimestamps; mapping (uint256 => Assaulter[]) public assaulters; mapping (uint256 => Debilitator[]) public debilitators; event TokenMinted(string _name, uint256 indexed tokenId); function mint(string memory _name) public payable nonReentrant { require(!paused, "Paused Contract"); require(msg.value == mintFee, "Insufficient fee"); require(bytes(_name).length > 0, "No Name"); // Create a new player and map it players[COUNTER] = Player({ name: _name, id: COUNTER, level: 0, attack: 100, defence: 100, fights: 0, wins: 0, payout: 0, activate: 0, history: 0}); // Mint a new ERC721 token for the player uint256 tokenId = COUNTER; _mint(msg.sender, tokenId); //Create Blacklist and map it blacklisted[COUNTER] = BlackList({ blacklist: false }); emit TokenMinted(_name, tokenId); COUNTER++; } function updateName(uint256 _tokenId, string memory _newName) public nonReentrant { require(msg.sender == ownerOf(_tokenId), "Not Your NFT."); require(bytes(_newName).length > 0, "No Name"); require(_tokenId >= 0 && _tokenId <= totalSupply(), "Not Found"); // Update the name in the players mapping players[_tokenId].name = string(_newName); } function setCharge(uint256 _charge) external onlyOwner() { charge = _charge; } function setGAMEAddress (address _GAMEAddress) external onlyOwner { require(msg.sender == owner(), "Not Owner."); GAME = _GAMEAddress; } function updateMintFee(uint256 _mintFee) external onlyOwner() { mintFee = _mintFee; } function updatePiD (uint256 pid, uint256 pay) external onlyOwner() { _pid = pid; _pay = pay; } function setTax (uint256 _deadtax, uint256 _bobbtax, uint256 _devtax, uint256 _gametax, uint256 _sos, uint256 _activatetax) external onlyOwner() { deadtax = _deadtax; bobbtax = _bobbtax; devtax = _devtax; gametax = _gametax; sos = _sos; activatetax = _activatetax; } function updateRequiredAmount(uint256 _requiredAmount) external onlyOwner() { requiredAmount = _requiredAmount; } function updateActivatingAmount(uint256 _activatingAmount) external onlyOwner() { activatingAmount = _activatingAmount; } function burn(uint256 _burnAmount, uint256 _num) internal { uint256 burnAmount = (_burnAmount * _num)/100 ; uint256 tax1 = (burnAmount * deadtax)/100; uint256 tax2 = (burnAmount * bobbtax)/100; uint256 tax3 = (burnAmount * devtax)/100; TokenInfo storage tokens = AllowedCrypto[_pid]; IERC20 paytoken; paytoken = tokens.paytoken; paytoken.transfer(burnAddress, tax1); paytoken.transfer(bobbAddress, tax2); paytoken.transfer(developmentAddress, tax3); TotalContractBurns += burnAmount; } function burnGAME(uint256 _burnAmount) internal { TokenInfo storage tokens = AllowedCrypto[_pay]; IERC20 paytoken; paytoken = tokens.paytoken; paytoken.transferFrom(msg.sender, address(this), _burnAmount); // Call the Burn function from the GAME contract Iburn(GAME).Burn(_burnAmount); TotalGAMEBurns += _burnAmount; } function transferTokens(uint256 _cost) internal { TokenInfo storage tokens = AllowedCrypto[_pid]; IERC20 paytoken; paytoken = tokens.paytoken; paytoken.transferFrom(msg.sender,address(this), _cost); } function activateNFT (uint256 _tokenId) public payable nonReentrant { require(!paused, "Paused Contract"); require(msg.sender == ownerOf(_tokenId), "Not your NFT"); require(_tokenId > 0 && _tokenId <= totalSupply(), "Not Found"); require(!blacklisted[_tokenId].blacklist, "Blacklisted"); uint256 cost; if(players[_tokenId].activate > 0) { require(players[_tokenId].wins >= 5, "Insufficient wins!"); // Calculate the payout cost uint256 payreward = ((requiredAmount - (requiredAmount/gametax))/divisor) * 5 * 5; players[_tokenId].payout -= payreward; players[_tokenId].wins -= 5; cost = payreward * divisor; //Initiate a 100% burn from the contract burn(cost, activatetax); } else { cost = activatingAmount; //Transfer Required Tokens to Activate NFT transferTokens(cost); //Initiate a 10% burn from the contract burn(cost, 10); } // Activate NFT players[_tokenId].activate++; } function weaponize (uint256 _tokenId) public payable nonReentrant { require(!paused, "Paused Contract"); require(players[_tokenId].activate > 0, "Activate NFT"); require(msg.sender == ownerOf(_tokenId), "Not your NFT"); require(_tokenId > 0 && _tokenId <= totalSupply(), "Not Found"); require(!blacklisted[_tokenId].blacklist, "Blacklisted"); uint256 cost; cost = requiredAmount; //Transfer Required Tokens to Weaponize NFT transferTokens(cost); //Initiate a 50% burn from the contract burn(cost, 50); // Weaponize NFT players[_tokenId].attack += sos; } function regenerate (uint256 _tokenId) public payable nonReentrant { require(!paused, "Paused Contract"); require(msg.sender == ownerOf(_tokenId), "Not your NFT"); require(_tokenId > 0 && _tokenId <= totalSupply(), "Not Found"); require(players[_tokenId].activate > 0, "Activate NFT"); require(!blacklisted[_tokenId].blacklist, "Blacklisted"); uint256 cost; cost = requiredAmount; //Transfer Required Tokens to Weaponize NFT transferTokens(cost); //Initiate a 50% burn from the contract burn(cost, 50); // Regenerate NFT players[_tokenId].defence += sos; } event AssaultEvent(uint256 indexed attackerId, uint256 indexed defenderId, uint256 stolenPoints, uint256 indexed timestamp); function Assault(uint256 attackerId, uint256 defenderId) public payable nonReentrant { require(!paused, "Paused Contract"); require(msg.sender == ownerOf(attackerId), "Not your NFT!"); require(players[attackerId].activate > 0 && players[defenderId].activate > 0, "Activate NFT."); require(players[attackerId].attack > 0, "No attack."); require(players[defenderId].attack > 0, "Impotent enemy."); require(functionCalls[attackerId] < 1001, "Limit reached."); require(block.timestamp - fightTimestamps[attackerId][defenderId] >= 24 hours, "Too soon."); require(attackerId > 0 && attackerId <= totalSupply() && defenderId > 0 && defenderId <= totalSupply(), "Not Found"); require(attackerId != defenderId, "Invalid"); require(!blacklisted[attackerId].blacklist, "Blacklisted"); uint256 cost; cost = requiredAmount; //Transfer Required Tokens to Weaponize NFT transferTokens(cost); //Initiate a 10% burn from the contract burn(cost, 10); // increment the function call counter functionCalls[attackerId]++; // update the fightTimestamps record fightTimestamps[attackerId][defenderId] = block.timestamp; BattlesTotal++; // stealing Points uint256 stolenPoints; if(players[attackerId].level > players[defenderId].level && players[defenderId].attack >= 20) { stolenPoints = 20; } else if (players[attackerId].attack >= (players[defenderId].defence + 300) && players[defenderId].attack >= 20) { stolenPoints = 20; } else { stolenPoints = 10; } players[defenderId].attack -= stolenPoints; players[attackerId].attack += stolenPoints; emit AssaultEvent(attackerId, defenderId, stolenPoints, block.timestamp); players[attackerId].fights++; players[attackerId].history++; players[attackerId].payout += ((requiredAmount - (requiredAmount/gametax))/divisor); addAssaulter(attackerId, defenderId, stolenPoints); } event AssaultPayoutClaimed(uint256 indexed _playerId, uint256 indexed _payreward); function claimAssault(uint256 _playerId) public nonReentrant { require(!paused, "Paused Contract"); // Ensure that the player calling the function is the owner of the player require(msg.sender == ownerOf(_playerId), "Not your NFT"); require(!blacklisted[_playerId].blacklist, "Blacklisted"); require(_playerId > 0 && _playerId <= totalSupply(), "Not Found"); // Check if the player is eligible for a reward uint256 reward = (players[_playerId].attack - 100) / 100; require(reward > 0, "Not eligible!"); // Update the player players[_playerId].wins += reward; players[_playerId].attack = players[_playerId].attack - (reward * 100); //calculate payout uint256 winmultiplier = 5; uint256 payreward = ((requiredAmount - (requiredAmount/gametax))/divisor) * reward * winmultiplier; players[_playerId].payout += payreward; // Emit event for payout emit AssaultPayoutClaimed(_playerId, payreward); } event DebilitateEvent(uint256 indexed attackerId, uint256 indexed defenderId, uint256 stolenPoints, uint256 indexed timestamp); function Debilitate(uint256 attackerId, uint256 defenderId) public payable nonReentrant { require(!paused, "Paused Contract"); require(msg.sender == ownerOf(attackerId), "Not your NFT"); require(!blacklisted[attackerId].blacklist, "Blacklisted"); require(players[attackerId].activate > 0 && players[defenderId].activate > 0, "Activate NFT"); require(players[attackerId].defence > 0, "No defence"); require(players[defenderId].defence > 0, "Impotent enemy"); require(functionCalls[attackerId] < 1001, "Limit reached."); // check if the last debilitation was more than 24 hours ago require(block.timestamp - fightTimestamps[attackerId][defenderId] >= 24 hours, "Too soon."); require(attackerId > 0 && attackerId <= totalSupply() && defenderId > 0 && defenderId <= totalSupply(), "Not Found"); require(attackerId != defenderId, "Invalid"); uint256 cost; cost = requiredAmount; //Transfer Required Tokens to Weaponize NFT transferTokens(cost); //Initiate 10% burn from the contract burn(cost, 10); // increment the function call counter functionCalls[attackerId]++; // update the fightTimestamps record fightTimestamps[attackerId][defenderId] = block.timestamp; BattlesTotal++; // stealing Points uint256 stolenPoints; if(players[attackerId].level > players[defenderId].level && players[defenderId].defence >= 20) { stolenPoints = 20; } else if (players[attackerId].defence >= (players[defenderId].attack + 300) && players[defenderId].defence >= 20) { stolenPoints = 20; } else { stolenPoints = 10; } players[defenderId].defence -= stolenPoints; players[attackerId].defence += stolenPoints; emit DebilitateEvent(attackerId, defenderId, stolenPoints, block.timestamp); players[attackerId].fights++; players[attackerId].history++; players[attackerId].payout += ((requiredAmount - (requiredAmount/gametax))/divisor); addDebilitator(attackerId, defenderId, stolenPoints); } event DebilitatePayoutClaimed(uint256 indexed _playerId, uint256 indexed _payreward); function claimDebilitate(uint256 _playerId) public nonReentrant { require(!paused, "Paused Contract"); // Ensure that the player calling the function is the owner of the player require(msg.sender == ownerOf(_playerId), "Not your NFT"); require(!blacklisted[_playerId].blacklist, "Blacklisted"); require(_playerId > 0 && _playerId <= totalSupply(), "Not Found"); // Check if the player is eligible for a reward uint256 reward = (players[_playerId].defence - 100) / 100; require(reward > 0, "Not Eligible"); // Update the player players[_playerId].wins += reward; players[_playerId].defence = players[_playerId].defence - (reward * 100); //calculate payout uint256 winmultiplier = 5; uint256 payreward = ((requiredAmount - (requiredAmount/gametax))/divisor) * reward * winmultiplier; players[_playerId].payout += payreward; // Emit event for payout emit DebilitatePayoutClaimed(_playerId, payreward); } event LevelUpEvent(uint256 indexed _playerId, uint256 indexed _level); uint256 public charge; function levelUp(uint256 _playerId) public nonReentrant { require(!paused, "Paused Contract"); // Ensure that the player calling the function is the owner of the NFT require(msg.sender == ownerOf(_playerId), "Not Your NFT"); require(!blacklisted[_playerId].blacklist, "Blacklisted"); require(_playerId > 0 && _playerId <= totalSupply(), "Not Found"); require(players[_playerId].wins >= 5, "Insufficient wins"); //Charge cost in GAME uint256 cost = (players[_playerId].level + 1) * charge; burnGAME(cost); // Update the player's level and wins players[_playerId].level++; uint256 currentLevel = players[_playerId].level; uint256 resetwins = players[_playerId].wins - 5; players[_playerId].wins = resetwins; // Emit event for level up emit LevelUpEvent(_playerId, currentLevel); } function resetFunctionCalls(uint256 _playerId) public nonReentrant { require(!paused, "Paused Contract"); require(msg.sender == ownerOf(_playerId), "Not your NFT"); require(!blacklisted[_playerId].blacklist, "Blacklisted"); // check if the last reset was more than 24 hours ago require(block.timestamp - lastReset[_playerId] >= 24 hours, "Too soon."); // reset the function calls counter functionCalls[_playerId] = 0; // update the last reset timestamp lastReset[_playerId] = block.timestamp; } function changeOwner(address newOwner) external onlyGuard { // Update the owner to the new owner transferOwnership(newOwner); } function withdraw(uint256 _amount) external payable onlyOwner { address payable _owner = payable(owner()); _owner.transfer(_amount); } function withdrawERC20(uint256 payId, uint256 _amount) external payable onlyOwner { TokenInfo storage tokens = AllowedCrypto[payId]; IERC20 paytoken; paytoken = tokens.paytoken; paytoken.transfer(msg.sender, _amount); } function setAddresses(address _developmentAddress, address _bobbAddress, address _burnAddress) public onlyOwner { developmentAddress = payable (_developmentAddress); bobbAddress = payable (_bobbAddress); burnAddress = _burnAddress; } event PayoutsClaimed(address indexed _player, uint256 indexed _amount); function Payouts (uint256 _playerId) public payable nonReentrant { require(!paused, "Paused Contract"); require(players[_playerId].level >= 1, "Min Level1"); require(players[_playerId].payout > 0, "No payout"); require(players[_playerId].wins >= 5, "Fight more"); require(msg.sender == ownerOf(_playerId), "Not your NFT"); require(!blacklisted[_playerId].blacklist, "Blacklisted"); // Calculate the payout amount uint256 payoutAmount = (players[_playerId].payout * divisor); TokenInfo storage tokens = AllowedCrypto[_pid]; IERC20 paytoken; paytoken = tokens.paytoken; //Check the contract for adequate withdrawal balance require(paytoken.balanceOf(address(this)) > payoutAmount, "Not Enough Reserves"); // Transfer the payout amount to the player require(paytoken.transfer(msg.sender, payoutAmount), "Transfer Failed"); // Reset the payout, wins and fight fields players[_playerId].payout = 0; players[_playerId].wins = 0; players[_playerId].fights= 0; // Emit event for payout claim emit PayoutsClaimed(msg.sender, payoutAmount); } function addCurrency(IERC20 _paytoken) external onlyOwner { AllowedCrypto.push( TokenInfo({ paytoken: _paytoken }) ); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function updateBaseURI(string memory _newLink) external onlyOwner() { baseURI = _newLink; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_tokenId <= totalSupply(), "Not Found"); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, _tokenId.toString(), ".json")) : ""; } event Pause(); function pause() public onlyGuard { require(!paused, "Contract already paused."); paused = true; emit Pause(); } event Unpause(); function unpause() public onlyGuard { require(paused, "Contract not paused."); paused = false; emit Unpause(); } // Getters function getPlayers(uint256 _tokenId) public view returns (Player[] memory) { Player[] memory playerBoard = new Player[](1); playerBoard[0] = players[_tokenId]; return playerBoard; } function getPlayerOwners(address _player) public view returns (Player[] memory) { uint256 total = balanceOf(_player); Player[] memory result = new Player[](total); uint256 counter = 0; for (uint256 i = 0; i < total; i++) { uint256 tokenId = tokenOfOwnerByIndex(_player, i); result[counter] = players[tokenId]; counter++; } return result; } function addAssaulter(uint256 attackerId, uint256 defenderId, uint256 stolenPoints) internal { Assaulter memory assaulter = Assaulter({ attackerId: attackerId, defenderId: defenderId, stolenPoints: stolenPoints, timestamp: fightTimestamps[attackerId][defenderId] }); assaulters[attackerId].push(assaulter); } function getAssaulters(uint256 attackerId) public view returns (Assaulter[] memory) { uint256 total = assaulters[attackerId].length; Assaulter[] memory result = new Assaulter[](total); uint256 counter = 0; for (uint256 i = 0; i < total; i++) { if (assaulters[attackerId][i].attackerId == attackerId) { result[counter] = assaulters[attackerId][i]; counter++; } } return result; } function addDebilitator(uint256 attackerId, uint256 defenderId, uint256 stolenPoints) internal { Debilitator memory debilitator = Debilitator({ attackerId: attackerId, defenderId: defenderId, stolenPoints: stolenPoints, timestamp: fightTimestamps[attackerId][defenderId] }); debilitators[attackerId].push(debilitator); } function getDebilitators(uint256 attackerId) public view returns (Debilitator[] memory) { uint256 counter = 0; uint256 total = debilitators[attackerId].length; Debilitator[] memory result = new Debilitator[](total); for (uint256 i = 0; i < total; i++) { if (debilitators[attackerId][i].attackerId == attackerId) { result[counter] = debilitators[attackerId][i]; counter++; } } return result; } function addToBlacklist(uint256[] calldata _nfts) external onlyOwner { for (uint256 i = 0; i < _nfts.length; i++) { blacklisted[_nfts[i]].blacklist = true; } } function removeFromBlacklist(uint256[] calldata _nfts) external onlyOwner { for (uint256 i = 0; i < _nfts.length; i++) { blacklisted[_nfts[i]].blacklist = false; } } function setGuard (address _newGuard) external onlyGuard { guard = _newGuard; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"GAMEAddress","type":"address"},{"internalType":"address","name":"_newGuard","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"attackerId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"defenderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stolenPoints","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AssaultEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_playerId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_payreward","type":"uint256"}],"name":"AssaultPayoutClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"attackerId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"defenderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stolenPoints","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DebilitateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_playerId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_payreward","type":"uint256"}],"name":"DebilitatePayoutClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_playerId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_level","type":"uint256"}],"name":"LevelUpEvent","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":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_player","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"PayoutsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AllowedCrypto","outputs":[{"internalType":"contract IERC20","name":"paytoken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"attackerId","type":"uint256"},{"internalType":"uint256","name":"defenderId","type":"uint256"}],"name":"Assault","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Author","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BattlesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"attackerId","type":"uint256"},{"internalType":"uint256","name":"defenderId","type":"uint256"}],"name":"Debilitate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"GAME","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerId","type":"uint256"}],"name":"Payouts","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"TotalContractBurns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalGAMEBurns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"activateNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"activatetax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_paytoken","type":"address"}],"name":"addCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nfts","type":"uint256[]"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"assaulters","outputs":[{"internalType":"uint256","name":"attackerId","type":"uint256"},{"internalType":"uint256","name":"defenderId","type":"uint256"},{"internalType":"uint256","name":"stolenPoints","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"blacklist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bobbAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bobbtax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerId","type":"uint256"}],"name":"claimAssault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerId","type":"uint256"}],"name":"claimDebilitate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadtax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"debilitators","outputs":[{"internalType":"uint256","name":"attackerId","type":"uint256"},{"internalType":"uint256","name":"defenderId","type":"uint256"},{"internalType":"uint256","name":"stolenPoints","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devtax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fightTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"functionCalls","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gametax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"attackerId","type":"uint256"}],"name":"getAssaulters","outputs":[{"components":[{"internalType":"uint256","name":"attackerId","type":"uint256"},{"internalType":"uint256","name":"defenderId","type":"uint256"},{"internalType":"uint256","name":"stolenPoints","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct battledog.Assaulter[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"attackerId","type":"uint256"}],"name":"getDebilitators","outputs":[{"components":[{"internalType":"uint256","name":"attackerId","type":"uint256"},{"internalType":"uint256","name":"defenderId","type":"uint256"},{"internalType":"uint256","name":"stolenPoints","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct battledog.Debilitator[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"getPlayerOwners","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defence","type":"uint256"},{"internalType":"uint256","name":"fights","type":"uint256"},{"internalType":"uint256","name":"wins","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"activate","type":"uint256"},{"internalType":"uint256","name":"history","type":"uint256"}],"internalType":"struct battledog.Player[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPlayers","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defence","type":"uint256"},{"internalType":"uint256","name":"fights","type":"uint256"},{"internalType":"uint256","name":"wins","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"activate","type":"uint256"},{"internalType":"uint256","name":"history","type":"uint256"}],"internalType":"struct battledog.Player[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerId","type":"uint256"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"players","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defence","type":"uint256"},{"internalType":"uint256","name":"fights","type":"uint256"},{"internalType":"uint256","name":"wins","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"activate","type":"uint256"},{"internalType":"uint256","name":"history","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"regenerate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nfts","type":"uint256[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerId","type":"uint256"}],"name":"resetFunctionCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentAddress","type":"address"},{"internalType":"address","name":"_bobbAddress","type":"address"},{"internalType":"address","name":"_burnAddress","type":"address"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_charge","type":"uint256"}],"name":"setCharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_GAMEAddress","type":"address"}],"name":"setGAMEAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newGuard","type":"address"}],"name":"setGuard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deadtax","type":"uint256"},{"internalType":"uint256","name":"_bobbtax","type":"uint256"},{"internalType":"uint256","name":"_devtax","type":"uint256"},{"internalType":"uint256","name":"_gametax","type":"uint256"},{"internalType":"uint256","name":"_sos","type":"uint256"},{"internalType":"uint256","name":"_activatetax","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sos","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_activatingAmount","type":"uint256"}],"name":"updateActivatingAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newLink","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"}],"name":"updateMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_newName","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"pay","type":"uint256"}],"name":"updatePiD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requiredAmount","type":"uint256"}],"name":"updateRequiredAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"weaponize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"payId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6000600c8190556509184e72a000600d55600e8190556001600f556501d1a94a20006010556512309ce54000601155620f42406012556013819055601481905560155560e0604052602c60808181529062005ee060a03960199062000065908262000211565b50601a805460ff191690553480156200007d57600080fd5b5060405162005f0c38038062005f0c833981016040819052620000a091620003a9565b83836000620000b0838262000211565b506001620000bf828262000211565b505050620000dc620000d66200011660201b60201c565b6200011a565b6001600b55601880546001600160a01b039384166001600160a01b0319918216179091556017805492909316911617905550620004389050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019757607f821691505b602082108103620001b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020c57600081815260208120601f850160051c81016020861015620001e75750805b601f850160051c820191505b818110156200020857828155600101620001f3565b5050505b505050565b81516001600160401b038111156200022d576200022d6200016c565b62000245816200023e845462000182565b84620001be565b602080601f8311600181146200027d5760008415620002645750858301515b600019600386901b1c1916600185901b17855562000208565b600085815260208120601f198616915b82811015620002ae578886015182559484019460019091019084016200028d565b5085821015620002cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620002ef57600080fd5b81516001600160401b03808211156200030c576200030c6200016c565b604051601f8301601f19908116603f011681019082821181831017156200033757620003376200016c565b816040528381526020925086838588010111156200035457600080fd5b600091505b8382101562000378578582018301518183018401529082019062000359565b600093810190920192909252949350505050565b80516001600160a01b0381168114620003a457600080fd5b919050565b60008060008060808587031215620003c057600080fd5b84516001600160401b0380821115620003d857600080fd5b620003e688838901620002dd565b95506020870151915080821115620003fd57600080fd5b506200040c87828801620002dd565b9350506200041d604086016200038c565b91506200042d606086016200038c565b905092959194509250565b615a9880620004486000396000f3fe6080604052600436106104895760003560e01c80636c0360eb11610255578063aee9984711610144578063e00e8bf3116100c1578063f2fde38b11610085578063f2fde38b14610da1578063f55e7d3914610dc1578063f71d96cb14610dd4578063f7581dd914610e0a578063f9f646ab14610e20578063fc55b13814610e4d57600080fd5b8063e00e8bf314610ce5578063e19a9dd914610cf8578063e6ccab7514610d18578063e985e9c514610d38578063f24b337314610d8157600080fd5b8063cefb6fa611610108578063cefb6fa614610c42578063d34acd1214610c58578063d85d3d2714610c85578063dc9ef6e714610c98578063def50d5814610cb857600080fd5b8063aee9984714610bb6578063b5ebbcc414610bcc578063b88d4fde14610bec578063c87b56dd14610c0c578063cdf52f8e14610c2c57600080fd5b80638bae54b8116101d257806395d89b411161019657806395d89b4114610b2e57806398e981c514610b435780639900bce914610b63578063a22cb46514610b76578063a6f9dae114610b9657600080fd5b80638bae54b814610a7a5780638c82ce3f14610aba5780638da5cb5b14610ad057806392201a4a14610aee578063931688cb14610b0e57600080fd5b80637fc897c2116102195780637fc897c2146109fc57806384017e5214610a0f5780638456cb5914610a2f5780638a7e26dd14610a445780638ab234b614610a5a57600080fd5b80636c0360eb1461097f57806370a082311461099457806370d5ae05146109b4578063715018a6146109d45780637b19b53a146109e957600080fd5b80632e5f0f571161037c5780634e77e525116102f95780635c975abb116102bd5780635c975abb146108d75780635c983aec146108f15780635f637025146109115780636352211e14610927578063638b1b141461094757806369e8f97a1461096c57600080fd5b80634e77e5251461084e5780634f6ccce71461086157806353e76f2c1461088157806355161913146108a1578063584cb693146108b757600080fd5b80633f4ba83a116103405780633f4ba83a146107cd57806342842e0e146107e2578063460e20491461080257806348b9ef40146108225780634e5a95af1461083857600080fd5b80632e5f0f57146107375780632f745c5914610757578063363bf964146107775780633687d626146107975780633b3cfba4146107ad57600080fd5b806318160ddd1161040a57806323b872dd116103ce57806323b872dd1461069457806323db4c91146106b457806326c91cad146106e457806327730d12146107045780632e1a7d4d1461072457600080fd5b806318160ddd1461061157806318e70f04146106265780631a3de5c3146106535780631b5a10631461066957806320b2af521461067f57600080fd5b80630ce90ec2116104515780630ce90ec2146105855780630ef5cc0e146105a55780630fffecc7146105c557806311f630f3146105db57806313966db5146105fb57600080fd5b806301ffc9a71461048e57806306fdde03146104c3578063081812fc146104e5578063095ea7b31461051d5780630b30904e1461053f575b600080fd5b34801561049a57600080fd5b506104ae6104a9366004614ed5565b610e6d565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104d8610e98565b6040516104ba9190614f49565b3480156104f157600080fd5b50610505610500366004614f5c565b610f2a565b6040516001600160a01b0390911681526020016104ba565b34801561052957600080fd5b5061053d610538366004614f8a565b610f51565b005b34801561054b57600080fd5b5061057761055a366004614fb6565b602860209081526000928352604080842090915290825290205481565b6040519081526020016104ba565b34801561059157600080fd5b5061053d6105a0366004614f5c565b61106b565b3480156105b157600080fd5b5061053d6105c0366004614f5c565b611273565b3480156105d157600080fd5b50610577601e5481565b3480156105e757600080fd5b5061053d6105f6366004614fd8565b6114b0565b34801561060757600080fd5b50610577600d5481565b34801561061d57600080fd5b50600854610577565b34801561063257600080fd5b5061064661064136600461501b565b6114d5565b6040516104ba9190615038565b34801561065f57600080fd5b50610577600f5481565b34801561067557600080fd5b5061057760115481565b34801561068b57600080fd5b506104d86116a9565b3480156106a057600080fd5b5061053d6106af366004615102565b611737565b3480156106c057600080fd5b506104ae6106cf366004614f5c565b60256020526000908152604090205460ff1681565b3480156106f057600080fd5b506105056106ff366004614f5c565b611768565b34801561071057600080fd5b50601854610505906001600160a01b031681565b61053d610732366004614f5c565b611792565b34801561074357600080fd5b5061053d610752366004614fb6565b6117e7565b34801561076357600080fd5b50610577610772366004614f8a565b6117fa565b34801561078357600080fd5b5061053d610792366004615143565b611890565b3480156107a357600080fd5b5061057760145481565b3480156107b957600080fd5b5061053d6107c836600461501b565b6118e0565b3480156107d957600080fd5b5061053d611951565b3480156107ee57600080fd5b5061053d6107fd366004615102565b6119f9565b34801561080e57600080fd5b5061064661081d366004614f5c565b611a14565b34801561082e57600080fd5b5061057760105481565b34801561084457600080fd5b5061057760215481565b61053d61085c366004614fb6565b611b7b565b34801561086d57600080fd5b5061057761087c366004614f5c565b6120c0565b34801561088d57600080fd5b5061053d61089c36600461523a565b612153565b3480156108ad57600080fd5b50610577602b5481565b3480156108c357600080fd5b5061053d6108d2366004614f5c565b612234565b3480156108e357600080fd5b50601a546104ae9060ff1681565b3480156108fd57600080fd5b5061053d61090c366004615281565b612241565b34801561091d57600080fd5b50610577601d5481565b34801561093357600080fd5b50610505610942366004614f5c565b6122a6565b34801561095357600080fd5b50601a546105059061010090046001600160a01b031681565b61053d61097a366004614fb6565b612306565b34801561098b57600080fd5b506104d8612880565b3480156109a057600080fd5b506105776109af36600461501b565b61288d565b3480156109c057600080fd5b50601c54610505906001600160a01b031681565b3480156109e057600080fd5b5061053d612913565b61053d6109f7366004614f5c565b612927565b61053d610a0a366004614f5c565b612a5f565b348015610a1b57600080fd5b5061053d610a2a366004614f5c565b612b89565b348015610a3b57600080fd5b5061053d612b96565b348015610a5057600080fd5b5061057760225481565b348015610a6657600080fd5b5061053d610a7536600461501b565b612c4b565b348015610a8657600080fd5b50610a9a610a95366004614fb6565b612cb6565b6040805194855260208501939093529183015260608201526080016104ba565b348015610ac657600080fd5b50610577601f5481565b348015610adc57600080fd5b50600a546001600160a01b0316610505565b348015610afa57600080fd5b5061053d610b09366004615281565b612cfc565b348015610b1a57600080fd5b5061053d610b293660046152f6565b612d61565b348015610b3a57600080fd5b506104d8612d75565b348015610b4f57600080fd5b50610a9a610b5e366004614fb6565b612d84565b61053d610b71366004614f5c565b612da0565b348015610b8257600080fd5b5061053d610b91366004615339565b61311a565b348015610ba257600080fd5b5061053d610bb136600461501b565b613125565b348015610bc257600080fd5b5061057760155481565b348015610bd857600080fd5b5061053d610be7366004614f5c565b613158565b348015610bf857600080fd5b5061053d610c07366004615372565b613165565b348015610c1857600080fd5b506104d8610c27366004614f5c565b61319d565b348015610c3857600080fd5b5061057760205481565b348015610c4e57600080fd5b50610577600e5481565b348015610c6457600080fd5b50610577610c73366004614f5c565b60266020526000908152604090205481565b61053d610c933660046152f6565b613223565b348015610ca457600080fd5b50601b54610505906001600160a01b031681565b348015610cc457600080fd5b50610cd8610cd3366004614f5c565b613436565b6040516104ba91906153f2565b61053d610cf3366004614fb6565b6135af565b348015610d0457600080fd5b5061053d610d1336600461501b565b613655565b348015610d2457600080fd5b5061053d610d33366004614f5c565b6136a1565b348015610d4457600080fd5b506104ae610d53366004615461565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610d8d57600080fd5b5061053d610d9c366004614f5c565b613798565b348015610dad57600080fd5b5061053d610dbc36600461501b565b6139d4565b61053d610dcf366004614f5c565b613a4a565b348015610de057600080fd5b50610df4610def366004614f5c565b613c65565b6040516104ba9a9998979695949392919061548f565b348015610e1657600080fd5b5061057760135481565b348015610e2c57600080fd5b50610e40610e3b366004614f5c565b613d39565b6040516104ba91906154e9565b348015610e5957600080fd5b5061053d610e68366004614f5c565b613ea8565b60006001600160e01b0319821663780e9d6360e01b1480610e925750610e9282613eb5565b92915050565b606060008054610ea79061554c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed39061554c565b8015610f205780601f10610ef557610100808354040283529160200191610f20565b820191906000526020600020905b815481529060010190602001808311610f0357829003601f168201915b5050505050905090565b6000610f3582613f05565b506000908152600460205260409020546001600160a01b031690565b6000610f5c826122a6565b9050806001600160a01b0316836001600160a01b031603610fce5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610fea5750610fea8133610d53565b61105c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610fc5565b6110668383613f64565b505050565b611073613fd2565b601a5460ff16156110965760405162461bcd60e51b8152600401610fc590615586565b61109f816122a6565b6001600160a01b0316336001600160a01b0316146110ee5760405162461bcd60e51b815260206004820152600c60248201526b139bdd08165bdd5c8813919560a21b6044820152606401610fc5565b60008181526025602052604090205460ff161561111d5760405162461bcd60e51b8152600401610fc5906155af565b60008111801561112f57506008548111155b61114b5760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040902060060154600511156111a15760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e742077696e7360781b6044820152606401610fc5565b602b546000828152602460205260408120600201549091906111c490600161560d565b6111ce9190615620565b90506111d98161402b565b60008281526024602052604081206002018054916111f683615637565b90915550506000828152602460205260408120600281015460069091015490919061122390600590615650565b60008581526024602052604080822060060183905551919250839186917f5ca885b5603e88c1fa88187446b77e0355fef8842d9ecdf39c8ded80628a19f991a35050506112706001600b55565b50565b61127b613fd2565b601a5460ff161561129e5760405162461bcd60e51b8152600401610fc590615586565b6112a7816122a6565b6001600160a01b0316336001600160a01b0316146112d75760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff16156113065760405162461bcd60e51b8152600401610fc5906155af565b60008111801561131857506008548111155b6113345760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040812060030154606490611354908290615650565b61135e9190615689565b9050600081116113a05760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420656c696769626c652160981b6044820152606401610fc5565b600082815260246020526040812060060180548392906113c190849061560d565b909155506113d29050816064615620565b6000838152602460205260409020600301546113ee9190615650565b600083815260246020908152604082206003019290925560125491546010546005938492869261141e9190615689565b60105461142b9190615650565b6114359190615689565b61143f9190615620565b6114499190615620565b905080602460008681526020019081526020016000206007016000828254611471919061560d565b9091555050604051819085907fcfe02161d782707626ce6a2efd36c33634fd1d48abf19b83c8ab3f0f6078e91c90600090a35050506112706001600b55565b6114b8614145565b601d95909555601e93909355601f91909155602055602255602155565b606060006114e28361288d565b905060008167ffffffffffffffff8111156114ff576114ff61518e565b60405190808252806020026020018201604052801561153857816020015b611525614e6c565b81526020019060019003908161151d5790505b5090506000805b8381101561169f57600061155387836117fa565b905060246000828152602001908152602001600020604051806101400160405290816000820180546115849061554c565b80601f01602080910402602001604051908101604052809291908181526020018280546115b09061554c565b80156115fd5780601f106115d2576101008083540402835291602001916115fd565b820191906000526020600020905b8154815290600101906020018083116115e057829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152602001600982015481525050848481518110611672576116726156ab565b6020026020010181905250828061168890615637565b93505050808061169790615637565b91505061153f565b5090949350505050565b601980546116b69061554c565b80601f01602080910402602001604051908101604052809291908181526020018280546116e29061554c565b801561172f5780601f106117045761010080835404028352916020019161172f565b820191906000526020600020905b81548152906001019060200180831161171257829003601f168201915b505050505081565b611741338261419f565b61175d5760405162461bcd60e51b8152600401610fc5906156c1565b61106683838361421e565b6023818154811061177857600080fd5b6000918252602090912001546001600160a01b0316905081565b61179a614145565b60006117ae600a546001600160a01b031690565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611066573d6000803e3d6000fd5b6117ef614145565b600e91909155600f55565b60006118058361288d565b82106118675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610fc5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b611898614145565b601a80546001600160a01b0394851661010002610100600160a81b0319909116179055601b80549284166001600160a01b0319938416179055601c8054919093169116179055565b6118e8614145565b600a546001600160a01b0316331461192f5760405162461bcd60e51b815260206004820152600a6024820152692737ba1027bbb732b91760b11b6044820152606401610fc5565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316331461197b5760405162461bcd60e51b8152600401610fc59061570e565b601a5460ff166119c45760405162461bcd60e51b815260206004820152601460248201527321b7b73a3930b1ba103737ba103830bab9b2b21760611b6044820152606401610fc5565b601a805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b61106683838360405180602001604052806000815250613165565b60408051600180825281830190925260609160009190816020015b611a37614e6c565b815260200190600190039081611a2f5790505090506024600084815260200190815260200160002060405180610140016040529081600082018054611a7b9061554c565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa79061554c565b8015611af45780601f10611ac957610100808354040283529160200191611af4565b820191906000526020600020905b815481529060010190602001808311611ad757829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152505081600081518110611b6a57611b6a6156ab565b602090810291909101015292915050565b611b83613fd2565b601a5460ff1615611ba65760405162461bcd60e51b8152600401610fc590615586565b611baf826122a6565b6001600160a01b0316336001600160a01b031614611bdf5760405162461bcd60e51b8152600401610fc590615663565b60008281526025602052604090205460ff1615611c0e5760405162461bcd60e51b8152600401610fc5906155af565b60008281526024602052604090206008015415801590611c3e575060008181526024602052604090206008015415155b611c5a5760405162461bcd60e51b8152600401610fc590615737565b600082815260246020526040902060040154611ca55760405162461bcd60e51b815260206004820152600a6024820152694e6f20646566656e636560b01b6044820152606401610fc5565b600081815260246020526040902060040154611cf45760405162461bcd60e51b815260206004820152600e60248201526d496d706f74656e7420656e656d7960901b6044820152606401610fc5565b6000828152602660205260409020546103e911611d445760405162461bcd60e51b815260206004820152600e60248201526d2634b6b4ba103932b0b1b432b21760911b6044820152606401610fc5565b60008281526028602090815260408083208484529091529020546201518090611d6d9042615650565b1015611d8b5760405162461bcd60e51b8152600401610fc59061575d565b600082118015611d9d57506008548211155b8015611da95750600081115b8015611db757506008548111155b611dd35760405162461bcd60e51b8152600401610fc5906155d4565b808203611e0c5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610fc5565b601054611e188161438f565b611e2381600a61442e565b6000838152602660205260408120805491611e3d83615637565b9091555050600083815260286020908152604080832085845290915281204290556015805491611e6c83615637565b90915550506000828152602460205260408082206002908101548684529183200154118015611ead5750600083815260246020526040902060040154601411155b15611eba57506014611f1b565b600083815260246020526040902060030154611ed89061012c61560d565b60008581526024602052604090206004015410801590611f0a5750600083815260246020526040902060040154601411155b15611f1757506014611f1b565b50600a5b60008381526024602052604081206004018054839290611f3c908490615650565b909155505060008481526024602052604081206004018054839290611f6290849061560d565b925050819055504283857fff229b26956a17ed5d6c377286dfdad2e5bbfc48a4c8c1266b1b4a1bafa9d87984604051611f9d91815260200190565b60405180910390a46000848152602460205260408120600501805491611fc283615637565b90915550506000848152602460205260408120600901805491611fe483615637565b9190505550601254602054601054611ffc9190615689565b6010546120099190615650565b6120139190615689565b6000858152602460205260408120600701805490919061203490849061560d565b9091555050604080516080810182528581526020808201868152828401858152600089815260288452858120898252845285812054606086019081528a8252602a855295812080546001808201835591835294909120945160049094029094019283559051928201929092559051600282015590516003909101555b50506120bc6001600b55565b5050565b60006120cb60085490565b821061212e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610fc5565b60088281548110612141576121416156ab565b90600052602060002001549050919050565b61215b613fd2565b612164826122a6565b6001600160a01b0316336001600160a01b0316146121b45760405162461bcd60e51b815260206004820152600d60248201526c2737ba102cb7bab91027232a1760991b6044820152606401610fc5565b60008151116121ef5760405162461bcd60e51b81526020600482015260076024820152664e6f204e616d6560c81b6044820152606401610fc5565b6008548211156122115760405162461bcd60e51b8152600401610fc5906155d4565b600082815260246020526040902061222982826157ce565b506120bc6001600b55565b61223c614145565b601155565b612249614145565b60005b818110156110665760016025600085858581811061226c5761226c6156ab565b60209081029290920135835250810191909152604001600020805460ff19169115159190911790558061229e81615637565b91505061224c565b6000818152600260205260408120546001600160a01b031680610e925760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fc5565b61230e613fd2565b601a5460ff16156123315760405162461bcd60e51b8152600401610fc590615586565b61233a826122a6565b6001600160a01b0316336001600160a01b03161461238a5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420796f7572204e46542160981b6044820152606401610fc5565b600082815260246020526040902060080154158015906123ba575060008181526024602052604090206008015415155b6123f65760405162461bcd60e51b815260206004820152600d60248201526c20b1ba34bb30ba329027232a1760991b6044820152606401610fc5565b6000828152602460205260409020600301546124415760405162461bcd60e51b815260206004820152600a60248201526927379030ba3a30b1b59760b11b6044820152606401610fc5565b6000818152602460205260409020600301546124915760405162461bcd60e51b815260206004820152600f60248201526e24b6b837ba32b73a1032b732b6bc9760891b6044820152606401610fc5565b6000828152602660205260409020546103e9116124e15760405162461bcd60e51b815260206004820152600e60248201526d2634b6b4ba103932b0b1b432b21760911b6044820152606401610fc5565b6000828152602860209081526040808320848452909152902054620151809061250a9042615650565b10156125285760405162461bcd60e51b8152600401610fc59061575d565b60008211801561253a57506008548211155b80156125465750600081115b801561255457506008548111155b6125705760405162461bcd60e51b8152600401610fc5906155d4565b8082036125a95760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610fc5565b60008281526025602052604090205460ff16156125d85760405162461bcd60e51b8152600401610fc5906155af565b6010546125e48161438f565b6125ef81600a61442e565b600083815260266020526040812080549161260983615637565b909155505060008381526028602090815260408083208584529091528120429055601580549161263883615637565b909155505060008281526024602052604080822060029081015486845291832001541180156126795750600083815260246020526040902060030154601411155b15612686575060146126e7565b6000838152602460205260409020600401546126a49061012c61560d565b600085815260246020526040902060030154108015906126d65750600083815260246020526040902060030154601411155b156126e3575060146126e7565b50600a5b60008381526024602052604081206003018054839290612708908490615650565b90915550506000848152602460205260408120600301805483929061272e90849061560d565b925050819055504283857f2a7e4271816fd9e2b2e21c4a4a7df63aa2c324c6ad1fc330161b6e7099206a788460405161276991815260200190565b60405180910390a4600084815260246020526040812060050180549161278e83615637565b909155505060008481526024602052604081206009018054916127b083615637565b91905055506012546020546010546127c89190615689565b6010546127d59190615650565b6127df9190615689565b6000858152602460205260408120600701805490919061280090849061560d565b9091555050604080516080810182528581526020808201868152828401858152600089815260288452858120898252845285812054606086019081528a82526029855295812080546001808201835591835294909120945160049094029094019283559051928201929092559051600282015590516003909101556120b0565b601680546116b69061554c565b60006001600160a01b0382166128f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610fc5565b506001600160a01b031660009081526003602052604090205490565b61291b614145565b6129256000614657565b565b61292f613fd2565b601a5460ff16156129525760405162461bcd60e51b8152600401610fc590615586565b6000818152602460205260409020600801546129805760405162461bcd60e51b8152600401610fc590615737565b612989816122a6565b6001600160a01b0316336001600160a01b0316146129b95760405162461bcd60e51b8152600401610fc590615663565b6000811180156129cb57506008548111155b6129e75760405162461bcd60e51b8152600401610fc5906155d4565b60008181526025602052604090205460ff1615612a165760405162461bcd60e51b8152600401610fc5906155af565b601054612a228161438f565b612a2d81603261442e565b60225460008381526024602052604081206003018054909190612a5190849061560d565b90915550506001600b555050565b612a67613fd2565b601a5460ff1615612a8a5760405162461bcd60e51b8152600401610fc590615586565b612a93816122a6565b6001600160a01b0316336001600160a01b031614612ac35760405162461bcd60e51b8152600401610fc590615663565b600081118015612ad557506008548111155b612af15760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040902060080154612b1f5760405162461bcd60e51b8152600401610fc590615737565b60008181526025602052604090205460ff1615612b4e5760405162461bcd60e51b8152600401610fc5906155af565b601054612b5a8161438f565b612b6581603261442e565b60225460008381526024602052604081206004018054909190612a5190849061560d565b612b91614145565b600d55565b6017546001600160a01b03163314612bc05760405162461bcd60e51b8152600401610fc59061570e565b601a5460ff1615612c135760405162461bcd60e51b815260206004820152601860248201527f436f6e747261637420616c7265616479207061757365642e00000000000000006044820152606401610fc5565b601a805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b612c53614145565b60408051602081019091526001600160a01b0391821681526023805460018101825560009190915290517fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423090910180546001600160a01b03191691909216179055565b602a6020528160005260406000208181548110612cd257600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919450925084565b612d04614145565b60005b8181101561106657600060256000858585818110612d2757612d276156ab565b60209081029290920135835250810191909152604001600020805460ff191691151591909117905580612d5981615637565b915050612d07565b612d69614145565b60166120bc82826157ce565b606060018054610ea79061554c565b60296020528160005260406000208181548110612cd257600080fd5b612da8613fd2565b601a5460ff1615612dcb5760405162461bcd60e51b8152600401610fc590615586565b60008181526024602052604090206002015460011115612e1a5760405162461bcd60e51b815260206004820152600a6024820152694d696e204c6576656c3160b01b6044820152606401610fc5565b600081815260246020526040902060070154612e645760405162461bcd60e51b8152602060048201526009602482015268139bc81c185e5bdd5d60ba1b6044820152606401610fc5565b60008181526024602052604090206006015460051115612eb35760405162461bcd60e51b815260206004820152600a6024820152694669676874206d6f726560b01b6044820152606401610fc5565b612ebc816122a6565b6001600160a01b0316336001600160a01b031614612eec5760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff1615612f1b5760405162461bcd60e51b8152600401610fc5906155af565b6012546000828152602460205260408120600701549091612f3b91615620565b905060006023600e5481548110612f5457612f546156ab565b600091825260209091200180546040516370a0823160e01b81523060048201529192506001600160a01b031690839082906370a0823190602401602060405180830381865afa158015612fab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcf919061588e565b116130125760405162461bcd60e51b81526020600482015260136024820152724e6f7420456e6f75676820526573657276657360681b6044820152606401610fc5565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0382169063a9059cbb906044016020604051808303816000875af115801561305f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308391906158a7565b6130c15760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610fc5565b600084815260246020526040808220600781018390556006810183905560050182905551849133917f2148c22360ec869df90a6857cc7c0b2c254544deff5a5e2e88f91c6c3e27ee059190a35050506112706001600b55565b6120bc3383836146a9565b6017546001600160a01b0316331461314f5760405162461bcd60e51b8152600401610fc59061570e565b611270816139d4565b613160614145565b601055565b61316f338361419f565b61318b5760405162461bcd60e51b8152600401610fc5906156c1565b61319784848484614777565b50505050565b60606131a860085490565b8211156131c75760405162461bcd60e51b8152600401610fc5906155d4565b6000601680546131d69061554c565b9050116131f25760405180602001604052806000815250610e92565b60166131fd836147aa565b60405160200161320e9291906158c4565b60405160208183030381529060405292915050565b61322b613fd2565b601a5460ff161561324e5760405162461bcd60e51b8152600401610fc590615586565b600d5434146132925760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610fc5565b60008151116132cd5760405162461bcd60e51b81526020600482015260076024820152664e6f204e616d6560c81b6044820152606401610fc5565b604051806101400160405280828152602001600c54815260200160008152602001606481526020016064815260200160008152602001600081526020016000815260200160008152602001600081525060246000600c548152602001908152602001600020600082015181600001908161334791906157ce565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155600c546133b3338261483d565b60408051602080820183526000808352600c54815260259091528290209051815460ff19169015151790555181907f51413fa31ea07fada8e4b3a4719c2683c7288050bc37c83c4ad11ce93423087f9061340e908590614f49565b60405180910390a2600c805490600061342683615637565b9190505550506112706001600b55565b6000818152602a602052604081205460609190818167ffffffffffffffff8111156134635761346361518e565b6040519080825280602002602001820160405280156134bf57816020015b6134ac6040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001906001900390816134815790505b50905060005b828110156135a6576000868152602a602052604090208054879190839081106134f0576134f06156ab565b90600052602060002090600402016000015403613594576000868152602a60205260409020805482908110613527576135276156ab565b906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505082858151811061357a5761357a6156ab565b6020026020010181905250838061359090615637565b9450505b8061359e81615637565b9150506134c5565b50949350505050565b6135b7614145565b6000602383815481106135cc576135cc6156ab565b6000918252602090912001805460405163a9059cbb60e01b8152336004820152602481018590529192506001600160a01b031690819063a9059cbb906044016020604051808303816000875af115801561362a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364e91906158a7565b5050505050565b6017546001600160a01b0316331461367f5760405162461bcd60e51b8152600401610fc59061570e565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6136a9613fd2565b601a5460ff16156136cc5760405162461bcd60e51b8152600401610fc590615586565b6136d5816122a6565b6001600160a01b0316336001600160a01b0316146137055760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff16156137345760405162461bcd60e51b8152600401610fc5906155af565b60008181526027602052604090205462015180906137529042615650565b10156137705760405162461bcd60e51b8152600401610fc59061575d565b6000818152602660209081526040808320839055602790915290204290556112706001600b55565b6137a0613fd2565b601a5460ff16156137c35760405162461bcd60e51b8152600401610fc590615586565b6137cc816122a6565b6001600160a01b0316336001600160a01b0316146137fc5760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff161561382b5760405162461bcd60e51b8152600401610fc5906155af565b60008111801561383d57506008548111155b6138595760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040812060040154606490613879908290615650565b6138839190615689565b9050600081116138c45760405162461bcd60e51b815260206004820152600c60248201526b4e6f7420456c696769626c6560a01b6044820152606401610fc5565b600082815260246020526040812060060180548392906138e590849061560d565b909155506138f69050816064615620565b6000838152602460205260409020600401546139129190615650565b60008381526024602090815260408220600401929092556012549154601054600593849286926139429190615689565b60105461394f9190615650565b6139599190615689565b6139639190615620565b61396d9190615620565b905080602460008681526020019081526020016000206007016000828254613995919061560d565b9091555050604051819085907f7f5659a067632eac859a934c471d405a845bf03086d0206bc77ca28c7b00b6c290600090a35050506112706001600b55565b6139dc614145565b6001600160a01b038116613a415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fc5565b61127081614657565b613a52613fd2565b601a5460ff1615613a755760405162461bcd60e51b8152600401610fc590615586565b613a7e816122a6565b6001600160a01b0316336001600160a01b031614613aae5760405162461bcd60e51b8152600401610fc590615663565b600081118015613ac057506008548111155b613adc5760405162461bcd60e51b8152600401610fc5906155d4565b60008181526025602052604090205460ff1615613b0b5760405162461bcd60e51b8152600401610fc5906155af565b60008181526024602052604081206008015415613c305760008281526024602052604090206006015460051115613b795760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742077696e732160701b6044820152606401610fc5565b6000601254602054601054613b8e9190615689565b601054613b9b9190615650565b613ba59190615689565b613bb0906005615620565b613bbb906005615620565b905080602460008581526020019081526020016000206007016000828254613be39190615650565b90915550506000838152602460205260408120600601805460059290613c0a908490615650565b9091555050601254613c1c9082615620565b9150613c2a8260215461442e565b50613c48565b50601154613c3d8161438f565b613c4881600a61442e565b600082815260246020526040812060080180549161342683615637565b602460205260009081526040902080548190613c809061554c565b80601f0160208091040260200160405190810160405280929190818152602001828054613cac9061554c565b8015613cf95780601f10613cce57610100808354040283529160200191613cf9565b820191906000526020600020905b815481529060010190602001808311613cdc57829003601f168201915b505050505090806001015490806002015490806003015490806004015490806005015490806006015490806007015490806008015490806009015490508a565b6000818152602960205260408120546060918167ffffffffffffffff811115613d6457613d6461518e565b604051908082528060200260200182016040528015613dc057816020015b613dad6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081613d825790505b5090506000805b8381101561169f576000868152602960205260409020805487919083908110613df257613df26156ab565b90600052602060002090600402016000015403613e96576000868152602960205260409020805482908110613e2957613e296156ab565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050838381518110613e7c57613e7c6156ab565b60200260200101819052508180613e9290615637565b9250505b80613ea081615637565b915050613dc7565b613eb0614145565b602b55565b60006001600160e01b031982166380ac58cd60e01b1480613ee657506001600160e01b03198216635b5e139f60e01b145b80610e9257506301ffc9a760e01b6001600160e01b0319831614610e92565b6000818152600260205260409020546001600160a01b03166112705760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fc5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613f99826122a6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6002600b54036140245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610fc5565b6002600b55565b60006023600f5481548110614042576140426156ab565b600091825260209091200180546040516323b872dd60e01b8152336004820152306024820152604481018590529192506001600160a01b03169081906323b872dd906064016020604051808303816000875af11580156140a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ca91906158a7565b5060185460405163b90306ad60e01b8152600481018590526001600160a01b039091169063b90306ad90602401600060405180830381600087803b15801561411157600080fd5b505af1158015614125573d6000803e3d6000fd5b50505050826014600082825461413b919061560d565b9091555050505050565b600a546001600160a01b031633146129255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fc5565b6000806141ab836122a6565b9050806001600160a01b0316846001600160a01b031614806141f257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806142165750836001600160a01b031661420b84610f2a565b6001600160a01b0316145b949350505050565b826001600160a01b0316614231826122a6565b6001600160a01b0316146142575760405162461bcd60e51b8152600401610fc59061595b565b6001600160a01b0382166142b95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610fc5565b6142c683838360016149d6565b826001600160a01b03166142d9826122a6565b6001600160a01b0316146142ff5760405162461bcd60e51b8152600401610fc59061595b565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006023600e54815481106143a6576143a66156ab565b600091825260209091200180546040516323b872dd60e01b8152336004820152306024820152604481018590529192506001600160a01b03169081906323b872dd906064016020604051808303816000875af115801561440a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319791906158a7565b6000606461443c8385615620565b6144469190615689565b905060006064601d548361445a9190615620565b6144649190615689565b905060006064601e54846144789190615620565b6144829190615689565b905060006064601f54856144969190615620565b6144a09190615689565b905060006023600e54815481106144b9576144b96156ab565b60009182526020909120018054601c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018890529293501690819063a9059cbb906044016020604051808303816000875af115801561451c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454091906158a7565b50601b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018690529082169063a9059cbb906044016020604051808303816000875af1158015614594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145b891906158a7565b50601a5460405163a9059cbb60e01b81526101009091046001600160a01b0390811660048301526024820185905282169063a9059cbb906044016020604051808303816000875af1158015614611573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061463591906158a7565b508560136000828254614648919061560d565b90915550505050505050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03160361470a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610fc5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61478284848461421e565b61478e84848484614b03565b6131975760405162461bcd60e51b8152600401610fc5906159a0565b606060006147b783614c04565b600101905060008167ffffffffffffffff8111156147d7576147d761518e565b6040519080825280601f01601f191660200182016040528015614801576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461480b57509392505050565b6001600160a01b0382166148935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610fc5565b6000818152600260205260409020546001600160a01b0316156148f85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fc5565b6149066000838360016149d6565b6000818152600260205260409020546001600160a01b03161561496b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fc5565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001811115614a455760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610fc5565b816001600160a01b038516614aa157614a9c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614ac4565b836001600160a01b0316856001600160a01b031614614ac457614ac48582614cdc565b6001600160a01b038416614ae057614adb81614d79565b61364e565b846001600160a01b0316846001600160a01b03161461364e5761364e8482614e28565b60006001600160a01b0384163b15614bf957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614b479033908990889088906004016159f2565b6020604051808303816000875af1925050508015614b82575060408051601f3d908101601f19168201909252614b7f91810190615a2f565b60015b614bdf573d808015614bb0576040519150601f19603f3d011682016040523d82523d6000602084013e614bb5565b606091505b508051600003614bd75760405162461bcd60e51b8152600401610fc5906159a0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050614216565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614c435772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614c6f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614c8d57662386f26fc10000830492506010015b6305f5e1008310614ca5576305f5e100830492506008015b6127108310614cb957612710830492506004015b60648310614ccb576064830492506002015b600a8310610e925760010192915050565b60006001614ce98461288d565b614cf39190615650565b600083815260076020526040902054909150808214614d46576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614d8b90600190615650565b60008381526009602052604081205460088054939450909284908110614db357614db36156ab565b906000526020600020015490508060088381548110614dd457614dd46156ab565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614e0c57614e0c615a4c565b6001900381819060005260206000200160009055905550505050565b6000614e338361288d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806101400160405280606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160e01b03198116811461127057600080fd5b600060208284031215614ee757600080fd5b8135614ef281614ebf565b9392505050565b60005b83811015614f14578181015183820152602001614efc565b50506000910152565b60008151808452614f35816020860160208601614ef9565b601f01601f19169290920160200192915050565b602081526000614ef26020830184614f1d565b600060208284031215614f6e57600080fd5b5035919050565b6001600160a01b038116811461127057600080fd5b60008060408385031215614f9d57600080fd5b8235614fa881614f75565b946020939093013593505050565b60008060408385031215614fc957600080fd5b50508035926020909101359150565b60008060008060008060c08789031215614ff157600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60006020828403121561502d57600080fd5b8135614ef281614f75565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156150f457603f198984030185528151610140815181865261508682870182614f1d565b838b0151878c0152898401518a880152606080850151908801526080808501519088015260a0808501519088015260c0808501519088015260e0808501519088015261010080850151908801526101209384015193909601929092525050938601939086019060010161505f565b509098975050505050505050565b60008060006060848603121561511757600080fd5b833561512281614f75565b9250602084013561513281614f75565b929592945050506040919091013590565b60008060006060848603121561515857600080fd5b833561516381614f75565b9250602084013561517381614f75565b9150604084013561518381614f75565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156151bf576151bf61518e565b604051601f8501601f19908116603f011681019082821181831017156151e7576151e761518e565b8160405280935085815286868601111561520057600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261522b57600080fd5b614ef2838335602085016151a4565b6000806040838503121561524d57600080fd5b82359150602083013567ffffffffffffffff81111561526b57600080fd5b6152778582860161521a565b9150509250929050565b6000806020838503121561529457600080fd5b823567ffffffffffffffff808211156152ac57600080fd5b818501915085601f8301126152c057600080fd5b8135818111156152cf57600080fd5b8660208260051b85010111156152e457600080fd5b60209290920196919550909350505050565b60006020828403121561530857600080fd5b813567ffffffffffffffff81111561531f57600080fd5b6142168482850161521a565b801515811461127057600080fd5b6000806040838503121561534c57600080fd5b823561535781614f75565b915060208301356153678161532b565b809150509250929050565b6000806000806080858703121561538857600080fd5b843561539381614f75565b935060208501356153a381614f75565b925060408501359150606085013567ffffffffffffffff8111156153c657600080fd5b8501601f810187136153d757600080fd5b6153e6878235602084016151a4565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b8181101561545557615442838551805182526020810151602083015260408101516040830152606081015160608301525050565b928401926080929092019160010161540e565b50909695505050505050565b6000806040838503121561547457600080fd5b823561547f81614f75565b9150602083013561536781614f75565b60006101408083526154a38184018e614f1d565b602084019c909c52505060408101989098526060880196909652608087019490945260a086019290925260c085015260e084015261010083015261012090910152919050565b6020808252825182820181905260009190848201906040850190845b8181101561545557615539838551805182526020810151602083015260408101516040830152606081015160608301525050565b9284019260809290920191600101615505565b600181811c9082168061556057607f821691505b60208210810361558057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600f908201526e14185d5cd9590810dbdb9d1c9858dd608a1b604082015260600190565b6020808252600b908201526a109b1858dadb1a5cdd195960aa1b604082015260600190565b602080825260099082015268139bdd08119bdd5b9960ba1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e9257610e926155f7565b8082028115828204841417610e9257610e926155f7565b600060018201615649576156496155f7565b5060010190565b81810381811115610e9257610e926155f7565b6020808252600c908201526b139bdd081e5bdd5c8813919560a21b604082015260600190565b6000826156a657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252600f908201526e2737ba1030baba3437b934bd32b21760891b604082015260600190565b6020808252600c908201526b1058dd1a5d985d194813919560a21b604082015260600190565b6020808252600990820152682a37b79039b7b7b71760b91b604082015260600190565b601f82111561106657600081815260208120601f850160051c810160208610156157a75750805b601f850160051c820191505b818110156157c6578281556001016157b3565b505050505050565b815167ffffffffffffffff8111156157e8576157e861518e565b6157fc816157f6845461554c565b84615780565b602080601f83116001811461583157600084156158195750858301515b600019600386901b1c1916600185901b1785556157c6565b600085815260208120601f198616915b8281101561586057888601518255948401946001909101908401615841565b508582101561587e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156158a057600080fd5b5051919050565b6000602082840312156158b957600080fd5b8151614ef28161532b565b60008084546158d28161554c565b600182811680156158ea57600181146158ff5761592e565b60ff198416875282151583028701945061592e565b8860005260208060002060005b858110156159255781548a82015290840190820161590c565b50505082870194505b505050508351615942818360208801614ef9565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a2590830184614f1d565b9695505050505050565b600060208284031215615a4157600080fd5b8151614ef281614ebf565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208d4e526b5d3be2c856bdfd3a6f097f7c7054affcafd63f78323ee46fc073005164736f6c634300081200333078536f726365726572207c20426174746f75736169204e616b616d6f746f207c204461726b2d5669706572000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000ab803c683000c3ab8836477b0e2bdc45c20139d1000000000000000000000000c0ba543b1f4a340aca0157c1988f3e216c9e17740000000000000000000000000000000000000000000000000000000000000009426174746c65646f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034244470000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106104895760003560e01c80636c0360eb11610255578063aee9984711610144578063e00e8bf3116100c1578063f2fde38b11610085578063f2fde38b14610da1578063f55e7d3914610dc1578063f71d96cb14610dd4578063f7581dd914610e0a578063f9f646ab14610e20578063fc55b13814610e4d57600080fd5b8063e00e8bf314610ce5578063e19a9dd914610cf8578063e6ccab7514610d18578063e985e9c514610d38578063f24b337314610d8157600080fd5b8063cefb6fa611610108578063cefb6fa614610c42578063d34acd1214610c58578063d85d3d2714610c85578063dc9ef6e714610c98578063def50d5814610cb857600080fd5b8063aee9984714610bb6578063b5ebbcc414610bcc578063b88d4fde14610bec578063c87b56dd14610c0c578063cdf52f8e14610c2c57600080fd5b80638bae54b8116101d257806395d89b411161019657806395d89b4114610b2e57806398e981c514610b435780639900bce914610b63578063a22cb46514610b76578063a6f9dae114610b9657600080fd5b80638bae54b814610a7a5780638c82ce3f14610aba5780638da5cb5b14610ad057806392201a4a14610aee578063931688cb14610b0e57600080fd5b80637fc897c2116102195780637fc897c2146109fc57806384017e5214610a0f5780638456cb5914610a2f5780638a7e26dd14610a445780638ab234b614610a5a57600080fd5b80636c0360eb1461097f57806370a082311461099457806370d5ae05146109b4578063715018a6146109d45780637b19b53a146109e957600080fd5b80632e5f0f571161037c5780634e77e525116102f95780635c975abb116102bd5780635c975abb146108d75780635c983aec146108f15780635f637025146109115780636352211e14610927578063638b1b141461094757806369e8f97a1461096c57600080fd5b80634e77e5251461084e5780634f6ccce71461086157806353e76f2c1461088157806355161913146108a1578063584cb693146108b757600080fd5b80633f4ba83a116103405780633f4ba83a146107cd57806342842e0e146107e2578063460e20491461080257806348b9ef40146108225780634e5a95af1461083857600080fd5b80632e5f0f57146107375780632f745c5914610757578063363bf964146107775780633687d626146107975780633b3cfba4146107ad57600080fd5b806318160ddd1161040a57806323b872dd116103ce57806323b872dd1461069457806323db4c91146106b457806326c91cad146106e457806327730d12146107045780632e1a7d4d1461072457600080fd5b806318160ddd1461061157806318e70f04146106265780631a3de5c3146106535780631b5a10631461066957806320b2af521461067f57600080fd5b80630ce90ec2116104515780630ce90ec2146105855780630ef5cc0e146105a55780630fffecc7146105c557806311f630f3146105db57806313966db5146105fb57600080fd5b806301ffc9a71461048e57806306fdde03146104c3578063081812fc146104e5578063095ea7b31461051d5780630b30904e1461053f575b600080fd5b34801561049a57600080fd5b506104ae6104a9366004614ed5565b610e6d565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104d8610e98565b6040516104ba9190614f49565b3480156104f157600080fd5b50610505610500366004614f5c565b610f2a565b6040516001600160a01b0390911681526020016104ba565b34801561052957600080fd5b5061053d610538366004614f8a565b610f51565b005b34801561054b57600080fd5b5061057761055a366004614fb6565b602860209081526000928352604080842090915290825290205481565b6040519081526020016104ba565b34801561059157600080fd5b5061053d6105a0366004614f5c565b61106b565b3480156105b157600080fd5b5061053d6105c0366004614f5c565b611273565b3480156105d157600080fd5b50610577601e5481565b3480156105e757600080fd5b5061053d6105f6366004614fd8565b6114b0565b34801561060757600080fd5b50610577600d5481565b34801561061d57600080fd5b50600854610577565b34801561063257600080fd5b5061064661064136600461501b565b6114d5565b6040516104ba9190615038565b34801561065f57600080fd5b50610577600f5481565b34801561067557600080fd5b5061057760115481565b34801561068b57600080fd5b506104d86116a9565b3480156106a057600080fd5b5061053d6106af366004615102565b611737565b3480156106c057600080fd5b506104ae6106cf366004614f5c565b60256020526000908152604090205460ff1681565b3480156106f057600080fd5b506105056106ff366004614f5c565b611768565b34801561071057600080fd5b50601854610505906001600160a01b031681565b61053d610732366004614f5c565b611792565b34801561074357600080fd5b5061053d610752366004614fb6565b6117e7565b34801561076357600080fd5b50610577610772366004614f8a565b6117fa565b34801561078357600080fd5b5061053d610792366004615143565b611890565b3480156107a357600080fd5b5061057760145481565b3480156107b957600080fd5b5061053d6107c836600461501b565b6118e0565b3480156107d957600080fd5b5061053d611951565b3480156107ee57600080fd5b5061053d6107fd366004615102565b6119f9565b34801561080e57600080fd5b5061064661081d366004614f5c565b611a14565b34801561082e57600080fd5b5061057760105481565b34801561084457600080fd5b5061057760215481565b61053d61085c366004614fb6565b611b7b565b34801561086d57600080fd5b5061057761087c366004614f5c565b6120c0565b34801561088d57600080fd5b5061053d61089c36600461523a565b612153565b3480156108ad57600080fd5b50610577602b5481565b3480156108c357600080fd5b5061053d6108d2366004614f5c565b612234565b3480156108e357600080fd5b50601a546104ae9060ff1681565b3480156108fd57600080fd5b5061053d61090c366004615281565b612241565b34801561091d57600080fd5b50610577601d5481565b34801561093357600080fd5b50610505610942366004614f5c565b6122a6565b34801561095357600080fd5b50601a546105059061010090046001600160a01b031681565b61053d61097a366004614fb6565b612306565b34801561098b57600080fd5b506104d8612880565b3480156109a057600080fd5b506105776109af36600461501b565b61288d565b3480156109c057600080fd5b50601c54610505906001600160a01b031681565b3480156109e057600080fd5b5061053d612913565b61053d6109f7366004614f5c565b612927565b61053d610a0a366004614f5c565b612a5f565b348015610a1b57600080fd5b5061053d610a2a366004614f5c565b612b89565b348015610a3b57600080fd5b5061053d612b96565b348015610a5057600080fd5b5061057760225481565b348015610a6657600080fd5b5061053d610a7536600461501b565b612c4b565b348015610a8657600080fd5b50610a9a610a95366004614fb6565b612cb6565b6040805194855260208501939093529183015260608201526080016104ba565b348015610ac657600080fd5b50610577601f5481565b348015610adc57600080fd5b50600a546001600160a01b0316610505565b348015610afa57600080fd5b5061053d610b09366004615281565b612cfc565b348015610b1a57600080fd5b5061053d610b293660046152f6565b612d61565b348015610b3a57600080fd5b506104d8612d75565b348015610b4f57600080fd5b50610a9a610b5e366004614fb6565b612d84565b61053d610b71366004614f5c565b612da0565b348015610b8257600080fd5b5061053d610b91366004615339565b61311a565b348015610ba257600080fd5b5061053d610bb136600461501b565b613125565b348015610bc257600080fd5b5061057760155481565b348015610bd857600080fd5b5061053d610be7366004614f5c565b613158565b348015610bf857600080fd5b5061053d610c07366004615372565b613165565b348015610c1857600080fd5b506104d8610c27366004614f5c565b61319d565b348015610c3857600080fd5b5061057760205481565b348015610c4e57600080fd5b50610577600e5481565b348015610c6457600080fd5b50610577610c73366004614f5c565b60266020526000908152604090205481565b61053d610c933660046152f6565b613223565b348015610ca457600080fd5b50601b54610505906001600160a01b031681565b348015610cc457600080fd5b50610cd8610cd3366004614f5c565b613436565b6040516104ba91906153f2565b61053d610cf3366004614fb6565b6135af565b348015610d0457600080fd5b5061053d610d1336600461501b565b613655565b348015610d2457600080fd5b5061053d610d33366004614f5c565b6136a1565b348015610d4457600080fd5b506104ae610d53366004615461565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610d8d57600080fd5b5061053d610d9c366004614f5c565b613798565b348015610dad57600080fd5b5061053d610dbc36600461501b565b6139d4565b61053d610dcf366004614f5c565b613a4a565b348015610de057600080fd5b50610df4610def366004614f5c565b613c65565b6040516104ba9a9998979695949392919061548f565b348015610e1657600080fd5b5061057760135481565b348015610e2c57600080fd5b50610e40610e3b366004614f5c565b613d39565b6040516104ba91906154e9565b348015610e5957600080fd5b5061053d610e68366004614f5c565b613ea8565b60006001600160e01b0319821663780e9d6360e01b1480610e925750610e9282613eb5565b92915050565b606060008054610ea79061554c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed39061554c565b8015610f205780601f10610ef557610100808354040283529160200191610f20565b820191906000526020600020905b815481529060010190602001808311610f0357829003601f168201915b5050505050905090565b6000610f3582613f05565b506000908152600460205260409020546001600160a01b031690565b6000610f5c826122a6565b9050806001600160a01b0316836001600160a01b031603610fce5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610fea5750610fea8133610d53565b61105c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610fc5565b6110668383613f64565b505050565b611073613fd2565b601a5460ff16156110965760405162461bcd60e51b8152600401610fc590615586565b61109f816122a6565b6001600160a01b0316336001600160a01b0316146110ee5760405162461bcd60e51b815260206004820152600c60248201526b139bdd08165bdd5c8813919560a21b6044820152606401610fc5565b60008181526025602052604090205460ff161561111d5760405162461bcd60e51b8152600401610fc5906155af565b60008111801561112f57506008548111155b61114b5760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040902060060154600511156111a15760405162461bcd60e51b8152602060048201526011602482015270496e73756666696369656e742077696e7360781b6044820152606401610fc5565b602b546000828152602460205260408120600201549091906111c490600161560d565b6111ce9190615620565b90506111d98161402b565b60008281526024602052604081206002018054916111f683615637565b90915550506000828152602460205260408120600281015460069091015490919061122390600590615650565b60008581526024602052604080822060060183905551919250839186917f5ca885b5603e88c1fa88187446b77e0355fef8842d9ecdf39c8ded80628a19f991a35050506112706001600b55565b50565b61127b613fd2565b601a5460ff161561129e5760405162461bcd60e51b8152600401610fc590615586565b6112a7816122a6565b6001600160a01b0316336001600160a01b0316146112d75760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff16156113065760405162461bcd60e51b8152600401610fc5906155af565b60008111801561131857506008548111155b6113345760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040812060030154606490611354908290615650565b61135e9190615689565b9050600081116113a05760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420656c696769626c652160981b6044820152606401610fc5565b600082815260246020526040812060060180548392906113c190849061560d565b909155506113d29050816064615620565b6000838152602460205260409020600301546113ee9190615650565b600083815260246020908152604082206003019290925560125491546010546005938492869261141e9190615689565b60105461142b9190615650565b6114359190615689565b61143f9190615620565b6114499190615620565b905080602460008681526020019081526020016000206007016000828254611471919061560d565b9091555050604051819085907fcfe02161d782707626ce6a2efd36c33634fd1d48abf19b83c8ab3f0f6078e91c90600090a35050506112706001600b55565b6114b8614145565b601d95909555601e93909355601f91909155602055602255602155565b606060006114e28361288d565b905060008167ffffffffffffffff8111156114ff576114ff61518e565b60405190808252806020026020018201604052801561153857816020015b611525614e6c565b81526020019060019003908161151d5790505b5090506000805b8381101561169f57600061155387836117fa565b905060246000828152602001908152602001600020604051806101400160405290816000820180546115849061554c565b80601f01602080910402602001604051908101604052809291908181526020018280546115b09061554c565b80156115fd5780601f106115d2576101008083540402835291602001916115fd565b820191906000526020600020905b8154815290600101906020018083116115e057829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152602001600982015481525050848481518110611672576116726156ab565b6020026020010181905250828061168890615637565b93505050808061169790615637565b91505061153f565b5090949350505050565b601980546116b69061554c565b80601f01602080910402602001604051908101604052809291908181526020018280546116e29061554c565b801561172f5780601f106117045761010080835404028352916020019161172f565b820191906000526020600020905b81548152906001019060200180831161171257829003601f168201915b505050505081565b611741338261419f565b61175d5760405162461bcd60e51b8152600401610fc5906156c1565b61106683838361421e565b6023818154811061177857600080fd5b6000918252602090912001546001600160a01b0316905081565b61179a614145565b60006117ae600a546001600160a01b031690565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611066573d6000803e3d6000fd5b6117ef614145565b600e91909155600f55565b60006118058361288d565b82106118675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610fc5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b611898614145565b601a80546001600160a01b0394851661010002610100600160a81b0319909116179055601b80549284166001600160a01b0319938416179055601c8054919093169116179055565b6118e8614145565b600a546001600160a01b0316331461192f5760405162461bcd60e51b815260206004820152600a6024820152692737ba1027bbb732b91760b11b6044820152606401610fc5565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316331461197b5760405162461bcd60e51b8152600401610fc59061570e565b601a5460ff166119c45760405162461bcd60e51b815260206004820152601460248201527321b7b73a3930b1ba103737ba103830bab9b2b21760611b6044820152606401610fc5565b601a805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b61106683838360405180602001604052806000815250613165565b60408051600180825281830190925260609160009190816020015b611a37614e6c565b815260200190600190039081611a2f5790505090506024600084815260200190815260200160002060405180610140016040529081600082018054611a7b9061554c565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa79061554c565b8015611af45780601f10611ac957610100808354040283529160200191611af4565b820191906000526020600020905b815481529060010190602001808311611ad757829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152505081600081518110611b6a57611b6a6156ab565b602090810291909101015292915050565b611b83613fd2565b601a5460ff1615611ba65760405162461bcd60e51b8152600401610fc590615586565b611baf826122a6565b6001600160a01b0316336001600160a01b031614611bdf5760405162461bcd60e51b8152600401610fc590615663565b60008281526025602052604090205460ff1615611c0e5760405162461bcd60e51b8152600401610fc5906155af565b60008281526024602052604090206008015415801590611c3e575060008181526024602052604090206008015415155b611c5a5760405162461bcd60e51b8152600401610fc590615737565b600082815260246020526040902060040154611ca55760405162461bcd60e51b815260206004820152600a6024820152694e6f20646566656e636560b01b6044820152606401610fc5565b600081815260246020526040902060040154611cf45760405162461bcd60e51b815260206004820152600e60248201526d496d706f74656e7420656e656d7960901b6044820152606401610fc5565b6000828152602660205260409020546103e911611d445760405162461bcd60e51b815260206004820152600e60248201526d2634b6b4ba103932b0b1b432b21760911b6044820152606401610fc5565b60008281526028602090815260408083208484529091529020546201518090611d6d9042615650565b1015611d8b5760405162461bcd60e51b8152600401610fc59061575d565b600082118015611d9d57506008548211155b8015611da95750600081115b8015611db757506008548111155b611dd35760405162461bcd60e51b8152600401610fc5906155d4565b808203611e0c5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610fc5565b601054611e188161438f565b611e2381600a61442e565b6000838152602660205260408120805491611e3d83615637565b9091555050600083815260286020908152604080832085845290915281204290556015805491611e6c83615637565b90915550506000828152602460205260408082206002908101548684529183200154118015611ead5750600083815260246020526040902060040154601411155b15611eba57506014611f1b565b600083815260246020526040902060030154611ed89061012c61560d565b60008581526024602052604090206004015410801590611f0a5750600083815260246020526040902060040154601411155b15611f1757506014611f1b565b50600a5b60008381526024602052604081206004018054839290611f3c908490615650565b909155505060008481526024602052604081206004018054839290611f6290849061560d565b925050819055504283857fff229b26956a17ed5d6c377286dfdad2e5bbfc48a4c8c1266b1b4a1bafa9d87984604051611f9d91815260200190565b60405180910390a46000848152602460205260408120600501805491611fc283615637565b90915550506000848152602460205260408120600901805491611fe483615637565b9190505550601254602054601054611ffc9190615689565b6010546120099190615650565b6120139190615689565b6000858152602460205260408120600701805490919061203490849061560d565b9091555050604080516080810182528581526020808201868152828401858152600089815260288452858120898252845285812054606086019081528a8252602a855295812080546001808201835591835294909120945160049094029094019283559051928201929092559051600282015590516003909101555b50506120bc6001600b55565b5050565b60006120cb60085490565b821061212e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610fc5565b60088281548110612141576121416156ab565b90600052602060002001549050919050565b61215b613fd2565b612164826122a6565b6001600160a01b0316336001600160a01b0316146121b45760405162461bcd60e51b815260206004820152600d60248201526c2737ba102cb7bab91027232a1760991b6044820152606401610fc5565b60008151116121ef5760405162461bcd60e51b81526020600482015260076024820152664e6f204e616d6560c81b6044820152606401610fc5565b6008548211156122115760405162461bcd60e51b8152600401610fc5906155d4565b600082815260246020526040902061222982826157ce565b506120bc6001600b55565b61223c614145565b601155565b612249614145565b60005b818110156110665760016025600085858581811061226c5761226c6156ab565b60209081029290920135835250810191909152604001600020805460ff19169115159190911790558061229e81615637565b91505061224c565b6000818152600260205260408120546001600160a01b031680610e925760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fc5565b61230e613fd2565b601a5460ff16156123315760405162461bcd60e51b8152600401610fc590615586565b61233a826122a6565b6001600160a01b0316336001600160a01b03161461238a5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420796f7572204e46542160981b6044820152606401610fc5565b600082815260246020526040902060080154158015906123ba575060008181526024602052604090206008015415155b6123f65760405162461bcd60e51b815260206004820152600d60248201526c20b1ba34bb30ba329027232a1760991b6044820152606401610fc5565b6000828152602460205260409020600301546124415760405162461bcd60e51b815260206004820152600a60248201526927379030ba3a30b1b59760b11b6044820152606401610fc5565b6000818152602460205260409020600301546124915760405162461bcd60e51b815260206004820152600f60248201526e24b6b837ba32b73a1032b732b6bc9760891b6044820152606401610fc5565b6000828152602660205260409020546103e9116124e15760405162461bcd60e51b815260206004820152600e60248201526d2634b6b4ba103932b0b1b432b21760911b6044820152606401610fc5565b6000828152602860209081526040808320848452909152902054620151809061250a9042615650565b10156125285760405162461bcd60e51b8152600401610fc59061575d565b60008211801561253a57506008548211155b80156125465750600081115b801561255457506008548111155b6125705760405162461bcd60e51b8152600401610fc5906155d4565b8082036125a95760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610fc5565b60008281526025602052604090205460ff16156125d85760405162461bcd60e51b8152600401610fc5906155af565b6010546125e48161438f565b6125ef81600a61442e565b600083815260266020526040812080549161260983615637565b909155505060008381526028602090815260408083208584529091528120429055601580549161263883615637565b909155505060008281526024602052604080822060029081015486845291832001541180156126795750600083815260246020526040902060030154601411155b15612686575060146126e7565b6000838152602460205260409020600401546126a49061012c61560d565b600085815260246020526040902060030154108015906126d65750600083815260246020526040902060030154601411155b156126e3575060146126e7565b50600a5b60008381526024602052604081206003018054839290612708908490615650565b90915550506000848152602460205260408120600301805483929061272e90849061560d565b925050819055504283857f2a7e4271816fd9e2b2e21c4a4a7df63aa2c324c6ad1fc330161b6e7099206a788460405161276991815260200190565b60405180910390a4600084815260246020526040812060050180549161278e83615637565b909155505060008481526024602052604081206009018054916127b083615637565b91905055506012546020546010546127c89190615689565b6010546127d59190615650565b6127df9190615689565b6000858152602460205260408120600701805490919061280090849061560d565b9091555050604080516080810182528581526020808201868152828401858152600089815260288452858120898252845285812054606086019081528a82526029855295812080546001808201835591835294909120945160049094029094019283559051928201929092559051600282015590516003909101556120b0565b601680546116b69061554c565b60006001600160a01b0382166128f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610fc5565b506001600160a01b031660009081526003602052604090205490565b61291b614145565b6129256000614657565b565b61292f613fd2565b601a5460ff16156129525760405162461bcd60e51b8152600401610fc590615586565b6000818152602460205260409020600801546129805760405162461bcd60e51b8152600401610fc590615737565b612989816122a6565b6001600160a01b0316336001600160a01b0316146129b95760405162461bcd60e51b8152600401610fc590615663565b6000811180156129cb57506008548111155b6129e75760405162461bcd60e51b8152600401610fc5906155d4565b60008181526025602052604090205460ff1615612a165760405162461bcd60e51b8152600401610fc5906155af565b601054612a228161438f565b612a2d81603261442e565b60225460008381526024602052604081206003018054909190612a5190849061560d565b90915550506001600b555050565b612a67613fd2565b601a5460ff1615612a8a5760405162461bcd60e51b8152600401610fc590615586565b612a93816122a6565b6001600160a01b0316336001600160a01b031614612ac35760405162461bcd60e51b8152600401610fc590615663565b600081118015612ad557506008548111155b612af15760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040902060080154612b1f5760405162461bcd60e51b8152600401610fc590615737565b60008181526025602052604090205460ff1615612b4e5760405162461bcd60e51b8152600401610fc5906155af565b601054612b5a8161438f565b612b6581603261442e565b60225460008381526024602052604081206004018054909190612a5190849061560d565b612b91614145565b600d55565b6017546001600160a01b03163314612bc05760405162461bcd60e51b8152600401610fc59061570e565b601a5460ff1615612c135760405162461bcd60e51b815260206004820152601860248201527f436f6e747261637420616c7265616479207061757365642e00000000000000006044820152606401610fc5565b601a805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b612c53614145565b60408051602081019091526001600160a01b0391821681526023805460018101825560009190915290517fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423090910180546001600160a01b03191691909216179055565b602a6020528160005260406000208181548110612cd257600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919450925084565b612d04614145565b60005b8181101561106657600060256000858585818110612d2757612d276156ab565b60209081029290920135835250810191909152604001600020805460ff191691151591909117905580612d5981615637565b915050612d07565b612d69614145565b60166120bc82826157ce565b606060018054610ea79061554c565b60296020528160005260406000208181548110612cd257600080fd5b612da8613fd2565b601a5460ff1615612dcb5760405162461bcd60e51b8152600401610fc590615586565b60008181526024602052604090206002015460011115612e1a5760405162461bcd60e51b815260206004820152600a6024820152694d696e204c6576656c3160b01b6044820152606401610fc5565b600081815260246020526040902060070154612e645760405162461bcd60e51b8152602060048201526009602482015268139bc81c185e5bdd5d60ba1b6044820152606401610fc5565b60008181526024602052604090206006015460051115612eb35760405162461bcd60e51b815260206004820152600a6024820152694669676874206d6f726560b01b6044820152606401610fc5565b612ebc816122a6565b6001600160a01b0316336001600160a01b031614612eec5760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff1615612f1b5760405162461bcd60e51b8152600401610fc5906155af565b6012546000828152602460205260408120600701549091612f3b91615620565b905060006023600e5481548110612f5457612f546156ab565b600091825260209091200180546040516370a0823160e01b81523060048201529192506001600160a01b031690839082906370a0823190602401602060405180830381865afa158015612fab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcf919061588e565b116130125760405162461bcd60e51b81526020600482015260136024820152724e6f7420456e6f75676820526573657276657360681b6044820152606401610fc5565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0382169063a9059cbb906044016020604051808303816000875af115801561305f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308391906158a7565b6130c15760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610fc5565b600084815260246020526040808220600781018390556006810183905560050182905551849133917f2148c22360ec869df90a6857cc7c0b2c254544deff5a5e2e88f91c6c3e27ee059190a35050506112706001600b55565b6120bc3383836146a9565b6017546001600160a01b0316331461314f5760405162461bcd60e51b8152600401610fc59061570e565b611270816139d4565b613160614145565b601055565b61316f338361419f565b61318b5760405162461bcd60e51b8152600401610fc5906156c1565b61319784848484614777565b50505050565b60606131a860085490565b8211156131c75760405162461bcd60e51b8152600401610fc5906155d4565b6000601680546131d69061554c565b9050116131f25760405180602001604052806000815250610e92565b60166131fd836147aa565b60405160200161320e9291906158c4565b60405160208183030381529060405292915050565b61322b613fd2565b601a5460ff161561324e5760405162461bcd60e51b8152600401610fc590615586565b600d5434146132925760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610fc5565b60008151116132cd5760405162461bcd60e51b81526020600482015260076024820152664e6f204e616d6560c81b6044820152606401610fc5565b604051806101400160405280828152602001600c54815260200160008152602001606481526020016064815260200160008152602001600081526020016000815260200160008152602001600081525060246000600c548152602001908152602001600020600082015181600001908161334791906157ce565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155600c546133b3338261483d565b60408051602080820183526000808352600c54815260259091528290209051815460ff19169015151790555181907f51413fa31ea07fada8e4b3a4719c2683c7288050bc37c83c4ad11ce93423087f9061340e908590614f49565b60405180910390a2600c805490600061342683615637565b9190505550506112706001600b55565b6000818152602a602052604081205460609190818167ffffffffffffffff8111156134635761346361518e565b6040519080825280602002602001820160405280156134bf57816020015b6134ac6040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001906001900390816134815790505b50905060005b828110156135a6576000868152602a602052604090208054879190839081106134f0576134f06156ab565b90600052602060002090600402016000015403613594576000868152602a60205260409020805482908110613527576135276156ab565b906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505082858151811061357a5761357a6156ab565b6020026020010181905250838061359090615637565b9450505b8061359e81615637565b9150506134c5565b50949350505050565b6135b7614145565b6000602383815481106135cc576135cc6156ab565b6000918252602090912001805460405163a9059cbb60e01b8152336004820152602481018590529192506001600160a01b031690819063a9059cbb906044016020604051808303816000875af115801561362a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364e91906158a7565b5050505050565b6017546001600160a01b0316331461367f5760405162461bcd60e51b8152600401610fc59061570e565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6136a9613fd2565b601a5460ff16156136cc5760405162461bcd60e51b8152600401610fc590615586565b6136d5816122a6565b6001600160a01b0316336001600160a01b0316146137055760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff16156137345760405162461bcd60e51b8152600401610fc5906155af565b60008181526027602052604090205462015180906137529042615650565b10156137705760405162461bcd60e51b8152600401610fc59061575d565b6000818152602660209081526040808320839055602790915290204290556112706001600b55565b6137a0613fd2565b601a5460ff16156137c35760405162461bcd60e51b8152600401610fc590615586565b6137cc816122a6565b6001600160a01b0316336001600160a01b0316146137fc5760405162461bcd60e51b8152600401610fc590615663565b60008181526025602052604090205460ff161561382b5760405162461bcd60e51b8152600401610fc5906155af565b60008111801561383d57506008548111155b6138595760405162461bcd60e51b8152600401610fc5906155d4565b600081815260246020526040812060040154606490613879908290615650565b6138839190615689565b9050600081116138c45760405162461bcd60e51b815260206004820152600c60248201526b4e6f7420456c696769626c6560a01b6044820152606401610fc5565b600082815260246020526040812060060180548392906138e590849061560d565b909155506138f69050816064615620565b6000838152602460205260409020600401546139129190615650565b60008381526024602090815260408220600401929092556012549154601054600593849286926139429190615689565b60105461394f9190615650565b6139599190615689565b6139639190615620565b61396d9190615620565b905080602460008681526020019081526020016000206007016000828254613995919061560d565b9091555050604051819085907f7f5659a067632eac859a934c471d405a845bf03086d0206bc77ca28c7b00b6c290600090a35050506112706001600b55565b6139dc614145565b6001600160a01b038116613a415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fc5565b61127081614657565b613a52613fd2565b601a5460ff1615613a755760405162461bcd60e51b8152600401610fc590615586565b613a7e816122a6565b6001600160a01b0316336001600160a01b031614613aae5760405162461bcd60e51b8152600401610fc590615663565b600081118015613ac057506008548111155b613adc5760405162461bcd60e51b8152600401610fc5906155d4565b60008181526025602052604090205460ff1615613b0b5760405162461bcd60e51b8152600401610fc5906155af565b60008181526024602052604081206008015415613c305760008281526024602052604090206006015460051115613b795760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742077696e732160701b6044820152606401610fc5565b6000601254602054601054613b8e9190615689565b601054613b9b9190615650565b613ba59190615689565b613bb0906005615620565b613bbb906005615620565b905080602460008581526020019081526020016000206007016000828254613be39190615650565b90915550506000838152602460205260408120600601805460059290613c0a908490615650565b9091555050601254613c1c9082615620565b9150613c2a8260215461442e565b50613c48565b50601154613c3d8161438f565b613c4881600a61442e565b600082815260246020526040812060080180549161342683615637565b602460205260009081526040902080548190613c809061554c565b80601f0160208091040260200160405190810160405280929190818152602001828054613cac9061554c565b8015613cf95780601f10613cce57610100808354040283529160200191613cf9565b820191906000526020600020905b815481529060010190602001808311613cdc57829003601f168201915b505050505090806001015490806002015490806003015490806004015490806005015490806006015490806007015490806008015490806009015490508a565b6000818152602960205260408120546060918167ffffffffffffffff811115613d6457613d6461518e565b604051908082528060200260200182016040528015613dc057816020015b613dad6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081613d825790505b5090506000805b8381101561169f576000868152602960205260409020805487919083908110613df257613df26156ab565b90600052602060002090600402016000015403613e96576000868152602960205260409020805482908110613e2957613e296156ab565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050838381518110613e7c57613e7c6156ab565b60200260200101819052508180613e9290615637565b9250505b80613ea081615637565b915050613dc7565b613eb0614145565b602b55565b60006001600160e01b031982166380ac58cd60e01b1480613ee657506001600160e01b03198216635b5e139f60e01b145b80610e9257506301ffc9a760e01b6001600160e01b0319831614610e92565b6000818152600260205260409020546001600160a01b03166112705760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fc5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613f99826122a6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6002600b54036140245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610fc5565b6002600b55565b60006023600f5481548110614042576140426156ab565b600091825260209091200180546040516323b872dd60e01b8152336004820152306024820152604481018590529192506001600160a01b03169081906323b872dd906064016020604051808303816000875af11580156140a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ca91906158a7565b5060185460405163b90306ad60e01b8152600481018590526001600160a01b039091169063b90306ad90602401600060405180830381600087803b15801561411157600080fd5b505af1158015614125573d6000803e3d6000fd5b50505050826014600082825461413b919061560d565b9091555050505050565b600a546001600160a01b031633146129255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fc5565b6000806141ab836122a6565b9050806001600160a01b0316846001600160a01b031614806141f257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806142165750836001600160a01b031661420b84610f2a565b6001600160a01b0316145b949350505050565b826001600160a01b0316614231826122a6565b6001600160a01b0316146142575760405162461bcd60e51b8152600401610fc59061595b565b6001600160a01b0382166142b95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610fc5565b6142c683838360016149d6565b826001600160a01b03166142d9826122a6565b6001600160a01b0316146142ff5760405162461bcd60e51b8152600401610fc59061595b565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006023600e54815481106143a6576143a66156ab565b600091825260209091200180546040516323b872dd60e01b8152336004820152306024820152604481018590529192506001600160a01b03169081906323b872dd906064016020604051808303816000875af115801561440a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319791906158a7565b6000606461443c8385615620565b6144469190615689565b905060006064601d548361445a9190615620565b6144649190615689565b905060006064601e54846144789190615620565b6144829190615689565b905060006064601f54856144969190615620565b6144a09190615689565b905060006023600e54815481106144b9576144b96156ab565b60009182526020909120018054601c5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018890529293501690819063a9059cbb906044016020604051808303816000875af115801561451c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454091906158a7565b50601b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018690529082169063a9059cbb906044016020604051808303816000875af1158015614594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145b891906158a7565b50601a5460405163a9059cbb60e01b81526101009091046001600160a01b0390811660048301526024820185905282169063a9059cbb906044016020604051808303816000875af1158015614611573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061463591906158a7565b508560136000828254614648919061560d565b90915550505050505050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03160361470a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610fc5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61478284848461421e565b61478e84848484614b03565b6131975760405162461bcd60e51b8152600401610fc5906159a0565b606060006147b783614c04565b600101905060008167ffffffffffffffff8111156147d7576147d761518e565b6040519080825280601f01601f191660200182016040528015614801576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461480b57509392505050565b6001600160a01b0382166148935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610fc5565b6000818152600260205260409020546001600160a01b0316156148f85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fc5565b6149066000838360016149d6565b6000818152600260205260409020546001600160a01b03161561496b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fc5565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001811115614a455760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610fc5565b816001600160a01b038516614aa157614a9c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614ac4565b836001600160a01b0316856001600160a01b031614614ac457614ac48582614cdc565b6001600160a01b038416614ae057614adb81614d79565b61364e565b846001600160a01b0316846001600160a01b03161461364e5761364e8482614e28565b60006001600160a01b0384163b15614bf957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614b479033908990889088906004016159f2565b6020604051808303816000875af1925050508015614b82575060408051601f3d908101601f19168201909252614b7f91810190615a2f565b60015b614bdf573d808015614bb0576040519150601f19603f3d011682016040523d82523d6000602084013e614bb5565b606091505b508051600003614bd75760405162461bcd60e51b8152600401610fc5906159a0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050614216565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614c435772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614c6f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614c8d57662386f26fc10000830492506010015b6305f5e1008310614ca5576305f5e100830492506008015b6127108310614cb957612710830492506004015b60648310614ccb576064830492506002015b600a8310610e925760010192915050565b60006001614ce98461288d565b614cf39190615650565b600083815260076020526040902054909150808214614d46576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614d8b90600190615650565b60008381526009602052604081205460088054939450909284908110614db357614db36156ab565b906000526020600020015490508060088381548110614dd457614dd46156ab565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614e0c57614e0c615a4c565b6001900381819060005260206000200160009055905550505050565b6000614e338361288d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806101400160405280606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160e01b03198116811461127057600080fd5b600060208284031215614ee757600080fd5b8135614ef281614ebf565b9392505050565b60005b83811015614f14578181015183820152602001614efc565b50506000910152565b60008151808452614f35816020860160208601614ef9565b601f01601f19169290920160200192915050565b602081526000614ef26020830184614f1d565b600060208284031215614f6e57600080fd5b5035919050565b6001600160a01b038116811461127057600080fd5b60008060408385031215614f9d57600080fd5b8235614fa881614f75565b946020939093013593505050565b60008060408385031215614fc957600080fd5b50508035926020909101359150565b60008060008060008060c08789031215614ff157600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60006020828403121561502d57600080fd5b8135614ef281614f75565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156150f457603f198984030185528151610140815181865261508682870182614f1d565b838b0151878c0152898401518a880152606080850151908801526080808501519088015260a0808501519088015260c0808501519088015260e0808501519088015261010080850151908801526101209384015193909601929092525050938601939086019060010161505f565b509098975050505050505050565b60008060006060848603121561511757600080fd5b833561512281614f75565b9250602084013561513281614f75565b929592945050506040919091013590565b60008060006060848603121561515857600080fd5b833561516381614f75565b9250602084013561517381614f75565b9150604084013561518381614f75565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156151bf576151bf61518e565b604051601f8501601f19908116603f011681019082821181831017156151e7576151e761518e565b8160405280935085815286868601111561520057600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261522b57600080fd5b614ef2838335602085016151a4565b6000806040838503121561524d57600080fd5b82359150602083013567ffffffffffffffff81111561526b57600080fd5b6152778582860161521a565b9150509250929050565b6000806020838503121561529457600080fd5b823567ffffffffffffffff808211156152ac57600080fd5b818501915085601f8301126152c057600080fd5b8135818111156152cf57600080fd5b8660208260051b85010111156152e457600080fd5b60209290920196919550909350505050565b60006020828403121561530857600080fd5b813567ffffffffffffffff81111561531f57600080fd5b6142168482850161521a565b801515811461127057600080fd5b6000806040838503121561534c57600080fd5b823561535781614f75565b915060208301356153678161532b565b809150509250929050565b6000806000806080858703121561538857600080fd5b843561539381614f75565b935060208501356153a381614f75565b925060408501359150606085013567ffffffffffffffff8111156153c657600080fd5b8501601f810187136153d757600080fd5b6153e6878235602084016151a4565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b8181101561545557615442838551805182526020810151602083015260408101516040830152606081015160608301525050565b928401926080929092019160010161540e565b50909695505050505050565b6000806040838503121561547457600080fd5b823561547f81614f75565b9150602083013561536781614f75565b60006101408083526154a38184018e614f1d565b602084019c909c52505060408101989098526060880196909652608087019490945260a086019290925260c085015260e084015261010083015261012090910152919050565b6020808252825182820181905260009190848201906040850190845b8181101561545557615539838551805182526020810151602083015260408101516040830152606081015160608301525050565b9284019260809290920191600101615505565b600181811c9082168061556057607f821691505b60208210810361558057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600f908201526e14185d5cd9590810dbdb9d1c9858dd608a1b604082015260600190565b6020808252600b908201526a109b1858dadb1a5cdd195960aa1b604082015260600190565b602080825260099082015268139bdd08119bdd5b9960ba1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e9257610e926155f7565b8082028115828204841417610e9257610e926155f7565b600060018201615649576156496155f7565b5060010190565b81810381811115610e9257610e926155f7565b6020808252600c908201526b139bdd081e5bdd5c8813919560a21b604082015260600190565b6000826156a657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252600f908201526e2737ba1030baba3437b934bd32b21760891b604082015260600190565b6020808252600c908201526b1058dd1a5d985d194813919560a21b604082015260600190565b6020808252600990820152682a37b79039b7b7b71760b91b604082015260600190565b601f82111561106657600081815260208120601f850160051c810160208610156157a75750805b601f850160051c820191505b818110156157c6578281556001016157b3565b505050505050565b815167ffffffffffffffff8111156157e8576157e861518e565b6157fc816157f6845461554c565b84615780565b602080601f83116001811461583157600084156158195750858301515b600019600386901b1c1916600185901b1785556157c6565b600085815260208120601f198616915b8281101561586057888601518255948401946001909101908401615841565b508582101561587e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156158a057600080fd5b5051919050565b6000602082840312156158b957600080fd5b8151614ef28161532b565b60008084546158d28161554c565b600182811680156158ea57600181146158ff5761592e565b60ff198416875282151583028701945061592e565b8860005260208060002060005b858110156159255781548a82015290840190820161590c565b50505082870194505b505050508351615942818360208801614ef9565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a2590830184614f1d565b9695505050505050565b600060208284031215615a4157600080fd5b8151614ef281614ebf565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208d4e526b5d3be2c856bdfd3a6f097f7c7054affcafd63f78323ee46fc073005164736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000ab803c683000c3ab8836477b0e2bdc45c20139d1000000000000000000000000c0ba543b1f4a340aca0157c1988f3e216c9e17740000000000000000000000000000000000000000000000000000000000000009426174746c65646f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034244470000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Battledog
Arg [1] : _symbol (string): BDG
Arg [2] : GAMEAddress (address): 0xaB803C683000C3Ab8836477B0e2BDC45C20139d1
Arg [3] : _newGuard (address): 0xc0ba543B1F4A340acA0157C1988F3E216C9e1774
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000ab803c683000c3ab8836477b0e2bdc45c20139d1
Arg [3] : 000000000000000000000000c0ba543b1f4a340aca0157c1988f3e216c9e1774
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 426174746c65646f670000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4244470000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
113751:24174:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107467:224;;;;;;;;;;-1:-1:-1;107467:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;107467:224:0;;;;;;;;91516:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;93028:171::-;;;;;;;;;;-1:-1:-1;93028:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;93028:171:0;1533:203:1;92546:416:0;;;;;;;;;;-1:-1:-1;92546:416:0;;;;;:::i;:::-;;:::i;:::-;;116341:72;;;;;;;;;;-1:-1:-1;116341:72:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2596:25:1;;;2584:2;2569:18;116341:72:0;2450:177:1;130076:928:0;;;;;;;;;;-1:-1:-1;130076:928:0;;;;;:::i;:::-;;:::i;125315:1060::-;;;;;;;;;;-1:-1:-1;125315:1060:0;;;;;:::i;:::-;;:::i;114962:22::-;;;;;;;;;;;;;;;;118399:325;;;;;;;;;;-1:-1:-1;118399:325:0;;;;;:::i;:::-;;:::i;114194:38::-;;;;;;;;;;;;;;;;108107:113;;;;;;;;;;-1:-1:-1;108195:10:0;:17;108107:113;;135088:451;;;;;;;;;;-1:-1:-1;135088:451:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;114269:23::-;;;;;;;;;;;;;;;;114353:50;;;;;;;;;;;;;;;;114694:69;;;;;;;;;;;;;:::i;93728:301::-;;;;;;;;;;-1:-1:-1;93728:301:0;;;;;:::i;:::-;;:::i;116176:49::-;;;;;;;;;;-1:-1:-1;116176:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;116070:32;;;;;;;;;;-1:-1:-1;116070:32:0;;;;;:::i;:::-;;:::i;114668:19::-;;;;;;;;;;-1:-1:-1;114668:19:0;;;;-1:-1:-1;;;;;114668:19:0;;;131767:157;;;;;;:::i;:::-;;:::i;118274:117::-;;;;;;;;;;-1:-1:-1;118274:117:0;;;;;:::i;:::-;;:::i;107775:256::-;;;;;;;;;;-1:-1:-1;107775:256:0;;;;;:::i;:::-;;:::i;132200:265::-;;;;;;;;;;-1:-1:-1;132200:265:0;;;;;:::i;:::-;;:::i;114496:33::-;;;;;;;;;;;;;;;;118000:159;;;;;;;;;;-1:-1:-1;118000:159:0;;;;;:::i;:::-;;:::i;134697:144::-;;;;;;;;;;;;;:::i;94100:151::-;;;;;;;;;;-1:-1:-1;94100:151:0;;;;;:::i;:::-;;:::i;134866:214::-;;;;;;;;;;-1:-1:-1;134866:214:0;;;;;:::i;:::-;;:::i;114299:47::-;;;;;;;;;;;;;;;;115055:26;;;;;;;;;;;;;;;;126518:2273;;;;;;:::i;:::-;;:::i;108297:233::-;;;;;;;;;;-1:-1:-1;108297:233:0;;;;;:::i;:::-;;:::i;117502:390::-;;;;;;;;;;-1:-1:-1;117502:390:0;;;;;:::i;:::-;;:::i;130046:21::-;;;;;;;;;;;;;;;;118867:135;;;;;;;;;;-1:-1:-1;118867:135:0;;;;;:::i;:::-;;:::i;114770:26::-;;;;;;;;;;-1:-1:-1;114770:26:0;;;;;;;;137417:195;;;;;;;;;;-1:-1:-1;137417:195:0;;;;;:::i;:::-;;:::i;114933:22::-;;;;;;;;;;;;;;;;91226:223;;;;;;;;;;-1:-1:-1;91226:223:0;;;;;:::i;:::-;;:::i;114804:41::-;;;;;;;;;;-1:-1:-1;114804:41:0;;;;;;;-1:-1:-1;;;;;114804:41:0;;;123051:2166;;;;;;:::i;:::-;;:::i;114611:21::-;;;;;;;;;;;;;:::i;90957:207::-;;;;;;;;;;-1:-1:-1;90957:207:0;;;;;:::i;:::-;;:::i;114900:26::-;;;;;;;;;;-1:-1:-1;114900:26:0;;;;-1:-1:-1;;;;;114900:26:0;;;61829:103;;;;;;;;;;;;;:::i;121515:694::-;;;;;;:::i;:::-;;:::i;122218:688::-;;;;;;:::i;:::-;;:::i;118167:99::-;;;;;;;;;;-1:-1:-1;118167:99:0;;;;;:::i;:::-;;:::i;134523:144::-;;;;;;;;;;;;;:::i;115088:18::-;;;;;;;;;;;;;;;;133799:185;;;;;;;;;;-1:-1:-1;133799:185:0;;;;;:::i;:::-;;:::i;116477:54::-;;;;;;;;;;-1:-1:-1;116477:54:0;;;;;:::i;:::-;;:::i;:::-;;;;9100:25:1;;;9156:2;9141:18;;9134:34;;;;9184:18;;;9177:34;9242:2;9227:18;;9220:34;9087:3;9072:19;116477:54:0;8869:391:1;114991:21:0;;;;;;;;;;;;;;;;61188:87;;;;;;;;;;-1:-1:-1;61261:6:0;;-1:-1:-1;;;;;61261:6:0;61188:87;;137620:201;;;;;;;;;;-1:-1:-1;137620:201:0;;;;;:::i;:::-;;:::i;134104:105::-;;;;;;;;;;-1:-1:-1;134104:105:0;;;;;:::i;:::-;;:::i;91685:104::-;;;;;;;;;;;;;:::i;116420:50::-;;;;;;;;;;-1:-1:-1;116420:50:0;;;;;:::i;:::-;;:::i;132553:1234::-;;;;;;:::i;:::-;;:::i;93271:155::-;;;;;;;;;;-1:-1:-1;93271:155:0;;;;;:::i;:::-;;:::i;131609:150::-;;;;;;;;;;-1:-1:-1;131609:150:0;;;;;:::i;:::-;;:::i;114540:31::-;;;;;;;;;;;;;;;;118732:127;;;;;;;;;;-1:-1:-1;118732:127:0;;;;;:::i;:::-;;:::i;94322:279::-;;;;;;;;;;-1:-1:-1;94322:279:0;;;;;:::i;:::-;;:::i;134217:278::-;;;;;;;;;;-1:-1:-1;134217:278:0;;;;;:::i;:::-;;:::i;115023:22::-;;;;;;;;;;;;;;;;114239:23;;;;;;;;;;;;;;;;116232:49;;;;;;;;;;-1:-1:-1;116232:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;116605:889;;;;;;:::i;:::-;;:::i;114852:34::-;;;;;;;;;;-1:-1:-1;114852:34:0;;;;-1:-1:-1;;;;;114852:34:0;;;136883:526;;;;;;;;;;-1:-1:-1;136883:526:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;131932:260::-;;;;;;:::i;:::-;;:::i;137829:93::-;;;;;;;;;;-1:-1:-1;137829:93:0;;;;;:::i;:::-;;:::i;131016:581::-;;;;;;;;;;-1:-1:-1;131016:581:0;;;;;:::i;:::-;;:::i;93497:164::-;;;;;;;;;;-1:-1:-1;93497:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;93618:25:0;;;93594:4;93618:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;93497:164;128892:1068;;;;;;;;;;-1:-1:-1;128892:1068:0;;;;;:::i;:::-;;:::i;62087:201::-;;;;;;;;;;-1:-1:-1;62087:201:0;;;;;:::i;:::-;;:::i;120307:1200::-;;;;;;:::i;:::-;;:::i;116127:42::-;;;;;;;;;;-1:-1:-1;116127:42:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;114452:37::-;;;;;;;;;;;;;;;;135952:511;;;;;;;;;;-1:-1:-1;135952:511:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;117900:92::-;;;;;;;;;;-1:-1:-1;117900:92:0;;;;;:::i;:::-;;:::i;107467:224::-;107569:4;-1:-1:-1;;;;;;107593:50:0;;-1:-1:-1;;;107593:50:0;;:90;;;107647:36;107671:11;107647:23;:36::i;:::-;107586:97;107467:224;-1:-1:-1;;107467:224:0:o;91516:100::-;91570:13;91603:5;91596:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91516:100;:::o;93028:171::-;93104:7;93124:23;93139:7;93124:14;:23::i;:::-;-1:-1:-1;93167:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;93167:24:0;;93028:171::o;92546:416::-;92627:13;92643:23;92658:7;92643:14;:23::i;:::-;92627:39;;92691:5;-1:-1:-1;;;;;92685:11:0;:2;-1:-1:-1;;;;;92685:11:0;;92677:57;;;;-1:-1:-1;;;92677:57:0;;14479:2:1;92677:57:0;;;14461:21:1;14518:2;14498:18;;;14491:30;14557:34;14537:18;;;14530:62;-1:-1:-1;;;14608:18:1;;;14601:31;14649:19;;92677:57:0;;;;;;;;;59819:10;-1:-1:-1;;;;;92769:21:0;;;;:62;;-1:-1:-1;92794:37:0;92811:5;59819:10;93497:164;:::i;92794:37::-;92747:173;;;;-1:-1:-1;;;92747:173:0;;14881:2:1;92747:173:0;;;14863:21:1;14920:2;14900:18;;;14893:30;14959:34;14939:18;;;14932:62;15030:31;15010:18;;;15003:59;15079:19;;92747:173:0;14679:425:1;92747:173:0;92933:21;92942:2;92946:7;92933:8;:21::i;:::-;92616:346;92546:416;;:::o;130076:928::-;2387:21;:19;:21::i;:::-;130152:6:::1;::::0;::::1;;130151:7;130143:35;;;;-1:-1:-1::0;;;130143:35:0::1;;;;;;;:::i;:::-;130291:18;130299:9;130291:7;:18::i;:::-;-1:-1:-1::0;;;;;130277:32:0::1;:10;-1:-1:-1::0;;;;;130277:32:0::1;;130269:57;;;::::0;-1:-1:-1;;;130269:57:0;;15655:2:1;130269:57:0::1;::::0;::::1;15637:21:1::0;15694:2;15674:18;;;15667:30;-1:-1:-1;;;15713:18:1;;;15706:42;15765:18;;130269:57:0::1;15453:336:1::0;130269:57:0::1;130346:22;::::0;;;:11:::1;:22;::::0;;;;:32;::::1;;130345:33;130337:57;;;;-1:-1:-1::0;;;130337:57:0::1;;;;;;;:::i;:::-;130426:1;130414:9;:13;:43;;;;-1:-1:-1::0;108195:10:0;:17;130431:9:::1;:26;;130414:43;130406:65;;;;-1:-1:-1::0;;;130406:65:0::1;;;;;;;:::i;:::-;130490:18;::::0;;;:7:::1;:18;::::0;;;;:23:::1;;::::0;130517:1:::1;-1:-1:-1::0;130490:28:0::1;130482:58;;;::::0;-1:-1:-1;;;130482:58:0;;16673:2:1;130482:58:0::1;::::0;::::1;16655:21:1::0;16712:2;16692:18;;;16685:30;-1:-1:-1;;;16731:18:1;;;16724:47;16788:18;;130482:58:0::1;16471:341:1::0;130482:58:0::1;130630:6;::::0;130582:12:::1;130598:18:::0;;;:7:::1;:18;::::0;;;;:24:::1;;::::0;130582:12;;130630:6;130598:28:::1;::::0;130625:1:::1;130598:28;:::i;:::-;130597:39;;;;:::i;:::-;130582:54;;130647:14;130656:4;130647:8;:14::i;:::-;130719:18;::::0;;;:7:::1;:18;::::0;;;;:24:::1;;:26:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;130756:20:0::1;130779:18:::0;;;:7:::1;:18;::::0;;;;:24:::1;::::0;::::1;::::0;130834:23:::1;::::0;;::::1;::::0;130779:24;;130756:20;130834:27:::1;::::0;130860:1:::1;::::0;130834:27:::1;:::i;:::-;130872:18;::::0;;;:7:::1;:18;::::0;;;;;:23:::1;;:35:::0;;;130959:37;130814:47;;-1:-1:-1;130983:12:0;;130880:9;;130959:37:::1;::::0;::::1;130132:872;;;2431:20:::0;1825:1;2951:7;:22;2768:213;2431:20;130076:928;:::o;125315:1060::-;2387:21;:19;:21::i;:::-;125396:6:::1;::::0;::::1;;125395:7;125387:35;;;;-1:-1:-1::0;;;125387:35:0::1;;;;;;;:::i;:::-;125538:18;125546:9;125538:7;:18::i;:::-;-1:-1:-1::0;;;;;125524:32:0::1;:10;-1:-1:-1::0;;;;;125524:32:0::1;;125516:57;;;;-1:-1:-1::0;;;125516:57:0::1;;;;;;;:::i;:::-;125593:22;::::0;;;:11:::1;:22;::::0;;;;:32;::::1;;125592:33;125584:57;;;;-1:-1:-1::0;;;125584:57:0::1;;;;;;;:::i;:::-;125673:1;125661:9;:13;:43;;;;-1:-1:-1::0;108195:10:0;:17;125678:9:::1;:26;;125661:43;125653:65;;;;-1:-1:-1::0;;;125653:65:0::1;;;;;;;:::i;:::-;125786:14;125804:18:::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;125839:3:::1;::::0;125804:31:::1;::::0;125839:3;;125804:31:::1;:::i;:::-;125803:39;;;;:::i;:::-;125786:56;;125870:1;125861:6;:10;125853:36;;;::::0;-1:-1:-1;;;125853:36:0;;18422:2:1;125853:36:0::1;::::0;::::1;18404:21:1::0;18461:2;18441:18;;;18434:30;-1:-1:-1;;;18480:18:1;;;18473:43;18533:18;;125853:36:0::1;18220:337:1::0;125853:36:0::1;125930:18;::::0;;;:7:::1;:18;::::0;;;;:23:::1;;:33:::0;;125957:6;;125930:18;:33:::1;::::0;125957:6;;125930:33:::1;:::i;:::-;::::0;;;-1:-1:-1;126031:12:0::1;::::0;-1:-1:-1;126031:6:0;126040:3:::1;126031:12;:::i;:::-;126002:18;::::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;:42:::1;::::0;;::::1;:::i;:::-;125974:18;::::0;;;:7:::1;:18;::::0;;;;;;:25:::1;;:70:::0;;;;126192:7:::1;::::0;126182;;126167:14:::1;::::0;126115:1:::1;::::0;;;126203:6;;126167:22:::1;::::0;126182:7;126167:22:::1;:::i;:::-;126149:14;;:41;;;;:::i;:::-;126148:51;;;;:::i;:::-;126147:62;;;;:::i;:::-;:78;;;;:::i;:::-;126127:98;;126265:9;126236:7;:18;126244:9;126236:18;;;;;;;;;;;:25;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;126325:42:0::1;::::0;126357:9;;126346;;126325:42:::1;::::0;;;::::1;125376:999;;;2431:20:::0;1825:1;2951:7;:22;2768:213;118399:325;61074:13;:11;:13::i;:::-;118555:7:::1;:18:::0;;;;118584:7:::1;:18:::0;;;;118613:6:::1;:16:::0;;;;118640:7:::1;:18:::0;118669:3:::1;:10:::0;118690:11:::1;:26:::0;118399:325::o;135088:451::-;135151:15;135179:13;135195:18;135205:7;135195:9;:18::i;:::-;135179:34;;135224:22;135262:5;135249:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;135224:44;;135279:15;135322:9;135317:191;135341:5;135337:1;:9;135317:191;;;135366:15;135384:31;135404:7;135413:1;135384:19;:31::i;:::-;135366:49;;135452:7;:16;135460:7;135452:16;;;;;;;;;;;135434:34;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;135441:7;135434:15;;;;;;;;:::i;:::-;;;;;;:34;;;;135487:9;;;;;:::i;:::-;;;;135353:155;135348:3;;;;;:::i;:::-;;;;135317:191;;;-1:-1:-1;135525:6:0;;135088:451;-1:-1:-1;;;;135088:451:0:o;114694:69::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;93728:301::-;93889:41;59819:10;93922:7;93889:18;:41::i;:::-;93881:99;;;;-1:-1:-1;;;93881:99:0;;;;;;;:::i;:::-;93993:28;94003:4;94009:2;94013:7;93993:9;:28::i;116070:32::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;116070:32:0;;-1:-1:-1;116070:32:0;:::o;131767:157::-;61074:13;:11;:13::i;:::-;131840:22:::1;131873:7;61261:6:::0;;-1:-1:-1;;;;;61261:6:0;;61188:87;131873:7:::1;131892:24;::::0;131840:41;;-1:-1:-1;;;;;;131892:15:0;::::1;::::0;:24;::::1;;;::::0;131908:7;;131892:24:::1;::::0;;;131908:7;131892:15;:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;118274:117:::0;61074:13;:11;:13::i;:::-;118352:4:::1;:10:::0;;;;118373:4:::1;:10:::0;118274:117::o;107775:256::-;107872:7;107908:23;107925:5;107908:16;:23::i;:::-;107900:5;:31;107892:87;;;;-1:-1:-1;;;107892:87:0;;19310:2:1;107892:87:0;;;19292:21:1;19349:2;19329:18;;;19322:30;19388:34;19368:18;;;19361:62;-1:-1:-1;;;19439:18:1;;;19432:41;19490:19;;107892:87:0;19108:407:1;107892:87:0;-1:-1:-1;;;;;;107997:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;107775:256::o;132200:265::-;61074:13;:11;:13::i;:::-;132323:18:::1;:50:::0;;-1:-1:-1;;;;;132323:50:0;;::::1;;;-1:-1:-1::0;;;;;;132323:50:0;;::::1;;::::0;;132384:11:::1;:36:::0;;;;::::1;-1:-1:-1::0;;;;;;132384:36:0;;::::1;;::::0;;132431:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;132200:265::o;118000:159::-;61074:13;:11;:13::i;:::-;61261:6;;-1:-1:-1;;;;;61261:6:0;118085:10:::1;:21;118077:44;;;::::0;-1:-1:-1;;;118077:44:0;;19722:2:1;118077:44:0::1;::::0;::::1;19704:21:1::0;19761:2;19741:18;;;19734:30;-1:-1:-1;;;19780:18:1;;;19773:40;19830:18;;118077:44:0::1;19520:334:1::0;118077:44:0::1;118132:4;:19:::0;;-1:-1:-1;;;;;;118132:19:0::1;-1:-1:-1::0;;;;;118132:19:0;;;::::1;::::0;;;::::1;::::0;;118000:159::o;134697:144::-;115171:5;;-1:-1:-1;;;;;115171:5:0;115157:10;:19;115149:47;;;;-1:-1:-1;;;115149:47:0;;;;;;;:::i;:::-;134752:6:::1;::::0;::::1;;134744:39;;;::::0;-1:-1:-1;;;134744:39:0;;20405:2:1;134744:39:0::1;::::0;::::1;20387:21:1::0;20444:2;20424:18;;;20417:30;-1:-1:-1;;;20463:18:1;;;20456:50;20523:18;;134744:39:0::1;20203:344:1::0;134744:39:0::1;134794:6;:14:::0;;-1:-1:-1;;134794:14:0::1;::::0;;134824:9:::1;::::0;::::1;::::0;134803:5:::1;::::0;134824:9:::1;134697:144::o:0;94100:151::-;94204:39;94221:4;94227:2;94231:7;94204:39;;;;;;;;;;;;:16;:39::i;134866:214::-;134983:15;;;134996:1;134983:15;;;;;;;;;134925;;134953:27;;134983:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;134953:45;;135026:7;:17;135034:8;135026:17;;;;;;;;;;;135009:34;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;135021:1;135009:14;;;;;;;;:::i;:::-;;;;;;;;;;:34;135061:11;134866:214;-1:-1:-1;;134866:214:0:o;126518:2273::-;2387:21;:19;:21::i;:::-;126626:6:::1;::::0;::::1;;126625:7;126617:35;;;;-1:-1:-1::0;;;126617:35:0::1;;;;;;;:::i;:::-;126685:19;126693:10;126685:7;:19::i;:::-;-1:-1:-1::0;;;;;126671:33:0::1;:10;-1:-1:-1::0;;;;;126671:33:0::1;;126663:58;;;;-1:-1:-1::0;;;126663:58:0::1;;;;;;;:::i;:::-;126742:23;::::0;;;:11:::1;:23;::::0;;;;:33;::::1;;126741:34;126733:58;;;;-1:-1:-1::0;;;126733:58:0::1;;;;;;;:::i;:::-;126842:1;126811:19:::0;;;:7:::1;:19;::::0;;;;:28:::1;;::::0;:32;;;;:68:::1;;-1:-1:-1::0;126878:1:0::1;126847:19:::0;;;:7:::1;:19;::::0;;;;:28:::1;;::::0;:32;;126811:68:::1;126803:93;;;;-1:-1:-1::0;;;126803:93:0::1;;;;;;;:::i;:::-;126952:1;126922:19:::0;;;:7:::1;:19;::::0;;;;:27:::1;;::::0;126914:54:::1;;;::::0;-1:-1:-1;;;126914:54:0;;21095:2:1;126914:54:0::1;::::0;::::1;21077:21:1::0;21134:2;21114:18;;;21107:30;-1:-1:-1;;;21153:18:1;;;21146:40;21203:18;;126914:54:0::1;20893:334:1::0;126914:54:0::1;127017:1;126987:19:::0;;;:7:::1;:19;::::0;;;;:27:::1;;::::0;126979:58:::1;;;::::0;-1:-1:-1;;;126979:58:0;;21434:2:1;126979:58:0::1;::::0;::::1;21416:21:1::0;21473:2;21453:18;;;21446:30;-1:-1:-1;;;21492:18:1;;;21485:44;21546:18;;126979:58:0::1;21232:338:1::0;126979:58:0::1;127056:25;::::0;;;:13:::1;:25;::::0;;;;;127084:4:::1;-1:-1:-1::0;127048:59:0::1;;;::::0;-1:-1:-1;;;127048:59:0;;21777:2:1;127048:59:0::1;::::0;::::1;21759:21:1::0;21816:2;21796:18;;;21789:30;-1:-1:-1;;;21835:18:1;;;21828:44;21889:18;;127048:59:0::1;21575:338:1::0;127048:59:0::1;127214:27;::::0;;;:15:::1;:27;::::0;;;;;;;:39;;;;;;;;;127257:8:::1;::::0;127196:57:::1;::::0;:15:::1;:57;:::i;:::-;:69;;127188:91;;;;-1:-1:-1::0;;;127188:91:0::1;;;;;;;:::i;:::-;127311:1;127298:10;:14;:45;;;;-1:-1:-1::0;108195:10:0;:17;127316:10:::1;:27;;127298:45;:63;;;;;127360:1;127347:10;:14;127298:63;:94;;;;-1:-1:-1::0;108195:10:0;:17;127365:10:::1;:27;;127298:94;127290:116;;;;-1:-1:-1::0;;;127290:116:0::1;;;;;;;:::i;:::-;127439:10;127425;:24:::0;127417:44:::1;;;::::0;-1:-1:-1;;;127417:44:0;;22457:2:1;127417:44:0::1;::::0;::::1;22439:21:1::0;22496:1;22476:18;;;22469:29;-1:-1:-1;;;22514:18:1;;;22507:37;22561:18;;127417:44:0::1;22255:330:1::0;127417:44:0::1;127502:14;::::0;127580:20:::1;127502:14:::0;127580::::1;:20::i;:::-;127659:14;127664:4;127670:2;127659:4;:14::i;:::-;127732:25;::::0;;;:13:::1;:25;::::0;;;;:27;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;127816:27:0::1;::::0;;;:15:::1;:27;::::0;;;;;;;:39;;;;;;;;127858:15:::1;127816:57:::0;;127892:12:::1;:14:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;127946:20:0::1;128008:19:::0;;;:7:::1;:19;::::0;;;;;:25:::1;::::0;;::::1;::::0;127980:19;;;;;;:25:::1;::::0;:53:::1;:99:::0;::::1;;;-1:-1:-1::0;128046:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;::::0;128077:2:::1;-1:-1:-1::0;128046:33:0::1;127980:99;127977:377;;;-1:-1:-1::0;128111:2:0::1;127977:377;;;128179:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;:32:::1;::::0;128208:3:::1;128179:32;:::i;:::-;128147:19;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;::::0;:65:::1;::::0;::::1;::::0;:111:::1;;-1:-1:-1::0;128225:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;::::0;128256:2:::1;-1:-1:-1::0;128225:33:0::1;128147:111;128143:211;;;-1:-1:-1::0;128290:2:0::1;128143:211;;;-1:-1:-1::0;128340:2:0::1;128143:211;128364:19;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;:43:::0;;128395:12;;128364:19;:43:::1;::::0;128395:12;;128364:43:::1;:::i;:::-;::::0;;;-1:-1:-1;;128418:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;:43:::0;;128449:12;;128418:19;:43:::1;::::0;128449:12;;128418:43:::1;:::i;:::-;;;;;;;;128531:15;128505:10;128493;128477:70;128517:12;128477:70;;;;2596:25:1::0;;2584:2;2569:18;;2450:177;128477:70:0::1;;;;;;;;128558:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:28:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;128597:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;:29:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;128712:7;;128702;;128687:14;;:22;;;;:::i;:::-;128669:14;;:41;;;;:::i;:::-;128668:51;;;;:::i;:::-;128637:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:83:::0;;:26;;:19;:83:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;136610:204:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;136763:27:0;;;:15;:27;;;;;:39;;;;;;;;;136610:204;;;;;;136825:24;;;:12;:24;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128731:52:::1;126606:2185;;2431:20:::0;1825:1;2951:7;:22;2768:213;2431:20;126518:2273;;:::o;108297:233::-;108372:7;108408:30;108195:10;:17;;108107:113;108408:30;108400:5;:38;108392:95;;;;-1:-1:-1;;;108392:95:0;;22792:2:1;108392:95:0;;;22774:21:1;22831:2;22811:18;;;22804:30;22870:34;22850:18;;;22843:62;-1:-1:-1;;;22921:18:1;;;22914:42;22973:19;;108392:95:0;22590:408:1;108392:95:0;108505:10;108516:5;108505:17;;;;;;;;:::i;:::-;;;;;;;;;108498:24;;108297:233;;;:::o;117502:390::-;2387:21;:19;:21::i;:::-;117616:17:::1;117624:8;117616:7;:17::i;:::-;-1:-1:-1::0;;;;;117602:31:0::1;:10;-1:-1:-1::0;;;;;117602:31:0::1;;117594:57;;;::::0;-1:-1:-1;;;117594:57:0;;23205:2:1;117594:57:0::1;::::0;::::1;23187:21:1::0;23244:2;23224:18;;;23217:30;-1:-1:-1;;;23263:18:1;;;23256:43;23316:18;;117594:57:0::1;23003:337:1::0;117594:57:0::1;117694:1;117675:8;117669:22;:26;117661:46;;;::::0;-1:-1:-1;;;117661:46:0;;23547:2:1;117661:46:0::1;::::0;::::1;23529:21:1::0;23586:1;23566:18;;;23559:29;-1:-1:-1;;;23604:18:1;;;23597:37;23651:18;;117661:46:0::1;23345:330:1::0;117661:46:0::1;108195:10:::0;:17;117742:8:::1;:25;;117717:64;;;;-1:-1:-1::0;;;117717:64:0::1;;;;;;;:::i;:::-;117843:17;::::0;;;:7:::1;:17;::::0;;;;:41:::1;117875:8:::0;117843:17;:41:::1;:::i;:::-;;2431:20:::0;1825:1;2951:7;:22;2768:213;118867:135;61074:13;:11;:13::i;:::-;118958:16:::1;:36:::0;118867:135::o;137417:195::-;61074:13;:11;:13::i;:::-;137502:9:::1;137497:108;137517:16:::0;;::::1;137497:108;;;137589:4;137555:11;:21;137567:5;;137573:1;137567:8;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;137555:21:::0;;-1:-1:-1;137555:21:0;::::1;::::0;;;;;;-1:-1:-1;137555:21:0;:38;;-1:-1:-1;;137555:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;137535:3;::::1;::::0;::::1;:::i;:::-;;;;137497:108;;91226:223:::0;91298:7;95959:16;;;:7;:16;;;;;;-1:-1:-1;;;;;95959:16:0;;91362:56;;;;-1:-1:-1;;;91362:56:0;;26086:2:1;91362:56:0;;;26068:21:1;26125:2;26105:18;;;26098:30;-1:-1:-1;;;26144:18:1;;;26137:54;26208:18;;91362:56:0;25884:348:1;123051:2166:0;2387:21;:19;:21::i;:::-;123156:6:::1;::::0;::::1;;123155:7;123147:35;;;;-1:-1:-1::0;;;123147:35:0::1;;;;;;;:::i;:::-;123215:19;123223:10;123215:7;:19::i;:::-;-1:-1:-1::0;;;;;123201:33:0::1;:10;-1:-1:-1::0;;;;;123201:33:0::1;;123193:59;;;::::0;-1:-1:-1;;;123193:59:0;;26439:2:1;123193:59:0::1;::::0;::::1;26421:21:1::0;26478:2;26458:18;;;26451:30;-1:-1:-1;;;26497:18:1;;;26490:43;26550:18;;123193:59:0::1;26237:337:1::0;123193:59:0::1;123302:1;123271:19:::0;;;:7:::1;:19;::::0;;;;:28:::1;;::::0;:32;;;;:68:::1;;-1:-1:-1::0;123338:1:0::1;123307:19:::0;;;:7:::1;:19;::::0;;;;:28:::1;;::::0;:32;;123271:68:::1;123263:94;;;::::0;-1:-1:-1;;;123263:94:0;;26781:2:1;123263:94:0::1;::::0;::::1;26763:21:1::0;26820:2;26800:18;;;26793:30;-1:-1:-1;;;26839:18:1;;;26832:43;26892:18;;123263:94:0::1;26579:337:1::0;123263:94:0::1;123405:1;123376:19:::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;123368:53:::1;;;::::0;-1:-1:-1;;;123368:53:0;;27123:2:1;123368:53:0::1;::::0;::::1;27105:21:1::0;27162:2;27142:18;;;27135:30;-1:-1:-1;;;27181:18:1;;;27174:40;27231:18;;123368:53:0::1;26921:334:1::0;123368:53:0::1;123469:1;123440:19:::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;123432:58:::1;;;::::0;-1:-1:-1;;;123432:58:0;;27462:2:1;123432:58:0::1;::::0;::::1;27444:21:1::0;27501:2;27481:18;;;27474:30;-1:-1:-1;;;27520:18:1;;;27513:45;27575:18;;123432:58:0::1;27260:339:1::0;123432:58:0::1;123509:25;::::0;;;:13:::1;:25;::::0;;;;;123537:4:::1;-1:-1:-1::0;123501:59:0::1;;;::::0;-1:-1:-1;;;123501:59:0;;21777:2:1;123501:59:0::1;::::0;::::1;21759:21:1::0;21816:2;21796:18;;;21789:30;-1:-1:-1;;;21835:18:1;;;21828:44;21889:18;;123501:59:0::1;21575:338:1::0;123501:59:0::1;123597:27;::::0;;;:15:::1;:27;::::0;;;;;;;:39;;;;;;;;;123640:8:::1;::::0;123579:57:::1;::::0;:15:::1;:57;:::i;:::-;:69;;123571:91;;;;-1:-1:-1::0;;;123571:91:0::1;;;;;;;:::i;:::-;123694:1;123681:10;:14;:45;;;;-1:-1:-1::0;108195:10:0;:17;123699:10:::1;:27;;123681:45;:63;;;;;123743:1;123730:10;:14;123681:63;:94;;;;-1:-1:-1::0;108195:10:0;:17;123748:10:::1;:27;;123681:94;123673:116;;;;-1:-1:-1::0;;;123673:116:0::1;;;;;;;:::i;:::-;123822:10;123808;:24:::0;123800:44:::1;;;::::0;-1:-1:-1;;;123800:44:0;;22457:2:1;123800:44:0::1;::::0;::::1;22439:21:1::0;22496:1;22476:18;;;22469:29;-1:-1:-1;;;22514:18:1;;;22507:37;22561:18;;123800:44:0::1;22255:330:1::0;123800:44:0::1;123864:23;::::0;;;:11:::1;:23;::::0;;;;:33;::::1;;123863:34;123855:58;;;;-1:-1:-1::0;;;123855:58:0::1;;;;;;;:::i;:::-;123955:14;::::0;124033:20:::1;123955:14:::0;124033::::1;:20::i;:::-;124115:14;124120:4;124126:2;124115:4;:14::i;:::-;124188:25;::::0;;;:13:::1;:25;::::0;;;;:27;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;124272:27:0::1;::::0;;;:15:::1;:27;::::0;;;;;;;:39;;;;;;;;124314:15:::1;124272:57:::0;;124340:12:::1;:14:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;124393:20:0::1;124455:19:::0;;;:7:::1;:19;::::0;;;;;:25:::1;::::0;;::::1;::::0;124427:19;;;;;;:25:::1;::::0;:53:::1;:98:::0;::::1;;;-1:-1:-1::0;124493:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;124523:2:::1;-1:-1:-1::0;124493:32:0::1;124427:98;124424:363;;;-1:-1:-1::0;124557:2:0::1;124424:363;;;124612:19;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;::::0;:33:::1;::::0;124642:3:::1;124612:33;:::i;:::-;124581:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;:65:::1;::::0;::::1;::::0;:110:::1;;-1:-1:-1::0;124659:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;::::0;124689:2:::1;-1:-1:-1::0;124659:32:0::1;124581:110;124577:210;;;-1:-1:-1::0;124723:2:0::1;124577:210;;;-1:-1:-1::0;124773:2:0::1;124577:210;124797:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:42:::0;;124827:12;;124797:19;:42:::1;::::0;124827:12;;124797:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;124850:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:42:::0;;124880:12;;124850:19;:42:::1;::::0;124880:12;;124850:42:::1;:::i;:::-;;;;;;;;124959:15;124933:10;124921;124908:67;124945:12;124908:67;;;;2596:25:1::0;;2584:2;2569:18;;2450:177;124908:67:0::1;;;;;;;;124986:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:28:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;125025:19:0::1;::::0;;;:7:::1;:19;::::0;;;;:27:::1;;:29:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;125140:7;;125130;;125115:14;;:22;;;;:::i;:::-;125097:14;;:41;;;;:::i;:::-;125096:51;;;;:::i;:::-;125065:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;;:83:::0;;:26;;:19;:83:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;135685:202:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;135836:27:0;;;:15;:27;;;;;:39;;;;;;;;;135685:202;;;;;;135898:22;;;:10;:22;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125159:50:::1;135552:392:::0;114611:21;;;;;;;:::i;90957:207::-;91029:7;-1:-1:-1;;;;;91057:19:0;;91049:73;;;;-1:-1:-1;;;91049:73:0;;27806:2:1;91049:73:0;;;27788:21:1;27845:2;27825:18;;;27818:30;27884:34;27864:18;;;27857:62;-1:-1:-1;;;27935:18:1;;;27928:39;27984:19;;91049:73:0;27604:405:1;91049:73:0;-1:-1:-1;;;;;;91140:16:0;;;;;:9;:16;;;;;;;90957:207::o;61829:103::-;61074:13;:11;:13::i;:::-;61894:30:::1;61921:1;61894:18;:30::i;:::-;61829:103::o:0;121515:694::-;2387:21;:19;:21::i;:::-;121609:6:::1;::::0;::::1;;121608:7;121600:35;;;;-1:-1:-1::0;;;121600:35:0::1;;;;;;;:::i;:::-;121683:1;121654:17:::0;;;:7:::1;:17;::::0;;;;:26:::1;;::::0;121646:55:::1;;;;-1:-1:-1::0;;;121646:55:0::1;;;;;;;:::i;:::-;121734:17;121742:8;121734:7;:17::i;:::-;-1:-1:-1::0;;;;;121720:31:0::1;:10;-1:-1:-1::0;;;;;121720:31:0::1;;121712:56;;;;-1:-1:-1::0;;;121712:56:0::1;;;;;;;:::i;:::-;121798:1;121787:8;:12;:41;;;;-1:-1:-1::0;108195:10:0;:17;121803:8:::1;:25;;121787:41;121779:63;;;;-1:-1:-1::0;;;121779:63:0::1;;;;;;;:::i;:::-;121862:21;::::0;;;:11:::1;:21;::::0;;;;:31;::::1;;121861:32;121853:56;;;;-1:-1:-1::0;;;121853:56:0::1;;;;;;;:::i;:::-;121951:14;::::0;122037:20:::1;121951:14:::0;122037::::1;:20::i;:::-;122119:14;122124:4;122130:2;122119:4;:14::i;:::-;122198:3;::::0;122170:17:::1;::::0;;;:7:::1;:17;::::0;;;;:24:::1;;:31:::0;;:24;;:17;:31:::1;::::0;122198:3;;122170:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;1825:1:0;2951:7;:22;-1:-1:-1;130076:928:0;:::o;122218:688::-;2387:21;:19;:21::i;:::-;122305:6:::1;::::0;::::1;;122304:7;122296:35;;;;-1:-1:-1::0;;;122296:35:0::1;;;;;;;:::i;:::-;122364:17;122372:8;122364:7;:17::i;:::-;-1:-1:-1::0;;;;;122350:31:0::1;:10;-1:-1:-1::0;;;;;122350:31:0::1;;122342:56;;;;-1:-1:-1::0;;;122342:56:0::1;;;;;;;:::i;:::-;122428:1;122417:8;:12;:41;;;;-1:-1:-1::0;108195:10:0;:17;122433:8:::1;:25;;122417:41;122409:63;;;;-1:-1:-1::0;;;122409:63:0::1;;;;;;;:::i;:::-;122520:1;122491:17:::0;;;:7:::1;:17;::::0;;;;:26:::1;;::::0;122483:55:::1;;;;-1:-1:-1::0;;;122483:55:0::1;;;;;;;:::i;:::-;122564:21;::::0;;;:11:::1;:21;::::0;;;;:31;::::1;;122563:32;122555:56;;;;-1:-1:-1::0;;;122555:56:0::1;;;;;;;:::i;:::-;122655:14;::::0;122733:20:::1;122655:14:::0;122733::::1;:20::i;:::-;122814:14;122819:4;122825:2;122814:4;:14::i;:::-;122895:3;::::0;122866:17:::1;::::0;;;:7:::1;:17;::::0;;;;:25:::1;;:32:::0;;:25;;:17;:32:::1;::::0;122895:3;;122866:32:::1;:::i;118167:99::-:0;61074:13;:11;:13::i;:::-;118240:7:::1;:18:::0;118167:99::o;134523:144::-;115171:5;;-1:-1:-1;;;;;115171:5:0;115157:10;:19;115149:47;;;;-1:-1:-1;;;115149:47:0;;;;;;;:::i;:::-;134577:6:::1;::::0;::::1;;134576:7;134568:44;;;::::0;-1:-1:-1;;;134568:44:0;;28216:2:1;134568:44:0::1;::::0;::::1;28198:21:1::0;28255:2;28235:18;;;28228:30;28294:26;28274:18;;;28267:54;28338:18;;134568:44:0::1;28014:348:1::0;134568:44:0::1;134623:6;:13:::0;;-1:-1:-1;;134623:13:0::1;134632:4;134623:13;::::0;;134652:7:::1;::::0;::::1;::::0;134623:6:::1;::::0;134652:7:::1;134523:144::o:0;133799:185::-;61074:13;:11;:13::i;:::-;133901:64:::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;133901:64:0;;::::1;::::0;;133868:13:::1;:108:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;133868:108:0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;133868:108:0::1;::::0;;;::::1;;::::0;;133799:185::o;116477:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;116477:54:0;-1:-1:-1;116477:54:0;:::o;137620:201::-;61074:13;:11;:13::i;:::-;137710:9:::1;137705:109;137725:16:::0;;::::1;137705:109;;;137797:5;137763:11;:21;137775:5;;137781:1;137775:8;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;137763:21:::0;;-1:-1:-1;137763:21:0;::::1;::::0;;;;;;-1:-1:-1;137763:21:0;:39;;-1:-1:-1;;137763:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;137743:3;::::1;::::0;::::1;:::i;:::-;;;;137705:109;;134104:105:::0;61074:13;:11;:13::i;:::-;134183:7:::1;:18;134193:8:::0;134183:7;:18:::1;:::i;91685:104::-:0;91741:13;91774:7;91767:14;;;;;:::i;116420:50::-;;;;;;;;;;;;;;;;;;;;132553:1234;2387:21;:19;:21::i;:::-;132638:6:::1;::::0;::::1;;132637:7;132629:35;;;;-1:-1:-1::0;;;132629:35:0::1;;;;;;;:::i;:::-;132683:18;::::0;;;:7:::1;:18;::::0;;;;:24:::1;;::::0;132711:1:::1;-1:-1:-1::0;132683:29:0::1;132675:52;;;::::0;-1:-1:-1;;;132675:52:0;;28569:2:1;132675:52:0::1;::::0;::::1;28551:21:1::0;28608:2;28588:18;;;28581:30;-1:-1:-1;;;28627:18:1;;;28620:40;28677:18;;132675:52:0::1;28367:334:1::0;132675:52:0::1;132774:1;132746:18:::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;132738:51:::1;;;::::0;-1:-1:-1;;;132738:51:0;;28908:2:1;132738:51:0::1;::::0;::::1;28890:21:1::0;28947:1;28927:18;;;28920:29;-1:-1:-1;;;28965:18:1;;;28958:39;29014:18;;132738:51:0::1;28706:332:1::0;132738:51:0::1;132808:18;::::0;;;:7:::1;:18;::::0;;;;:23:::1;;::::0;132835:1:::1;-1:-1:-1::0;132808:28:0::1;132800:51;;;::::0;-1:-1:-1;;;132800:51:0;;29245:2:1;132800:51:0::1;::::0;::::1;29227:21:1::0;29284:2;29264:18;;;29257:30;-1:-1:-1;;;29303:18:1;;;29296:40;29353:18;;132800:51:0::1;29043:334:1::0;132800:51:0::1;132884:18;132892:9;132884:7;:18::i;:::-;-1:-1:-1::0;;;;;132870:32:0::1;:10;-1:-1:-1::0;;;;;132870:32:0::1;;132862:57;;;;-1:-1:-1::0;;;132862:57:0::1;;;;;;;:::i;:::-;132939:22;::::0;;;:11:::1;:22;::::0;;;;:32;::::1;;132938:33;132930:57;;;;-1:-1:-1::0;;;132930:57:0::1;;;;;;;:::i;:::-;133091:7;::::0;133039:20:::1;133063:18:::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;133039:20;;133063:35:::1;::::0;::::1;:::i;:::-;133039:60;;133110:24;133137:13;133151:4;;133137:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;133204:15:::0;;133301:33:::1;::::0;-1:-1:-1;;;133301:33:0;;133328:4:::1;133301:33;::::0;::::1;1679:51:1::0;133137:19:0;;-1:-1:-1;;;;;;133204:15:0::1;::::0;133337:12;;133204:15;;133301:18:::1;::::0;1652::1;;133301:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;133293:80;;;::::0;-1:-1:-1;;;133293:80:0;;29773:2:1;133293:80:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;-1:-1:-1;;;29831:18:1;;;29824:49;29890:18;;133293:80:0::1;29571:343:1::0;133293:80:0::1;133451:43;::::0;-1:-1:-1;;;133451:43:0;;133469:10:::1;133451:43;::::0;::::1;30093:51:1::0;30160:18;;;30153:34;;;-1:-1:-1;;;;;133451:17:0;::::1;::::0;::::1;::::0;30066:18:1;;133451:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;133443:71;;;::::0;-1:-1:-1;;;133443:71:0;;30650:2:1;133443:71:0::1;::::0;::::1;30632:21:1::0;30689:2;30669:18;;;30662:30;-1:-1:-1;;;30708:18:1;;;30701:45;30763:18;;133443:71:0::1;30448:339:1::0;133443:71:0::1;133605:1;133577:18:::0;;;:7:::1;:18;::::0;;;;;:25:::1;::::0;::::1;:29:::0;;;133617:23:::1;::::0;::::1;:27:::0;;;133655:25:::1;;:28:::0;;;133739:40;133766:12;;133754:10:::1;::::0;133739:40:::1;::::0;133605:1;133739:40:::1;132618:1169;;;2431:20:::0;1825:1;2951:7;:22;2768:213;93271:155;93366:52;59819:10;93399:8;93409;93366:18;:52::i;131609:150::-;115171:5;;-1:-1:-1;;;;;115171:5:0;115157:10;:19;115149:47;;;;-1:-1:-1;;;115149:47:0;;;;;;;:::i;:::-;131724:27:::1;131742:8;131724:17;:27::i;118732:127::-:0;61074:13;:11;:13::i;:::-;118819:14:::1;:32:::0;118732:127::o;94322:279::-;94453:41;59819:10;94486:7;94453:18;:41::i;:::-;94445:99;;;;-1:-1:-1;;;94445:99:0;;;;;;;:::i;:::-;94555:38;94569:4;94575:2;94579:7;94588:4;94555:13;:38::i;:::-;94322:279;;;;:::o;134217:278::-;134283:13;134325;108195:10;:17;;108107:113;134325:13;134313:8;:25;;134305:47;;;;-1:-1:-1;;;134305:47:0;;;;;;;:::i;:::-;134397:1;134379:7;134373:21;;;;;:::i;:::-;;;:25;:114;;;;;;;;;;;;;;;;;134434:7;134443:19;:8;:17;:19::i;:::-;134417:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;134359:128;134217:278;-1:-1:-1;;134217:278:0:o;116605:889::-;2387:21;:19;:21::i;:::-;116688:6:::1;::::0;::::1;;116687:7;116679:35;;;;-1:-1:-1::0;;;116679:35:0::1;;;;;;;:::i;:::-;116746:7;;116733:9;:20;116725:49;;;::::0;-1:-1:-1;;;116725:49:0;;32186:2:1;116725:49:0::1;::::0;::::1;32168:21:1::0;32225:2;32205:18;;;32198:30;-1:-1:-1;;;32244:18:1;;;32237:46;32300:18;;116725:49:0::1;31984:340:1::0;116725:49:0::1;116815:1;116799:5;116793:19;:23;116785:43;;;::::0;-1:-1:-1;;;116785:43:0;;23547:2:1;116785:43:0::1;::::0;::::1;23529:21:1::0;23586:1;23566:18;;;23559:29;-1:-1:-1;;;23604:18:1;;;23597:37;23651:18;;116785:43:0::1;23345:330:1::0;116785:43:0::1;116901:258;;;;;;;;116929:5;116901:258;;;;116953:7;;116901:258;;;;116982:1;116901:258;;;;117006:3;116901:258;;;;117033:3;116901:258;;;;117059:1;116901:258;;;;117081:1;116901:258;;;;117105:1;116901:258;;;;117131:1;116901:258;;;;117156:1;116901:258;;::::0;116882:7:::1;:16;116890:7;;116882:16;;;;;;;;;;;:277;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;116882:277:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;117239:7:::1;::::0;117257:26:::1;117263:10;117239:7:::0;117257:5:::1;:26::i;:::-;117358:55;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;117358:55:0;;;117347:7:::1;::::0;117335:20;;:11:::1;:20:::0;;;;;;:78;;;;-1:-1:-1;;117335:78:0::1;::::0;::::1;;;::::0;;117439:27;117458:7;;117439:27:::1;::::0;::::1;::::0;117451:5;;117439:27:::1;:::i;:::-;;;;;;;;117477:7;:9:::0;;;:7:::1;:9;::::0;::::1;:::i;:::-;;;;;;116668:826;2431:20:::0;1825:1;2951:7;:22;2768:213;136883:526;136982:15;137028:24;;;:12;:24;;;;;:31;136949:20;;136982:15;;137028:31;137100:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137100:24:0;;;;;;;;;;;;;;;;;137070:54;;137150:9;137145:233;137169:5;137165:1;:9;137145:233;;;137201:24;;;;:12;:24;;;;;:27;;137243:10;;137201:24;137226:1;;137201:27;;;;;;:::i;:::-;;;;;;;;;;;:38;;;:52;137197:170;;137293:24;;;;:12;:24;;;;;:27;;137318:1;;137293:27;;;;;;:::i;:::-;;;;;;;;;;;137275:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;137282:7;137275:15;;;;;;;;:::i;:::-;;;;;;:45;;;;137341:9;;;;;:::i;:::-;;;;137197:170;137176:3;;;;:::i;:::-;;;;137145:233;;;-1:-1:-1;137395:6:0;136883:526;-1:-1:-1;;;;136883:526:0:o;131932:260::-;61074:13;:11;:13::i;:::-;132025:24:::1;132052:13;132066:5;132052:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;132120:15:::0;;132146:38:::1;::::0;-1:-1:-1;;;132146:38:0;;132164:10:::1;132146:38;::::0;::::1;30093:51:1::0;30160:18;;;30153:34;;;132052:20:0;;-1:-1:-1;;;;;;132120:15:0::1;::::0;;;132146:17:::1;::::0;30066:18:1;;132146:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;132014:178;;131932:260:::0;;:::o;137829:93::-;115171:5;;-1:-1:-1;;;;;115171:5:0;115157:10;:19;115149:47;;;;-1:-1:-1;;;115149:47:0;;;;;;;:::i;:::-;137897:5:::1;:17:::0;;-1:-1:-1;;;;;;137897:17:0::1;-1:-1:-1::0;;;;;137897:17:0;;;::::1;::::0;;;::::1;::::0;;137829:93::o;131016:581::-;2387:21;:19;:21::i;:::-;131103:6:::1;::::0;::::1;;131102:7;131094:35;;;;-1:-1:-1::0;;;131094:35:0::1;;;;;;;:::i;:::-;131162:18;131170:9;131162:7;:18::i;:::-;-1:-1:-1::0;;;;;131148:32:0::1;:10;-1:-1:-1::0;;;;;131148:32:0::1;;131140:57;;;;-1:-1:-1::0;;;131140:57:0::1;;;;;;;:::i;:::-;131217:22;::::0;;;:11:::1;:22;::::0;;;;:32;::::1;;131216:33;131208:57;;;;-1:-1:-1::0;;;131208:57:0::1;;;;;;;:::i;:::-;131366:20;::::0;;;:9:::1;:20;::::0;;;;;131390:8:::1;::::0;131348:38:::1;::::0;:15:::1;:38;:::i;:::-;:50;;131340:72;;;;-1:-1:-1::0;;;131340:72:0::1;;;;;;;:::i;:::-;131495:1;131468:24:::0;;;:13:::1;:24;::::0;;;;;;;:28;;;131551:9:::1;:20:::0;;;;;131574:15:::1;131551:38:::0;;2431:20;1825:1;2951:7;:22;2768:213;128892:1068;2387:21;:19;:21::i;:::-;128976:6:::1;::::0;::::1;;128975:7;128967:35;;;;-1:-1:-1::0;;;128967:35:0::1;;;;;;;:::i;:::-;129118:18;129126:9;129118:7;:18::i;:::-;-1:-1:-1::0;;;;;129104:32:0::1;:10;-1:-1:-1::0;;;;;129104:32:0::1;;129096:57;;;;-1:-1:-1::0;;;129096:57:0::1;;;;;;;:::i;:::-;129173:22;::::0;;;:11:::1;:22;::::0;;;;:32;::::1;;129172:33;129164:57;;;;-1:-1:-1::0;;;129164:57:0::1;;;;;;;:::i;:::-;129253:1;129241:9;:13;:43;;;;-1:-1:-1::0;108195:10:0;:17;129258:9:::1;:26;;129241:43;129233:65;;;;-1:-1:-1::0;;;129233:65:0::1;;;;;;;:::i;:::-;129366:14;129384:18:::0;;;:7:::1;:18;::::0;;;;:26:::1;;::::0;129420:3:::1;::::0;129384:32:::1;::::0;129420:3;;129384:32:::1;:::i;:::-;129383:40;;;;:::i;:::-;129366:57;;129451:1;129442:6;:10;129434:35;;;::::0;-1:-1:-1;;;129434:35:0;;32531:2:1;129434:35:0::1;::::0;::::1;32513:21:1::0;32570:2;32550:18;;;32543:30;-1:-1:-1;;;32589:18:1;;;32582:42;32641:18;;129434:35:0::1;32329:336:1::0;129434:35:0::1;129510:18;::::0;;;:7:::1;:18;::::0;;;;:23:::1;;:33:::0;;129537:6;;129510:18;:33:::1;::::0;129537:6;;129510:33:::1;:::i;:::-;::::0;;;-1:-1:-1;129613:12:0::1;::::0;-1:-1:-1;129613:6:0;129622:3:::1;129613:12;:::i;:::-;129583:18;::::0;;;:7:::1;:18;::::0;;;;:26:::1;;::::0;:43:::1;::::0;;::::1;:::i;:::-;129554:18;::::0;;;:7:::1;:18;::::0;;;;;;:26:::1;;:72:::0;;;;129774:7:::1;::::0;129764;;129749:14:::1;::::0;129697:1:::1;::::0;;;129785:6;;129749:22:::1;::::0;129764:7;129749:22:::1;:::i;:::-;129731:14;;:41;;;;:::i;:::-;129730:51;;;;:::i;:::-;129729:62;;;;:::i;:::-;:78;;;;:::i;:::-;129709:98;;129847:9;129818:7;:18;129826:9;129818:18;;;;;;;;;;;:25;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;129907:45:0::1;::::0;129942:9;;129931;;129907:45:::1;::::0;;;::::1;128956:1004;;;2431:20:::0;1825:1;2951:7;:22;2768:213;62087:201;61074:13;:11;:13::i;:::-;-1:-1:-1;;;;;62176:22:0;::::1;62168:73;;;::::0;-1:-1:-1;;;62168:73:0;;32872:2:1;62168:73:0::1;::::0;::::1;32854:21:1::0;32911:2;32891:18;;;32884:30;32950:34;32930:18;;;32923:62;-1:-1:-1;;;33001:18:1;;;32994:36;33047:19;;62168:73:0::1;32670:402:1::0;62168:73:0::1;62252:28;62271:8;62252:18;:28::i;120307:1200::-:0;2387:21;:19;:21::i;:::-;120395:6:::1;::::0;::::1;;120394:7;120386:35;;;;-1:-1:-1::0;;;120386:35:0::1;;;;;;;:::i;:::-;120454:17;120462:8;120454:7;:17::i;:::-;-1:-1:-1::0;;;;;120440:31:0::1;:10;-1:-1:-1::0;;;;;120440:31:0::1;;120432:56;;;;-1:-1:-1::0;;;120432:56:0::1;;;;;;;:::i;:::-;120518:1;120507:8;:12;:41;;;;-1:-1:-1::0;108195:10:0;:17;120523:8:::1;:25;;120507:41;120499:63;;;;-1:-1:-1::0;;;120499:63:0::1;;;;;;;:::i;:::-;120582:21;::::0;;;:11:::1;:21;::::0;;;;:31;::::1;;120581:32;120573:56;;;;-1:-1:-1::0;;;120573:56:0::1;;;;;;;:::i;:::-;120641:12;120667:17:::0;;;:7:::1;:17;::::0;;;;:26:::1;;::::0;:30;120664:767:::1;;120722:17;::::0;;;:7:::1;:17;::::0;;;;:22:::1;;::::0;120748:1:::1;-1:-1:-1::0;120722:27:0::1;120714:58;;;::::0;-1:-1:-1;;;120714:58:0;;33279:2:1;120714:58:0::1;::::0;::::1;33261:21:1::0;33318:2;33298:18;;;33291:30;-1:-1:-1;;;33337:18:1;;;33330:48;33395:18;;120714:58:0::1;33077:342:1::0;120714:58:0::1;120834:17;120899:7;;120889;;120874:14;;:22;;;;:::i;:::-;120856:14;;:41;;;;:::i;:::-;120855:51;;;;:::i;:::-;120854:57;::::0;120910:1:::1;120854:57;:::i;:::-;:61;::::0;120914:1:::1;120854:61;:::i;:::-;120834:81;;120959:9;120931:7;:17;120939:8;120931:17;;;;;;;;;;;:24;;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;120983:17:0::1;::::0;;;:7:::1;:17;::::0;;;;:22:::1;;:27:::0;;121009:1:::1;::::0;120983:17;:27:::1;::::0;121009:1;;120983:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;121044:7:0::1;::::0;121032:19:::1;::::0;:9;:19:::1;:::i;:::-;121025:26;;121129:23;121134:4;121140:11;;121129:4;:23::i;:::-;120699:468;120664:767;;;-1:-1:-1::0;121210:16:0::1;::::0;121308:20:::1;121210:16:::0;121308:14:::1;:20::i;:::-;121404:14;121409:4;121415:2;121404:4;:14::i;:::-;121471:17;::::0;;;:7:::1;:17;::::0;;;;:26:::1;;:28:::0;;;::::1;::::0;::::1;:::i;116127:42::-:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;135952:511::-;136047:13;136063:22;;;:10;:22;;;;;:29;136016:18;;136063:29;136131:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;136131:22:0;;;;;;;;;;;;;;;;;136103:50;;136174:15;136209:9;136204:228;136228:5;136224:1;:9;136204:228;;;136260:22;;;;:10;:22;;;;;:25;;136300:10;;136260:22;136283:1;;136260:25;;;;;;:::i;:::-;;;;;;;;;;;:36;;;:50;136256:165;;136350:22;;;;:10;:22;;;;;:25;;136373:1;;136350:25;;;;;;:::i;:::-;;;;;;;;;;;136332:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;136339:7;136332:15;;;;;;;;:::i;:::-;;;;;;:43;;;;136394:9;;;;;:::i;:::-;;;;136256:165;136235:3;;;;:::i;:::-;;;;136204:228;;117900:92;61074:13;:11;:13::i;:::-;117968:6:::1;:16:::0;117900:92::o;90588:305::-;90690:4;-1:-1:-1;;;;;;90727:40:0;;-1:-1:-1;;;90727:40:0;;:105;;-1:-1:-1;;;;;;;90784:48:0;;-1:-1:-1;;;90784:48:0;90727:105;:158;;;-1:-1:-1;;;;;;;;;;82241:40:0;;;90849:36;82132:157;102591:135;96361:4;95959:16;;;:7;:16;;;;;;-1:-1:-1;;;;;95959:16:0;102665:53;;;;-1:-1:-1;;;102665:53:0;;26086:2:1;102665:53:0;;;26068:21:1;26125:2;26105:18;;;26098:30;-1:-1:-1;;;26144:18:1;;;26137:54;26208:18;;102665:53:0;25884:348:1;101904:174:0;101979:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;101979:29:0;-1:-1:-1;;;;;101979:29:0;;;;;;;;:24;;102033:23;101979:24;102033:14;:23::i;:::-;-1:-1:-1;;;;;102024:46:0;;;;;;;;;;;101904:174;;:::o;2467:293::-;1869:1;2601:7;;:19;2593:63;;;;-1:-1:-1;;;2593:63:0;;33626:2:1;2593:63:0;;;33608:21:1;33665:2;33645:18;;;33638:30;33704:33;33684:18;;;33677:61;33755:18;;2593:63:0;33424:355:1;2593:63:0;1869:1;2734:7;:18;2467:293::o;119653:393::-;119712:24;119739:13;119753:4;;119739:19;;;;;;;;:::i;:::-;;;;;;;;;;119806:15;;119832:61;;-1:-1:-1;;;119832:61:0;;119854:10;119832:61;;;34024:34:1;119874:4:0;34074:18:1;;;34067:43;34126:18;;;34119:34;;;119739:19:0;;-1:-1:-1;;;;;;119806:15:0;;;;119832:21;;33959:18:1;;119832:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;119968:4:0;;119962:29;;-1:-1:-1;;;119962:29:0;;;;;2596:25:1;;;-1:-1:-1;;;;;119968:4:0;;;;119962:16;;2569:18:1;;119962:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120020:11;120002:14;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;119653:393:0:o;61353:132::-;61261:6;;-1:-1:-1;;;;;61261:6:0;59819:10;61417:23;61409:68;;;;-1:-1:-1;;;61409:68:0;;34366:2:1;61409:68:0;;;34348:21:1;;;34385:18;;;34378:30;34444:34;34424:18;;;34417:62;34496:18;;61409:68:0;34164:356:1;96591:264:0;96684:4;96701:13;96717:23;96732:7;96717:14;:23::i;:::-;96701:39;;96770:5;-1:-1:-1;;;;;96759:16:0;:7;-1:-1:-1;;;;;96759:16:0;;:52;;;-1:-1:-1;;;;;;93618:25:0;;;93594:4;93618:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;96779:32;96759:87;;;;96839:7;-1:-1:-1;;;;;96815:31:0;:20;96827:7;96815:11;:20::i;:::-;-1:-1:-1;;;;;96815:31:0;;96759:87;96751:96;96591:264;-1:-1:-1;;;;96591:264:0:o;100556:1229::-;100681:4;-1:-1:-1;;;;;100654:31:0;:23;100669:7;100654:14;:23::i;:::-;-1:-1:-1;;;;;100654:31:0;;100646:81;;;;-1:-1:-1;;;100646:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;100746:16:0;;100738:65;;;;-1:-1:-1;;;100738:65:0;;35133:2:1;100738:65:0;;;35115:21:1;35172:2;35152:18;;;35145:30;35211:34;35191:18;;;35184:62;-1:-1:-1;;;35262:18:1;;;35255:34;35306:19;;100738:65:0;34931:400:1;100738:65:0;100816:42;100837:4;100843:2;100847:7;100856:1;100816:20;:42::i;:::-;100988:4;-1:-1:-1;;;;;100961:31:0;:23;100976:7;100961:14;:23::i;:::-;-1:-1:-1;;;;;100961:31:0;;100953:81;;;;-1:-1:-1;;;100953:81:0;;;;;;;:::i;:::-;101106:24;;;;:15;:24;;;;;;;;101099:31;;-1:-1:-1;;;;;;101099:31:0;;;;;;-1:-1:-1;;;;;101582:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;101582:20:0;;;101617:13;;;;;;;;;:18;;101099:31;101617:18;;;101657:16;;;:7;:16;;;;;;:21;;;;;;;;;;101696:27;;101122:7;;101696:27;;;92616:346;92546:416;;:::o;120058:241::-;120117:24;120144:13;120158:4;;120144:19;;;;;;;;:::i;:::-;;;;;;;;;;120211:15;;120237:54;;-1:-1:-1;;;120237:54:0;;120259:10;120237:54;;;34024:34:1;120278:4:0;34074:18:1;;;34067:43;34126:18;;;34119:34;;;120144:19:0;;-1:-1:-1;;;;;;120211:15:0;;;;120237:21;;33959:18:1;;120237:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;119010:635::-;119079:18;119121:3;119101:18;119115:4;119101:11;:18;:::i;:::-;119100:24;;;;:::i;:::-;119079:45;;119138:12;119177:3;119168:7;;119155:10;:20;;;;:::i;:::-;119154:26;;;;:::i;:::-;119138:42;;119191:12;119230:3;119221:7;;119208:10;:20;;;;:::i;:::-;119207:26;;;;:::i;:::-;119191:42;;119244:12;119282:3;119274:6;;119261:10;:19;;;;:::i;:::-;119260:25;;;;:::i;:::-;119244:41;;119298:24;119325:13;119339:4;;119325:19;;;;;;;;:::i;:::-;;;;;;;;;;119392:15;;119451:11;;119433:36;;-1:-1:-1;;;119433:36:0;;-1:-1:-1;;;;;119451:11:0;;;119433:36;;;30093:51:1;30160:18;;;30153:34;;;119325:19:0;;-1:-1:-1;119392:15:0;;;;119433:17;;30066:18:1;;119433:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;119513:11:0;;119495:36;;-1:-1:-1;;;119495:36:0;;-1:-1:-1;;;;;119513:11:0;;;119495:36;;;30093:51:1;30160:18;;;30153:34;;;119495:17:0;;;;;;30066:18:1;;119495:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;119561:18:0;;119543:43;;-1:-1:-1;;;119543:43:0;;119561:18;;;;-1:-1:-1;;;;;119561:18:0;;;119543:43;;;30093:51:1;30160:18;;;30153:34;;;119543:17:0;;;;;30066:18:1;;119543:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;119620:10;119598:18;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;119010:635:0:o;62448:191::-;62541:6;;;-1:-1:-1;;;;;62558:17:0;;;-1:-1:-1;;;;;;62558:17:0;;;;;;;62591:40;;62541:6;;;62558:17;62541:6;;62591:40;;62522:16;;62591:40;62511:128;62448:191;:::o;102221:281::-;102342:8;-1:-1:-1;;;;;102333:17:0;:5;-1:-1:-1;;;;;102333:17:0;;102325:55;;;;-1:-1:-1;;;102325:55:0;;35825:2:1;102325:55:0;;;35807:21:1;35864:2;35844:18;;;35837:30;35903:27;35883:18;;;35876:55;35948:18;;102325:55:0;35623:349:1;102325:55:0;-1:-1:-1;;;;;102391:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;102391:46:0;;;;;;;;;;102453:41;;540::1;;;102453::0;;513:18:1;102453:41:0;;;;;;;102221:281;;;:::o;95482:270::-;95595:28;95605:4;95611:2;95615:7;95595:9;:28::i;:::-;95642:47;95665:4;95671:2;95675:7;95684:4;95642:22;:47::i;:::-;95634:110;;;;-1:-1:-1;;;95634:110:0;;;;;;;:::i;56658:716::-;56714:13;56765:14;56782:17;56793:5;56782:10;:17::i;:::-;56802:1;56782:21;56765:38;;56818:20;56852:6;56841:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56841:18:0;-1:-1:-1;56818:41:0;-1:-1:-1;56983:28:0;;;56999:2;56983:28;57040:288;-1:-1:-1;;57072:5:0;-1:-1:-1;;;57209:2:0;57198:14;;57193:30;57072:5;57180:44;57270:2;57261:11;;;-1:-1:-1;57291:21:0;57040:288;57291:21;-1:-1:-1;57349:6:0;56658:716;-1:-1:-1;;;56658:716:0:o;98155:942::-;-1:-1:-1;;;;;98235:16:0;;98227:61;;;;-1:-1:-1;;;98227:61:0;;36598:2:1;98227:61:0;;;36580:21:1;;;36617:18;;;36610:30;36676:34;36656:18;;;36649:62;36728:18;;98227:61:0;36396:356:1;98227:61:0;96361:4;95959:16;;;:7;:16;;;;;;-1:-1:-1;;;;;95959:16:0;96385:31;98299:58;;;;-1:-1:-1;;;98299:58:0;;36959:2:1;98299:58:0;;;36941:21:1;36998:2;36978:18;;;36971:30;37037;37017:18;;;37010:58;37085:18;;98299:58:0;36757:352:1;98299:58:0;98370:48;98399:1;98403:2;98407:7;98416:1;98370:20;:48::i;:::-;96361:4;95959:16;;;:7;:16;;;;;;-1:-1:-1;;;;;95959:16:0;96385:31;98508:58;;;;-1:-1:-1;;;98508:58:0;;36959:2:1;98508:58:0;;;36941:21:1;36998:2;36978:18;;;36971:30;37037;37017:18;;;37010:58;37085:18;;98508:58:0;36757:352:1;98508:58:0;-1:-1:-1;;;;;98915:13:0;;;;;;:9;:13;;;;;;;;:18;;98932:1;98915:18;;;98957:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;98957:21:0;;;;;98996:33;98965:7;;98915:13;;98996:33;;98915:13;;98996:33;126518:2273;;:::o;108604:915::-;108871:1;108859:9;:13;108855:222;;;109002:63;;-1:-1:-1;;;109002:63:0;;37316:2:1;109002:63:0;;;37298:21:1;37355:2;37335:18;;;37328:30;37394:34;37374:18;;;37367:62;-1:-1:-1;;;37445:18:1;;;37438:51;37506:19;;109002:63:0;37114:417:1;108855:222:0;109107:12;-1:-1:-1;;;;;109136:18:0;;109132:187;;109171:40;109203:7;110346:10;:17;;110319:24;;;;:15;:24;;;;;:44;;;110374:24;;;;;;;;;;;;110242:164;109171:40;109132:187;;;109241:2;-1:-1:-1;;;;;109233:10:0;:4;-1:-1:-1;;;;;109233:10:0;;109229:90;;109260:47;109293:4;109299:7;109260:32;:47::i;:::-;-1:-1:-1;;;;;109333:16:0;;109329:183;;109366:45;109403:7;109366:36;:45::i;:::-;109329:183;;;109439:4;-1:-1:-1;;;;;109433:10:0;:2;-1:-1:-1;;;;;109433:10:0;;109429:83;;109460:40;109488:2;109492:7;109460:27;:40::i;103290:853::-;103444:4;-1:-1:-1;;;;;103465:13:0;;64415:19;:23;103461:675;;103501:71;;-1:-1:-1;;;103501:71:0;;-1:-1:-1;;;;;103501:36:0;;;;;:71;;59819:10;;103552:4;;103558:7;;103567:4;;103501:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;103501:71:0;;;;;;;;-1:-1:-1;;103501:71:0;;;;;;;;;;;;:::i;:::-;;;103497:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103742:6;:13;103759:1;103742:18;103738:328;;103785:60;;-1:-1:-1;;;103785:60:0;;;;;;;:::i;103738:328::-;104016:6;104010:13;104001:6;103997:2;103993:15;103986:38;103497:584;-1:-1:-1;;;;;;103623:51:0;-1:-1:-1;;;103623:51:0;;-1:-1:-1;103616:58:0;;103461:675;-1:-1:-1;104120:4:0;103290:853;;;;;;:::o;53492:948::-;53545:7;;-1:-1:-1;;;53623:17:0;;53619:106;;-1:-1:-1;;;53661:17:0;;;-1:-1:-1;53707:2:0;53697:12;53619:106;53752:8;53743:5;:17;53739:106;;53790:8;53781:17;;;-1:-1:-1;53827:2:0;53817:12;53739:106;53872:8;53863:5;:17;53859:106;;53910:8;53901:17;;;-1:-1:-1;53947:2:0;53937:12;53859:106;53992:7;53983:5;:16;53979:103;;54029:7;54020:16;;;-1:-1:-1;54065:1:0;54055:11;53979:103;54109:7;54100:5;:16;54096:103;;54146:7;54137:16;;;-1:-1:-1;54182:1:0;54172:11;54096:103;54226:7;54217:5;:16;54213:103;;54263:7;54254:16;;;-1:-1:-1;54299:1:0;54289:11;54213:103;54343:7;54334:5;:16;54330:68;;54381:1;54371:11;54426:6;53492:948;-1:-1:-1;;53492:948:0:o;111033:988::-;111299:22;111349:1;111324:22;111341:4;111324:16;:22::i;:::-;:26;;;;:::i;:::-;111361:18;111382:26;;;:17;:26;;;;;;111299:51;;-1:-1:-1;111515:28:0;;;111511:328;;-1:-1:-1;;;;;111582:18:0;;111560:19;111582:18;;;:12;:18;;;;;;;;:34;;;;;;;;;111633:30;;;;;;:44;;;111750:30;;:17;:30;;;;;:43;;;111511:328;-1:-1:-1;111935:26:0;;;;:17;:26;;;;;;;;111928:33;;;-1:-1:-1;;;;;111979:18:0;;;;;:12;:18;;;;;:34;;;;;;;111972:41;111033:988::o;112316:1079::-;112594:10;:17;112569:22;;112594:21;;112614:1;;112594:21;:::i;:::-;112626:18;112647:24;;;:15;:24;;;;;;113020:10;:26;;112569:46;;-1:-1:-1;112647:24:0;;112569:46;;113020:26;;;;;;:::i;:::-;;;;;;;;;112998:48;;113084:11;113059:10;113070;113059:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;113164:28;;;:15;:28;;;;;;;:41;;;113336:24;;;;;113329:31;113371:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;112387:1008;;;112316:1079;:::o;109820:221::-;109905:14;109922:20;109939:2;109922:16;:20::i;:::-;-1:-1:-1;;;;;109953:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;109998:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;109820:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:248::-;2265:6;2273;2326:2;2314:9;2305:7;2301:23;2297:32;2294:52;;;2342:1;2339;2332:12;2294:52;-1:-1:-1;;2365:23:1;;;2435:2;2420:18;;;2407:32;;-1:-1:-1;2197:248:1:o;2632:523::-;2736:6;2744;2752;2760;2768;2776;2829:3;2817:9;2808:7;2804:23;2800:33;2797:53;;;2846:1;2843;2836:12;2797:53;-1:-1:-1;;2869:23:1;;;2939:2;2924:18;;2911:32;;-1:-1:-1;2990:2:1;2975:18;;2962:32;;3041:2;3026:18;;3013:32;;-1:-1:-1;3092:3:1;3077:19;;3064:33;;-1:-1:-1;3144:3:1;3129:19;3116:33;;-1:-1:-1;2632:523:1;-1:-1:-1;2632:523:1:o;3160:247::-;3219:6;3272:2;3260:9;3251:7;3247:23;3243:32;3240:52;;;3288:1;3285;3278:12;3240:52;3327:9;3314:23;3346:31;3371:5;3346:31;:::i;3412:1734::-;3602:4;3631:2;3671;3660:9;3656:18;3701:2;3690:9;3683:21;3724:6;3759;3753:13;3790:6;3782;3775:22;3816:2;3806:12;;3849:2;3838:9;3834:18;3827:25;;3911:2;3901:6;3898:1;3894:14;3883:9;3879:30;3875:39;3949:2;3941:6;3937:15;3970:1;3980:1137;3994:6;3991:1;3988:13;3980:1137;;;4087:2;4083:7;4071:9;4063:6;4059:22;4055:36;4050:3;4043:49;4121:6;4115:13;4151:6;4196:2;4190:9;4227:2;4219:6;4212:18;4257:48;4301:2;4293:6;4289:15;4275:12;4257:48;:::i;:::-;4348:11;;;4342:18;4325:15;;;4318:43;4404:11;;;4398:18;4381:15;;;4374:43;4440:4;4487:11;;;4481:18;4464:15;;;4457:43;4523:4;4570:11;;;4564:18;4547:15;;;4540:43;4606:4;4653:11;;;4647:18;4630:15;;;4623:43;4689:4;4736:11;;;4730:18;4713:15;;;4706:43;4772:4;4819:11;;;4813:18;4796:15;;;4789:43;4856:6;4906:12;;;4900:19;4882:16;;;4875:45;4944:6;4994:12;;;4988:19;4970:16;;;;4963:45;;;;-1:-1:-1;;5095:12:1;;;;5060:15;;;;4016:1;4009:9;3980:1137;;;-1:-1:-1;5134:6:1;;3412:1734;-1:-1:-1;;;;;;;;3412:1734:1:o;5151:456::-;5228:6;5236;5244;5297:2;5285:9;5276:7;5272:23;5268:32;5265:52;;;5313:1;5310;5303:12;5265:52;5352:9;5339:23;5371:31;5396:5;5371:31;:::i;:::-;5421:5;-1:-1:-1;5478:2:1;5463:18;;5450:32;5491:33;5450:32;5491:33;:::i;:::-;5151:456;;5543:7;;-1:-1:-1;;;5597:2:1;5582:18;;;;5569:32;;5151:456::o;5834:529::-;5911:6;5919;5927;5980:2;5968:9;5959:7;5955:23;5951:32;5948:52;;;5996:1;5993;5986:12;5948:52;6035:9;6022:23;6054:31;6079:5;6054:31;:::i;:::-;6104:5;-1:-1:-1;6161:2:1;6146:18;;6133:32;6174:33;6133:32;6174:33;:::i;:::-;6226:7;-1:-1:-1;6285:2:1;6270:18;;6257:32;6298:33;6257:32;6298:33;:::i;:::-;6350:7;6340:17;;;5834:529;;;;;:::o;6368:127::-;6429:10;6424:3;6420:20;6417:1;6410:31;6460:4;6457:1;6450:15;6484:4;6481:1;6474:15;6500:632;6565:5;6595:18;6636:2;6628:6;6625:14;6622:40;;;6642:18;;:::i;:::-;6717:2;6711:9;6685:2;6771:15;;-1:-1:-1;;6767:24:1;;;6793:2;6763:33;6759:42;6747:55;;;6817:18;;;6837:22;;;6814:46;6811:72;;;6863:18;;:::i;:::-;6903:10;6899:2;6892:22;6932:6;6923:15;;6962:6;6954;6947:22;7002:3;6993:6;6988:3;6984:16;6981:25;6978:45;;;7019:1;7016;7009:12;6978:45;7069:6;7064:3;7057:4;7049:6;7045:17;7032:44;7124:1;7117:4;7108:6;7100;7096:19;7092:30;7085:41;;;;6500:632;;;;;:::o;7137:222::-;7180:5;7233:3;7226:4;7218:6;7214:17;7210:27;7200:55;;7251:1;7248;7241:12;7200:55;7273:80;7349:3;7340:6;7327:20;7320:4;7312:6;7308:17;7273:80;:::i;7364:390::-;7442:6;7450;7503:2;7491:9;7482:7;7478:23;7474:32;7471:52;;;7519:1;7516;7509:12;7471:52;7555:9;7542:23;7532:33;;7616:2;7605:9;7601:18;7588:32;7643:18;7635:6;7632:30;7629:50;;;7675:1;7672;7665:12;7629:50;7698;7740:7;7731:6;7720:9;7716:22;7698:50;:::i;:::-;7688:60;;;7364:390;;;;;:::o;7759:615::-;7845:6;7853;7906:2;7894:9;7885:7;7881:23;7877:32;7874:52;;;7922:1;7919;7912:12;7874:52;7962:9;7949:23;7991:18;8032:2;8024:6;8021:14;8018:34;;;8048:1;8045;8038:12;8018:34;8086:6;8075:9;8071:22;8061:32;;8131:7;8124:4;8120:2;8116:13;8112:27;8102:55;;8153:1;8150;8143:12;8102:55;8193:2;8180:16;8219:2;8211:6;8208:14;8205:34;;;8235:1;8232;8225:12;8205:34;8288:7;8283:2;8273:6;8270:1;8266:14;8262:2;8258:23;8254:32;8251:45;8248:65;;;8309:1;8306;8299:12;8248:65;8340:2;8332:11;;;;;8362:6;;-1:-1:-1;7759:615:1;;-1:-1:-1;;;;7759:615:1:o;9265:322::-;9334:6;9387:2;9375:9;9366:7;9362:23;9358:32;9355:52;;;9403:1;9400;9393:12;9355:52;9443:9;9430:23;9476:18;9468:6;9465:30;9462:50;;;9508:1;9505;9498:12;9462:50;9531;9573:7;9564:6;9553:9;9549:22;9531:50;:::i;9592:118::-;9678:5;9671:13;9664:21;9657:5;9654:32;9644:60;;9700:1;9697;9690:12;9715:382;9780:6;9788;9841:2;9829:9;9820:7;9816:23;9812:32;9809:52;;;9857:1;9854;9847:12;9809:52;9896:9;9883:23;9915:31;9940:5;9915:31;:::i;:::-;9965:5;-1:-1:-1;10022:2:1;10007:18;;9994:32;10035:30;9994:32;10035:30;:::i;:::-;10084:7;10074:17;;;9715:382;;;;;:::o;10102:795::-;10197:6;10205;10213;10221;10274:3;10262:9;10253:7;10249:23;10245:33;10242:53;;;10291:1;10288;10281:12;10242:53;10330:9;10317:23;10349:31;10374:5;10349:31;:::i;:::-;10399:5;-1:-1:-1;10456:2:1;10441:18;;10428:32;10469:33;10428:32;10469:33;:::i;:::-;10521:7;-1:-1:-1;10575:2:1;10560:18;;10547:32;;-1:-1:-1;10630:2:1;10615:18;;10602:32;10657:18;10646:30;;10643:50;;;10689:1;10686;10679:12;10643:50;10712:22;;10765:4;10757:13;;10753:27;-1:-1:-1;10743:55:1;;10794:1;10791;10784:12;10743:55;10817:74;10883:7;10878:2;10865:16;10860:2;10856;10852:11;10817:74;:::i;:::-;10807:84;;;10102:795;;;;;;;:::o;11171:715::-;11400:2;11452:21;;;11522:13;;11425:18;;;11544:22;;;11371:4;;11400:2;11623:15;;;;11597:2;11582:18;;;11371:4;11666:194;11680:6;11677:1;11674:13;11666:194;;;11729:49;11774:3;11765:6;11759:13;10985:5;10979:12;10974:3;10967:25;11041:4;11034:5;11030:16;11024:23;11017:4;11012:3;11008:14;11001:47;11097:4;11090:5;11086:16;11080:23;11073:4;11068:3;11064:14;11057:47;11153:4;11146:5;11142:16;11136:23;11129:4;11124:3;11120:14;11113:47;;;10902:264;11729:49;11835:15;;;;11807:4;11798:14;;;;;11702:1;11695:9;11666:194;;;-1:-1:-1;11877:3:1;;11171:715;-1:-1:-1;;;;;;11171:715:1:o;11891:388::-;11959:6;11967;12020:2;12008:9;11999:7;11995:23;11991:32;11988:52;;;12036:1;12033;12026:12;11988:52;12075:9;12062:23;12094:31;12119:5;12094:31;:::i;:::-;12144:5;-1:-1:-1;12201:2:1;12186:18;;12173:32;12214:33;12173:32;12214:33;:::i;12284:887::-;12648:4;12677:3;12707:2;12696:9;12689:21;12727:45;12768:2;12757:9;12753:18;12745:6;12727:45;:::i;:::-;12803:2;12788:18;;12781:34;;;;-1:-1:-1;;12846:2:1;12831:18;;12824:34;;;;12889:2;12874:18;;12867:34;;;;12932:3;12917:19;;12910:35;;;;12976:3;12961:19;;12954:35;;;;13020:3;13005:19;;12998:35;13064:3;13049:19;;13042:35;13108:3;13093:19;;13086:35;13152:3;13137:19;;;13130:35;12719:53;12284:887;-1:-1:-1;12284:887:1:o;13176:711::-;13401:2;13453:21;;;13523:13;;13426:18;;;13545:22;;;13372:4;;13401:2;13624:15;;;;13598:2;13583:18;;;13372:4;13667:194;13681:6;13678:1;13675:13;13667:194;;;13730:49;13775:3;13766:6;13760:13;10985:5;10979:12;10974:3;10967:25;11041:4;11034:5;11030:16;11024:23;11017:4;11012:3;11008:14;11001:47;11097:4;11090:5;11086:16;11080:23;11073:4;11068:3;11064:14;11057:47;11153:4;11146:5;11142:16;11136:23;11129:4;11124:3;11120:14;11113:47;;;10902:264;13730:49;13836:15;;;;13808:4;13799:14;;;;;13703:1;13696:9;13667:194;;13892:380;13971:1;13967:12;;;;14014;;;14035:61;;14089:4;14081:6;14077:17;14067:27;;14035:61;14142:2;14134:6;14131:14;14111:18;14108:38;14105:161;;14188:10;14183:3;14179:20;14176:1;14169:31;14223:4;14220:1;14213:15;14251:4;14248:1;14241:15;14105:161;;13892:380;;;:::o;15109:339::-;15311:2;15293:21;;;15350:2;15330:18;;;15323:30;-1:-1:-1;;;15384:2:1;15369:18;;15362:45;15439:2;15424:18;;15109:339::o;15794:335::-;15996:2;15978:21;;;16035:2;16015:18;;;16008:30;-1:-1:-1;;;16069:2:1;16054:18;;16047:41;16120:2;16105:18;;15794:335::o;16134:332::-;16336:2;16318:21;;;16375:1;16355:18;;;16348:29;-1:-1:-1;;;16408:2:1;16393:18;;16386:39;16457:2;16442:18;;16134:332::o;16817:127::-;16878:10;16873:3;16869:20;16866:1;16859:31;16909:4;16906:1;16899:15;16933:4;16930:1;16923:15;16949:125;17014:9;;;17035:10;;;17032:36;;;17048:18;;:::i;17079:168::-;17152:9;;;17183;;17200:15;;;17194:22;;17180:37;17170:71;;17221:18;;:::i;17252:135::-;17291:3;17312:17;;;17309:43;;17332:18;;:::i;:::-;-1:-1:-1;17379:1:1;17368:13;;17252:135::o;17392:128::-;17459:9;;;17480:11;;;17477:37;;;17494:18;;:::i;17525:336::-;17727:2;17709:21;;;17766:2;17746:18;;;17739:30;-1:-1:-1;;;17800:2:1;17785:18;;17778:42;17852:2;17837:18;;17525:336::o;17998:217::-;18038:1;18064;18054:132;;18108:10;18103:3;18099:20;18096:1;18089:31;18143:4;18140:1;18133:15;18171:4;18168:1;18161:15;18054:132;-1:-1:-1;18200:9:1;;17998:217::o;18562:127::-;18623:10;18618:3;18614:20;18611:1;18604:31;18654:4;18651:1;18644:15;18678:4;18675:1;18668:15;18694:409;18896:2;18878:21;;;18935:2;18915:18;;;18908:30;18974:34;18969:2;18954:18;;18947:62;-1:-1:-1;;;19040:2:1;19025:18;;19018:43;19093:3;19078:19;;18694:409::o;19859:339::-;20061:2;20043:21;;;20100:2;20080:18;;;20073:30;-1:-1:-1;;;20134:2:1;20119:18;;20112:45;20189:2;20174:18;;19859:339::o;20552:336::-;20754:2;20736:21;;;20793:2;20773:18;;;20766:30;-1:-1:-1;;;20827:2:1;20812:18;;20805:42;20879:2;20864:18;;20552:336::o;21918:332::-;22120:2;22102:21;;;22159:1;22139:18;;;22132:29;-1:-1:-1;;;22192:2:1;22177:18;;22170:39;22241:2;22226:18;;21918:332::o;23806:545::-;23908:2;23903:3;23900:11;23897:448;;;23944:1;23969:5;23965:2;23958:17;24014:4;24010:2;24000:19;24084:2;24072:10;24068:19;24065:1;24061:27;24055:4;24051:38;24120:4;24108:10;24105:20;24102:47;;;-1:-1:-1;24143:4:1;24102:47;24198:2;24193:3;24189:12;24186:1;24182:20;24176:4;24172:31;24162:41;;24253:82;24271:2;24264:5;24261:13;24253:82;;;24316:17;;;24297:1;24286:13;24253:82;;;24257:3;;;23806:545;;;:::o;24527:1352::-;24653:3;24647:10;24680:18;24672:6;24669:30;24666:56;;;24702:18;;:::i;:::-;24731:97;24821:6;24781:38;24813:4;24807:11;24781:38;:::i;:::-;24775:4;24731:97;:::i;:::-;24883:4;;24947:2;24936:14;;24964:1;24959:663;;;;25666:1;25683:6;25680:89;;;-1:-1:-1;25735:19:1;;;25729:26;25680:89;-1:-1:-1;;24484:1:1;24480:11;;;24476:24;24472:29;24462:40;24508:1;24504:11;;;24459:57;25782:81;;24929:944;;24959:663;23753:1;23746:14;;;23790:4;23777:18;;-1:-1:-1;;24995:20:1;;;25113:236;25127:7;25124:1;25121:14;25113:236;;;25216:19;;;25210:26;25195:42;;25308:27;;;;25276:1;25264:14;;;;25143:19;;25113:236;;;25117:3;25377:6;25368:7;25365:19;25362:201;;;25438:19;;;25432:26;-1:-1:-1;;25521:1:1;25517:14;;;25533:3;25513:24;25509:37;25505:42;25490:58;25475:74;;25362:201;-1:-1:-1;;;;;25609:1:1;25593:14;;;25589:22;25576:36;;-1:-1:-1;24527:1352:1:o;29382:184::-;29452:6;29505:2;29493:9;29484:7;29480:23;29476:32;29473:52;;;29521:1;29518;29511:12;29473:52;-1:-1:-1;29544:16:1;;29382:184;-1:-1:-1;29382:184:1:o;30198:245::-;30265:6;30318:2;30306:9;30297:7;30293:23;30289:32;30286:52;;;30334:1;30331;30324:12;30286:52;30366:9;30360:16;30385:28;30407:5;30385:28;:::i;30792:1187::-;31069:3;31098:1;31131:6;31125:13;31161:36;31187:9;31161:36;:::i;:::-;31216:1;31233:18;;;31260:133;;;;31407:1;31402:356;;;;31226:532;;31260:133;-1:-1:-1;;31293:24:1;;31281:37;;31366:14;;31359:22;31347:35;;31338:45;;;-1:-1:-1;31260:133:1;;31402:356;31433:6;31430:1;31423:17;31463:4;31508:2;31505:1;31495:16;31533:1;31547:165;31561:6;31558:1;31555:13;31547:165;;;31639:14;;31626:11;;;31619:35;31682:16;;;;31576:10;;31547:165;;;31551:3;;;31741:6;31736:3;31732:16;31725:23;;31226:532;;;;;31789:6;31783:13;31805:68;31864:8;31859:3;31852:4;31844:6;31840:17;31805:68;:::i;:::-;-1:-1:-1;;;31895:18:1;;31922:22;;;31971:1;31960:13;;30792:1187;-1:-1:-1;;;;30792:1187:1:o;34525:401::-;34727:2;34709:21;;;34766:2;34746:18;;;34739:30;34805:34;34800:2;34785:18;;34778:62;-1:-1:-1;;;34871:2:1;34856:18;;34849:35;34916:3;34901:19;;34525:401::o;35977:414::-;36179:2;36161:21;;;36218:2;36198:18;;;36191:30;36257:34;36252:2;36237:18;;36230:62;-1:-1:-1;;;36323:2:1;36308:18;;36301:48;36381:3;36366:19;;35977:414::o;37536:489::-;-1:-1:-1;;;;;37805:15:1;;;37787:34;;37857:15;;37852:2;37837:18;;37830:43;37904:2;37889:18;;37882:34;;;37952:3;37947:2;37932:18;;37925:31;;;37730:4;;37973:46;;37999:19;;37991:6;37973:46;:::i;:::-;37965:54;37536:489;-1:-1:-1;;;;;;37536:489:1:o;38030:249::-;38099:6;38152:2;38140:9;38131:7;38127:23;38123:32;38120:52;;;38168:1;38165;38158:12;38120:52;38200:9;38194:16;38219:30;38243:5;38219:30;:::i;38284:127::-;38345:10;38340:3;38336:20;38333:1;38326:31;38376:4;38373:1;38366:15;38400:4;38397:1;38390:15
Swarm Source
ipfs://8d4e526b5d3be2c856bdfd3a6f097f7c7054affcafd63f78323ee46fc0730051
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.