ERC-20
Overview
Max Total Supply
1,000,000,000 JUMP
Holders
100
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
465,693.396909264156198445 JUMPValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
JumpEVM
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-09-28 */ // SPDX-License-Identifier: MIT // ERC20A, The new token standard with GameFi-driven taxes and fluctuating APR. // Dynamic yield farming with ponzinomics // Twitter: https://x.com/JumpEVM // TG: https://t.me/JumpEVM // Website: https://www.jumpevm.xyz/ // Docs: https://docs.jumpevm.xyz/ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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/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/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @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 An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @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.encodeCall(token.transfer, (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.encodeCall(token.transferFrom, (from, to, 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); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @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.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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(token).code.length > 0; } } // File: contracts/JumpEVMERC20A.sol // ERC20A, The new token standard with GameFi-driven taxes and fluctuating APR. // Dynamic yield farming with ponzinomics // Twitter: https://x.com/JumpEVM // TG: https://t.me/JumpEVM // Website: https://www.jumpevm.xyz/ // Docs: https://docs.jumpevm.xyz/ pragma solidity ^0.8.0; // External Staking Vault interface interface StakingVault { function depositTokens(address user, uint256 id, uint256 amount) external; function withdrawTokens(address user, uint256 id, uint256 amount) external; } // NFT Pool Share interface interface NFTPoolShare { function mint(address _to) external returns (uint256); function burn(uint256 tokenId) external; function walletOfOwner( address _owner ) external view returns (uint256[] memory); function tokenURI(uint256 tokenId) external view returns (string memory); function setBaseURI(string memory _newBaseURI) external; function setBaseExtension(string memory _newBaseExtension) external; function balanceOf(address owner) external view returns (uint256); function ownerOf(uint256 tokenId) external view returns (address); function safeTransferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address); function totalSupply() external view returns (uint256); } interface IUniswapV2Factory { function createPair( address tokenA, address tokenB ) external returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } contract JumpEVM is IERC20, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; address payable private _taxWallet; mapping(uint256 => uint256) private _stakedBalances; // Tracks staking balances uint256 private _totalStaked; // Total amount staked in the system uint256 private _totalTaxPool; // Total tax pool for rewards uint256 private _minSellTax = 2; // Minimum sell tax (2%) uint256 private _maxSellTax = 20; // Maximum sell tax (20%) uint256 private _decimals = 18; uint256 private _tTotal = 1000000000 * 10 ** _decimals; string private _name = "JumpEVM"; string private _symbol = "JUMP"; bool private tradingOpen; bool private inSwap = false; bool private swapEnabled = false; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; modifier lockTheSwap() { inSwap = true; _; inSwap = false; } // Define the struct to represent a transaction struct Transaction { uint256 nftId; // The address of the wallet uint256 quantity; // The quantity of tokens involved in the transaction uint256 timestamp; // The time the transaction occurred } // Mapping to store transactions with a unique ID (for example, a uint) mapping(uint256 => Transaction) public stakeTransactions; // Define the struct to represent a staking vault StakingVault public stakingVault; address private stakingVaultAddress; // Define the struct to represent a NFT Pool Share NFTPoolShare public nftPoolShare; address private nftPoolShareAddress; constructor() Ownable(msg.sender) { _balances[_msgSender()] = _tTotal; _taxWallet = payable(_msgSender()); stakingVault = StakingVault(address(0)); // Use the provided vault address // Initialize the vault with token address stakingVaultAddress = address(0); nftPoolShare = NFTPoolShare(address(0)); // Use the provided vault address // Initialize the vault with token address nftPoolShareAddress = address(0); // Initialize UniswapV2 router and pair for the token uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D // ETH ); // Uniswap V2 Router address uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair( address(this), uniswapV2Router.WETH() ); emit Transfer(address(0), _msgSender(), _tTotal); } function setStakingVault(address newVaultAddress) external onlyOwner { require(newVaultAddress != address(0), "Invalid vault address!"); stakingVault = StakingVault(newVaultAddress); stakingVaultAddress = newVaultAddress; } function setNFTPoolShare( address newNFTPoolShareAddress ) external onlyOwner { require(newNFTPoolShareAddress != address(0), "Invalid vault address!"); nftPoolShare = NFTPoolShare(newNFTPoolShareAddress); nftPoolShareAddress = newNFTPoolShareAddress; } // * MAIN FUNCTION: Calculate dynamic sell tax based on staking participation * function calculateDynamicSellTax() public view returns (uint256) { uint256 stakedAmount = _totalStaked; uint256 totalSupplyToken = _tTotal; if (stakedAmount == 0) { return _maxSellTax; // If no tokens are staked, apply maximum tax } // If the staked amount is 10% or more of total supply, apply the minimum tax uint256 threshold = totalSupplyToken.mul(10).div(100); // 30% of total supply if (stakedAmount >= threshold) { return _minSellTax; } // If stakedAmount is below 10%, dynamically calculate tax between minSellTax and maxSellTax // The tax should increase from minSellTax to maxSellTax as stakedAmount approaches 0 uint256 scale = 1e18; uint256 dynamicRange = _maxSellTax.sub(_minSellTax); // Difference between max and min tax // Calculate the proportion of staked tokens relative to the 30% threshold // If stakedAmount is close to the threshold, tax should be close to minSellTax // If stakedAmount is close to 0, tax should be close to maxSellTax uint256 tax = _minSellTax.add( dynamicRange .mul(threshold.sub(stakedAmount)) .mul(scale) .div(threshold) .div(scale) ); return tax; } // * Staking Functions * function stakeTokens(uint256 amount) public { require(amount > 0, "Cannot stake zero tokens!"); require( _balances[_msgSender()] >= amount, "Insufficient balance to stake!" ); // Mint NFT uint256 currentNftId = nftPoolShare.mint(_msgSender()); // Send tokens to the vault for staking stakingVault.depositTokens(_msgSender(), currentNftId, amount); _totalStaked = _totalStaked.add(amount); _stakedBalances[currentNftId] = _stakedBalances[currentNftId].add( amount ); // Store the staking transaction details in a mapping stakeTransactions[currentNftId] = ( Transaction({ nftId: currentNftId, quantity: amount, timestamp: block.timestamp }) ); } // * Un-Staking Functions * function unstakeTokens(uint256 id) public { uint256 nftId = stakeTransactions[id].nftId; uint256 amount = stakeTransactions[id].quantity; require(amount > 0, "Cannot unstake zero tokens!"); require( _stakedBalances[nftId] >= amount, "Insufficient staked balance to unstake!" ); require(nftOwnerAddress(nftId) == _msgSender()); // Burn NFT nftPoolShare.burn(nftId); // Check for min time of staking if (block.timestamp >= stakeTransactions[id].timestamp + 20 minutes) { // Calculate rewards based on the user's LP share uint256 lpShare = amount.mul(100).div(_totalStaked); // LP share percentage uint256 reward = _totalTaxPool.mul(lpShare).div(100); // Reward = pool balance * LP share _totalTaxPool = _totalTaxPool.sub(reward); // Deduct reward from the tax pool // Add reward from the tax pool _balances[_msgSender()] = _balances[_msgSender()].add(reward); _balances[address(this)] = _balances[address(this)].sub(reward); emit Transfer(address(this), _msgSender(), reward); // Log the reward transfer } _totalStaked = _totalStaked.sub(amount); _stakedBalances[nftId] = _stakedBalances[nftId].sub(amount); // Withdraw staked tokens from the vault stakingVault.withdrawTokens(_msgSender(), nftId, amount); // Delete the staking transaction details in the mapping delete stakeTransactions[id]; } function nftOwnerAddress(uint256 id) public view returns (address) { return nftPoolShare.ownerOf(id); } // * Override transfer function to include dynamic tax * function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); uint256 taxAmount = 0; // If it's a sell transaction (from Uniswap pair to user) and not swapping if (to == uniswapV2Pair && from != address(this)) { uint256 sellTax = calculateDynamicSellTax(); taxAmount = amount.mul(sellTax).div(100); // Apply the dynamic sell tax } // If it's a stake/unstake transaction tax = 0 if (to == stakingVaultAddress || from == stakingVaultAddress) { taxAmount = 0; } if (taxAmount > 0) { _balances[address(this)] = _balances[address(this)].add(taxAmount); uint256 amountToSell = taxAmount.mul(30).div(100); swapTokensForEth(amountToSell); payable(owner()).transfer(address(this).balance); // Update the tax pool with the remaining tax amount (after the amountToSell) _totalTaxPool = _totalTaxPool.add(taxAmount.sub(amountToSell)); emit Transfer(from, address(this), taxAmount); } // Now perform the actual transfer of the tokens _balances[from] = _balances[from].sub(amount); _balances[to] = _balances[to].add(amount.sub(taxAmount)); emit Transfer(from, to, amount.sub(taxAmount)); } // * View Functions * function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return uint8(_decimals); } function totalSupply() public view returns (uint256) { return _tTotal; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function allowance( address owner, address spender ) public view returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function stakingCAddress() public view returns (address) { return stakingVaultAddress; } function nftPoolCAddress() public view returns (address) { return nftPoolShareAddress; } function transferFrom( address sender, address recipient, uint256 amount ) public returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount > allowance!" ) ); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address!"); require(spender != address(0), "ERC20: approve to the zero address!"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function sendETHToFee(uint256 amount) private { _taxWallet.transfer(amount); } // Open Trading function function openTrading() external onlyOwner { require(!tradingOpen, "Trading is open!"); _approve(address(this), address(uniswapV2Router), _tTotal); uniswapV2Router.addLiquidityETH{value: address(this).balance}( address(this), balanceOf(address(this)), 0, 0, owner(), block.timestamp ); swapEnabled = true; tradingOpen = true; } receive() external payable {} function manualContractUnclog() external { require(_msgSender() == _taxWallet); uint256 tokenBalance = balanceOf(address(this)); if (tokenBalance > 0) { swapTokensForEth(tokenBalance); } uint256 ethBalance = address(this).balance; if (ethBalance > 0) { sendETHToFee(ethBalance); } } function manualSendEth() external { require(_msgSender() == _taxWallet); uint256 contractETHBalance = address(this).balance; sendETHToFee(contractETHBalance); } function withdrawPoolRewardTokens(address to, uint256 amount) external { require(_msgSender() == _taxWallet); amount = amount * 10 ** _decimals; require( amount <= _balances[address(this)], "Insufficient balance in Pool!" ); _balances[address(this)] = _balances[address(this)].sub(amount); _balances[to] = _balances[to].add(amount); emit Transfer(address(this), to, amount); } // * Function to view total Staked tokens * function totalTaxPool() public view returns (uint256) { return _totalTaxPool; } // * Function to view total Staked tokens * function totalStakedTokens() public view returns (uint256) { return _totalStaked; } // * Function to view Staked tokens of NFT Id * function stakedTokensOfNFTId(uint256 nftId) public view returns (uint256) { return _stakedBalances[nftId]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateDynamicSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualContractUnclog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nftOwnerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPoolCAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPoolShare","outputs":[{"internalType":"contract NFTPoolShare","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newNFTPoolShareAddress","type":"address"}],"name":"setNFTPoolShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"setStakingVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeTransactions","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"stakedTokensOfNFTId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingCAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingVault","outputs":[{"internalType":"contract StakingVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"unstakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPoolRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600260075560146008556012600955600954600a61002291906107ee565b633b9aca006100319190610838565b600a556040518060400160405280600781526020017f4a756d7045564d00000000000000000000000000000000000000000000000000815250600b90816100789190610aaa565b506040518060400160405280600481526020017f4a554d5000000000000000000000000000000000000000000000000000000000815250600c90816100bd9190610aaa565b505f600d60016101000a81548160ff0219169083151502179055505f600d60026101000a81548160ff0219169083151502179055503480156100fd575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016f575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101669190610bb8565b60405180910390fd5b61017e816105c160201b60201c565b50600a5460015f61019361068260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506101de61068260201b60201c565b60035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600d60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104019190610bff565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610488573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ac9190610bff565b6040518363ffffffff1660e01b81526004016104c9929190610c2a565b6020604051808303815f875af11580156104e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105099190610bff565b600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061055661068260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a546040516105b49190610c60565b60405180910390a3610c79565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561070b578086048111156106e7576106e6610689565b5b60018516156106f65780820291505b8081029050610704856106b6565b94506106cb565b94509492505050565b5f8261072357600190506107de565b81610730575f90506107de565b816001811461074657600281146107505761077f565b60019150506107de565b60ff84111561076257610761610689565b5b8360020a91508482111561077957610778610689565b5b506107de565b5060208310610133831016604e8410600b84101617156107b45782820a9050838111156107af576107ae610689565b5b6107de565b6107c184848460016106c2565b925090508184048111156107d8576107d7610689565b5b81810290505b9392505050565b5f819050919050565b5f6107f8826107e5565b9150610803836107e5565b92506108307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610714565b905092915050565b5f610842826107e5565b915061084d836107e5565b925082820261085b816107e5565b9150828204841483151761087257610871610689565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806108f457607f821691505b602082108103610907576109066108b0565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261092e565b610973868361092e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6109ae6109a96109a4846107e5565b61098b565b6107e5565b9050919050565b5f819050919050565b6109c783610994565b6109db6109d3826109b5565b84845461093a565b825550505050565b5f90565b6109ef6109e3565b6109fa8184846109be565b505050565b5b81811015610a1d57610a125f826109e7565b600181019050610a00565b5050565b601f821115610a6257610a338161090d565b610a3c8461091f565b81016020851015610a4b578190505b610a5f610a578561091f565b8301826109ff565b50505b505050565b5f82821c905092915050565b5f610a825f1984600802610a67565b1980831691505092915050565b5f610a9a8383610a73565b9150826002028217905092915050565b610ab382610879565b67ffffffffffffffff811115610acc57610acb610883565b5b610ad682546108dd565b610ae1828285610a21565b5f60209050601f831160018114610b12575f8415610b00578287015190505b610b0a8582610a8f565b865550610b71565b601f198416610b208661090d565b5f5b82811015610b4757848901518255600182019150602085019450602081019050610b22565b86831015610b645784890151610b60601f891682610a73565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ba282610b79565b9050919050565b610bb281610b98565b82525050565b5f602082019050610bcb5f830184610ba9565b92915050565b5f80fd5b610bde81610b98565b8114610be8575f80fd5b50565b5f81519050610bf981610bd5565b92915050565b5f60208284031215610c1457610c13610bd1565b5b5f610c2184828501610beb565b91505092915050565b5f604082019050610c3d5f830185610ba9565b610c4a6020830184610ba9565b9392505050565b610c5a816107e5565b82525050565b5f602082019050610c735f830184610c51565b92915050565b61384780610c865f395ff3fe6080604052600436106101d0575f3560e01c806370a08231116100f657806395d89b4111610094578063ca053dc311610063578063ca053dc314610633578063dd62ed3e14610671578063f2fde38b146106ad578063fe560792146106d5576101d7565b806395d89b411461058d578063a9059cbb146105b7578063c1474e54146105f3578063c9567bf91461061d576101d7565b80637b07763c116100d05780637b07763c146104fd57806380f909c7146105255780638da5cb5b1461054d5780638f80a85214610577576101d7565b806370a0823114610483578063715018a6146104bf5780637547c7a3146104d5576101d7565b806323b872dd1161016e5780633ae732591161013d5780633ae73259146103dd578063511f4d2714610407578063608e4dd014610431578063671769fb14610459576101d7565b806323b872dd1461032357806324e7964a1461035f5780632d6e185714610389578063313ce567146103b3576101d7565b8063095ea7b3116101aa578063095ea7b31461026b57806318160ddd146102a75780631dbf20d5146102d15780631deff2161461030d576101d7565b806302d012c6146101db57806302d1db511461020557806306fdde0314610241576101d7565b366101d757005b5f80fd5b3480156101e6575f80fd5b506101ef6106fd565b6040516101fc9190612882565b60405180910390f35b348015610210575f80fd5b5061022b600480360381019061022691906128d2565b610725565b604051610238919061290c565b60405180910390f35b34801561024c575f80fd5b5061025561073f565b6040516102629190612995565b60405180910390f35b348015610276575f80fd5b50610291600480360381019061028c91906129df565b6107cf565b60405161029e9190612a37565b60405180910390f35b3480156102b2575f80fd5b506102bb6107ec565b6040516102c8919061290c565b60405180910390f35b3480156102dc575f80fd5b506102f760048036038101906102f291906128d2565b6107f5565b6040516103049190612882565b60405180910390f35b348015610318575f80fd5b50610321610896565b005b34801561032e575f80fd5b5061034960048036038101906103449190612a50565b610905565b6040516103569190612a37565b60405180910390f35b34801561036a575f80fd5b506103736109d9565b6040516103809190612afb565b60405180910390f35b348015610394575f80fd5b5061039d6109fe565b6040516103aa919061290c565b60405180910390f35b3480156103be575f80fd5b506103c7610b01565b6040516103d49190612b2f565b60405180910390f35b3480156103e8575f80fd5b506103f1610b0a565b6040516103fe919061290c565b60405180910390f35b348015610412575f80fd5b5061041b610b13565b6040516104289190612b68565b60405180910390f35b34801561043c575f80fd5b50610457600480360381019061045291906128d2565b610b38565b005b348015610464575f80fd5b5061046d611015565b60405161047a919061290c565b60405180910390f35b34801561048e575f80fd5b506104a960048036038101906104a49190612b81565b61101e565b6040516104b6919061290c565b60405180910390f35b3480156104ca575f80fd5b506104d3611064565b005b3480156104e0575f80fd5b506104fb60048036038101906104f691906128d2565b611077565b005b348015610508575f80fd5b50610523600480360381019061051e91906129df565b611319565b005b348015610530575f80fd5b5061054b60048036038101906105469190612b81565b61159f565b005b348015610558575f80fd5b50610561611698565b60405161056e9190612882565b60405180910390f35b348015610582575f80fd5b5061058b6116bf565b005b348015610598575f80fd5b506105a1611756565b6040516105ae9190612995565b60405180910390f35b3480156105c2575f80fd5b506105dd60048036038101906105d891906129df565b6117e6565b6040516105ea9190612a37565b60405180910390f35b3480156105fe575f80fd5b50610607611803565b6040516106149190612882565b60405180910390f35b348015610628575f80fd5b5061063161182b565b005b34801561063e575f80fd5b50610659600480360381019061065491906128d2565b6119a1565b60405161066893929190612bac565b60405180910390f35b34801561067c575f80fd5b5061069760048036038101906106929190612be1565b6119c7565b6040516106a4919061290c565b60405180910390f35b3480156106b8575f80fd5b506106d360048036038101906106ce9190612b81565b611a49565b005b3480156106e0575f80fd5b506106fb60048036038101906106f69190612b81565b611acd565b005b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60045f8381526020019081526020015f20549050919050565b6060600b805461074e90612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461077a90612c4c565b80156107c55780601f1061079c576101008083540402835291602001916107c5565b820191905f5260205f20905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b5f6107e26107db611bc6565b8484611bcd565b6001905092915050565b5f600a54905090565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610850919061290c565b602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190612c90565b9050919050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108d6611bc6565b73ffffffffffffffffffffffffffffffffffffffff16146108f5575f80fd5b5f47905061090281611d90565b50565b5f610911848484611df8565b6109ce8461091d611bc6565b6109c9856040518060600160405280602381526020016137ef6023913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610980611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546123e59092919063ffffffff16565b611bcd565b600190509392505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8060055490505f600a5490505f8203610a1e5760085492505050610afe565b5f610a466064610a38600a8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050808310610a5c576007549350505050610afe565b5f670de0b6b3a764000090505f610a8060075460085461246390919063ffffffff16565b90505f610af2610ae184610ad387610ac588610ab7610aa88e8d61246390919063ffffffff16565b8a61243990919063ffffffff16565b61243990919063ffffffff16565b61244e90919063ffffffff16565b61244e90919063ffffffff16565b60075461247890919063ffffffff16565b90508096505050505050505b90565b5f600954905090565b5f600554905090565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600f5f8381526020019081526020015f205f015490505f600f5f8481526020019081526020015f206001015490505f8111610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090612d05565b60405180910390fd5b8060045f8481526020019081526020015f20541015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612d93565b60405180910390fd5b610c05611bc6565b73ffffffffffffffffffffffffffffffffffffffff16610c24836107f5565b73ffffffffffffffffffffffffffffffffffffffff1614610c43575f80fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610c9d919061290c565b5f604051808303815f87803b158015610cb4575f80fd5b505af1158015610cc6573d5f803e3d5ffd5b505050506104b0600f5f8581526020019081526020015f2060020154610cec9190612dde565b4210610f02575f610d1b600554610d0d60648561243990919063ffffffff16565b61244e90919063ffffffff16565b90505f610d466064610d388460065461243990919063ffffffff16565b61244e90919063ffffffff16565b9050610d5d8160065461246390919063ffffffff16565b600681905550610dba8160015f610d72611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f610dc5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e528160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e9b611bc6565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ef7919061290c565b60405180910390a350505b610f178160055461246390919063ffffffff16565b600581905550610f418160045f8581526020019081526020015f205461246390919063ffffffff16565b60045f8481526020019081526020015f208190555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c1d1fde610f9b611bc6565b84846040518463ffffffff1660e01b8152600401610fbb93929190612e11565b5f604051808303815f87803b158015610fd2575f80fd5b505af1158015610fe4573d5f803e3d5ffd5b50505050600f5f8481526020019081526020015f205f8082015f9055600182015f9055600282015f90555050505050565b5f600654905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61106c61248d565b6110755f612514565b565b5f81116110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612e90565b60405180910390fd5b8060015f6110c5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790612ef8565b60405180910390fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842611186611bc6565b6040518263ffffffff1660e01b81526004016111a29190612882565b6020604051808303815f875af11580156111be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e29190612f2a565b905060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c5b9f8f611229611bc6565b83856040518463ffffffff1660e01b815260040161124993929190612e11565b5f604051808303815f87803b158015611260575f80fd5b505af1158015611272573d5f803e3d5ffd5b5050505061128b8260055461247890919063ffffffff16565b6005819055506112b58260045f8481526020019081526020015f205461247890919063ffffffff16565b60045f8381526020019081526020015f2081905550604051806060016040528082815260200183815260200142815250600f5f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611359611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614611378575f80fd5b600954600a6113879190613084565b8161139291906130ce565b905060015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613159565b60405180910390fd5b6114648160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506114f58160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611593919061290c565b60405180910390a35050565b6115a761248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906131c1565b60405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116ff611bc6565b73ffffffffffffffffffffffffffffffffffffffff161461171e575f80fd5b5f6117283061101e565b90505f81111561173c5761173b816125d5565b5b5f4790505f8111156117525761175181611d90565b5b5050565b6060600c805461176590612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461179190612c4c565b80156117dc5780601f106117b3576101008083540402835291602001916117dc565b820191905f5260205f20905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b5f6117f96117f2611bc6565b8484611df8565b6001905092915050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61183361248d565b600d5f9054906101000a900460ff1615611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990613229565b60405180910390fd5b6118b130600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a54611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306118fa3061101e565b5f80611904611698565b426040518863ffffffff1660e01b815260040161192696959493929190613280565b60606040518083038185885af1158015611942573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061196791906132df565b5050506001600d60026101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff021916908315150217905550565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611a5161248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac1575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611ab89190612882565b60405180910390fd5b611aca81612514565b50565b611ad561248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a906131c1565b60405180910390fd5b8060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c329061339f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca09061342d565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d83919061290c565b60405180910390a3505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611df4573d5f803e3d5ffd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d906134bb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90613549565b60405180910390fd5b5f8111611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d906135d7565b60405180910390fd5b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611f9f57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611fd9575f611fad6109fe565b9050611fd56064611fc7838661243990919063ffffffff16565b61244e90919063ffffffff16565b9150505b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612080575060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612089575f90505b5f811115612234576120e18160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f61214a606461213c601e8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050612155816125d5565b61215d611698565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561219f573d5f803e3d5ffd5b506121c76121b6828461246390919063ffffffff16565b60065461247890919063ffffffff16565b6006819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161222a919061290c565b60405180910390a3505b6122848260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506123276122db828461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6123ca848661246390919063ffffffff16565b6040516123d7919061290c565b60405180910390a350505050565b5f83831115829061242c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124239190612995565b60405180910390fd5b5082840390509392505050565b5f818361244691906130ce565b905092915050565b5f818361245b9190613622565b905092915050565b5f81836124709190613652565b905092915050565b5f81836124859190612dde565b905092915050565b612495611bc6565b73ffffffffffffffffffffffffffffffffffffffff166124b3611698565b73ffffffffffffffffffffffffffffffffffffffff1614612512576124d6611bc6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016125099190612882565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600d60016101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561260c5761260b613685565b5b60405190808252806020026020018201604052801561263a5781602001602082028036833780820191505090505b50905030815f81518110612651576126506136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271a9190612c90565b8160018151811061272e5761272d6136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061279530600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016127f8959493929190613796565b5f604051808303815f87803b15801561280f575f80fd5b505af1158015612821573d5f803e3d5ffd5b50505050505f600d60016101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61286c82612843565b9050919050565b61287c81612862565b82525050565b5f6020820190506128955f830184612873565b92915050565b5f80fd5b5f819050919050565b6128b18161289f565b81146128bb575f80fd5b50565b5f813590506128cc816128a8565b92915050565b5f602082840312156128e7576128e661289b565b5b5f6128f4848285016128be565b91505092915050565b6129068161289f565b82525050565b5f60208201905061291f5f8301846128fd565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61296782612925565b612971818561292f565b935061298181856020860161293f565b61298a8161294d565b840191505092915050565b5f6020820190508181035f8301526129ad818461295d565b905092915050565b6129be81612862565b81146129c8575f80fd5b50565b5f813590506129d9816129b5565b92915050565b5f80604083850312156129f5576129f461289b565b5b5f612a02858286016129cb565b9250506020612a13858286016128be565b9150509250929050565b5f8115159050919050565b612a3181612a1d565b82525050565b5f602082019050612a4a5f830184612a28565b92915050565b5f805f60608486031215612a6757612a6661289b565b5b5f612a74868287016129cb565b9350506020612a85868287016129cb565b9250506040612a96868287016128be565b9150509250925092565b5f819050919050565b5f612ac3612abe612ab984612843565b612aa0565b612843565b9050919050565b5f612ad482612aa9565b9050919050565b5f612ae582612aca565b9050919050565b612af581612adb565b82525050565b5f602082019050612b0e5f830184612aec565b92915050565b5f60ff82169050919050565b612b2981612b14565b82525050565b5f602082019050612b425f830184612b20565b92915050565b5f612b5282612aca565b9050919050565b612b6281612b48565b82525050565b5f602082019050612b7b5f830184612b59565b92915050565b5f60208284031215612b9657612b9561289b565b5b5f612ba3848285016129cb565b91505092915050565b5f606082019050612bbf5f8301866128fd565b612bcc60208301856128fd565b612bd960408301846128fd565b949350505050565b5f8060408385031215612bf757612bf661289b565b5b5f612c04858286016129cb565b9250506020612c15858286016129cb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c6357607f821691505b602082108103612c7657612c75612c1f565b5b50919050565b5f81519050612c8a816129b5565b92915050565b5f60208284031215612ca557612ca461289b565b5b5f612cb284828501612c7c565b91505092915050565b7f43616e6e6f7420756e7374616b65207a65726f20746f6b656e732100000000005f82015250565b5f612cef601b8361292f565b9150612cfa82612cbb565b602082019050919050565b5f6020820190508181035f830152612d1c81612ce3565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e636520746f20755f8201527f6e7374616b652100000000000000000000000000000000000000000000000000602082015250565b5f612d7d60278361292f565b9150612d8882612d23565b604082019050919050565b5f6020820190508181035f830152612daa81612d71565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612de88261289f565b9150612df38361289f565b9250828201905080821115612e0b57612e0a612db1565b5b92915050565b5f606082019050612e245f830186612873565b612e3160208301856128fd565b612e3e60408301846128fd565b949350505050565b7f43616e6e6f74207374616b65207a65726f20746f6b656e7321000000000000005f82015250565b5f612e7a60198361292f565b9150612e8582612e46565b602082019050919050565b5f6020820190508181035f830152612ea781612e6e565b9050919050565b7f496e73756666696369656e742062616c616e636520746f207374616b652100005f82015250565b5f612ee2601e8361292f565b9150612eed82612eae565b602082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b5f81519050612f24816128a8565b92915050565b5f60208284031215612f3f57612f3e61289b565b5b5f612f4c84828501612f16565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115612faa57808604811115612f8657612f85612db1565b5b6001851615612f955780820291505b8081029050612fa385612f55565b9450612f6a565b94509492505050565b5f82612fc2576001905061307d565b81612fcf575f905061307d565b8160018114612fe55760028114612fef5761301e565b600191505061307d565b60ff84111561300157613000612db1565b5b8360020a91508482111561301857613017612db1565b5b5061307d565b5060208310610133831016604e8410600b84101617156130535782820a90508381111561304e5761304d612db1565b5b61307d565b6130608484846001612f61565b9250905081840481111561307757613076612db1565b5b81810290505b9392505050565b5f61308e8261289f565b91506130998361289f565b92506130c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612fb3565b905092915050565b5f6130d88261289f565b91506130e38361289f565b92508282026130f18161289f565b9150828204841483151761310857613107612db1565b5b5092915050565b7f496e73756666696369656e742062616c616e636520696e20506f6f6c210000005f82015250565b5f613143601d8361292f565b915061314e8261310f565b602082019050919050565b5f6020820190508181035f83015261317081613137565b9050919050565b7f496e76616c6964207661756c74206164647265737321000000000000000000005f82015250565b5f6131ab60168361292f565b91506131b682613177565b602082019050919050565b5f6020820190508181035f8301526131d88161319f565b9050919050565b7f54726164696e67206973206f70656e21000000000000000000000000000000005f82015250565b5f61321360108361292f565b915061321e826131df565b602082019050919050565b5f6020820190508181035f83015261324081613207565b9050919050565b5f819050919050565b5f61326a61326561326084613247565b612aa0565b61289f565b9050919050565b61327a81613250565b82525050565b5f60c0820190506132935f830189612873565b6132a060208301886128fd565b6132ad6040830187613271565b6132ba6060830186613271565b6132c76080830185612873565b6132d460a08301846128fd565b979650505050505050565b5f805f606084860312156132f6576132f561289b565b5b5f61330386828701612f16565b935050602061331486828701612f16565b925050604061332586828701612f16565b9150509250925092565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737321000000000000000000000000000000000000000000000000000000602082015250565b5f61338960258361292f565b91506133948261332f565b604082019050919050565b5f6020820190508181035f8301526133b68161337d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b5f61341760238361292f565b9150613422826133bd565b604082019050919050565b5f6020820190508181035f8301526134448161340b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6134a560258361292f565b91506134b08261344b565b604082019050919050565b5f6020820190508181035f8301526134d281613499565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61353360238361292f565b915061353e826134d9565b604082019050919050565b5f6020820190508181035f83015261356081613527565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f6135c160298361292f565b91506135cc82613567565b604082019050919050565b5f6020820190508181035f8301526135ee816135b5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61362c8261289f565b91506136378361289f565b925082613647576136466135f5565b5b828204905092915050565b5f61365c8261289f565b91506136678361289f565b925082820390508181111561367f5761367e612db1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61371181612862565b82525050565b5f6137228383613708565b60208301905092915050565b5f602082019050919050565b5f613744826136df565b61374e81856136e9565b9350613759836136f9565b805f5b838110156137895781516137708882613717565b975061377b8361372e565b92505060018101905061375c565b5085935050505092915050565b5f60a0820190506137a95f8301886128fd565b6137b66020830187613271565b81810360408301526137c8818661373a565b90506137d76060830185612873565b6137e460808301846128fd565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74203e20616c6c6f77616e636521a264697066735822122084dcbaae9de78ff12b8d129940ab990594f955be56db1afd20a4b8ff7cc07c2c64736f6c63430008190033
Deployed Bytecode
0x6080604052600436106101d0575f3560e01c806370a08231116100f657806395d89b4111610094578063ca053dc311610063578063ca053dc314610633578063dd62ed3e14610671578063f2fde38b146106ad578063fe560792146106d5576101d7565b806395d89b411461058d578063a9059cbb146105b7578063c1474e54146105f3578063c9567bf91461061d576101d7565b80637b07763c116100d05780637b07763c146104fd57806380f909c7146105255780638da5cb5b1461054d5780638f80a85214610577576101d7565b806370a0823114610483578063715018a6146104bf5780637547c7a3146104d5576101d7565b806323b872dd1161016e5780633ae732591161013d5780633ae73259146103dd578063511f4d2714610407578063608e4dd014610431578063671769fb14610459576101d7565b806323b872dd1461032357806324e7964a1461035f5780632d6e185714610389578063313ce567146103b3576101d7565b8063095ea7b3116101aa578063095ea7b31461026b57806318160ddd146102a75780631dbf20d5146102d15780631deff2161461030d576101d7565b806302d012c6146101db57806302d1db511461020557806306fdde0314610241576101d7565b366101d757005b5f80fd5b3480156101e6575f80fd5b506101ef6106fd565b6040516101fc9190612882565b60405180910390f35b348015610210575f80fd5b5061022b600480360381019061022691906128d2565b610725565b604051610238919061290c565b60405180910390f35b34801561024c575f80fd5b5061025561073f565b6040516102629190612995565b60405180910390f35b348015610276575f80fd5b50610291600480360381019061028c91906129df565b6107cf565b60405161029e9190612a37565b60405180910390f35b3480156102b2575f80fd5b506102bb6107ec565b6040516102c8919061290c565b60405180910390f35b3480156102dc575f80fd5b506102f760048036038101906102f291906128d2565b6107f5565b6040516103049190612882565b60405180910390f35b348015610318575f80fd5b50610321610896565b005b34801561032e575f80fd5b5061034960048036038101906103449190612a50565b610905565b6040516103569190612a37565b60405180910390f35b34801561036a575f80fd5b506103736109d9565b6040516103809190612afb565b60405180910390f35b348015610394575f80fd5b5061039d6109fe565b6040516103aa919061290c565b60405180910390f35b3480156103be575f80fd5b506103c7610b01565b6040516103d49190612b2f565b60405180910390f35b3480156103e8575f80fd5b506103f1610b0a565b6040516103fe919061290c565b60405180910390f35b348015610412575f80fd5b5061041b610b13565b6040516104289190612b68565b60405180910390f35b34801561043c575f80fd5b50610457600480360381019061045291906128d2565b610b38565b005b348015610464575f80fd5b5061046d611015565b60405161047a919061290c565b60405180910390f35b34801561048e575f80fd5b506104a960048036038101906104a49190612b81565b61101e565b6040516104b6919061290c565b60405180910390f35b3480156104ca575f80fd5b506104d3611064565b005b3480156104e0575f80fd5b506104fb60048036038101906104f691906128d2565b611077565b005b348015610508575f80fd5b50610523600480360381019061051e91906129df565b611319565b005b348015610530575f80fd5b5061054b60048036038101906105469190612b81565b61159f565b005b348015610558575f80fd5b50610561611698565b60405161056e9190612882565b60405180910390f35b348015610582575f80fd5b5061058b6116bf565b005b348015610598575f80fd5b506105a1611756565b6040516105ae9190612995565b60405180910390f35b3480156105c2575f80fd5b506105dd60048036038101906105d891906129df565b6117e6565b6040516105ea9190612a37565b60405180910390f35b3480156105fe575f80fd5b50610607611803565b6040516106149190612882565b60405180910390f35b348015610628575f80fd5b5061063161182b565b005b34801561063e575f80fd5b50610659600480360381019061065491906128d2565b6119a1565b60405161066893929190612bac565b60405180910390f35b34801561067c575f80fd5b5061069760048036038101906106929190612be1565b6119c7565b6040516106a4919061290c565b60405180910390f35b3480156106b8575f80fd5b506106d360048036038101906106ce9190612b81565b611a49565b005b3480156106e0575f80fd5b506106fb60048036038101906106f69190612b81565b611acd565b005b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60045f8381526020019081526020015f20549050919050565b6060600b805461074e90612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461077a90612c4c565b80156107c55780601f1061079c576101008083540402835291602001916107c5565b820191905f5260205f20905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b5f6107e26107db611bc6565b8484611bcd565b6001905092915050565b5f600a54905090565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610850919061290c565b602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190612c90565b9050919050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108d6611bc6565b73ffffffffffffffffffffffffffffffffffffffff16146108f5575f80fd5b5f47905061090281611d90565b50565b5f610911848484611df8565b6109ce8461091d611bc6565b6109c9856040518060600160405280602381526020016137ef6023913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610980611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546123e59092919063ffffffff16565b611bcd565b600190509392505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8060055490505f600a5490505f8203610a1e5760085492505050610afe565b5f610a466064610a38600a8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050808310610a5c576007549350505050610afe565b5f670de0b6b3a764000090505f610a8060075460085461246390919063ffffffff16565b90505f610af2610ae184610ad387610ac588610ab7610aa88e8d61246390919063ffffffff16565b8a61243990919063ffffffff16565b61243990919063ffffffff16565b61244e90919063ffffffff16565b61244e90919063ffffffff16565b60075461247890919063ffffffff16565b90508096505050505050505b90565b5f600954905090565b5f600554905090565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600f5f8381526020019081526020015f205f015490505f600f5f8481526020019081526020015f206001015490505f8111610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090612d05565b60405180910390fd5b8060045f8481526020019081526020015f20541015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612d93565b60405180910390fd5b610c05611bc6565b73ffffffffffffffffffffffffffffffffffffffff16610c24836107f5565b73ffffffffffffffffffffffffffffffffffffffff1614610c43575f80fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610c9d919061290c565b5f604051808303815f87803b158015610cb4575f80fd5b505af1158015610cc6573d5f803e3d5ffd5b505050506104b0600f5f8581526020019081526020015f2060020154610cec9190612dde565b4210610f02575f610d1b600554610d0d60648561243990919063ffffffff16565b61244e90919063ffffffff16565b90505f610d466064610d388460065461243990919063ffffffff16565b61244e90919063ffffffff16565b9050610d5d8160065461246390919063ffffffff16565b600681905550610dba8160015f610d72611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f610dc5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e528160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e9b611bc6565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ef7919061290c565b60405180910390a350505b610f178160055461246390919063ffffffff16565b600581905550610f418160045f8581526020019081526020015f205461246390919063ffffffff16565b60045f8481526020019081526020015f208190555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c1d1fde610f9b611bc6565b84846040518463ffffffff1660e01b8152600401610fbb93929190612e11565b5f604051808303815f87803b158015610fd2575f80fd5b505af1158015610fe4573d5f803e3d5ffd5b50505050600f5f8481526020019081526020015f205f8082015f9055600182015f9055600282015f90555050505050565b5f600654905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61106c61248d565b6110755f612514565b565b5f81116110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612e90565b60405180910390fd5b8060015f6110c5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790612ef8565b60405180910390fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842611186611bc6565b6040518263ffffffff1660e01b81526004016111a29190612882565b6020604051808303815f875af11580156111be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e29190612f2a565b905060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c5b9f8f611229611bc6565b83856040518463ffffffff1660e01b815260040161124993929190612e11565b5f604051808303815f87803b158015611260575f80fd5b505af1158015611272573d5f803e3d5ffd5b5050505061128b8260055461247890919063ffffffff16565b6005819055506112b58260045f8481526020019081526020015f205461247890919063ffffffff16565b60045f8381526020019081526020015f2081905550604051806060016040528082815260200183815260200142815250600f5f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611359611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614611378575f80fd5b600954600a6113879190613084565b8161139291906130ce565b905060015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613159565b60405180910390fd5b6114648160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506114f58160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611593919061290c565b60405180910390a35050565b6115a761248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906131c1565b60405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116ff611bc6565b73ffffffffffffffffffffffffffffffffffffffff161461171e575f80fd5b5f6117283061101e565b90505f81111561173c5761173b816125d5565b5b5f4790505f8111156117525761175181611d90565b5b5050565b6060600c805461176590612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461179190612c4c565b80156117dc5780601f106117b3576101008083540402835291602001916117dc565b820191905f5260205f20905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b5f6117f96117f2611bc6565b8484611df8565b6001905092915050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61183361248d565b600d5f9054906101000a900460ff1615611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990613229565b60405180910390fd5b6118b130600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a54611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306118fa3061101e565b5f80611904611698565b426040518863ffffffff1660e01b815260040161192696959493929190613280565b60606040518083038185885af1158015611942573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061196791906132df565b5050506001600d60026101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff021916908315150217905550565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611a5161248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac1575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611ab89190612882565b60405180910390fd5b611aca81612514565b50565b611ad561248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a906131c1565b60405180910390fd5b8060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c329061339f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca09061342d565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d83919061290c565b60405180910390a3505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611df4573d5f803e3d5ffd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d906134bb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90613549565b60405180910390fd5b5f8111611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d906135d7565b60405180910390fd5b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611f9f57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611fd9575f611fad6109fe565b9050611fd56064611fc7838661243990919063ffffffff16565b61244e90919063ffffffff16565b9150505b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612080575060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612089575f90505b5f811115612234576120e18160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f61214a606461213c601e8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050612155816125d5565b61215d611698565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561219f573d5f803e3d5ffd5b506121c76121b6828461246390919063ffffffff16565b60065461247890919063ffffffff16565b6006819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161222a919061290c565b60405180910390a3505b6122848260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506123276122db828461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6123ca848661246390919063ffffffff16565b6040516123d7919061290c565b60405180910390a350505050565b5f83831115829061242c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124239190612995565b60405180910390fd5b5082840390509392505050565b5f818361244691906130ce565b905092915050565b5f818361245b9190613622565b905092915050565b5f81836124709190613652565b905092915050565b5f81836124859190612dde565b905092915050565b612495611bc6565b73ffffffffffffffffffffffffffffffffffffffff166124b3611698565b73ffffffffffffffffffffffffffffffffffffffff1614612512576124d6611bc6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016125099190612882565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600d60016101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561260c5761260b613685565b5b60405190808252806020026020018201604052801561263a5781602001602082028036833780820191505090505b50905030815f81518110612651576126506136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271a9190612c90565b8160018151811061272e5761272d6136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061279530600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016127f8959493929190613796565b5f604051808303815f87803b15801561280f575f80fd5b505af1158015612821573d5f803e3d5ffd5b50505050505f600d60016101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61286c82612843565b9050919050565b61287c81612862565b82525050565b5f6020820190506128955f830184612873565b92915050565b5f80fd5b5f819050919050565b6128b18161289f565b81146128bb575f80fd5b50565b5f813590506128cc816128a8565b92915050565b5f602082840312156128e7576128e661289b565b5b5f6128f4848285016128be565b91505092915050565b6129068161289f565b82525050565b5f60208201905061291f5f8301846128fd565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61296782612925565b612971818561292f565b935061298181856020860161293f565b61298a8161294d565b840191505092915050565b5f6020820190508181035f8301526129ad818461295d565b905092915050565b6129be81612862565b81146129c8575f80fd5b50565b5f813590506129d9816129b5565b92915050565b5f80604083850312156129f5576129f461289b565b5b5f612a02858286016129cb565b9250506020612a13858286016128be565b9150509250929050565b5f8115159050919050565b612a3181612a1d565b82525050565b5f602082019050612a4a5f830184612a28565b92915050565b5f805f60608486031215612a6757612a6661289b565b5b5f612a74868287016129cb565b9350506020612a85868287016129cb565b9250506040612a96868287016128be565b9150509250925092565b5f819050919050565b5f612ac3612abe612ab984612843565b612aa0565b612843565b9050919050565b5f612ad482612aa9565b9050919050565b5f612ae582612aca565b9050919050565b612af581612adb565b82525050565b5f602082019050612b0e5f830184612aec565b92915050565b5f60ff82169050919050565b612b2981612b14565b82525050565b5f602082019050612b425f830184612b20565b92915050565b5f612b5282612aca565b9050919050565b612b6281612b48565b82525050565b5f602082019050612b7b5f830184612b59565b92915050565b5f60208284031215612b9657612b9561289b565b5b5f612ba3848285016129cb565b91505092915050565b5f606082019050612bbf5f8301866128fd565b612bcc60208301856128fd565b612bd960408301846128fd565b949350505050565b5f8060408385031215612bf757612bf661289b565b5b5f612c04858286016129cb565b9250506020612c15858286016129cb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c6357607f821691505b602082108103612c7657612c75612c1f565b5b50919050565b5f81519050612c8a816129b5565b92915050565b5f60208284031215612ca557612ca461289b565b5b5f612cb284828501612c7c565b91505092915050565b7f43616e6e6f7420756e7374616b65207a65726f20746f6b656e732100000000005f82015250565b5f612cef601b8361292f565b9150612cfa82612cbb565b602082019050919050565b5f6020820190508181035f830152612d1c81612ce3565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e636520746f20755f8201527f6e7374616b652100000000000000000000000000000000000000000000000000602082015250565b5f612d7d60278361292f565b9150612d8882612d23565b604082019050919050565b5f6020820190508181035f830152612daa81612d71565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612de88261289f565b9150612df38361289f565b9250828201905080821115612e0b57612e0a612db1565b5b92915050565b5f606082019050612e245f830186612873565b612e3160208301856128fd565b612e3e60408301846128fd565b949350505050565b7f43616e6e6f74207374616b65207a65726f20746f6b656e7321000000000000005f82015250565b5f612e7a60198361292f565b9150612e8582612e46565b602082019050919050565b5f6020820190508181035f830152612ea781612e6e565b9050919050565b7f496e73756666696369656e742062616c616e636520746f207374616b652100005f82015250565b5f612ee2601e8361292f565b9150612eed82612eae565b602082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b5f81519050612f24816128a8565b92915050565b5f60208284031215612f3f57612f3e61289b565b5b5f612f4c84828501612f16565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115612faa57808604811115612f8657612f85612db1565b5b6001851615612f955780820291505b8081029050612fa385612f55565b9450612f6a565b94509492505050565b5f82612fc2576001905061307d565b81612fcf575f905061307d565b8160018114612fe55760028114612fef5761301e565b600191505061307d565b60ff84111561300157613000612db1565b5b8360020a91508482111561301857613017612db1565b5b5061307d565b5060208310610133831016604e8410600b84101617156130535782820a90508381111561304e5761304d612db1565b5b61307d565b6130608484846001612f61565b9250905081840481111561307757613076612db1565b5b81810290505b9392505050565b5f61308e8261289f565b91506130998361289f565b92506130c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612fb3565b905092915050565b5f6130d88261289f565b91506130e38361289f565b92508282026130f18161289f565b9150828204841483151761310857613107612db1565b5b5092915050565b7f496e73756666696369656e742062616c616e636520696e20506f6f6c210000005f82015250565b5f613143601d8361292f565b915061314e8261310f565b602082019050919050565b5f6020820190508181035f83015261317081613137565b9050919050565b7f496e76616c6964207661756c74206164647265737321000000000000000000005f82015250565b5f6131ab60168361292f565b91506131b682613177565b602082019050919050565b5f6020820190508181035f8301526131d88161319f565b9050919050565b7f54726164696e67206973206f70656e21000000000000000000000000000000005f82015250565b5f61321360108361292f565b915061321e826131df565b602082019050919050565b5f6020820190508181035f83015261324081613207565b9050919050565b5f819050919050565b5f61326a61326561326084613247565b612aa0565b61289f565b9050919050565b61327a81613250565b82525050565b5f60c0820190506132935f830189612873565b6132a060208301886128fd565b6132ad6040830187613271565b6132ba6060830186613271565b6132c76080830185612873565b6132d460a08301846128fd565b979650505050505050565b5f805f606084860312156132f6576132f561289b565b5b5f61330386828701612f16565b935050602061331486828701612f16565b925050604061332586828701612f16565b9150509250925092565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737321000000000000000000000000000000000000000000000000000000602082015250565b5f61338960258361292f565b91506133948261332f565b604082019050919050565b5f6020820190508181035f8301526133b68161337d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b5f61341760238361292f565b9150613422826133bd565b604082019050919050565b5f6020820190508181035f8301526134448161340b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6134a560258361292f565b91506134b08261344b565b604082019050919050565b5f6020820190508181035f8301526134d281613499565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61353360238361292f565b915061353e826134d9565b604082019050919050565b5f6020820190508181035f83015261356081613527565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f6135c160298361292f565b91506135cc82613567565b604082019050919050565b5f6020820190508181035f8301526135ee816135b5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61362c8261289f565b91506136378361289f565b925082613647576136466135f5565b5b828204905092915050565b5f61365c8261289f565b91506136678361289f565b925082820390508181111561367f5761367e612db1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61371181612862565b82525050565b5f6137228383613708565b60208301905092915050565b5f602082019050919050565b5f613744826136df565b61374e81856136e9565b9350613759836136f9565b805f5b838110156137895781516137708882613717565b975061377b8361372e565b92505060018101905061375c565b5085935050505092915050565b5f60a0820190506137a95f8301886128fd565b6137b66020830187613271565b81810360408301526137c8818661373a565b90506137d76060830185612873565b6137e460808301846128fd565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74203e20616c6c6f77616e636521a264697066735822122084dcbaae9de78ff12b8d129940ab990594f955be56db1afd20a4b8ff7cc07c2c64736f6c63430008190033
Deployed Bytecode Sourcemap
32849:13808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43087:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46532:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41988:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42651:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42272:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40187:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45497:192;;;;;;;;;;;;;:::i;:::-;;43197:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34436:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36237:1377;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42174:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46374:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34575:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38582:1597;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46224:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42366:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6550:103;;;;;;;;;;;;;:::i;:::-;;37652:889;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45697:470;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35845:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5875:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45113:376;;;;;;;;;;;;;:::i;:::-;;42079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42811:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42977:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44605:463;;;;;;;;;;;;;:::i;:::-;;34316:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;42484:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6808:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35582:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43087:102;43135:7;43162:19;;;;;;;;;;;43155:26;;43087:102;:::o;46532:122::-;46597:7;46624:15;:22;46640:5;46624:22;;;;;;;;;;;;46617:29;;46532:122;;;:::o;41988:83::-;42025:13;42058:5;42051:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41988:83;:::o;42651:152::-;42717:4;42734:39;42743:12;:10;:12::i;:::-;42757:7;42766:6;42734:8;:39::i;:::-;42791:4;42784:11;;42651:152;;;;:::o;42272:86::-;42316:7;42343;;42336:14;;42272:86;:::o;40187:117::-;40245:7;40272:12;;;;;;;;;;;:20;;;40293:2;40272:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40265:31;;40187:117;;;:::o;45497:192::-;45566:10;;;;;;;;;;;45550:26;;:12;:10;:12::i;:::-;:26;;;45542:35;;;;;;45588:26;45617:21;45588:50;;45649:32;45662:18;45649:12;:32::i;:::-;45531:158;45497:192::o;43197:432::-;43320:4;43337:36;43347:6;43355:9;43366:6;43337:9;:36::i;:::-;43384:215;43407:6;43428:12;:10;:12::i;:::-;43455:133;43511:6;43455:133;;;;;;;;;;;;;;;;;:11;:19;43467:6;43455:19;;;;;;;;;;;;;;;:33;43475:12;:10;:12::i;:::-;43455:33;;;;;;;;;;;;;;;;:37;;:133;;;;;:::i;:::-;43384:8;:215::i;:::-;43617:4;43610:11;;43197:432;;;;;:::o;34436:32::-;;;;;;;;;;;;;:::o;36237:1377::-;36293:7;36313:20;36336:12;;36313:35;;36359:24;36386:7;;36359:34;;36426:1;36410:12;:17;36406:114;;36451:11;;36444:18;;;;;;36406:114;36619:17;36639:33;36668:3;36639:24;36660:2;36639:16;:20;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;36619:53;;36726:9;36710:12;:25;36706:76;;36759:11;;36752:18;;;;;;;36706:76;36991:13;37007:4;36991:20;;37022;37045:28;37061:11;;37045;;:15;;:28;;;;:::i;:::-;37022:51;;37374:11;37388:195;37418:154;37566:5;37418:125;37533:9;37418:92;37504:5;37418:63;37453:27;37467:12;37453:9;:13;;:27;;;;:::i;:::-;37418:12;:34;;:63;;;;:::i;:::-;:85;;:92;;;;:::i;:::-;:114;;:125;;;;:::i;:::-;:147;;:154;;;;:::i;:::-;37388:11;;:15;;:195;;;;:::i;:::-;37374:209;;37603:3;37596:10;;;;;;;;36237:1377;;:::o;42174:90::-;42215:5;42246:9;;42233:23;;42174:90;:::o;46374:97::-;46424:7;46451:12;;46444:19;;46374:97;:::o;34575:32::-;;;;;;;;;;;;;:::o;38582:1597::-;38635:13;38651:17;:21;38669:2;38651:21;;;;;;;;;;;:27;;;38635:43;;38689:14;38706:17;:21;38724:2;38706:21;;;;;;;;;;;:30;;;38689:47;;38764:1;38755:6;:10;38747:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;38856:6;38830:15;:22;38846:5;38830:22;;;;;;;;;;;;:32;;38808:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;38974:12;:10;:12::i;:::-;38948:38;;:22;38964:5;38948:15;:22::i;:::-;:38;;;38940:47;;;;;;39021:12;;;;;;;;;;;:17;;;39039:5;39021:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39157:10;39123:17;:21;39141:2;39123:21;;;;;;;;;;;:31;;;:44;;;;:::i;:::-;39104:15;:63;39100:724;;39247:15;39265:33;39285:12;;39265:15;39276:3;39265:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;39247:51;;39336:14;39353:35;39384:3;39353:26;39371:7;39353:13;;:17;;:26;;;;:::i;:::-;:30;;:35;;;;:::i;:::-;39336:52;;39457:25;39475:6;39457:13;;:17;;:25;;;;:::i;:::-;39441:13;:41;;;;39605:35;39633:6;39605:9;:23;39615:12;:10;:12::i;:::-;39605:23;;;;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;39579:9;:23;39589:12;:10;:12::i;:::-;39579:23;;;;;;;;;;;;;;;:61;;;;39682:36;39711:6;39682:9;:24;39700:4;39682:24;;;;;;;;;;;;;;;;:28;;:36;;;;:::i;:::-;39655:9;:24;39673:4;39655:24;;;;;;;;;;;;;;;:63;;;;39764:12;:10;:12::i;:::-;39740:45;;39757:4;39740:45;;;39778:6;39740:45;;;;;;:::i;:::-;;;;;;;;39169:655;;39100:724;39851:24;39868:6;39851:12;;:16;;:24;;;;:::i;:::-;39836:12;:39;;;;39911:34;39938:6;39911:15;:22;39927:5;39911:22;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;39886:15;:22;39902:5;39886:22;;;;;;;;;;;:59;;;;40008:12;;;;;;;;;;;:27;;;40036:12;:10;:12::i;:::-;40050:5;40057:6;40008:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40150:17;:21;40168:2;40150:21;;;;;;;;;;;;40143:28;;;;;;;;;;;;;;;;;;;;38624:1555;;38582:1597;:::o;46224:93::-;46269:7;46296:13;;46289:20;;46224:93;:::o;42366:110::-;42423:7;42450:9;:18;42460:7;42450:18;;;;;;;;;;;;;;;;42443:25;;42366:110;;;:::o;6550:103::-;5761:13;:11;:13::i;:::-;6615:30:::1;6642:1;6615:18;:30::i;:::-;6550:103::o:0;37652:889::-;37724:1;37715:6;:10;37707:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;37815:6;37788:9;:23;37798:12;:10;:12::i;:::-;37788:23;;;;;;;;;;;;;;;;:33;;37766:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;37913:20;37936:12;;;;;;;;;;;:17;;;37954:12;:10;:12::i;:::-;37936:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37913:54;;38029:12;;;;;;;;;;;:26;;;38056:12;:10;:12::i;:::-;38070;38084:6;38029:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38119:24;38136:6;38119:12;;:16;;:24;;;;:::i;:::-;38104:12;:39;;;;38186:65;38234:6;38186:15;:29;38202:12;38186:29;;;;;;;;;;;;:33;;:65;;;;:::i;:::-;38154:15;:29;38170:12;38154:29;;;;;;;;;;;:97;;;;38376:146;;;;;;;;38414:12;38376:146;;;;38455:6;38376:146;;;;38491:15;38376:146;;;38327:17;:31;38345:12;38327:31;;;;;;;;;;;:206;;;;;;;;;;;;;;;;;;;;;;;;;;;37696:845;37652:889;:::o;45697:470::-;45803:10;;;;;;;;;;;45787:26;;:12;:10;:12::i;:::-;:26;;;45779:35;;;;;;45849:9;;45843:2;:15;;;;:::i;:::-;45834:6;:24;;;;:::i;:::-;45825:33;;45901:9;:24;45919:4;45901:24;;;;;;;;;;;;;;;;45891:6;:34;;45869:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46020:36;46049:6;46020:9;:24;46038:4;46020:24;;;;;;;;;;;;;;;;:28;;:36;;;;:::i;:::-;45993:9;:24;46011:4;45993:24;;;;;;;;;;;;;;;:63;;;;46083:25;46101:6;46083:9;:13;46093:2;46083:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;46067:9;:13;46077:2;46067:13;;;;;;;;;;;;;;;:41;;;;46148:2;46124:35;;46141:4;46124:35;;;46152:6;46124:35;;;;;;:::i;:::-;;;;;;;;45697:470;;:::o;35845:299::-;5761:13;:11;:13::i;:::-;35990:1:::1;35956:36;;:22;:36;;::::0;35948:71:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36058:22;36030:12;;:51;;;;;;;;;;;;;;;;;;36114:22;36092:19;;:44;;;;;;;;;;;;;;;;;;35845:299:::0;:::o;5875:87::-;5921:7;5948:6;;;;;;;;;;;5941:13;;5875:87;:::o;45113:376::-;45189:10;;;;;;;;;;;45173:26;;:12;:10;:12::i;:::-;:26;;;45165:35;;;;;;45211:20;45234:24;45252:4;45234:9;:24::i;:::-;45211:47;;45288:1;45273:12;:16;45269:79;;;45306:30;45323:12;45306:16;:30::i;:::-;45269:79;45358:18;45379:21;45358:42;;45428:1;45415:10;:14;45411:71;;;45446:24;45459:10;45446:12;:24::i;:::-;45411:71;45154:335;;45113:376::o;42079:87::-;42118:13;42151:7;42144:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42079:87;:::o;42811:158::-;42880:4;42897:42;42907:12;:10;:12::i;:::-;42921:9;42932:6;42897:9;:42::i;:::-;42957:4;42950:11;;42811:158;;;;:::o;42977:102::-;43025:7;43052:19;;;;;;;;;;;43045:26;;42977:102;:::o;44605:463::-;5761:13;:11;:13::i;:::-;44667:11:::1;;;;;;;;;;;44666:12;44658:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;44710:58;44727:4;44742:15;;;;;;;;;;;44760:7;;44710:8;:58::i;:::-;44779:15;;;;;;;;;;;:31;;;44818:21;44863:4;44883:24;44901:4;44883:9;:24::i;:::-;44922:1;44938::::0;44954:7:::1;:5;:7::i;:::-;44976:15;44779:223;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;45027:4;45013:11;;:18;;;;;;;;;;;;;;;;;;45056:4;45042:11;;:18;;;;;;;;;;;;;;;;;;44605:463::o:0;34316:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42484:159::-;42581:7;42608:11;:18;42620:5;42608:18;;;;;;;;;;;;;;;:27;42627:7;42608:27;;;;;;;;;;;;;;;;42601:34;;42484:159;;;;:::o;6808:220::-;5761:13;:11;:13::i;:::-;6913:1:::1;6893:22;;:8;:22;;::::0;6889:93:::1;;6967:1;6939:31;;;;;;;;;;;:::i;:::-;;;;;;;;6889:93;6992:28;7011:8;6992:18;:28::i;:::-;6808:220:::0;:::o;35582:255::-;5761:13;:11;:13::i;:::-;35697:1:::1;35670:29;;:15;:29;;::::0;35662:64:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35765:15;35737:12;;:44;;;;;;;;;;;;;;;;;;35814:15;35792:19;;:37;;;;;;;;;;;;;;;;;;35582:255:::0;:::o;3884:98::-;3937:7;3964:10;3957:17;;3884:98;:::o;43637:339::-;43747:1;43730:19;;:5;:19;;;43722:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43829:1;43810:21;;:7;:21;;;43802:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43914:6;43884:11;:18;43896:5;43884:18;;;;;;;;;;;;;;;:27;43903:7;43884:27;;;;;;;;;;;;;;;:36;;;;43952:7;43936:32;;43945:5;43936:32;;;43961:6;43936:32;;;;;;:::i;:::-;;;;;;;;43637:339;;;:::o;44475:92::-;44532:10;;;;;;;;;;;:19;;:27;44552:6;44532:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44475:92;:::o;40374:1579::-;40478:1;40462:18;;:4;:18;;;40454:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40555:1;40541:16;;:2;:16;;;40533:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40625:1;40616:6;:10;40608:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40685:17;40813:13;;;;;;;;;;;40807:19;;:2;:19;;;:44;;;;;40846:4;40830:21;;:4;:21;;;;40807:44;40803:205;;;40868:15;40886:25;:23;:25::i;:::-;40868:43;;40938:28;40962:3;40938:19;40949:7;40938:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;40926:40;;40853:155;40803:205;41086:19;;;;;;;;;;;41080:25;;:2;:25;;;:56;;;;41117:19;;;;;;;;;;;41109:27;;:4;:27;;;41080:56;41076:102;;;41165:1;41153:13;;41076:102;41206:1;41194:9;:13;41190:516;;;41251:39;41280:9;41251;:24;41269:4;41251:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;41224:9;:24;41242:4;41224:24;;;;;;;;;;;;;;;:66;;;;41305:20;41328:26;41350:3;41328:17;41342:2;41328:9;:13;;:17;;;;:::i;:::-;:21;;:26;;;;:::i;:::-;41305:49;;41369:30;41386:12;41369:16;:30::i;:::-;41422:7;:5;:7::i;:::-;41414:25;;:48;41440:21;41414:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41586:46;41604:27;41618:12;41604:9;:13;;:27;;;;:::i;:::-;41586:13;;:17;;:46;;;;:::i;:::-;41570:13;:62;;;;41677:4;41654:40;;41663:4;41654:40;;;41684:9;41654:40;;;;;;:::i;:::-;;;;;;;;41209:497;41190:516;41794:27;41814:6;41794:9;:15;41804:4;41794:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;41776:9;:15;41786:4;41776:15;;;;;;;;;;;;;;;:45;;;;41848:40;41866:21;41877:9;41866:6;:10;;:21;;;;:::i;:::-;41848:9;:13;41858:2;41848:13;;;;;;;;;;;;;;;;:17;;:40;;;;:::i;:::-;41832:9;:13;41842:2;41832:13;;;;;;;;;;;;;;;:56;;;;41919:2;41904:41;;41913:4;41904:41;;;41923:21;41934:9;41923:6;:10;;:21;;;;:::i;:::-;41904:41;;;;;;:::i;:::-;;;;;;;;40443:1510;40374:1579;;;:::o;12541:206::-;12627:7;12685:1;12680;:6;;12688:12;12672:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12727:1;12723;:5;12716:12;;12541:206;;;;;:::o;11000:98::-;11058:7;11089:1;11085;:5;;;;:::i;:::-;11078:12;;11000:98;;;;:::o;11399:::-;11457:7;11488:1;11484;:5;;;;:::i;:::-;11477:12;;11399:98;;;;:::o;10643:::-;10701:7;10732:1;10728;:5;;;;:::i;:::-;10721:12;;10643:98;;;;:::o;10262:::-;10320:7;10351:1;10347;:5;;;;:::i;:::-;10340:12;;10262:98;;;;:::o;6040:166::-;6111:12;:10;:12::i;:::-;6100:23;;:7;:5;:7::i;:::-;:23;;;6096:103;;6174:12;:10;:12::i;:::-;6147:40;;;;;;;;;;;:::i;:::-;;;;;;;;6096:103;6040:166::o;7188:191::-;7262:16;7281:6;;;;;;;;;;;7262:25;;7307:8;7298:6;;:17;;;;;;;;;;;;;;;;;;7362:8;7331:40;;7352:8;7331:40;;;;;;;;;;;;7251:128;7188:191;:::o;43984:483::-;33895:4;33886:6;;:13;;;;;;;;;;;;;;;;;;44062:21:::1;44100:1;44086:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44062:40;;44131:4;44113;44118:1;44113:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;44157:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44147:4;44152:1;44147:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;44190:62;44207:4;44222:15;;;;;;;;;;;44240:11;44190:8;:62::i;:::-;44263:15;;;;;;;;;;;:66;;;44344:11;44370:1;44386:4;44413;44433:15;44263:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44051:416;33931:5:::0;33922:6;;:14;;;;;;;;;;;;;;;;;;43984:483;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;674:117::-;783:1;780;773:12;920:77;957:7;986:5;975:16;;920:77;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:118::-;1698:24;1716:5;1698:24;:::i;:::-;1693:3;1686:37;1611:118;;:::o;1735:222::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1735:222;;;;:::o;1963:99::-;2015:6;2049:5;2043:12;2033:22;;1963:99;;;:::o;2068:169::-;2152:11;2186:6;2181:3;2174:19;2226:4;2221:3;2217:14;2202:29;;2068:169;;;;:::o;2243:139::-;2332:6;2327:3;2322;2316:23;2373:1;2364:6;2359:3;2355:16;2348:27;2243:139;;;:::o;2388:102::-;2429:6;2480:2;2476:7;2471:2;2464:5;2460:14;2456:28;2446:38;;2388:102;;;:::o;2496:377::-;2584:3;2612:39;2645:5;2612:39;:::i;:::-;2667:71;2731:6;2726:3;2667:71;:::i;:::-;2660:78;;2747:65;2805:6;2800:3;2793:4;2786:5;2782:16;2747:65;:::i;:::-;2837:29;2859:6;2837:29;:::i;:::-;2832:3;2828:39;2821:46;;2588:285;2496:377;;;;:::o;2879:313::-;2992:4;3030:2;3019:9;3015:18;3007:26;;3079:9;3073:4;3069:20;3065:1;3054:9;3050:17;3043:47;3107:78;3180:4;3171:6;3107:78;:::i;:::-;3099:86;;2879:313;;;;:::o;3198:122::-;3271:24;3289:5;3271:24;:::i;:::-;3264:5;3261:35;3251:63;;3310:1;3307;3300:12;3251:63;3198:122;:::o;3326:139::-;3372:5;3410:6;3397:20;3388:29;;3426:33;3453:5;3426:33;:::i;:::-;3326:139;;;;:::o;3471:474::-;3539:6;3547;3596:2;3584:9;3575:7;3571:23;3567:32;3564:119;;;3602:79;;:::i;:::-;3564:119;3722:1;3747:53;3792:7;3783:6;3772:9;3768:22;3747:53;:::i;:::-;3737:63;;3693:117;3849:2;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3820:118;3471:474;;;;;:::o;3951:90::-;3985:7;4028:5;4021:13;4014:21;4003:32;;3951:90;;;:::o;4047:109::-;4128:21;4143:5;4128:21;:::i;:::-;4123:3;4116:34;4047:109;;:::o;4162:210::-;4249:4;4287:2;4276:9;4272:18;4264:26;;4300:65;4362:1;4351:9;4347:17;4338:6;4300:65;:::i;:::-;4162:210;;;;:::o;4378:619::-;4455:6;4463;4471;4520:2;4508:9;4499:7;4495:23;4491:32;4488:119;;;4526:79;;:::i;:::-;4488:119;4646:1;4671:53;4716:7;4707:6;4696:9;4692:22;4671:53;:::i;:::-;4661:63;;4617:117;4773:2;4799:53;4844:7;4835:6;4824:9;4820:22;4799:53;:::i;:::-;4789:63;;4744:118;4901:2;4927:53;4972:7;4963:6;4952:9;4948:22;4927:53;:::i;:::-;4917:63;;4872:118;4378:619;;;;;:::o;5003:60::-;5031:3;5052:5;5045:12;;5003:60;;;:::o;5069:142::-;5119:9;5152:53;5170:34;5179:24;5197:5;5179:24;:::i;:::-;5170:34;:::i;:::-;5152:53;:::i;:::-;5139:66;;5069:142;;;:::o;5217:126::-;5267:9;5300:37;5331:5;5300:37;:::i;:::-;5287:50;;5217:126;;;:::o;5349:147::-;5420:9;5453:37;5484:5;5453:37;:::i;:::-;5440:50;;5349:147;;;:::o;5502:173::-;5610:58;5662:5;5610:58;:::i;:::-;5605:3;5598:71;5502:173;;:::o;5681:264::-;5795:4;5833:2;5822:9;5818:18;5810:26;;5846:92;5935:1;5924:9;5920:17;5911:6;5846:92;:::i;:::-;5681:264;;;;:::o;5951:86::-;5986:7;6026:4;6019:5;6015:16;6004:27;;5951:86;;;:::o;6043:112::-;6126:22;6142:5;6126:22;:::i;:::-;6121:3;6114:35;6043:112;;:::o;6161:214::-;6250:4;6288:2;6277:9;6273:18;6265:26;;6301:67;6365:1;6354:9;6350:17;6341:6;6301:67;:::i;:::-;6161:214;;;;:::o;6381:147::-;6452:9;6485:37;6516:5;6485:37;:::i;:::-;6472:50;;6381:147;;;:::o;6534:173::-;6642:58;6694:5;6642:58;:::i;:::-;6637:3;6630:71;6534:173;;:::o;6713:264::-;6827:4;6865:2;6854:9;6850:18;6842:26;;6878:92;6967:1;6956:9;6952:17;6943:6;6878:92;:::i;:::-;6713:264;;;;:::o;6983:329::-;7042:6;7091:2;7079:9;7070:7;7066:23;7062:32;7059:119;;;7097:79;;:::i;:::-;7059:119;7217:1;7242:53;7287:7;7278:6;7267:9;7263:22;7242:53;:::i;:::-;7232:63;;7188:117;6983:329;;;;:::o;7318:442::-;7467:4;7505:2;7494:9;7490:18;7482:26;;7518:71;7586:1;7575:9;7571:17;7562:6;7518:71;:::i;:::-;7599:72;7667:2;7656:9;7652:18;7643:6;7599:72;:::i;:::-;7681;7749:2;7738:9;7734:18;7725:6;7681:72;:::i;:::-;7318:442;;;;;;:::o;7766:474::-;7834:6;7842;7891:2;7879:9;7870:7;7866:23;7862:32;7859:119;;;7897:79;;:::i;:::-;7859:119;8017:1;8042:53;8087:7;8078:6;8067:9;8063:22;8042:53;:::i;:::-;8032:63;;7988:117;8144:2;8170:53;8215:7;8206:6;8195:9;8191:22;8170:53;:::i;:::-;8160:63;;8115:118;7766:474;;;;;:::o;8246:180::-;8294:77;8291:1;8284:88;8391:4;8388:1;8381:15;8415:4;8412:1;8405:15;8432:320;8476:6;8513:1;8507:4;8503:12;8493:22;;8560:1;8554:4;8550:12;8581:18;8571:81;;8637:4;8629:6;8625:17;8615:27;;8571:81;8699:2;8691:6;8688:14;8668:18;8665:38;8662:84;;8718:18;;:::i;:::-;8662:84;8483:269;8432:320;;;:::o;8758:143::-;8815:5;8846:6;8840:13;8831:22;;8862:33;8889:5;8862:33;:::i;:::-;8758:143;;;;:::o;8907:351::-;8977:6;9026:2;9014:9;9005:7;9001:23;8997:32;8994:119;;;9032:79;;:::i;:::-;8994:119;9152:1;9177:64;9233:7;9224:6;9213:9;9209:22;9177:64;:::i;:::-;9167:74;;9123:128;8907:351;;;;:::o;9264:177::-;9404:29;9400:1;9392:6;9388:14;9381:53;9264:177;:::o;9447:366::-;9589:3;9610:67;9674:2;9669:3;9610:67;:::i;:::-;9603:74;;9686:93;9775:3;9686:93;:::i;:::-;9804:2;9799:3;9795:12;9788:19;;9447:366;;;:::o;9819:419::-;9985:4;10023:2;10012:9;10008:18;10000:26;;10072:9;10066:4;10062:20;10058:1;10047:9;10043:17;10036:47;10100:131;10226:4;10100:131;:::i;:::-;10092:139;;9819:419;;;:::o;10244:226::-;10384:34;10380:1;10372:6;10368:14;10361:58;10453:9;10448:2;10440:6;10436:15;10429:34;10244:226;:::o;10476:366::-;10618:3;10639:67;10703:2;10698:3;10639:67;:::i;:::-;10632:74;;10715:93;10804:3;10715:93;:::i;:::-;10833:2;10828:3;10824:12;10817:19;;10476:366;;;:::o;10848:419::-;11014:4;11052:2;11041:9;11037:18;11029:26;;11101:9;11095:4;11091:20;11087:1;11076:9;11072:17;11065:47;11129:131;11255:4;11129:131;:::i;:::-;11121:139;;10848:419;;;:::o;11273:180::-;11321:77;11318:1;11311:88;11418:4;11415:1;11408:15;11442:4;11439:1;11432:15;11459:191;11499:3;11518:20;11536:1;11518:20;:::i;:::-;11513:25;;11552:20;11570:1;11552:20;:::i;:::-;11547:25;;11595:1;11592;11588:9;11581:16;;11616:3;11613:1;11610:10;11607:36;;;11623:18;;:::i;:::-;11607:36;11459:191;;;;:::o;11656:442::-;11805:4;11843:2;11832:9;11828:18;11820:26;;11856:71;11924:1;11913:9;11909:17;11900:6;11856:71;:::i;:::-;11937:72;12005:2;11994:9;11990:18;11981:6;11937:72;:::i;:::-;12019;12087:2;12076:9;12072:18;12063:6;12019:72;:::i;:::-;11656:442;;;;;;:::o;12104:175::-;12244:27;12240:1;12232:6;12228:14;12221:51;12104:175;:::o;12285:366::-;12427:3;12448:67;12512:2;12507:3;12448:67;:::i;:::-;12441:74;;12524:93;12613:3;12524:93;:::i;:::-;12642:2;12637:3;12633:12;12626:19;;12285:366;;;:::o;12657:419::-;12823:4;12861:2;12850:9;12846:18;12838:26;;12910:9;12904:4;12900:20;12896:1;12885:9;12881:17;12874:47;12938:131;13064:4;12938:131;:::i;:::-;12930:139;;12657:419;;;:::o;13082:180::-;13222:32;13218:1;13210:6;13206:14;13199:56;13082:180;:::o;13268:366::-;13410:3;13431:67;13495:2;13490:3;13431:67;:::i;:::-;13424:74;;13507:93;13596:3;13507:93;:::i;:::-;13625:2;13620:3;13616:12;13609:19;;13268:366;;;:::o;13640:419::-;13806:4;13844:2;13833:9;13829:18;13821:26;;13893:9;13887:4;13883:20;13879:1;13868:9;13864:17;13857:47;13921:131;14047:4;13921:131;:::i;:::-;13913:139;;13640:419;;;:::o;14065:143::-;14122:5;14153:6;14147:13;14138:22;;14169:33;14196:5;14169:33;:::i;:::-;14065:143;;;;:::o;14214:351::-;14284:6;14333:2;14321:9;14312:7;14308:23;14304:32;14301:119;;;14339:79;;:::i;:::-;14301:119;14459:1;14484:64;14540:7;14531:6;14520:9;14516:22;14484:64;:::i;:::-;14474:74;;14430:128;14214:351;;;;:::o;14571:102::-;14613:8;14660:5;14657:1;14653:13;14632:34;;14571:102;;;:::o;14679:848::-;14740:5;14747:4;14771:6;14762:15;;14795:5;14786:14;;14809:712;14830:1;14820:8;14817:15;14809:712;;;14925:4;14920:3;14916:14;14910:4;14907:24;14904:50;;;14934:18;;:::i;:::-;14904:50;14984:1;14974:8;14970:16;14967:451;;;15399:4;15392:5;15388:16;15379:25;;14967:451;15449:4;15443;15439:15;15431:23;;15479:32;15502:8;15479:32;:::i;:::-;15467:44;;14809:712;;;14679:848;;;;;;;:::o;15533:1073::-;15587:5;15778:8;15768:40;;15799:1;15790:10;;15801:5;;15768:40;15827:4;15817:36;;15844:1;15835:10;;15846:5;;15817:36;15913:4;15961:1;15956:27;;;;15997:1;15992:191;;;;15906:277;;15956:27;15974:1;15965:10;;15976:5;;;15992:191;16037:3;16027:8;16024:17;16021:43;;;16044:18;;:::i;:::-;16021:43;16093:8;16090:1;16086:16;16077:25;;16128:3;16121:5;16118:14;16115:40;;;16135:18;;:::i;:::-;16115:40;16168:5;;;15906:277;;16292:2;16282:8;16279:16;16273:3;16267:4;16264:13;16260:36;16242:2;16232:8;16229:16;16224:2;16218:4;16215:12;16211:35;16195:111;16192:246;;;16348:8;16342:4;16338:19;16329:28;;16383:3;16376:5;16373:14;16370:40;;;16390:18;;:::i;:::-;16370:40;16423:5;;16192:246;16463:42;16501:3;16491:8;16485:4;16482:1;16463:42;:::i;:::-;16448:57;;;;16537:4;16532:3;16528:14;16521:5;16518:25;16515:51;;;16546:18;;:::i;:::-;16515:51;16595:4;16588:5;16584:16;16575:25;;15533:1073;;;;;;:::o;16612:285::-;16672:5;16696:23;16714:4;16696:23;:::i;:::-;16688:31;;16740:27;16758:8;16740:27;:::i;:::-;16728:39;;16786:104;16823:66;16813:8;16807:4;16786:104;:::i;:::-;16777:113;;16612:285;;;;:::o;16903:410::-;16943:7;16966:20;16984:1;16966:20;:::i;:::-;16961:25;;17000:20;17018:1;17000:20;:::i;:::-;16995:25;;17055:1;17052;17048:9;17077:30;17095:11;17077:30;:::i;:::-;17066:41;;17256:1;17247:7;17243:15;17240:1;17237:22;17217:1;17210:9;17190:83;17167:139;;17286:18;;:::i;:::-;17167:139;16951:362;16903:410;;;;:::o;17319:179::-;17459:31;17455:1;17447:6;17443:14;17436:55;17319:179;:::o;17504:366::-;17646:3;17667:67;17731:2;17726:3;17667:67;:::i;:::-;17660:74;;17743:93;17832:3;17743:93;:::i;:::-;17861:2;17856:3;17852:12;17845:19;;17504:366;;;:::o;17876:419::-;18042:4;18080:2;18069:9;18065:18;18057:26;;18129:9;18123:4;18119:20;18115:1;18104:9;18100:17;18093:47;18157:131;18283:4;18157:131;:::i;:::-;18149:139;;17876:419;;;:::o;18301:172::-;18441:24;18437:1;18429:6;18425:14;18418:48;18301:172;:::o;18479:366::-;18621:3;18642:67;18706:2;18701:3;18642:67;:::i;:::-;18635:74;;18718:93;18807:3;18718:93;:::i;:::-;18836:2;18831:3;18827:12;18820:19;;18479:366;;;:::o;18851:419::-;19017:4;19055:2;19044:9;19040:18;19032:26;;19104:9;19098:4;19094:20;19090:1;19079:9;19075:17;19068:47;19132:131;19258:4;19132:131;:::i;:::-;19124:139;;18851:419;;;:::o;19276:166::-;19416:18;19412:1;19404:6;19400:14;19393:42;19276:166;:::o;19448:366::-;19590:3;19611:67;19675:2;19670:3;19611:67;:::i;:::-;19604:74;;19687:93;19776:3;19687:93;:::i;:::-;19805:2;19800:3;19796:12;19789:19;;19448:366;;;:::o;19820:419::-;19986:4;20024:2;20013:9;20009:18;20001:26;;20073:9;20067:4;20063:20;20059:1;20048:9;20044:17;20037:47;20101:131;20227:4;20101:131;:::i;:::-;20093:139;;19820:419;;;:::o;20245:85::-;20290:7;20319:5;20308:16;;20245:85;;;:::o;20336:158::-;20394:9;20427:61;20445:42;20454:32;20480:5;20454:32;:::i;:::-;20445:42;:::i;:::-;20427:61;:::i;:::-;20414:74;;20336:158;;;:::o;20500:147::-;20595:45;20634:5;20595:45;:::i;:::-;20590:3;20583:58;20500:147;;:::o;20653:807::-;20902:4;20940:3;20929:9;20925:19;20917:27;;20954:71;21022:1;21011:9;21007:17;20998:6;20954:71;:::i;:::-;21035:72;21103:2;21092:9;21088:18;21079:6;21035:72;:::i;:::-;21117:80;21193:2;21182:9;21178:18;21169:6;21117:80;:::i;:::-;21207;21283:2;21272:9;21268:18;21259:6;21207:80;:::i;:::-;21297:73;21365:3;21354:9;21350:19;21341:6;21297:73;:::i;:::-;21380;21448:3;21437:9;21433:19;21424:6;21380:73;:::i;:::-;20653:807;;;;;;;;;:::o;21466:663::-;21554:6;21562;21570;21619:2;21607:9;21598:7;21594:23;21590:32;21587:119;;;21625:79;;:::i;:::-;21587:119;21745:1;21770:64;21826:7;21817:6;21806:9;21802:22;21770:64;:::i;:::-;21760:74;;21716:128;21883:2;21909:64;21965:7;21956:6;21945:9;21941:22;21909:64;:::i;:::-;21899:74;;21854:129;22022:2;22048:64;22104:7;22095:6;22084:9;22080:22;22048:64;:::i;:::-;22038:74;;21993:129;21466:663;;;;;:::o;22135:224::-;22275:34;22271:1;22263:6;22259:14;22252:58;22344:7;22339:2;22331:6;22327:15;22320:32;22135:224;:::o;22365:366::-;22507:3;22528:67;22592:2;22587:3;22528:67;:::i;:::-;22521:74;;22604:93;22693:3;22604:93;:::i;:::-;22722:2;22717:3;22713:12;22706:19;;22365:366;;;:::o;22737:419::-;22903:4;22941:2;22930:9;22926:18;22918:26;;22990:9;22984:4;22980:20;22976:1;22965:9;22961:17;22954:47;23018:131;23144:4;23018:131;:::i;:::-;23010:139;;22737:419;;;:::o;23162:222::-;23302:34;23298:1;23290:6;23286:14;23279:58;23371:5;23366:2;23358:6;23354:15;23347:30;23162:222;:::o;23390:366::-;23532:3;23553:67;23617:2;23612:3;23553:67;:::i;:::-;23546:74;;23629:93;23718:3;23629:93;:::i;:::-;23747:2;23742:3;23738:12;23731:19;;23390:366;;;:::o;23762:419::-;23928:4;23966:2;23955:9;23951:18;23943:26;;24015:9;24009:4;24005:20;24001:1;23990:9;23986:17;23979:47;24043:131;24169:4;24043:131;:::i;:::-;24035:139;;23762:419;;;:::o;24187:224::-;24327:34;24323:1;24315:6;24311:14;24304:58;24396:7;24391:2;24383:6;24379:15;24372:32;24187:224;:::o;24417:366::-;24559:3;24580:67;24644:2;24639:3;24580:67;:::i;:::-;24573:74;;24656:93;24745:3;24656:93;:::i;:::-;24774:2;24769:3;24765:12;24758:19;;24417:366;;;:::o;24789:419::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:131;25196:4;25070:131;:::i;:::-;25062:139;;24789:419;;;:::o;25214:222::-;25354:34;25350:1;25342:6;25338:14;25331:58;25423:5;25418:2;25410:6;25406:15;25399:30;25214:222;:::o;25442:366::-;25584:3;25605:67;25669:2;25664:3;25605:67;:::i;:::-;25598:74;;25681:93;25770:3;25681:93;:::i;:::-;25799:2;25794:3;25790:12;25783:19;;25442:366;;;:::o;25814:419::-;25980:4;26018:2;26007:9;26003:18;25995:26;;26067:9;26061:4;26057:20;26053:1;26042:9;26038:17;26031:47;26095:131;26221:4;26095:131;:::i;:::-;26087:139;;25814:419;;;:::o;26239:228::-;26379:34;26375:1;26367:6;26363:14;26356:58;26448:11;26443:2;26435:6;26431:15;26424:36;26239:228;:::o;26473:366::-;26615:3;26636:67;26700:2;26695:3;26636:67;:::i;:::-;26629:74;;26712:93;26801:3;26712:93;:::i;:::-;26830:2;26825:3;26821:12;26814:19;;26473:366;;;:::o;26845:419::-;27011:4;27049:2;27038:9;27034:18;27026:26;;27098:9;27092:4;27088:20;27084:1;27073:9;27069:17;27062:47;27126:131;27252:4;27126:131;:::i;:::-;27118:139;;26845:419;;;:::o;27270:180::-;27318:77;27315:1;27308:88;27415:4;27412:1;27405:15;27439:4;27436:1;27429:15;27456:185;27496:1;27513:20;27531:1;27513:20;:::i;:::-;27508:25;;27547:20;27565:1;27547:20;:::i;:::-;27542:25;;27586:1;27576:35;;27591:18;;:::i;:::-;27576:35;27633:1;27630;27626:9;27621:14;;27456:185;;;;:::o;27647:194::-;27687:4;27707:20;27725:1;27707:20;:::i;:::-;27702:25;;27741:20;27759:1;27741:20;:::i;:::-;27736:25;;27785:1;27782;27778:9;27770:17;;27809:1;27803:4;27800:11;27797:37;;;27814:18;;:::i;:::-;27797:37;27647:194;;;;:::o;27847:180::-;27895:77;27892:1;27885:88;27992:4;27989:1;27982:15;28016:4;28013:1;28006:15;28033:180;28081:77;28078:1;28071:88;28178:4;28175:1;28168:15;28202:4;28199:1;28192:15;28219:114;28286:6;28320:5;28314:12;28304:22;;28219:114;;;:::o;28339:184::-;28438:11;28472:6;28467:3;28460:19;28512:4;28507:3;28503:14;28488:29;;28339:184;;;;:::o;28529:132::-;28596:4;28619:3;28611:11;;28649:4;28644:3;28640:14;28632:22;;28529:132;;;:::o;28667:108::-;28744:24;28762:5;28744:24;:::i;:::-;28739:3;28732:37;28667:108;;:::o;28781:179::-;28850:10;28871:46;28913:3;28905:6;28871:46;:::i;:::-;28949:4;28944:3;28940:14;28926:28;;28781:179;;;;:::o;28966:113::-;29036:4;29068;29063:3;29059:14;29051:22;;28966:113;;;:::o;29115:732::-;29234:3;29263:54;29311:5;29263:54;:::i;:::-;29333:86;29412:6;29407:3;29333:86;:::i;:::-;29326:93;;29443:56;29493:5;29443:56;:::i;:::-;29522:7;29553:1;29538:284;29563:6;29560:1;29557:13;29538:284;;;29639:6;29633:13;29666:63;29725:3;29710:13;29666:63;:::i;:::-;29659:70;;29752:60;29805:6;29752:60;:::i;:::-;29742:70;;29598:224;29585:1;29582;29578:9;29573:14;;29538:284;;;29542:14;29838:3;29831:10;;29239:608;;;29115:732;;;;:::o;29853:831::-;30116:4;30154:3;30143:9;30139:19;30131:27;;30168:71;30236:1;30225:9;30221:17;30212:6;30168:71;:::i;:::-;30249:80;30325:2;30314:9;30310:18;30301:6;30249:80;:::i;:::-;30376:9;30370:4;30366:20;30361:2;30350:9;30346:18;30339:48;30404:108;30507:4;30498:6;30404:108;:::i;:::-;30396:116;;30522:72;30590:2;30579:9;30575:18;30566:6;30522:72;:::i;:::-;30604:73;30672:3;30661:9;30657:19;30648:6;30604:73;:::i;:::-;29853:831;;;;;;;;:::o
Swarm Source
ipfs://84dcbaae9de78ff12b8d129940ab990594f955be56db1afd20a4b8ff7cc07c2c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.