Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Latest 19 from a total of 19 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create ERC20 | 19436535 | 256 days ago | IN | 1.2 ETH | 0.30183793 | ||||
Update Max Team ... | 19436173 | 257 days ago | IN | 0 ETH | 0.00227662 | ||||
Create ERC20 | 19430614 | 257 days ago | IN | 100.3 ETH | 0.34747212 | ||||
Update Max Team ... | 19430285 | 257 days ago | IN | 0 ETH | 0.00241677 | ||||
Create ERC20 | 19413695 | 260 days ago | IN | 1.8 ETH | 0.47255985 | ||||
Update Max Team ... | 19412096 | 260 days ago | IN | 0 ETH | 0.00378524 | ||||
Create ERC20 | 19394835 | 262 days ago | IN | 1.55 ETH | 0.27355091 | ||||
Create ERC20 | 19382703 | 264 days ago | IN | 1.3 ETH | 0.34650512 | ||||
Update Max Team ... | 19380199 | 264 days ago | IN | 0 ETH | 0.0030248 | ||||
Update Bank Mach... | 19375672 | 265 days ago | IN | 0 ETH | 0.00182009 | ||||
Create ERC20 | 19375221 | 265 days ago | IN | 1.8 ETH | 0.49121249 | ||||
Update Max Team ... | 19374220 | 265 days ago | IN | 0 ETH | 0.00190933 | ||||
Update Max Team ... | 19374015 | 265 days ago | IN | 0 ETH | 0.00323308 | ||||
Update LP Locker | 19373166 | 265 days ago | IN | 0 ETH | 0.00271077 | ||||
Update Bank Mach... | 19373134 | 265 days ago | IN | 0 ETH | 0.00265939 | ||||
Update Min Pair ... | 19373132 | 265 days ago | IN | 0 ETH | 0.00276953 | ||||
Update Min Pair ... | 19373125 | 265 days ago | IN | 0 ETH | 0.00278904 | ||||
Update LP Locker | 19373114 | 265 days ago | IN | 0 ETH | 0.00271658 | ||||
0x60806040 | 19369787 | 266 days ago | IN | 0 ETH | 0.3550384 |
Latest 18 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19436535 | 256 days ago | 0.1 ETH | ||||
19436535 | 256 days ago | 0.1 ETH | ||||
19436535 | 256 days ago | 1 ETH | ||||
19430614 | 257 days ago | 0.2 ETH | ||||
19430614 | 257 days ago | 0.1 ETH | ||||
19430614 | 257 days ago | 100 ETH | ||||
19413695 | 260 days ago | 0.2 ETH | ||||
19413695 | 260 days ago | 0.1 ETH | ||||
19413695 | 260 days ago | 1.5 ETH | ||||
19394835 | 262 days ago | 0.2 ETH | ||||
19394835 | 262 days ago | 0.1 ETH | ||||
19394835 | 262 days ago | 1.25 ETH | ||||
19382703 | 264 days ago | 0.2 ETH | ||||
19382703 | 264 days ago | 0.1 ETH | ||||
19382703 | 264 days ago | 1 ETH | ||||
19375221 | 265 days ago | 0.2 ETH | ||||
19375221 | 265 days ago | 0.1 ETH | ||||
19375221 | 265 days ago | 1.5 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ERC20FactoryByBankPad
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-05 */ // Sources flattened with hardhat v2.19.1 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // File contracts/interfaces/IBase.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IBase { /// - antiBotParam /// 1. holdLimit /// 2. txLimit /// 3. antiDumpLimit /// 4. antiSniperOn /// /// - taxParam /// 1. dexRouter: uniswap or sushiswap /// 2. pairedToken: eth or usdc /// 3. taxPayAccount /// 4. treasuryAccount /// 5. buyTax /// 6. sellTax /// 7. treasuryTax /// /// - distribParam /// 1. totalSupply /// 2. teamAccount /// 3. teamAllocPercent /// /// - lpParam /// 1. isLPBurn /// 2. isTradingDelayed /// 3. isTradingDisabled /// 4. pairedTokenAmount /// 5. lockPeriod struct TokenLaunchConf { string uuid; string name; string symbol; bytes distribParam; bytes antiBotParam; bytes taxParam; bytes lpParam; } // Configuration inherited from the factory contract struct InheritedConf { uint16 autoBurnFirstPercent; uint16 autoBurnSecondPercent; uint16 autoBurnThirdPercent; uint16 thresholdPercent; uint16 maxBuyTaxAfter; uint16 maxSellTaxAfter; uint16 maxTreasuryTaxAfter; uint16 bankPadTax; uint16 maxTaxToRenounce; uint32 bankPadTaxApplyPeriod; uint32 taxWhitelistApplyDelay; uint32 tradingDelayTime; uint32 tradingDisableTime; } } // File contracts/interfaces/IERC20ByBankPad.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IERC20ByBankPad { /** * @notice function {preLaunch} * * Configure token contract with the factory configuration * * @param param configuration structure from the factory */ function preLaunch(IBase.InheritedConf calldata param) external; /// @notice Launch the token contract /// @dev Token is launched from this moment, and users can start trading /// @param tradingDelayed Once this flag is set, trading is delayed for 1 min /// @param tradingDisabled Once this flag is set, trading is disabled until it is set or 4 days function launch(bool tradingDelayed, bool tradingDisabled) external; /// @notice View amm related configuration addresses /// @return address dex router address /// @return address base paired token address /// @return address base pair address from the dex router function ammAddresses() external view returns (address, address, address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external; /** * @dev BankPad UUID Hash */ function bankUUIDHash() external view returns (bytes32); /** * @notice Check if the anti-dump feature is enabled in the token */ function isAntiDumpEnabled() external view returns (bool); } // File contracts/interfaces/IERC20MachineByBankPad.sol pragma solidity ^0.8.0; // Original license: SPDX_License_Identifier: MIT /** * @dev BankPad ERC-20 contract deployer * * * Lightweight deployment module for use with template contracts */ interface IERC20MachineByBankPad { /** * @notice function {deploy} * * Deploy a fresh instance */ function deploy( bytes32 bankIdHash_, bytes32 salt_, bytes memory args_ ) external payable returns (address erc20ContractAddress_); } // File contracts/interfaces/IDexRouter.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IDexFactory { function createPair( address tokenA, address tokenB ) external returns (address pair); } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); } // File contracts/interfaces/IUniLocker.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IERCBurn { function burn(uint256 _amount) external; function approve(address spender, uint256 amount) external returns (bool); function allowance( address owner, address spender ) external returns (uint256); function balanceOf(address account) external view returns (uint256); } interface IUniLocker { struct FeeStruct { uint256 ethFee; // Small eth fee to prevent spam on the platform IERCBurn secondaryFeeToken; // UNCX or UNCL uint256 secondaryTokenFee; // optional, UNCX or UNCL uint256 secondaryTokenDiscount; // discount on liquidity fee for burning secondaryToken uint256 liquidityFee; // fee on univ2 liquidity tokens uint256 referralPercent; // fee for referrals IERCBurn referralToken; // token the refferer must hold to qualify as a referrer uint256 referralHold; // balance the referrer must hold to qualify as a referrer uint256 referralDiscount; // discount on flatrate fees for using a valid referral address } function gFees() external view returns (FeeStruct memory); function lockLPToken( address _lpToken, uint256 _amount, uint256 _unlock_date, address payable _referral, bool _fee_in_eth, address payable _withdrawer ) external payable; } // File contracts/launchpad/ERC20FactoryByBankPadBase.sol pragma solidity ^0.8.0; // Original license: SPDX_License_Identifier: MIT contract ERC20FactoryByBankPadBase is Ownable { using Address for address payable; uint16 internal constant DENOMINATOR = 10000; // ==================== 32 bytes slot 1 start ================= // /// @dev Anti-snipe tax is burned, reducing total supply /// 1. 20% tax on buys in the first block /// 2. Reducing to 13.33% in the second block /// 3. Reducing to 6.66% in the third /// 4. Finally 0% from the fourth block on uint16 private _autoBurnFirstPercent = 2000; uint16 private _autoBurnSecondPercent = 1333; uint16 private _autoBurnThirdPercent = 666; /// @dev Max buy tax after token launched uint16 private _maxBuyTaxAfter = 1500; /// @dev Max sell tax after token launched uint16 private _maxSellTaxAfter = 1500; /// @dev Max treasury tax after token launched uint16 private _maxTreasuryTaxAfter = 500; /// @dev Bankpad tax is set on top buy / sell / treasury tax as a service fee uint16 private _bankPadTax = 1000; /// @dev Ownership can be renounced only when buy/sell/treasury tax is below limit default 5% uint16 private _maxTaxToRenounce = 500; /// @dev Bankpad tax is removed after some days default 30 days uint32 private _bankPadTaxApplyPeriod = 30 days; /// @dev Tax whitelist (exclude list) is not applied within some days after token launches default 2 days uint32 private _taxWhitelistApplyDelay = 2 days; /// @dev Token transfer is disabled for 1 mins once trading_delay flag is set uint32 private _tradingDelayTime = 1 minutes; /// @dev Trading is disabled once {_isTradingDisabled} flag is set, /// it is unset automatically after 7 days if owner does not enable trading uint32 private _tradingDisableTime = 7 days; // ==================== 32 bytes slot 1 end ================= // // ==================== 32 bytes slot 2 start ================= // /// @dev Service fee and token tax fee receive account address payable internal _servicePayAccount; /// @dev Max team distribution rate default 10% uint16 private _maxTeamAlloc = 1000; /// @dev Max token launch count per wallet uint16 internal _maxLaunchesPerWallet = 12; /// @dev Max buy tax uint16 private _maxBuyTax = 3500; /// @dev Max sell tax uint16 private _maxSellTax = 3500; /// @dev Max treasury tax uint16 private _maxTreasuryTax = 500; // ==================== 32 bytes slot 2 end: 30 bytes ================= // /// @dev Swap back threshold percent. default 2% uint16 private _thresholdPercent = 200; /// @dev BankPad machine contract address internal _machine; /// @dev Minimum lock period default 30 days uint256 internal _minLockPeriod = 30 days; /// @dev Token launch fee in ETH uint256 internal _launchFee; /// @dev Delayed trading fee in ETH uint256 internal _tradingDelayFee; /// @dev Delayed disable fee in ETH uint256 internal _tradingDisableFee; /// @dev Anti-Dump service fee in ETH uint256 internal _antiDumpFee; /// @dev LP locker contract for dex router mapping(address => address) internal _lpLockers; /// @dev Get token address per given BankPad UUID mapping(string => address) internal _tokens; /// @dev Whitelist for the unlimited team allocation mapping(string => uint16) internal _teamAllocWhitelist; /// @dev Whitelist for manually enabling trading mapping(string => bool) internal _manualEnableTradingWhitelist; /// @dev Minimum pair token amount to be added to the liquidity mapping(address => uint256) internal _minPairTokenAmounts; /// @dev Token launched count per account mapping(address => uint16) internal _launchedCounts; event BankPadTaxUpdated(uint16 bankPadTax); event MaxLaunchesPerWalletUpdated(uint16 maxLaunches); event MaxTaxToRenounceUpdated(uint16 maxTax); event MaxTeamAllocUpdated(uint16 teamAlloc); event MaxTeamAllocUpdatedForUUID(string uuid, uint16 teamAlloc); event MinLockPeriodUpdated(uint256 period); event MinPairTokenAmountUpdated(address pairToken, uint256 amount); event ServiceFeesUpdated( uint256 launchFee, uint256 tradingDelayFee, uint256 tradingDisableFee, uint256 antiDumpFee ); event ServicePayAccountUpdated(address payable account); event SnipeAutoBurnPercentsUpdated( uint16 firstPercent, uint16 secondPercent, uint16 thirdPercent ); event TaxAfterLimitsUpdated( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ); event TaxLimitsUpdated( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ); event ThreasholdPercentUpdated(uint16 percent); event ManualEnableTradingForUUIDUpdated(string uuid, bool flag); event TimeConfigurationUpdated( uint32 tradingDelayTime, uint32 tradingDisableTime, uint32 bankPadTaxApplyPeriod, uint32 taxWhitelistApplyDelay ); /** * @dev Build InheritedConf structure to be used in token deployment * * @param uuid token UUID */ function _buildInheritedConf( string memory uuid ) internal view returns (IBase.InheritedConf memory) { IBase.InheritedConf memory param; param.autoBurnFirstPercent = _autoBurnFirstPercent; param.autoBurnSecondPercent = _autoBurnSecondPercent; param.autoBurnThirdPercent = _autoBurnThirdPercent; param.thresholdPercent = _thresholdPercent; param.maxBuyTaxAfter = _maxBuyTaxAfter; param.maxSellTaxAfter = _maxSellTaxAfter; param.maxTreasuryTaxAfter = _maxTreasuryTaxAfter; param.bankPadTax = _bankPadTax; param.maxTaxToRenounce = _maxTaxToRenounce; param.bankPadTaxApplyPeriod = _bankPadTaxApplyPeriod; param.taxWhitelistApplyDelay = _taxWhitelistApplyDelay; param.tradingDelayTime = _tradingDelayTime; // when the uuid is whitelisted for the manually enable trading feature // we set tradingDisableTime as MAX_UINT32 param.tradingDisableTime = _manualEnableTradingWhitelist[uuid] ? uint32(int32(-1)) : _tradingDisableTime; return param; } function _validateTaxProps(bytes memory taxParam) internal view { (, , , , uint16 buyTax, uint16 sellTax, uint16 treasuryTax) = abi .decode( taxParam, (address, address, address, address, uint16, uint16, uint16) ); require( buyTax <= _maxBuyTax && sellTax <= _maxSellTax && treasuryTax <= _maxTreasuryTax, "too much tax" ); uint16 bankPadTax_ = _bankPadTax; // check if the applied tax is too much so it exceeds the transfer amount require( (uint256(buyTax + treasuryTax) * (DENOMINATOR + bankPadTax_)) / DENOMINATOR <= DENOMINATOR && (uint256(sellTax + treasuryTax) * (DENOMINATOR + bankPadTax_)) / DENOMINATOR <= DENOMINATOR, "tax out of range" ); } /// @notice Update BankPad service fees /// @param launchFee token launch fee /// @param tradingDelayFee trading delay service fee /// @param tradingDisableFee trading disable service fee function updateServiceFees( uint256 launchFee, uint256 tradingDelayFee, uint256 tradingDisableFee, uint256 antiDumpFee ) external onlyOwner { _launchFee = launchFee; _tradingDelayFee = tradingDelayFee; _tradingDisableFee = tradingDisableFee; _antiDumpFee = antiDumpFee; emit ServiceFeesUpdated( launchFee, tradingDelayFee, tradingDisableFee, antiDumpFee ); } /// @notice View BankPad service fees /// @return uint256 token launch fee /// @return uint256 trading delay service fee /// @return uint256 trading disable service fee /// @return uint256 anti-dump service fee function serviceFees() external view returns (uint256, uint256, uint256, uint256) { return (_launchFee, _tradingDelayFee, _tradingDisableFee, _antiDumpFee); } /// @notice Update LP locker contract function updateLPLocker( address dexRouter, address newLocker ) external onlyOwner { _lpLockers[dexRouter] = newLocker; } function lpLocker(address dexRouter) external view returns (address) { return _lpLockers[dexRouter]; } /** * @notice function {updateBankMachine} * * Update BankPad token machine address */ function updateBankMachine(address machine) external onlyOwner { require(machine != address(0), "invalid machine"); _machine = machine; } function bankMachine() external view returns (address) { return _machine; } /// @notice Update service fee receive account function updateServicePayAccount( address payable account ) external onlyOwner { require(account != address(0), "invalid pay account"); // confirm service pay account can receive ETH account.sendValue(0); _servicePayAccount = account; emit ServicePayAccountUpdated(account); } function servicePayAccount() external view returns (address payable) { return _servicePayAccount; } function getToken(string memory uuid) external view returns (address) { return _tokens[uuid]; } /** * @dev function {updateMaxTeamAlloc} * * Update the limit of the team distribution percent * * @param teamAlloc new max limit of the team distribution percent */ function updateMaxTeamAlloc(uint16 teamAlloc) external onlyOwner { require(teamAlloc <= DENOMINATOR, "out of range"); _maxTeamAlloc = teamAlloc; emit MaxTeamAllocUpdated(teamAlloc); } /** * @dev function {maxTeamAlloc} * * Return common max team distribution percentage */ function maxTeamAlloc() external view returns (uint16) { return _maxTeamAlloc; } /** * @dev function {updateMaxTeamAllocForUUID} * * Whitelist token uuid for the unlimited team allocation percent * * @param uuid token to be whitelisted * @param teamAlloc new max team allocation percent */ function updateMaxTeamAllocForUUID( string calldata uuid, uint16 teamAlloc ) external onlyOwner { require(teamAlloc <= DENOMINATOR, "out of range"); _teamAllocWhitelist[uuid] = teamAlloc; emit MaxTeamAllocUpdatedForUUID(uuid, teamAlloc); } /** * @dev function {maxTeamAllocForUUID} * * Return max team distribution percentage for the given `uuid` of token * whitelisted token will return its max allocation percent * return `_maxTeamAlloc` for others * * @param uuid token UUID */ function maxTeamAllocForUUID( string calldata uuid ) external view returns (uint16) { uint16 teamAllocForUUID = _teamAllocWhitelist[uuid]; if (teamAllocForUUID > 0) return teamAllocForUUID; return _maxTeamAlloc; } /** * @notice function {whitelistUUIDForManualEnableTrading} * * Whitelist token for setting manual enabling trading feature * * @param uuid token uuid to whitelist * @param flag true / false */ function whitelistUUIDForManualEnableTrading( string calldata uuid, bool flag ) external onlyOwner { _manualEnableTradingWhitelist[uuid] = flag; emit ManualEnableTradingForUUIDUpdated(uuid, flag); } function isUUIDWhitelistedForManualEnableTrading( string calldata uuid ) external view returns (bool) { return _manualEnableTradingWhitelist[uuid]; } /** * @dev function {updateMinLockPeriod} * * Update minimum lock period * * @param period new minimum lock period */ function updateMinLockPeriod(uint256 period) external onlyOwner { _minLockPeriod = period; emit MinLockPeriodUpdated(period); } function minLockPeriod() external view returns (uint256) { return _minLockPeriod; } /** * @dev function {updateSnipeAutoBurnPercents} * * Update percent values of anti-snipe auto burning * * @param firstPercent anti-snipe first auto burn percent. max 35% * @param secondPercent anti-snipe second auto burn percent. max 20% * @param thirdPercent anti-snipe third auto burn percent. max 10% */ function updateSnipeAutoBurnPercents( uint16 firstPercent, uint16 secondPercent, uint16 thirdPercent ) external onlyOwner { require( firstPercent <= 3500 && secondPercent <= 2000 && thirdPercent <= 1000, "out of range" ); _autoBurnFirstPercent = firstPercent; _autoBurnSecondPercent = secondPercent; _autoBurnThirdPercent = thirdPercent; emit SnipeAutoBurnPercentsUpdated( firstPercent, secondPercent, thirdPercent ); } /** * @dev function {snipeAutoBurnPercents} * * Return anti-snipe auto burn percent values for 3 steps * * @return uint16 first auto burn percent * @return uint16 second auto burn percent * @return uint16 third auto burn percent */ function snipeAutoBurnPercents() external view returns (uint16, uint16, uint16) { return ( _autoBurnFirstPercent, _autoBurnSecondPercent, _autoBurnThirdPercent ); } /** * @dev function {updateTaxLimits} * * Update max limit of buy/sell/treasury tax which are used at the time of token deployment * * @param maxBuyTax maximum value of {buyTax}. max 35% * @param maxSellTax maximum value of {sellTax}. max 35% * @param maxTreasuryTax maximum value of {treasuryTax}. max 5% */ function updateTaxLimits( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ) external onlyOwner { require( maxBuyTax <= 3500 && maxSellTax <= 3500 && maxTreasuryTax <= 500, "out of range" ); _maxBuyTax = maxBuyTax; _maxSellTax = maxSellTax; _maxTreasuryTax = maxTreasuryTax; emit TaxLimitsUpdated(maxBuyTax, maxSellTax, maxTreasuryTax); } /** * @dev function {taxLimits} * * Return tax limits which are used at the time of token deployment * * @return uint16 max buy tax limit * @return uint16 max sell tax limit * @return uint16 max treasury tax limit */ function taxLimits() external view returns (uint16, uint16, uint16) { return (_maxBuyTax, _maxSellTax, _maxTreasuryTax); } /** * @dev function {updateTaxAfterLimits} * * Update max limit of buy/sell/treasury tax which are used after token launched * * @param maxBuyTax maximum value of {buyTax}. max 35% * @param maxSellTax maximum value of {sellTax}. max 35% * @param maxTreasuryTax maximum value of {treasuryTax}. max 5% */ function updateTaxAfterLimits( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ) external onlyOwner { require( maxBuyTax <= 3500 && maxSellTax <= 3500 && maxTreasuryTax <= 500, "out of range" ); _maxBuyTaxAfter = maxBuyTax; _maxSellTaxAfter = maxSellTax; _maxTreasuryTaxAfter = maxTreasuryTax; emit TaxAfterLimitsUpdated(maxBuyTax, maxSellTax, maxTreasuryTax); } /** * @dev function {taxAfterLimits} * * Return tax limits which are used after token launched * * @return uint16 max buy tax limit * @return uint16 max sell tax limit * @return uint16 max treasury tax limit */ function taxAfterLimits() external view returns (uint16, uint16, uint16) { return (_maxBuyTaxAfter, _maxSellTaxAfter, _maxTreasuryTaxAfter); } /** * @dev function {updateBankPadTax} * * Update BankPad tax value * * @param tax new BankPad tax */ function updateBankPadTax(uint16 tax) external onlyOwner { _bankPadTax = tax; emit BankPadTaxUpdated(tax); } function bankPadTax() external view returns (uint16) { return _bankPadTax; } /** * @dev function {updateMaxTaxToRenounce} * * Update the tax condition for renouncing ownership of the token * * @param maxTax max tax values for renounce */ function updateMaxTaxToRenounce(uint16 maxTax) external onlyOwner { _maxTaxToRenounce = maxTax; emit MaxTaxToRenounceUpdated(maxTax); } /** * @dev function {maxTaxToRenounce} * * Return the tax condition for renouncing ownership of the token * * @return uint16 max tax values for renounce */ function maxTaxToRenounce() external view returns (uint16) { return _maxTaxToRenounce; } /** * @dev function {updateTradingTimes} * * Update token related time configuration * * @param tradingDelayTime new trading delay time * @param tradingDisableTime new trading disable time * @param bankPadTaxApplyPeriod new bankPad tax apply period * @param taxWhitelistApplyDelay new tax whitelist delay period */ function updateTimeConfiguration( uint32 tradingDelayTime, uint32 tradingDisableTime, uint32 bankPadTaxApplyPeriod, uint32 taxWhitelistApplyDelay ) external onlyOwner { _tradingDelayTime = tradingDelayTime; _tradingDisableTime = tradingDisableTime; _bankPadTaxApplyPeriod = bankPadTaxApplyPeriod; _taxWhitelistApplyDelay = taxWhitelistApplyDelay; emit TimeConfigurationUpdated( tradingDelayTime, tradingDisableTime, bankPadTaxApplyPeriod, taxWhitelistApplyDelay ); } /** * @dev function {tradingTimes} * * Return token related time configuration * * @return uint32 trading delay time * @return uint32 trading disable time * @return uint32 BankPad tax apply period * @return uint32 Tax whitelist delay period */ function timeConfiguration() external view returns (uint32, uint32, uint32, uint32) { return ( _tradingDelayTime, _tradingDisableTime, _bankPadTaxApplyPeriod, _taxWhitelistApplyDelay ); } function updateMinPairTokenAmount( address pairToken, uint256 amount ) external onlyOwner { _minPairTokenAmounts[pairToken] = amount; emit MinPairTokenAmountUpdated(pairToken, amount); } /** * @dev function {minPairTokenAmount} * * Return minimum pair token amount * * @param pairToken address of adding token being added with deployed token */ function minPairTokenAmount( address pairToken ) external view returns (uint256) { return _minPairTokenAmounts[pairToken]; } /** * @notice Update threshold percent value * @param percent new threshold percent */ function updateThresholdPercent(uint16 percent) external onlyOwner { _thresholdPercent = percent; emit ThreasholdPercentUpdated(percent); } function thresholdPercent() external view returns (uint16) { return _thresholdPercent; } /** * @dev function {updateMaxLaunchesPerWallet} * * Update max launches count per wallet * * @param maxLaunches new max launches count */ function updateMaxLaunchesPerWallet(uint16 maxLaunches) external onlyOwner { _maxLaunchesPerWallet = maxLaunches; emit MaxLaunchesPerWalletUpdated(maxLaunches); } function maxLaunchesPerWallet() external view returns (uint16) { return _maxLaunchesPerWallet; } /** * @dev function {launchedCount} * * Return launched token count by the given account * * @param account to view */ function launchedCount(address account) external view returns (uint16) { return _launchedCounts[account]; } } // File contracts/launchpad/ERC20FactoryByBankPad.sol pragma solidity ^0.8.0; // Original license: SPDX_License_Identifier: MIT // import "../interfaces/IUniLockerGoerli.sol"; contract ERC20FactoryByBankPad is ERC20FactoryByBankPadBase, Pausable { using SafeERC20 for IERC20; using Address for address payable; address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; event NewTokenCreated( address token, address serviceAccount, address deployer, bytes32 uuidHash, uint256 serviceFee, IBase.TokenLaunchConf tokenLaunchConf, IBase.InheritedConf inheritedConf ); constructor( address payable servicePayAccount_, uint256 launchFee_, uint256 delayedTradingFee_, uint256 tradingDisableFee_, uint256 antiDumpFee_ ) { require(servicePayAccount_ != address(0), "invalid pay account"); _servicePayAccount = servicePayAccount_; _launchFee = launchFee_; _tradingDelayFee = delayedTradingFee_; _tradingDisableFee = tradingDisableFee_; _antiDumpFee = antiDumpFee_; } /// @notice Create token from the template /// @dev Token configuration parameters are passed as ABI-encoded values. function createERC20( IBase.TokenLaunchConf memory tokenLaunchConf ) external payable whenNotPaused returns (address) { uint256 ethAmount = msg.value; require(_tokens[tokenLaunchConf.uuid] == address(0), "duplicated uuid"); IBase.InheritedConf memory inheritedConf = _buildInheritedConf( tokenLaunchConf.uuid ); IERC20ByBankPad createdToken = _deployERC20( tokenLaunchConf, inheritedConf ); ( bool isTradingDelayed, bool isTradingDisabled, uint256 ethInLP, uint256 ethInLockFee ) = _initializeLP(createdToken, tokenLaunchConf); uint256 serviceFee = _launchFee + (isTradingDelayed ? _tradingDelayFee : 0) + (isTradingDisabled ? _tradingDisableFee : 0) + (createdToken.isAntiDumpEnabled() ? _antiDumpFee : 0); require( ethAmount >= serviceFee + ethInLP + ethInLockFee, "insufficient eth" ); // send remained eth to the service pay account _servicePayAccount.sendValue(address(this).balance); createdToken.launch(isTradingDelayed, isTradingDisabled); emit NewTokenCreated( address(createdToken), _servicePayAccount, _msgSender(), createdToken.bankUUIDHash(), serviceFee, tokenLaunchConf, inheritedConf ); return address(createdToken); } function _deployERC20( IBase.TokenLaunchConf memory tokenLaunchConf, IBase.InheritedConf memory inheritedConf ) private returns (IERC20ByBankPad) { address deployer = _msgSender(); uint16 launchedCount = _launchedCounts[deployer]; require(launchedCount < _maxLaunchesPerWallet, "over launched"); _launchedCounts[deployer] = ++launchedCount; // validate some props in the factory, not to transfer attributes to the token _validateTaxProps(tokenLaunchConf.taxParam); bytes32 salt = keccak256( abi.encodePacked(tokenLaunchConf.uuid, block.timestamp) ); bytes32 bankIdHash = keccak256(abi.encodePacked(tokenLaunchConf.uuid)); bytes memory args = abi.encode( address(this), deployer, tokenLaunchConf, inheritedConf ); address deployedAddress = IERC20MachineByBankPad(_machine).deploy( bankIdHash, salt, args ); _tokens[tokenLaunchConf.uuid] = deployedAddress; return IERC20ByBankPad(deployedAddress); } function _initializeLP( IERC20ByBankPad createdToken, IBase.TokenLaunchConf memory param ) private returns (bool, bool, uint256, uint256) { ( bool isLPBurn, bool isTradingDelayed, bool isTradingDisabled, uint256 pairedTokenAmount, uint256 lockPeriod ) = abi.decode(param.lpParam, (bool, bool, bool, uint256, uint256)); require(pairedTokenAmount > 0, "invalid pair token amount"); // add liquidity (uint256 lpAmount, uint256 ethInLP) = _addLP( createdToken, pairedTokenAmount, isLPBurn ); // lock liquidity uint256 ethInLockFee; if (!isLPBurn) ethInLockFee = _lockLP(createdToken, lpAmount, lockPeriod); return (isTradingDelayed, isTradingDisabled, ethInLP, ethInLockFee); } /// @dev Add liquidity to the uniswap router /// LP is burnt if the burn flag is set /// @return uint256 created LP amount /// @return uint256 if pair is eth, return eth amount function _addLP( IERC20ByBankPad createdToken, uint256 pairedTokenAmount, bool isLPBurn ) private returns (uint256, uint256) { (address dexRouter_, address basePairedToken, ) = createdToken .ammAddresses(); IDexRouter dexRouter = IDexRouter(dexRouter_); uint256 createdTokenAmount = createdToken.balanceOf(address(this)); IERC20(address(createdToken)).safeApprove( address(dexRouter), createdTokenAmount ); require( pairedTokenAmount >= _minPairTokenAmounts[basePairedToken], "too small pair amount" ); if (basePairedToken == ETH_ADDRESS) { (, , uint256 lpAmount) = dexRouter.addLiquidityETH{ value: pairedTokenAmount }( address(createdToken), createdTokenAmount, 0, 0, isLPBurn ? address(0xdead) : address(this), block.timestamp + 300 ); return (lpAmount, pairedTokenAmount); } else { IERC20(basePairedToken).safeTransferFrom( _msgSender(), address(this), pairedTokenAmount ); IERC20(basePairedToken).safeApprove( address(dexRouter), pairedTokenAmount ); (, , uint256 lpAmount) = dexRouter.addLiquidity( address(createdToken), basePairedToken, createdTokenAmount, pairedTokenAmount, 0, 0, isLPBurn ? address(0xdead) : address(this), block.timestamp + 300 ); return (lpAmount, 0); } } /// @dev Lock LP into unicrypt lp locker contract /// We pay fee in ETH /// @return uint256 fee amount function _lockLP( IERC20ByBankPad createdToken, uint256 lpAmount, uint256 lockPeriod ) private returns (uint256) { require(lockPeriod >= _minLockPeriod, "too short lock"); (address dexRouter, , address baseAmmPair) = createdToken .ammAddresses(); IUniLocker lockerForDex = IUniLocker(_lpLockers[dexRouter]); require( address(lockerForDex) != address(0), "unsupported dex for lock" ); uint256 ethFee = lockerForDex.gFees().ethFee; IERC20(baseAmmPair).safeApprove(address(lockerForDex), lpAmount); lockerForDex.lockLPToken{value: ethFee}( baseAmmPair, lpAmount, block.timestamp + lockPeriod, payable(address(0)), true, payable(_msgSender()) // , // 11 // country code is used in the testnet ); return ethFee; } /** * @notice function {pauseFactory} * * Pause factory for the maintenance */ function pauseFactory(bool flag) external onlyOwner { if (flag) _pause(); else _unpause(); } /// @notice It allows the admin to recover tokens sent to the contract /// @param token_: the address of the token to withdraw /// @param amount_: the number of tokens to withdraw /// @dev Only owner can call this function function recoverToken(address token_, uint256 amount_) external onlyOwner { IERC20(token_).safeTransfer(_msgSender(), amount_); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"servicePayAccount_","type":"address"},{"internalType":"uint256","name":"launchFee_","type":"uint256"},{"internalType":"uint256","name":"delayedTradingFee_","type":"uint256"},{"internalType":"uint256","name":"tradingDisableFee_","type":"uint256"},{"internalType":"uint256","name":"antiDumpFee_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"bankPadTax","type":"uint16"}],"name":"BankPadTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"ManualEnableTradingForUUIDUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxLaunches","type":"uint16"}],"name":"MaxLaunchesPerWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxTax","type":"uint16"}],"name":"MaxTaxToRenounceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"MaxTeamAllocUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"MaxTeamAllocUpdatedForUUID","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"MinLockPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pairToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinPairTokenAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"serviceAccount","type":"address"},{"indexed":false,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"uuidHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"serviceFee","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes","name":"distribParam","type":"bytes"},{"internalType":"bytes","name":"antiBotParam","type":"bytes"},{"internalType":"bytes","name":"taxParam","type":"bytes"},{"internalType":"bytes","name":"lpParam","type":"bytes"}],"indexed":false,"internalType":"struct IBase.TokenLaunchConf","name":"tokenLaunchConf","type":"tuple"},{"components":[{"internalType":"uint16","name":"autoBurnFirstPercent","type":"uint16"},{"internalType":"uint16","name":"autoBurnSecondPercent","type":"uint16"},{"internalType":"uint16","name":"autoBurnThirdPercent","type":"uint16"},{"internalType":"uint16","name":"thresholdPercent","type":"uint16"},{"internalType":"uint16","name":"maxBuyTaxAfter","type":"uint16"},{"internalType":"uint16","name":"maxSellTaxAfter","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTaxAfter","type":"uint16"},{"internalType":"uint16","name":"bankPadTax","type":"uint16"},{"internalType":"uint16","name":"maxTaxToRenounce","type":"uint16"},{"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"},{"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"internalType":"uint32","name":"tradingDisableTime","type":"uint32"}],"indexed":false,"internalType":"struct IBase.InheritedConf","name":"inheritedConf","type":"tuple"}],"name":"NewTokenCreated","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"launchFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradingDelayFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradingDisableFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"antiDumpFee","type":"uint256"}],"name":"ServiceFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"account","type":"address"}],"name":"ServicePayAccountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"firstPercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"secondPercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"thirdPercent","type":"uint16"}],"name":"SnipeAutoBurnPercentsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"TaxAfterLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"TaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"percent","type":"uint16"}],"name":"ThreasholdPercentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"tradingDisableTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"}],"name":"TimeConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"bankMachine","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bankPadTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes","name":"distribParam","type":"bytes"},{"internalType":"bytes","name":"antiBotParam","type":"bytes"},{"internalType":"bytes","name":"taxParam","type":"bytes"},{"internalType":"bytes","name":"lpParam","type":"bytes"}],"internalType":"struct IBase.TokenLaunchConf","name":"tokenLaunchConf","type":"tuple"}],"name":"createERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"isUUIDWhitelistedForManualEnableTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"launchedCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"}],"name":"lpLocker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLaunchesPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTaxToRenounce","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTeamAlloc","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"maxTeamAllocForUUID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pairToken","type":"address"}],"name":"minPairTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"pauseFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"servicePayAccount","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipeAutoBurnPercents","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxAfterLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholdPercent","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConfiguration","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"machine","type":"address"}],"name":"updateBankMachine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"}],"name":"updateBankPadTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"address","name":"newLocker","type":"address"}],"name":"updateLPLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxLaunches","type":"uint16"}],"name":"updateMaxLaunchesPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxTax","type":"uint16"}],"name":"updateMaxTaxToRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"updateMaxTeamAlloc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"updateMaxTeamAllocForUUID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"updateMinLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinPairTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"launchFee","type":"uint256"},{"internalType":"uint256","name":"tradingDelayFee","type":"uint256"},{"internalType":"uint256","name":"tradingDisableFee","type":"uint256"},{"internalType":"uint256","name":"antiDumpFee","type":"uint256"}],"name":"updateServiceFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"updateServicePayAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"firstPercent","type":"uint16"},{"internalType":"uint16","name":"secondPercent","type":"uint16"},{"internalType":"uint16","name":"thirdPercent","type":"uint16"}],"name":"updateSnipeAutoBurnPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"updateTaxAfterLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"updateTaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"percent","type":"uint16"}],"name":"updateThresholdPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"internalType":"uint32","name":"tradingDisableTime","type":"uint32"},{"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"}],"name":"updateTimeConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"whitelistUUIDForManualEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040525f80546001600160a01b039081166a1f405dc05dc029a053507d60a41b17909155600180546001600160a01b03191672093a800000003c0002a30000278d0001f403e8179055600280549091166a19003e81b581b58001807d60a31b17905562278d0060045534801562000076575f80fd5b50604051620035903803806200359083398101604081905262000099916200018e565b620000a4336200013f565b600f805460ff191690556001600160a01b038516620001095760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420706179206163636f756e7400000000000000000000000000604482015260640160405180910390fd5b600280546001600160a01b0319166001600160a01b039690961695909517909455600592909255600655600755600855620001e0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f805f60a08688031215620001a3575f80fd5b85516001600160a01b0381168114620001ba575f80fd5b602087015160408801516060890151608090990151929a91995097965090945092505050565b6133a280620001ee5f395ff3fe608060405260043610610254575f3560e01c8063870f85681161013f578063c1733f68116100b3578063cfc16cea11610078578063cfc16cea146107bf578063e602ab8b146107de578063eb1c8349146107fd578063f1c71cd414610835578063f2fde38b14610854578063fd109d7714610873575f80fd5b8063c1733f681461072d578063c2d4f9421461074c578063c524e82e14610769578063c5d4191514610781578063cb2df418146107a0575f80fd5b8063a103657e11610104578063a103657e1461065e578063a315682614610692578063acd33f31146106b1578063b29a8140146106d0578063b74e68a5146106ef578063bcf480701461070e575f80fd5b8063870f8568146105d257806387b27a95146105f15780638da5cb5b1461060457806397abb762146106205780639c030fc01461063f575f80fd5b806351186e9e116101d657806373ae54b51161019b57806373ae54b5146104a75780637c678b16146104bb57806380857ffa146104ec57806380c746531461052457806381b31abd1461057c57806382b0f7d0146105b3575f80fd5b806351186e9e1461041357806357824338146104325780635c975abb146104515780635f57ef2c14610474578063715018a614610493575f80fd5b806329c66e381161021c57806329c66e38146103525780632b142918146103845780632fdd75bf146103a357806349deaf4f146103d65780634a1db646146103f4575f80fd5b806305860c24146102585780630d426b00146102795780630d777758146102d25780630e8a284f1461031457806313345cf914610333575b5f80fd5b348015610263575f80fd5b506102776102723660046127b6565b610892565b005b348015610284575f80fd5b505f5461ffff600160a01b8204811691600160b01b8104821691600160c01b909104165b6040805161ffff948516815292841660208401529216918101919091526060015b60405180910390f35b3480156102dd575f80fd5b506103066102ec366004612812565b6001600160a01b03165f908152600d602052604090205490565b6040519081526020016102c9565b34801561031f575f80fd5b5061027761032e366004612834565b610981565b34801561033e575f80fd5b5061027761034d366004612812565b6109e1565b34801561035d575f80fd5b5061037161036c366004612894565b610a96565b60405161ffff90911681526020016102c9565b34801561038f575f80fd5b5061027761039e366004612812565b610ae4565b3480156103ae575f80fd5b505f5461ffff600160d01b8204811691600160e01b8104821691600160f01b909104166102a8565b3480156103e1575f80fd5b5060015462010000900461ffff16610371565b3480156103ff575f80fd5b50600254600160a01b900461ffff16610371565b34801561041e575f80fd5b5061027761042d366004612834565b610b56565b34801561043d575f80fd5b5061027761044c3660046128d3565b610bae565b34801561045c575f80fd5b50600f5460ff165b60405190151581526020016102c9565b34801561047f575f80fd5b5061027761048e366004612928565b610c46565b34801561049e575f80fd5b50610277610c67565b3480156104b2575f80fd5b50600454610306565b3480156104c6575f80fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016102c9565b3480156104f7575f80fd5b506005546006546007546008546040805194855260208501939093529183015260608201526080016102c9565b34801561052f575f80fd5b506001546040805163ffffffff600160601b840481168252600160801b8404811660208301526401000000008404811692820192909252600160401b9092041660608201526080016102c9565b348015610587575f80fd5b506104d4610596366004612812565b6001600160a01b039081165f908152600960205260409020541690565b3480156105be575f80fd5b50600254600160b01b900461ffff16610371565b3480156105dd575f80fd5b506102776105ec3660046127b6565b610c7a565b6104d46105ff366004612a2d565b610d56565b34801561060f575f80fd5b505f546001600160a01b03166104d4565b34801561062b575f80fd5b5061027761063a366004612b67565b611038565b34801561064a575f80fd5b50610277610659366004612b91565b611097565b348015610669575f80fd5b5060025461ffff600160c01b8204811691600160d01b8104821691600160e01b909104166102a8565b34801561069d575f80fd5b506102776106ac366004612834565b6110d4565b3480156106bc575f80fd5b506102776106cb366004612ba8565b61112a565b3480156106db575f80fd5b506102776106ea366004612b67565b611197565b3480156106fa575f80fd5b50610277610709366004612bf0565b6111b7565b348015610719575f80fd5b50610277610728366004612c32565b611222565b348015610738575f80fd5b506104d4610747366004612c83565b6112ea565b348015610757575f80fd5b506002546001600160a01b03166104d4565b348015610774575f80fd5b5060015461ffff16610371565b34801561078c575f80fd5b5061027761079b3660046127b6565b61131a565b3480156107ab575f80fd5b506104646107ba366004612894565b6113f7565b3480156107ca575f80fd5b50600254600160f01b900461ffff16610371565b3480156107e9575f80fd5b506102776107f8366004612834565b611425565b348015610808575f80fd5b50610371610817366004612812565b6001600160a01b03165f908152600e602052604090205461ffff1690565b348015610840575f80fd5b5061027761084f366004612834565b611471565b34801561085f575f80fd5b5061027761086e366004612812565b6114ef565b34801561087e575f80fd5b5061027761088d366004612cb5565b611565565b61089a61159a565b610dac8361ffff16111580156108b65750610dac8261ffff1611155b80156108c857506101f48161ffff1611155b6108ed5760405162461bcd60e51b81526004016108e490612cec565b60405180910390fd5b5f805463ffffffff60d01b1916600160d01b61ffff86811691820261ffff60e01b191692909217600160e01b868416908102919091176001600160f01b0316600160f01b93861693840217909355604080519182526020820193909352918201527f8157027eb85fd89b2efb2911c47299c62a2f43927770288915a57ff5aa9aff78906060015b60405180910390a1505050565b61098961159a565b600280546001600160f01b0316600160f01b61ffff8416908102919091179091556040519081527f7f3fa83ef903b3f2c7c62018f605865e7da7cecfd8bbf8a8702f9a82f02546e9906020015b60405180910390a150565b6109e961159a565b6001600160a01b038116610a355760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081c185e481858d8dbdd5b9d606a1b60448201526064016108e4565b610a486001600160a01b0382165f6115f3565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f3625e9e992e84551991603867426211da9c3e048e19eb2aac8e5f1bda7e5f92b906020016109d6565b5f80600b8484604051610aaa929190612d12565b9081526040519081900360200190205461ffff1690508015610acd579050610ade565b5050600254600160a01b900461ffff165b92915050565b610aec61159a565b6001600160a01b038116610b345760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206d616368696e6560881b60448201526064016108e4565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610b5e61159a565b6002805461ffff60b01b1916600160b01b61ffff8416908102919091179091556040519081527f0d5dfa7e3ffdf0daca1d63bd5ab5c65827be4c580153bef4544eb2512afa12bf906020016109d6565b610bb661159a565b61271061ffff82161115610bdc5760405162461bcd60e51b81526004016108e490612cec565b80600b8484604051610bef929190612d12565b908152604051908190036020018120805461ffff9390931661ffff19909316929092179091557fa9a9f157d989d2731dd74a16d2e9f7e9caacb51e0a7cd33b7ec6a1d3908f55209061097490859085908590612d49565b610c4e61159a565b8015610c5f57610c5c61170d565b50565b610c5c611767565b610c6f61159a565b610c785f6117a0565b565b610c8261159a565b610dac8361ffff1611158015610c9e57506107d08261ffff1611155b8015610cb057506103e88161ffff1611155b610ccc5760405162461bcd60e51b81526004016108e490612cec565b5f805463ffffffff60a01b1916600160a01b61ffff86811691820261ffff60b01b191692909217600160b01b8684169081029190911761ffff60c01b1916600160c01b93861693840217909355604080519182526020820193909352918201527f5fa708f2b10f2c2a41a460fe7ec148a656813df1ea95b47e8161bc95166e5a9290606001610974565b5f610d5f6117ef565b815160405134915f91600a91610d7491612d92565b908152604051908190036020019020546001600160a01b031614610dcc5760405162461bcd60e51b815260206004820152600f60248201526e191d5c1b1a58d85d1959081d5d5a59608a1b60448201526064016108e4565b5f610dd9845f0151611835565b90505f610de6858361194b565b90505f805f80610df6858a611b36565b93509350935093505f856001600160a01b0316633e4042286040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5f9190612dad565b610e69575f610e6d565b6008545b84610e78575f610e7c565b6007545b86610e87575f610e8b565b6006545b600554610e989190612ddc565b610ea29190612ddc565b610eac9190612ddc565b905081610eb98483612ddc565b610ec39190612ddc565b881015610f055760405162461bcd60e51b815260206004820152601060248201526f0d2dce6eaccccd2c6d2cadce840cae8d60831b60448201526064016108e4565b600254610f1b906001600160a01b0316476115f3565b60405163f519b7d360e01b8152851515600482015284151560248201526001600160a01b0387169063f519b7d3906044015f604051808303815f87803b158015610f63575f80fd5b505af1158015610f75573d5f803e3d5ffd5b50506002547fbfb1a5c4fca493a57c57587e08bae3f9c87261c756239ba42d9ccd4f27b1e57992508891506001600160a01b031633896001600160a01b031663b4b37bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100a9190612def565b858f8d6040516110209796959493929190612fde565b60405180910390a1509396505050505050505b919050565b61104061159a565b6001600160a01b0382165f818152600d6020908152604091829020849055815192835282018390527f4fe473bd5cc90e6c73cf11d29f6cc091faa692024afacfdb69bc9a9abebfb618910160405180910390a15050565b61109f61159a565b60048190556040518181527fe818ff6972bf8970ca14a893539e57452588b197b76e6afe29c40a31b3363c61906020016109d6565b6110dc61159a565b6001805463ffff000019166201000061ffff8416908102919091179091556040519081527f269f7677f1796af445e0c26473b7cede0cdee7ee422179b8b7b1438344a73af3906020016109d6565b61113261159a565b80600c8484604051611145929190612d12565b908152604051908190036020018120805492151560ff19909316929092179091557fc8729436e2f8fcb79ab0f757a04f56302b14f2f2c80b43f0caa626870ca11506906109749085908590859061303c565b61119f61159a565b6111b36001600160a01b0383163383611bea565b5050565b6111bf61159a565b60058490556006839055600782905560088190556040805185815260208101859052908101839052606081018290527f843719a8988f9a856dfa922ecd43b71c9dcfcedbd2d42f44fbf1ed39a9366606906080015b60405180910390a150505050565b61122a61159a565b6001805467ffffffffffffffff60601b1916600160601b63ffffffff87811691820263ffffffff60801b191692909217600160801b878416908102919091176bffffffffffffffff0000000019166401000000008785169081026bffffffff0000000000000000191691909117600160401b9487169485021790945560408051928352602083019190915281019290925260608201527fcac069ca087ac0dfda6b83c11d979488cb43699e375b64862130e9005b1c33e990608001611214565b5f600a826040516112fb9190612d92565b908152604051908190036020019020546001600160a01b031692915050565b61132261159a565b610dac8361ffff161115801561133e5750610dac8261ffff1611155b801561135057506101f48161ffff1611155b61136c5760405162461bcd60e51b81526004016108e490612cec565b6002805463ffffffff60c01b1916600160c01b61ffff86811691820261ffff60d01b191692909217600160d01b8684169081029190911761ffff60e01b1916600160e01b93861693840217909355604080519182526020820193909352918201527f29f254017ff4765c884ec3d1a19c84421b8afb55dc41de389a9869699b3a038590606001610974565b5f600c838360405161140a929190612d12565b9081526040519081900360200190205460ff16905092915050565b61142d61159a565b6001805461ffff191661ffff83169081179091556040519081527fa5d64adc4dabd69870f1a872d07b3d117150f1bfd0d046d7c35243f141fe0819906020016109d6565b61147961159a565b61271061ffff8216111561149f5760405162461bcd60e51b81526004016108e490612cec565b6002805461ffff60a01b1916600160a01b61ffff8416908102919091179091556040519081527f39bbc533273be90b6ca32ee9b59e96795cf54c48c5388c9c00af1e509d2ffbb9906020016109d6565b6114f761159a565b6001600160a01b03811661155c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e4565b610c5c816117a0565b61156d61159a565b6001600160a01b039182165f90815260096020526040902080546001600160a01b03191691909216179055565b5f546001600160a01b03163314610c785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b804710156116435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108e4565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461168c576040519150601f19603f3d011682016040523d82523d5f602084013e611691565b606091505b50509050806117085760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108e4565b505050565b6117156117ef565b600f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861174a3390565b6040516001600160a01b03909116815260200160405180910390a1565b61176f611c4d565b600f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361174a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600f5460ff1615610c785760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108e4565b61183d61273c565b61184561273c565b5f5461ffff600160a01b820481168352600160b01b820481166020840152600160c01b82048116604080850191909152600254600160f01b9081900483166060860152600160d01b840483166080860152600160e01b8404831660a0860152909204811660c084015260015480821660e085015262010000810490911661010084015263ffffffff64010000000082048116610120850152600160401b82048116610140850152600160601b9091041661016083015251600c9061190a908590612d92565b9081526040519081900360200190205460ff1661193657600154600160801b900463ffffffff16611939565b5f195b63ffffffff1661018082015292915050565b335f818152600e602052604081205460025491929161ffff91821691600160b01b9091041681106119ae5760405162461bcd60e51b815260206004820152600d60248201526c1bdd995c881b185d5b98da1959609a1b60448201526064016108e4565b6119b781613061565b6001600160a01b0383165f908152600e60205260409020805461ffff191661ffff831617905560a08601519091506119ee90611c96565b84516040515f91611a03914290602001613081565b60408051601f1981840301815290829052805160209182012088519093505f92611a2d9201612d92565b6040516020818303038152906040528051906020012090505f30858989604051602001611a5d94939291906130a2565b60408051601f198184030181529082905260035463d76fad2360e01b83529092505f916001600160a01b039091169063d76fad2390611aa4908690889087906004016130de565b6020604051808303815f875af1158015611ac0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae491906130fc565b905080600a8a5f0151604051611afa9190612d92565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790559550505050505092915050565b5f805f805f805f805f8960c00151806020019051810190611b579190613117565b945094509450945094505f8211611bb05760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207061697220746f6b656e20616d6f756e740000000000000060448201526064016108e4565b5f80611bbd8d8589611e09565b915091505f87611bd557611bd28e848661215a565b90505b959d949c509a50939850919650505050505050565b6040516001600160a01b03831660248201526044810182905261170890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261238e565b600f5460ff16610c785760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108e4565b5f805f83806020019051810190611cad9190613171565b96509650965050505050600260189054906101000a900461ffff1661ffff168361ffff1611158015611cf0575060025461ffff600160d01b909104811690831611155b8015611d0d575060025461ffff600160e01b909104811690821611155b611d485760405162461bcd60e51b815260206004820152600c60248201526b0e8dede40daeac6d040e8c2f60a31b60448201526064016108e4565b60015461ffff1661271080611d5d8382613208565b61ffff16611d6b8588613208565b61ffff16611d79919061322a565b611d839190613241565b11158015611dc3575061271080611d9a8382613208565b61ffff16611da88587613208565b61ffff16611db6919061322a565b611dc09190613241565b11155b611e025760405162461bcd60e51b815260206004820152601060248201526f746178206f7574206f662072616e676560801b60448201526064016108e4565b5050505050565b5f805f80866001600160a01b0316637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6d9190613260565b506040516370a0823160e01b8152306004820152919350915082905f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611edd9190612def565b9050611ef36001600160a01b038a168383612461565b6001600160a01b0383165f908152600d6020526040902054881015611f525760405162461bcd60e51b81526020600482015260156024820152741d1bdbc81cdb585b1b081c185a5c88185b5bdd5b9d605a1b60448201526064016108e4565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03841601612049575f826001600160a01b031663f305d7198a8c855f808e611f975730611f9b565b61dead5b611fa74261012c612ddc565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015612012573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612037919061329f565b98508a97506121529650505050505050565b61205e6001600160a01b03841633308b612574565b6120726001600160a01b038416838a612461565b5f826001600160a01b031663e8e337008b86858d5f808f6120935730612097565b61dead5b6120a34261012c612ddc565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303815f875af115801561211c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612140919061329f565b98505f97506121529650505050505050565b935093915050565b5f60045482101561219e5760405162461bcd60e51b815260206004820152600e60248201526d746f6f2073686f7274206c6f636b60901b60448201526064016108e4565b5f80856001600160a01b0316637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122009190613260565b6001600160a01b038084165f90815260096020526040902054939550909350919091169050806122725760405162461bcd60e51b815260206004820152601860248201527f756e737570706f727465642064657820666f72206c6f636b000000000000000060448201526064016108e4565b5f816001600160a01b03166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa1580156122b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d491906132d5565b5190506122eb6001600160a01b0384168389612461565b6001600160a01b038216638af416f682858a6123078b42612ddc565b604080516001600160e01b031960e088901b1681526001600160a01b03949094166004850152602484019290925260448301525f60648301819052600160848401523360a4840152905160c48084019382900301818588803b15801561236b575f80fd5b505af115801561237d573d5f803e3d5ffd5b50939b9a5050505050505050505050565b5f6123e2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125b29092919063ffffffff16565b905080515f14806124025750808060200190518101906124029190612dad565b6117085760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108e4565b8015806124d95750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d79190612def565b155b6125445760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016108e4565b6040516001600160a01b03831660248201526044810182905261170890849063095ea7b360e01b90606401611c16565b6040516001600160a01b03808516602483015283166044820152606481018290526125ac9085906323b872dd60e01b90608401611c16565b50505050565b60606125c084845f856125c8565b949350505050565b6060824710156126295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108e4565b5f80866001600160a01b031685876040516126449190612d92565b5f6040518083038185875af1925050503d805f811461267e576040519150601f19603f3d011682016040523d82523d5f602084013e612683565b606091505b50915091506126948783838761269f565b979650505050505050565b6060831561270d5782515f03612706576001600160a01b0385163b6127065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108e4565b50816125c0565b6125c083838151156127225781518083602001fd5b8060405162461bcd60e51b81526004016108e4919061335a565b604080516101a0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b61ffff81168114610c5c575f80fd5b5f805f606084860312156127c8575f80fd5b83356127d3816127a7565b925060208401356127e3816127a7565b915060408401356127f3816127a7565b809150509250925092565b6001600160a01b0381168114610c5c575f80fd5b5f60208284031215612822575f80fd5b813561282d816127fe565b9392505050565b5f60208284031215612844575f80fd5b813561282d816127a7565b5f8083601f84011261285f575f80fd5b50813567ffffffffffffffff811115612876575f80fd5b60208301915083602082850101111561288d575f80fd5b9250929050565b5f80602083850312156128a5575f80fd5b823567ffffffffffffffff8111156128bb575f80fd5b6128c78582860161284f565b90969095509350505050565b5f805f604084860312156128e5575f80fd5b833567ffffffffffffffff8111156128fb575f80fd5b6129078682870161284f565b90945092505060208401356127f3816127a7565b8015158114610c5c575f80fd5b5f60208284031215612938575f80fd5b813561282d8161291b565b634e487b7160e01b5f52604160045260245ffd5b60405160e0810167ffffffffffffffff8111828210171561297a5761297a612943565b60405290565b604051610120810167ffffffffffffffff8111828210171561297a5761297a612943565b5f82601f8301126129b3575f80fd5b813567ffffffffffffffff808211156129ce576129ce612943565b604051601f8301601f19908116603f011681019082821181831017156129f6576129f6612943565b81604052838152866020858801011115612a0e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215612a3d575f80fd5b813567ffffffffffffffff80821115612a54575f80fd5b9083019060e08286031215612a67575f80fd5b612a6f612957565b823582811115612a7d575f80fd5b612a89878286016129a4565b825250602083013582811115612a9d575f80fd5b612aa9878286016129a4565b602083015250604083013582811115612ac0575f80fd5b612acc878286016129a4565b604083015250606083013582811115612ae3575f80fd5b612aef878286016129a4565b606083015250608083013582811115612b06575f80fd5b612b12878286016129a4565b60808301525060a083013582811115612b29575f80fd5b612b35878286016129a4565b60a08301525060c083013582811115612b4c575f80fd5b612b58878286016129a4565b60c08301525095945050505050565b5f8060408385031215612b78575f80fd5b8235612b83816127fe565b946020939093013593505050565b5f60208284031215612ba1575f80fd5b5035919050565b5f805f60408486031215612bba575f80fd5b833567ffffffffffffffff811115612bd0575f80fd5b612bdc8682870161284f565b90945092505060208401356127f38161291b565b5f805f8060808587031215612c03575f80fd5b5050823594602084013594506040840135936060013592509050565b803563ffffffff81168114611033575f80fd5b5f805f8060808587031215612c45575f80fd5b612c4e85612c1f565b9350612c5c60208601612c1f565b9250612c6a60408601612c1f565b9150612c7860608601612c1f565b905092959194509250565b5f60208284031215612c93575f80fd5b813567ffffffffffffffff811115612ca9575f80fd5b6125c0848285016129a4565b5f8060408385031215612cc6575f80fd5b8235612cd1816127fe565b91506020830135612ce1816127fe565b809150509250929050565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f612d5c604083018587612d21565b905061ffff83166020830152949350505050565b5f5b83811015612d8a578181015183820152602001612d72565b50505f910152565b5f8251612da3818460208701612d70565b9190910192915050565b5f60208284031215612dbd575f80fd5b815161282d8161291b565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ade57610ade612dc8565b5f60208284031215612dff575f80fd5b5051919050565b5f8151808452612e1d816020860160208601612d70565b601f01601f19169290920160200192915050565b5f815160e08452612e4560e0850182612e06565b905060208301518482036020860152612e5e8282612e06565b91505060408301518482036040860152612e788282612e06565b91505060608301518482036060860152612e928282612e06565b91505060808301518482036080860152612eac8282612e06565b91505060a083015184820360a0860152612ec68282612e06565b91505060c083015184820360c0860152612ee08282612e06565b95945050505050565b805161ffff1682526020810151612f06602084018261ffff169052565b506040810151612f1c604084018261ffff169052565b506060810151612f32606084018261ffff169052565b506080810151612f48608084018261ffff169052565b5060a0810151612f5e60a084018261ffff169052565b5060c0810151612f7460c084018261ffff169052565b5060e0810151612f8a60e084018261ffff169052565b506101008181015161ffff16908301526101208082015163ffffffff9081169184019190915261014080830151821690840152610160808301518216908401526101808083015191821681850152906125ac565b6001600160a01b038881168252878116602083015286166040820152606081018590526080810184905261026060a082018190525f9061302083820186612e31565b91505061303060c0830184612ee9565b98975050505050505050565b604081525f61304f604083018587612d21565b90508215156020830152949350505050565b5f61ffff80831681810361307757613077612dc8565b6001019392505050565b5f8351613092818460208801612d70565b9190910191825250602001919050565b6001600160a01b03858116825284166020820152610200604082018190525f906130ce83820186612e31565b915050612ee06060830184612ee9565b838152826020820152606060408201525f612ee06060830184612e06565b5f6020828403121561310c575f80fd5b815161282d816127fe565b5f805f805f60a0868803121561312b575f80fd5b85516131368161291b565b60208701519095506131478161291b565b60408701519094506131588161291b565b6060870151608090970151959894975095949392505050565b5f805f805f805f60e0888a031215613187575f80fd5b8751613192816127fe565b60208901519097506131a3816127fe565b60408901519096506131b4816127fe565b60608901519095506131c5816127fe565b60808901519094506131d6816127a7565b60a08901519093506131e7816127a7565b60c08901519092506131f8816127a7565b8091505092959891949750929550565b61ffff81811683821601908082111561322357613223612dc8565b5092915050565b8082028115828204841417610ade57610ade612dc8565b5f8261325b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f60608486031215613272575f80fd5b835161327d816127fe565b602085015190935061328e816127fe565b60408501519092506127f3816127fe565b5f805f606084860312156132b1575f80fd5b8351925060208401519150604084015190509250925092565b8051611033816127fe565b5f61012082840312156132e6575f80fd5b6132ee612980565b825181526132fe602084016132ca565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261333760c084016132ca565b60c082015260e08381015190820152610100928301519281019290925250919050565b602081525f61282d6020830184612e0656fea2646970667358221220cb5b3bd5764be55aee0558a3c4e667cf96b4169f0b28b018ff9da1ea8d3bc38664736f6c6343000818003300000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000
Deployed Bytecode
0x608060405260043610610254575f3560e01c8063870f85681161013f578063c1733f68116100b3578063cfc16cea11610078578063cfc16cea146107bf578063e602ab8b146107de578063eb1c8349146107fd578063f1c71cd414610835578063f2fde38b14610854578063fd109d7714610873575f80fd5b8063c1733f681461072d578063c2d4f9421461074c578063c524e82e14610769578063c5d4191514610781578063cb2df418146107a0575f80fd5b8063a103657e11610104578063a103657e1461065e578063a315682614610692578063acd33f31146106b1578063b29a8140146106d0578063b74e68a5146106ef578063bcf480701461070e575f80fd5b8063870f8568146105d257806387b27a95146105f15780638da5cb5b1461060457806397abb762146106205780639c030fc01461063f575f80fd5b806351186e9e116101d657806373ae54b51161019b57806373ae54b5146104a75780637c678b16146104bb57806380857ffa146104ec57806380c746531461052457806381b31abd1461057c57806382b0f7d0146105b3575f80fd5b806351186e9e1461041357806357824338146104325780635c975abb146104515780635f57ef2c14610474578063715018a614610493575f80fd5b806329c66e381161021c57806329c66e38146103525780632b142918146103845780632fdd75bf146103a357806349deaf4f146103d65780634a1db646146103f4575f80fd5b806305860c24146102585780630d426b00146102795780630d777758146102d25780630e8a284f1461031457806313345cf914610333575b5f80fd5b348015610263575f80fd5b506102776102723660046127b6565b610892565b005b348015610284575f80fd5b505f5461ffff600160a01b8204811691600160b01b8104821691600160c01b909104165b6040805161ffff948516815292841660208401529216918101919091526060015b60405180910390f35b3480156102dd575f80fd5b506103066102ec366004612812565b6001600160a01b03165f908152600d602052604090205490565b6040519081526020016102c9565b34801561031f575f80fd5b5061027761032e366004612834565b610981565b34801561033e575f80fd5b5061027761034d366004612812565b6109e1565b34801561035d575f80fd5b5061037161036c366004612894565b610a96565b60405161ffff90911681526020016102c9565b34801561038f575f80fd5b5061027761039e366004612812565b610ae4565b3480156103ae575f80fd5b505f5461ffff600160d01b8204811691600160e01b8104821691600160f01b909104166102a8565b3480156103e1575f80fd5b5060015462010000900461ffff16610371565b3480156103ff575f80fd5b50600254600160a01b900461ffff16610371565b34801561041e575f80fd5b5061027761042d366004612834565b610b56565b34801561043d575f80fd5b5061027761044c3660046128d3565b610bae565b34801561045c575f80fd5b50600f5460ff165b60405190151581526020016102c9565b34801561047f575f80fd5b5061027761048e366004612928565b610c46565b34801561049e575f80fd5b50610277610c67565b3480156104b2575f80fd5b50600454610306565b3480156104c6575f80fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016102c9565b3480156104f7575f80fd5b506005546006546007546008546040805194855260208501939093529183015260608201526080016102c9565b34801561052f575f80fd5b506001546040805163ffffffff600160601b840481168252600160801b8404811660208301526401000000008404811692820192909252600160401b9092041660608201526080016102c9565b348015610587575f80fd5b506104d4610596366004612812565b6001600160a01b039081165f908152600960205260409020541690565b3480156105be575f80fd5b50600254600160b01b900461ffff16610371565b3480156105dd575f80fd5b506102776105ec3660046127b6565b610c7a565b6104d46105ff366004612a2d565b610d56565b34801561060f575f80fd5b505f546001600160a01b03166104d4565b34801561062b575f80fd5b5061027761063a366004612b67565b611038565b34801561064a575f80fd5b50610277610659366004612b91565b611097565b348015610669575f80fd5b5060025461ffff600160c01b8204811691600160d01b8104821691600160e01b909104166102a8565b34801561069d575f80fd5b506102776106ac366004612834565b6110d4565b3480156106bc575f80fd5b506102776106cb366004612ba8565b61112a565b3480156106db575f80fd5b506102776106ea366004612b67565b611197565b3480156106fa575f80fd5b50610277610709366004612bf0565b6111b7565b348015610719575f80fd5b50610277610728366004612c32565b611222565b348015610738575f80fd5b506104d4610747366004612c83565b6112ea565b348015610757575f80fd5b506002546001600160a01b03166104d4565b348015610774575f80fd5b5060015461ffff16610371565b34801561078c575f80fd5b5061027761079b3660046127b6565b61131a565b3480156107ab575f80fd5b506104646107ba366004612894565b6113f7565b3480156107ca575f80fd5b50600254600160f01b900461ffff16610371565b3480156107e9575f80fd5b506102776107f8366004612834565b611425565b348015610808575f80fd5b50610371610817366004612812565b6001600160a01b03165f908152600e602052604090205461ffff1690565b348015610840575f80fd5b5061027761084f366004612834565b611471565b34801561085f575f80fd5b5061027761086e366004612812565b6114ef565b34801561087e575f80fd5b5061027761088d366004612cb5565b611565565b61089a61159a565b610dac8361ffff16111580156108b65750610dac8261ffff1611155b80156108c857506101f48161ffff1611155b6108ed5760405162461bcd60e51b81526004016108e490612cec565b60405180910390fd5b5f805463ffffffff60d01b1916600160d01b61ffff86811691820261ffff60e01b191692909217600160e01b868416908102919091176001600160f01b0316600160f01b93861693840217909355604080519182526020820193909352918201527f8157027eb85fd89b2efb2911c47299c62a2f43927770288915a57ff5aa9aff78906060015b60405180910390a1505050565b61098961159a565b600280546001600160f01b0316600160f01b61ffff8416908102919091179091556040519081527f7f3fa83ef903b3f2c7c62018f605865e7da7cecfd8bbf8a8702f9a82f02546e9906020015b60405180910390a150565b6109e961159a565b6001600160a01b038116610a355760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081c185e481858d8dbdd5b9d606a1b60448201526064016108e4565b610a486001600160a01b0382165f6115f3565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f3625e9e992e84551991603867426211da9c3e048e19eb2aac8e5f1bda7e5f92b906020016109d6565b5f80600b8484604051610aaa929190612d12565b9081526040519081900360200190205461ffff1690508015610acd579050610ade565b5050600254600160a01b900461ffff165b92915050565b610aec61159a565b6001600160a01b038116610b345760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206d616368696e6560881b60448201526064016108e4565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610b5e61159a565b6002805461ffff60b01b1916600160b01b61ffff8416908102919091179091556040519081527f0d5dfa7e3ffdf0daca1d63bd5ab5c65827be4c580153bef4544eb2512afa12bf906020016109d6565b610bb661159a565b61271061ffff82161115610bdc5760405162461bcd60e51b81526004016108e490612cec565b80600b8484604051610bef929190612d12565b908152604051908190036020018120805461ffff9390931661ffff19909316929092179091557fa9a9f157d989d2731dd74a16d2e9f7e9caacb51e0a7cd33b7ec6a1d3908f55209061097490859085908590612d49565b610c4e61159a565b8015610c5f57610c5c61170d565b50565b610c5c611767565b610c6f61159a565b610c785f6117a0565b565b610c8261159a565b610dac8361ffff1611158015610c9e57506107d08261ffff1611155b8015610cb057506103e88161ffff1611155b610ccc5760405162461bcd60e51b81526004016108e490612cec565b5f805463ffffffff60a01b1916600160a01b61ffff86811691820261ffff60b01b191692909217600160b01b8684169081029190911761ffff60c01b1916600160c01b93861693840217909355604080519182526020820193909352918201527f5fa708f2b10f2c2a41a460fe7ec148a656813df1ea95b47e8161bc95166e5a9290606001610974565b5f610d5f6117ef565b815160405134915f91600a91610d7491612d92565b908152604051908190036020019020546001600160a01b031614610dcc5760405162461bcd60e51b815260206004820152600f60248201526e191d5c1b1a58d85d1959081d5d5a59608a1b60448201526064016108e4565b5f610dd9845f0151611835565b90505f610de6858361194b565b90505f805f80610df6858a611b36565b93509350935093505f856001600160a01b0316633e4042286040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5f9190612dad565b610e69575f610e6d565b6008545b84610e78575f610e7c565b6007545b86610e87575f610e8b565b6006545b600554610e989190612ddc565b610ea29190612ddc565b610eac9190612ddc565b905081610eb98483612ddc565b610ec39190612ddc565b881015610f055760405162461bcd60e51b815260206004820152601060248201526f0d2dce6eaccccd2c6d2cadce840cae8d60831b60448201526064016108e4565b600254610f1b906001600160a01b0316476115f3565b60405163f519b7d360e01b8152851515600482015284151560248201526001600160a01b0387169063f519b7d3906044015f604051808303815f87803b158015610f63575f80fd5b505af1158015610f75573d5f803e3d5ffd5b50506002547fbfb1a5c4fca493a57c57587e08bae3f9c87261c756239ba42d9ccd4f27b1e57992508891506001600160a01b031633896001600160a01b031663b4b37bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100a9190612def565b858f8d6040516110209796959493929190612fde565b60405180910390a1509396505050505050505b919050565b61104061159a565b6001600160a01b0382165f818152600d6020908152604091829020849055815192835282018390527f4fe473bd5cc90e6c73cf11d29f6cc091faa692024afacfdb69bc9a9abebfb618910160405180910390a15050565b61109f61159a565b60048190556040518181527fe818ff6972bf8970ca14a893539e57452588b197b76e6afe29c40a31b3363c61906020016109d6565b6110dc61159a565b6001805463ffff000019166201000061ffff8416908102919091179091556040519081527f269f7677f1796af445e0c26473b7cede0cdee7ee422179b8b7b1438344a73af3906020016109d6565b61113261159a565b80600c8484604051611145929190612d12565b908152604051908190036020018120805492151560ff19909316929092179091557fc8729436e2f8fcb79ab0f757a04f56302b14f2f2c80b43f0caa626870ca11506906109749085908590859061303c565b61119f61159a565b6111b36001600160a01b0383163383611bea565b5050565b6111bf61159a565b60058490556006839055600782905560088190556040805185815260208101859052908101839052606081018290527f843719a8988f9a856dfa922ecd43b71c9dcfcedbd2d42f44fbf1ed39a9366606906080015b60405180910390a150505050565b61122a61159a565b6001805467ffffffffffffffff60601b1916600160601b63ffffffff87811691820263ffffffff60801b191692909217600160801b878416908102919091176bffffffffffffffff0000000019166401000000008785169081026bffffffff0000000000000000191691909117600160401b9487169485021790945560408051928352602083019190915281019290925260608201527fcac069ca087ac0dfda6b83c11d979488cb43699e375b64862130e9005b1c33e990608001611214565b5f600a826040516112fb9190612d92565b908152604051908190036020019020546001600160a01b031692915050565b61132261159a565b610dac8361ffff161115801561133e5750610dac8261ffff1611155b801561135057506101f48161ffff1611155b61136c5760405162461bcd60e51b81526004016108e490612cec565b6002805463ffffffff60c01b1916600160c01b61ffff86811691820261ffff60d01b191692909217600160d01b8684169081029190911761ffff60e01b1916600160e01b93861693840217909355604080519182526020820193909352918201527f29f254017ff4765c884ec3d1a19c84421b8afb55dc41de389a9869699b3a038590606001610974565b5f600c838360405161140a929190612d12565b9081526040519081900360200190205460ff16905092915050565b61142d61159a565b6001805461ffff191661ffff83169081179091556040519081527fa5d64adc4dabd69870f1a872d07b3d117150f1bfd0d046d7c35243f141fe0819906020016109d6565b61147961159a565b61271061ffff8216111561149f5760405162461bcd60e51b81526004016108e490612cec565b6002805461ffff60a01b1916600160a01b61ffff8416908102919091179091556040519081527f39bbc533273be90b6ca32ee9b59e96795cf54c48c5388c9c00af1e509d2ffbb9906020016109d6565b6114f761159a565b6001600160a01b03811661155c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e4565b610c5c816117a0565b61156d61159a565b6001600160a01b039182165f90815260096020526040902080546001600160a01b03191691909216179055565b5f546001600160a01b03163314610c785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b804710156116435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108e4565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461168c576040519150601f19603f3d011682016040523d82523d5f602084013e611691565b606091505b50509050806117085760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108e4565b505050565b6117156117ef565b600f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861174a3390565b6040516001600160a01b03909116815260200160405180910390a1565b61176f611c4d565b600f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361174a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600f5460ff1615610c785760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108e4565b61183d61273c565b61184561273c565b5f5461ffff600160a01b820481168352600160b01b820481166020840152600160c01b82048116604080850191909152600254600160f01b9081900483166060860152600160d01b840483166080860152600160e01b8404831660a0860152909204811660c084015260015480821660e085015262010000810490911661010084015263ffffffff64010000000082048116610120850152600160401b82048116610140850152600160601b9091041661016083015251600c9061190a908590612d92565b9081526040519081900360200190205460ff1661193657600154600160801b900463ffffffff16611939565b5f195b63ffffffff1661018082015292915050565b335f818152600e602052604081205460025491929161ffff91821691600160b01b9091041681106119ae5760405162461bcd60e51b815260206004820152600d60248201526c1bdd995c881b185d5b98da1959609a1b60448201526064016108e4565b6119b781613061565b6001600160a01b0383165f908152600e60205260409020805461ffff191661ffff831617905560a08601519091506119ee90611c96565b84516040515f91611a03914290602001613081565b60408051601f1981840301815290829052805160209182012088519093505f92611a2d9201612d92565b6040516020818303038152906040528051906020012090505f30858989604051602001611a5d94939291906130a2565b60408051601f198184030181529082905260035463d76fad2360e01b83529092505f916001600160a01b039091169063d76fad2390611aa4908690889087906004016130de565b6020604051808303815f875af1158015611ac0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae491906130fc565b905080600a8a5f0151604051611afa9190612d92565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790559550505050505092915050565b5f805f805f805f805f8960c00151806020019051810190611b579190613117565b945094509450945094505f8211611bb05760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207061697220746f6b656e20616d6f756e740000000000000060448201526064016108e4565b5f80611bbd8d8589611e09565b915091505f87611bd557611bd28e848661215a565b90505b959d949c509a50939850919650505050505050565b6040516001600160a01b03831660248201526044810182905261170890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261238e565b600f5460ff16610c785760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108e4565b5f805f83806020019051810190611cad9190613171565b96509650965050505050600260189054906101000a900461ffff1661ffff168361ffff1611158015611cf0575060025461ffff600160d01b909104811690831611155b8015611d0d575060025461ffff600160e01b909104811690821611155b611d485760405162461bcd60e51b815260206004820152600c60248201526b0e8dede40daeac6d040e8c2f60a31b60448201526064016108e4565b60015461ffff1661271080611d5d8382613208565b61ffff16611d6b8588613208565b61ffff16611d79919061322a565b611d839190613241565b11158015611dc3575061271080611d9a8382613208565b61ffff16611da88587613208565b61ffff16611db6919061322a565b611dc09190613241565b11155b611e025760405162461bcd60e51b815260206004820152601060248201526f746178206f7574206f662072616e676560801b60448201526064016108e4565b5050505050565b5f805f80866001600160a01b0316637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6d9190613260565b506040516370a0823160e01b8152306004820152919350915082905f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611edd9190612def565b9050611ef36001600160a01b038a168383612461565b6001600160a01b0383165f908152600d6020526040902054881015611f525760405162461bcd60e51b81526020600482015260156024820152741d1bdbc81cdb585b1b081c185a5c88185b5bdd5b9d605a1b60448201526064016108e4565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03841601612049575f826001600160a01b031663f305d7198a8c855f808e611f975730611f9b565b61dead5b611fa74261012c612ddc565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015612012573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612037919061329f565b98508a97506121529650505050505050565b61205e6001600160a01b03841633308b612574565b6120726001600160a01b038416838a612461565b5f826001600160a01b031663e8e337008b86858d5f808f6120935730612097565b61dead5b6120a34261012c612ddc565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303815f875af115801561211c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612140919061329f565b98505f97506121529650505050505050565b935093915050565b5f60045482101561219e5760405162461bcd60e51b815260206004820152600e60248201526d746f6f2073686f7274206c6f636b60901b60448201526064016108e4565b5f80856001600160a01b0316637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122009190613260565b6001600160a01b038084165f90815260096020526040902054939550909350919091169050806122725760405162461bcd60e51b815260206004820152601860248201527f756e737570706f727465642064657820666f72206c6f636b000000000000000060448201526064016108e4565b5f816001600160a01b03166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa1580156122b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d491906132d5565b5190506122eb6001600160a01b0384168389612461565b6001600160a01b038216638af416f682858a6123078b42612ddc565b604080516001600160e01b031960e088901b1681526001600160a01b03949094166004850152602484019290925260448301525f60648301819052600160848401523360a4840152905160c48084019382900301818588803b15801561236b575f80fd5b505af115801561237d573d5f803e3d5ffd5b50939b9a5050505050505050505050565b5f6123e2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125b29092919063ffffffff16565b905080515f14806124025750808060200190518101906124029190612dad565b6117085760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108e4565b8015806124d95750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156124b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d79190612def565b155b6125445760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016108e4565b6040516001600160a01b03831660248201526044810182905261170890849063095ea7b360e01b90606401611c16565b6040516001600160a01b03808516602483015283166044820152606481018290526125ac9085906323b872dd60e01b90608401611c16565b50505050565b60606125c084845f856125c8565b949350505050565b6060824710156126295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108e4565b5f80866001600160a01b031685876040516126449190612d92565b5f6040518083038185875af1925050503d805f811461267e576040519150601f19603f3d011682016040523d82523d5f602084013e612683565b606091505b50915091506126948783838761269f565b979650505050505050565b6060831561270d5782515f03612706576001600160a01b0385163b6127065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108e4565b50816125c0565b6125c083838151156127225781518083602001fd5b8060405162461bcd60e51b81526004016108e4919061335a565b604080516101a0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b61ffff81168114610c5c575f80fd5b5f805f606084860312156127c8575f80fd5b83356127d3816127a7565b925060208401356127e3816127a7565b915060408401356127f3816127a7565b809150509250925092565b6001600160a01b0381168114610c5c575f80fd5b5f60208284031215612822575f80fd5b813561282d816127fe565b9392505050565b5f60208284031215612844575f80fd5b813561282d816127a7565b5f8083601f84011261285f575f80fd5b50813567ffffffffffffffff811115612876575f80fd5b60208301915083602082850101111561288d575f80fd5b9250929050565b5f80602083850312156128a5575f80fd5b823567ffffffffffffffff8111156128bb575f80fd5b6128c78582860161284f565b90969095509350505050565b5f805f604084860312156128e5575f80fd5b833567ffffffffffffffff8111156128fb575f80fd5b6129078682870161284f565b90945092505060208401356127f3816127a7565b8015158114610c5c575f80fd5b5f60208284031215612938575f80fd5b813561282d8161291b565b634e487b7160e01b5f52604160045260245ffd5b60405160e0810167ffffffffffffffff8111828210171561297a5761297a612943565b60405290565b604051610120810167ffffffffffffffff8111828210171561297a5761297a612943565b5f82601f8301126129b3575f80fd5b813567ffffffffffffffff808211156129ce576129ce612943565b604051601f8301601f19908116603f011681019082821181831017156129f6576129f6612943565b81604052838152866020858801011115612a0e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215612a3d575f80fd5b813567ffffffffffffffff80821115612a54575f80fd5b9083019060e08286031215612a67575f80fd5b612a6f612957565b823582811115612a7d575f80fd5b612a89878286016129a4565b825250602083013582811115612a9d575f80fd5b612aa9878286016129a4565b602083015250604083013582811115612ac0575f80fd5b612acc878286016129a4565b604083015250606083013582811115612ae3575f80fd5b612aef878286016129a4565b606083015250608083013582811115612b06575f80fd5b612b12878286016129a4565b60808301525060a083013582811115612b29575f80fd5b612b35878286016129a4565b60a08301525060c083013582811115612b4c575f80fd5b612b58878286016129a4565b60c08301525095945050505050565b5f8060408385031215612b78575f80fd5b8235612b83816127fe565b946020939093013593505050565b5f60208284031215612ba1575f80fd5b5035919050565b5f805f60408486031215612bba575f80fd5b833567ffffffffffffffff811115612bd0575f80fd5b612bdc8682870161284f565b90945092505060208401356127f38161291b565b5f805f8060808587031215612c03575f80fd5b5050823594602084013594506040840135936060013592509050565b803563ffffffff81168114611033575f80fd5b5f805f8060808587031215612c45575f80fd5b612c4e85612c1f565b9350612c5c60208601612c1f565b9250612c6a60408601612c1f565b9150612c7860608601612c1f565b905092959194509250565b5f60208284031215612c93575f80fd5b813567ffffffffffffffff811115612ca9575f80fd5b6125c0848285016129a4565b5f8060408385031215612cc6575f80fd5b8235612cd1816127fe565b91506020830135612ce1816127fe565b809150509250929050565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f612d5c604083018587612d21565b905061ffff83166020830152949350505050565b5f5b83811015612d8a578181015183820152602001612d72565b50505f910152565b5f8251612da3818460208701612d70565b9190910192915050565b5f60208284031215612dbd575f80fd5b815161282d8161291b565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ade57610ade612dc8565b5f60208284031215612dff575f80fd5b5051919050565b5f8151808452612e1d816020860160208601612d70565b601f01601f19169290920160200192915050565b5f815160e08452612e4560e0850182612e06565b905060208301518482036020860152612e5e8282612e06565b91505060408301518482036040860152612e788282612e06565b91505060608301518482036060860152612e928282612e06565b91505060808301518482036080860152612eac8282612e06565b91505060a083015184820360a0860152612ec68282612e06565b91505060c083015184820360c0860152612ee08282612e06565b95945050505050565b805161ffff1682526020810151612f06602084018261ffff169052565b506040810151612f1c604084018261ffff169052565b506060810151612f32606084018261ffff169052565b506080810151612f48608084018261ffff169052565b5060a0810151612f5e60a084018261ffff169052565b5060c0810151612f7460c084018261ffff169052565b5060e0810151612f8a60e084018261ffff169052565b506101008181015161ffff16908301526101208082015163ffffffff9081169184019190915261014080830151821690840152610160808301518216908401526101808083015191821681850152906125ac565b6001600160a01b038881168252878116602083015286166040820152606081018590526080810184905261026060a082018190525f9061302083820186612e31565b91505061303060c0830184612ee9565b98975050505050505050565b604081525f61304f604083018587612d21565b90508215156020830152949350505050565b5f61ffff80831681810361307757613077612dc8565b6001019392505050565b5f8351613092818460208801612d70565b9190910191825250602001919050565b6001600160a01b03858116825284166020820152610200604082018190525f906130ce83820186612e31565b915050612ee06060830184612ee9565b838152826020820152606060408201525f612ee06060830184612e06565b5f6020828403121561310c575f80fd5b815161282d816127fe565b5f805f805f60a0868803121561312b575f80fd5b85516131368161291b565b60208701519095506131478161291b565b60408701519094506131588161291b565b6060870151608090970151959894975095949392505050565b5f805f805f805f60e0888a031215613187575f80fd5b8751613192816127fe565b60208901519097506131a3816127fe565b60408901519096506131b4816127fe565b60608901519095506131c5816127fe565b60808901519094506131d6816127a7565b60a08901519093506131e7816127a7565b60c08901519092506131f8816127a7565b8091505092959891949750929550565b61ffff81811683821601908082111561322357613223612dc8565b5092915050565b8082028115828204841417610ade57610ade612dc8565b5f8261325b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f60608486031215613272575f80fd5b835161327d816127fe565b602085015190935061328e816127fe565b60408501519092506127f3816127fe565b5f805f606084860312156132b1575f80fd5b8351925060208401519150604084015190509250925092565b8051611033816127fe565b5f61012082840312156132e6575f80fd5b6132ee612980565b825181526132fe602084016132ca565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261333760c084016132ca565b60c082015260e08381015190820152610100928301519281019290925250919050565b602081525f61282d6020830184612e0656fea2646970667358221220cb5b3bd5764be55aee0558a3c4e667cf96b4169f0b28b018ff9da1ea8d3bc38664736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000
-----Decoded View---------------
Arg [0] : servicePayAccount_ (address): 0x67262A61c0A459Fff172c22E60DBC730393BF790
Arg [1] : launchFee_ (uint256): 100000000000000000
Arg [2] : delayedTradingFee_ (uint256): 50000000000000000
Arg [3] : tradingDisableFee_ (uint256): 100000000000000000
Arg [4] : antiDumpFee_ (uint256): 50000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790
Arg [1] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [2] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [3] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [4] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Deployed Bytecode Sourcemap
57725:8626:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52161:492;;;;;;;;;;-1:-1:-1;52161:492:0;;;;;:::i;:::-;;:::i;:::-;;50288:258;;;;;;;;;;-1:-1:-1;50371:6:0;50433:21;;-1:-1:-1;;;50433:21:0;;;;;-1:-1:-1;;;50469:22:0;;;;;-1:-1:-1;;;50506:21:0;;;;50288:258;;;;965:6:1;998:15;;;980:34;;1050:15;;;1045:2;1030:18;;1023:43;1102:15;;1082:18;;;1075:43;;;;943:2;928:18;50288:258:0;;;;;;;;56196:152;;;;;;;;;;-1:-1:-1;56196:152:0;;;;;:::i;:::-;-1:-1:-1;;;;;56309:31:0;56282:7;56309:31;;;:20;:31;;;;;;;56196:152;;;;1663:25:1;;;1651:2;1636:18;56196:152:0;1517:177:1;56466:164:0;;;;;;;;;;-1:-1:-1;56466:164:0;;;;;:::i;:::-;;:::i;45550:344::-;;;;;;;;;;-1:-1:-1;45550:344:0;;;;;:::i;:::-;;:::i;47644:259::-;;;;;;;;;;-1:-1:-1;47644:259:0;;;;;:::i;:::-;;:::i;:::-;;;3152:6:1;3140:19;;;3122:38;;3110:2;3095:18;47644:259:0;2978:188:1;45231:162:0;;;;;;;;;;-1:-1:-1;45231:162:0;;;;;:::i;:::-;;:::i;52925:156::-;;;;;;;;;;-1:-1:-1;52974:6:0;53017:15;;-1:-1:-1;;;53017:15:0;;;;;-1:-1:-1;;;53034:16:0;;;;;-1:-1:-1;;;53052:20:0;;;;52925:156;;54038:102;;;;;;;;;;-1:-1:-1;54115:17:0;;;;;;;54038:102;;46688:94;;;;;;;;;;-1:-1:-1;46761:13:0;;-1:-1:-1;;;46761:13:0;;;;46688:94;;56926:187;;;;;;;;;;-1:-1:-1;56926:187:0;;;;;:::i;:::-;;:::i;47046:296::-;;;;;;;;;;-1:-1:-1;47046:296:0;;;;;:::i;:::-;;:::i;5524:86::-;;;;;;;;;;-1:-1:-1;5595:7:0;;;;5524:86;;;3885:14:1;;3878:22;3860:41;;3848:2;3833:18;5524:86:0;3720:187:1;65839:115:0;;;;;;;;;;-1:-1:-1;65839:115:0;;;;;:::i;:::-;;:::i;2979:103::-;;;;;;;;;;;;;:::i;48909:97::-;;;;;;;;;;-1:-1:-1;48984:14:0;;48909:97;;45401:89;;;;;;;;;;-1:-1:-1;45474:8:0;;-1:-1:-1;;;;;45474:8:0;45401:89;;;-1:-1:-1;;;;;4445:32:1;;;4427:51;;4415:2;4400:18;45401:89:0;4281:203:1;44570:204:0;;;;;;;;;;-1:-1:-1;44703:10:0;;44715:16;;44733:18;;44753:12;;44570:204;;;4720:25:1;;;4776:2;4761:18;;4754:34;;;;4804:18;;;4797:34;4862:2;4847:18;;4840:34;4707:3;4692:19;44570:204:0;4489:391:1;55453:294:0;;;;;;;;;;-1:-1:-1;55602:17:0;;55453:294;;;55602:17;-1:-1:-1;;;55602:17:0;;;;5236:34:1;;-1:-1:-1;;;55634:19:0;;;;5301:2:1;5286:18;;5279:43;55668:22:0;;;;;5338:18:1;;;5331:43;;;;-1:-1:-1;;;55705:23:0;;;;5405:2:1;5390:18;;5383:43;5194:3;5179:19;55453:294:0;4984:448:1;44991:116:0;;;;;;;;;;-1:-1:-1;44991:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;45078:21:0;;;45051:7;45078:21;;;:10;:21;;;;;;;;44991:116;57121:110;;;;;;;;;;-1:-1:-1;57202:21:0;;-1:-1:-1;;;57202:21:0;;;;57121:110;;49375:620;;;;;;;;;;-1:-1:-1;49375:620:0;;;;;:::i;:::-;;:::i;58881:1562::-;;;;;;:::i;:::-;;:::i;2338:87::-;;;;;;;;;;-1:-1:-1;2384:7:0;2411:6;-1:-1:-1;;;;;2411:6:0;2338:87;;55755:234;;;;;;;;;;-1:-1:-1;55755:234:0;;;;;:::i;:::-;;:::i;48749:152::-;;;;;;;;;;-1:-1:-1;48749:152:0;;;;;:::i;:::-;;:::i;51661:136::-;;;;;;;;;;-1:-1:-1;51748:10:0;;;-1:-1:-1;;;51748:10:0;;;;;-1:-1:-1;;;51760:11:0;;;;;-1:-1:-1;;;51773:15:0;;;;51661:136;;53673:160;;;;;;;;;;-1:-1:-1;53673:160:0;;;;;:::i;:::-;;:::i;48153:244::-;;;;;;;;;;-1:-1:-1;48153:244:0;;;;;:::i;:::-;;:::i;66205:143::-;;;;;;;;;;-1:-1:-1;66205:143:0;;;;;:::i;:::-;;:::i;43814:512::-;;;;;;;;;;-1:-1:-1;43814:512:0;;;;;:::i;:::-;;:::i;54522:620::-;;;;;;;;;;-1:-1:-1;54522:620:0;;;;;:::i;:::-;;:::i;46023:109::-;;;;;;;;;;-1:-1:-1;46023:109:0;;;;;:::i;:::-;;:::i;45902:113::-;;;;;;;;;;-1:-1:-1;45989:18:0;;-1:-1:-1;;;;;45989:18:0;45902:113;;53373:90;;;;;;;;;;-1:-1:-1;53444:11:0;;;;53373:90;;50916:467;;;;;;;;;;-1:-1:-1;50916:467:0;;;;;:::i;:::-;;:::i;48405:177::-;;;;;;;;;;-1:-1:-1;48405:177:0;;;;;:::i;:::-;;:::i;56638:100::-;;;;;;;;;;-1:-1:-1;56713:17:0;;-1:-1:-1;;;56713:17:0;;;;56638:100;;53232:133;;;;;;;;;;-1:-1:-1;53232:133:0;;;;;:::i;:::-;;:::i;57399:121::-;;;;;;;;;;-1:-1:-1;57399:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;57488:24:0;57462:6;57488:24;;;:15;:24;;;;;;;;;57399:121;46347:215;;;;;;;;;;-1:-1:-1;46347:215:0;;;;;:::i;:::-;;:::i;3237:201::-;;;;;;;;;;-1:-1:-1;3237:201:0;;;;;:::i;:::-;;:::i;44825:158::-;;;;;;;;;;-1:-1:-1;44825:158:0;;;;;:::i;:::-;;:::i;52161:492::-;2224:13;:11;:13::i;:::-;52350:4:::1;52337:9;:17;;;;:39;;;;;52372:4;52358:10;:18;;;;52337:39;:64;;;;;52398:3;52380:14;:21;;;;52337:64;52315:126;;;;-1:-1:-1::0;;;52315:126:0::1;;;;;;;:::i;:::-;;;;;;;;;52452:15;:27:::0;;-1:-1:-1;;;;52490:29:0;-1:-1:-1;;;52452:27:0::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;52490:29:0;;;;;-1:-1:-1;;;52490:29:0;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;52530:37:0::1;-1:-1:-1::0;;;52530:37:0;;::::1;::::0;;::::1;;::::0;;;52585:60:::1;::::0;;980:34:1;;;1045:2;1030:18;;1023:43;;;;1082:18;;;1075:43;52585:60:0::1;::::0;943:2:1;928:18;52585:60:0::1;;;;;;;;52161:492:::0;;;:::o;56466:164::-;2224:13;:11;:13::i;:::-;56544:17:::1;:27:::0;;-1:-1:-1;;;;;56544:27:0::1;-1:-1:-1::0;;;56544:27:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;56589:33:::1;::::0;3122:38:1;;;56589:33:0::1;::::0;3110:2:1;3095:18;56589:33:0::1;;;;;;;;56466:164:::0;:::o;45550:344::-;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;45662:21:0;::::1;45654:53;;;::::0;-1:-1:-1;;;45654:53:0;;11970:2:1;45654:53:0::1;::::0;::::1;11952:21:1::0;12009:2;11989:18;;;11982:30;-1:-1:-1;;;12028:18:1;;;12021:49;12087:18;;45654:53:0::1;11768:343:1::0;45654:53:0::1;45774:20;-1:-1:-1::0;;;;;45774:17:0;::::1;45792:1;45774:17;:20::i;:::-;45807:18;:28:::0;;-1:-1:-1;;;;;;45807:28:0::1;-1:-1:-1::0;;;;;45807:28:0;::::1;::::0;;::::1;::::0;;;45853:33:::1;::::0;4427:51:1;;;45853:33:0::1;::::0;4415:2:1;4400:18;45853:33:0::1;4281:203:1::0;47644:259:0;47734:6;47753:23;47779:19;47799:4;;47779:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;47819:20:0;;47815:49;;47848:16;-1:-1:-1;47841:23:0;;47815:49;-1:-1:-1;;47882:13:0;;-1:-1:-1;;;47882:13:0;;;;47644:259;;;;;:::o;45231:162::-;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;45313:21:0;::::1;45305:49;;;::::0;-1:-1:-1;;;45305:49:0;;12596:2:1;45305:49:0::1;::::0;::::1;12578:21:1::0;12635:2;12615:18;;;12608:30;-1:-1:-1;;;12654:18:1;;;12647:45;12709:18;;45305:49:0::1;12394:339:1::0;45305:49:0::1;45367:8;:18:::0;;-1:-1:-1;;;;;;45367:18:0::1;-1:-1:-1::0;;;;;45367:18:0;;;::::1;::::0;;;::::1;::::0;;45231:162::o;56926:187::-;2224:13;:11;:13::i;:::-;57012:21:::1;:35:::0;;-1:-1:-1;;;;57012:35:0::1;-1:-1:-1::0;;;57012:35:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;57065:40:::1;::::0;3122:38:1;;;57065:40:0::1;::::0;3110:2:1;3095:18;57065:40:0::1;2978:188:1::0;47046:296:0;2224:13;:11;:13::i;:::-;36320:5:::1;47184:24;::::0;::::1;;;47176:49;;;;-1:-1:-1::0;;;47176:49:0::1;;;;;;;:::i;:::-;47264:9;47236:19;47256:4;;47236:25;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:37;;::::1;::::0;;;::::1;-1:-1:-1::0;;47236:37:0;;::::1;::::0;;;::::1;::::0;;;47291:43:::1;::::0;::::1;::::0;47318:4;;;;47324:9;;47291:43:::1;:::i;65839:115::-:0;2224:13;:11;:13::i;:::-;65906:4:::1;65902:44;;;65912:8;:6;:8::i;:::-;65839:115:::0;:::o;65902:44::-:1;65936:10;:8;:10::i;2979:103::-:0;2224:13;:11;:13::i;:::-;3044:30:::1;3071:1;3044:18;:30::i;:::-;2979:103::o:0;49375:620::-;2224:13;:11;:13::i;:::-;49578:4:::1;49562:12;:20;;;;:62;;;;;49620:4;49603:13;:21;;;;49562:62;:103;;;;;49661:4;49645:12;:20;;;;49562:103;49540:165;;;;-1:-1:-1::0;;;49540:165:0::1;;;;;;;:::i;:::-;49716:21;:36:::0;;-1:-1:-1;;;;49763:38:0;-1:-1:-1;;;49716:36:0::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;49763:38:0;;;;;-1:-1:-1;;;49763:38:0;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;49812:36:0::1;-1:-1:-1::0;;;49812:36:0;;::::1;::::0;;::::1;;::::0;;;49866:121:::1;::::0;;980:34:1;;;1045:2;1030:18;;1023:43;;;;1082:18;;;1075:43;49866:121:0::1;::::0;943:2:1;928:18;49866:121:0::1;759:365:1::0;58881:1562:0;59004:7;5129:19;:17;:19::i;:::-;59080:20;;59072:29:::1;::::0;59044:9:::1;::::0;59024:17:::1;::::0;59072:7:::1;::::0;:29:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;59072:29:0::1;:43;59064:71;;;::::0;-1:-1:-1;;;59064:71:0;;14095:2:1;59064:71:0::1;::::0;::::1;14077:21:1::0;14134:2;14114:18;;;14107:30;-1:-1:-1;;;14153:18:1;;;14146:45;14208:18;;59064:71:0::1;13893:339:1::0;59064:71:0::1;59148:40;59191:65;59225:15;:20;;;59191:19;:65::i;:::-;59148:108;;59267:28;59298:81;59325:15;59355:13;59298:12;:81::i;:::-;59267:112;;59407:21;59443:22:::0;59480:15:::1;59510:20:::0;59544:44:::1;59558:12;59572:15;59544:13;:44::i;:::-;59392:196;;;;;;;;59599:18;59764:12;-1:-1:-1::0;;;;;59764:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;59814:1;59764:51;;;59799:12;;59764:51;59704:17;:42;;59745:1;59704:42;;;59724:18;;59704:42;59647:16;:39;;59685:1;59647:39;;;59666:16;;59647:39;59620:10;;:67;;;;:::i;:::-;:127;;;;:::i;:::-;:196;;;;:::i;:::-;59599:217:::0;-1:-1:-1;59885:12:0;59862:20:::1;59875:7:::0;59599:217;59862:20:::1;:::i;:::-;:35;;;;:::i;:::-;59849:9;:48;;59827:114;;;::::0;-1:-1:-1;;;59827:114:0;;14951:2:1;59827:114:0::1;::::0;::::1;14933:21:1::0;14990:2;14970:18;;;14963:30;-1:-1:-1;;;15009:18:1;;;15002:46;15065:18;;59827:114:0::1;14749:340:1::0;59827:114:0::1;60011:18;::::0;:51:::1;::::0;-1:-1:-1;;;;;60011:18:0::1;60040:21;60011:28;:51::i;:::-;60073:56;::::0;-1:-1:-1;;;60073:56:0;;15281:14:1;;15274:22;60073:56:0::1;::::0;::::1;15256:41:1::0;15340:14;;15333:22;15313:18;;;15306:50;-1:-1:-1;;;;;60073:19:0;::::1;::::0;::::1;::::0;15229:18:1;;60073:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;60213:18:0::1;::::0;60147:247:::1;::::0;-1:-1:-1;60185:12:0;;-1:-1:-1;;;;;;60213:18:0::1;914:10:::0;60273:12:::1;-1:-1:-1::0;;;;;60273:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60315:10;60340:15;60370:13;60147:247;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;60422:12:0;;-1:-1:-1;;;;;;;5159:1:0::1;58881:1562:::0;;;:::o;55755:234::-;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;55879:31:0;::::1;;::::0;;;:20:::1;:31;::::0;;;;;;;;:40;;;55937:44;;19671:51:1;;;19738:18;;19731:34;;;55937:44:0::1;::::0;19644:18:1;55937:44:0::1;;;;;;;55755:234:::0;;:::o;48749:152::-;2224:13;:11;:13::i;:::-;48824:14:::1;:23:::0;;;48865:28:::1;::::0;1663:25:1;;;48865:28:0::1;::::0;1651:2:1;1636:18;48865:28:0::1;1517:177:1::0;53673:160:0;2224:13;:11;:13::i;:::-;53750:17:::1;:26:::0;;-1:-1:-1;;53750:26:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;53794:31:::1;::::0;3122:38:1;;;53794:31:0::1;::::0;3110:2:1;3095:18;53794:31:0::1;2978:188:1::0;48153:244:0;2224:13;:11;:13::i;:::-;48324:4:::1;48286:29;48316:4;;48286:35;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:42;;;::::1;;-1:-1:-1::0;;48286:42:0;;::::1;::::0;;;::::1;::::0;;;48344:45:::1;::::0;::::1;::::0;48378:4;;;;48384;;48344:45:::1;:::i;66205:143::-:0;2224:13;:11;:13::i;:::-;66290:50:::1;-1:-1:-1::0;;;;;66290:27:0;::::1;914:10:::0;66332:7;66290:27:::1;:50::i;:::-;66205:143:::0;;:::o;43814:512::-;2224:13;:11;:13::i;:::-;44006:10:::1;:22:::0;;;44039:16:::1;:34:::0;;;44084:18:::1;:38:::0;;;44133:12:::1;:26:::0;;;44177:141:::1;::::0;;4720:25:1;;;4776:2;4761:18;;4754:34;;;4804:18;;;4797:34;;;4862:2;4847:18;;4840:34;;;44177:141:0::1;::::0;4707:3:1;4692:19;44177:141:0::1;;;;;;;;43814:512:::0;;;;:::o;54522:620::-;2224:13;:11;:13::i;:::-;54741:17:::1;:36:::0;;-1:-1:-1;;;;54788:40:0;-1:-1:-1;;;54741:36:0::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;54788:40:0;;;;;-1:-1:-1;;;54788:40:0;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;54896:48:0;54839:46;;;::::1;::::0;;::::1;-1:-1:-1::0;;54896:48:0;;;;;-1:-1:-1;;;54896:48:0;;::::1;::::0;;::::1;;::::0;;;54962:172:::1;::::0;;5236:34:1;;;5301:2;5286:18;;5279:43;;;;5338:18;;5331:43;;;;5405:2;5390:18;;5383:43;54962:172:0::1;::::0;5194:3:1;5179:19;54962:172:0::1;4984:448:1::0;46023:109:0;46084:7;46111;46119:4;46111:13;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;46111:13:0;;46023:109;-1:-1:-1;;46023:109:0:o;50916:467::-;2224:13;:11;:13::i;:::-;51100:4:::1;51087:9;:17;;;;:39;;;;;51122:4;51108:10;:18;;;;51087:39;:64;;;;;51148:3;51130:14;:21;;;;51087:64;51065:126;;;;-1:-1:-1::0;;;51065:126:0::1;;;;;;;:::i;:::-;51202:10;:22:::0;;-1:-1:-1;;;;51235:24:0;-1:-1:-1;;;51202:22:0::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;51235:24:0;;;;;-1:-1:-1;;;51235:24:0;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;51270:32:0::1;-1:-1:-1::0;;;51270:32:0;;::::1;::::0;;::::1;;::::0;;;51320:55:::1;::::0;;980:34:1;;;1045:2;1030:18;;1023:43;;;;1082:18;;;1075:43;51320:55:0::1;::::0;943:2:1;928:18;51320:55:0::1;759:365:1::0;48405:177:0;48515:4;48539:29;48569:4;;48539:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;48405:177:0;;;;:::o;53232:133::-;2224:13;:11;:13::i;:::-;53300:11:::1;:17:::0;;-1:-1:-1;;53300:17:0::1;;::::0;::::1;::::0;;::::1;::::0;;;53335:22:::1;::::0;3122:38:1;;;53335:22:0::1;::::0;3110:2:1;3095:18;53335:22:0::1;2978:188:1::0;46347:215:0;2224:13;:11;:13::i;:::-;36320:5:::1;46431:24;::::0;::::1;;;46423:49;;;;-1:-1:-1::0;;;46423:49:0::1;;;;;;;:::i;:::-;46483:13;:25:::0;;-1:-1:-1;;;;46483:25:0::1;-1:-1:-1::0;;;46483:25:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;46524:30:::1;::::0;3122:38:1;;;46524:30:0::1;::::0;3110:2:1;3095:18;46524:30:0::1;2978:188:1::0;3237:201:0;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;3326:22:0;::::1;3318:73;;;::::0;-1:-1:-1;;;3318:73:0;;20311:2:1;3318:73:0::1;::::0;::::1;20293:21:1::0;20350:2;20330:18;;;20323:30;20389:34;20369:18;;;20362:62;-1:-1:-1;;;20440:18:1;;;20433:36;20486:19;;3318:73:0::1;20109:402:1::0;3318:73:0::1;3402:28;3421:8;3402:18;:28::i;44825:158::-:0;2224:13;:11;:13::i;:::-;-1:-1:-1;;;;;44942:21:0;;::::1;;::::0;;;:10:::1;:21;::::0;;;;:33;;-1:-1:-1;;;;;;44942:33:0::1;::::0;;;::::1;;::::0;;44825:158::o;2503:132::-;2384:7;2411:6;-1:-1:-1;;;;;2411:6:0;914:10;2567:23;2559:68;;;;-1:-1:-1;;;2559:68:0;;20718:2:1;2559:68:0;;;20700:21:1;;;20737:18;;;20730:30;20796:34;20776:18;;;20769:62;20848:18;;2559:68:0;20516:356:1;14623:317:0;14738:6;14713:21;:31;;14705:73;;;;-1:-1:-1;;;14705:73:0;;21079:2:1;14705:73:0;;;21061:21:1;21118:2;21098:18;;;21091:30;21157:31;21137:18;;;21130:59;21206:18;;14705:73:0;20877:353:1;14705:73:0;14792:12;14810:9;-1:-1:-1;;;;;14810:14:0;14832:6;14810:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14791:52;;;14862:7;14854:78;;;;-1:-1:-1;;;14854:78:0;;21647:2:1;14854:78:0;;;21629:21:1;21686:2;21666:18;;;21659:30;21725:34;21705:18;;;21698:62;21796:28;21776:18;;;21769:56;21842:19;;14854:78:0;21445:422:1;14854:78:0;14694:246;14623:317;;:::o;6120:118::-;5129:19;:17;:19::i;:::-;6180:7:::1;:14:::0;;-1:-1:-1;;6180:14:0::1;6190:4;6180:14;::::0;;6210:20:::1;6217:12;914:10:::0;;834:98;6217:12:::1;6210:20;::::0;-1:-1:-1;;;;;4445:32:1;;;4427:51;;4415:2;4400:18;6210:20:0::1;;;;;;;6120:118::o:0;6379:120::-;5388:16;:14;:16::i;:::-;6438:7:::1;:15:::0;;-1:-1:-1;;6438:15:0::1;::::0;;6469:22:::1;914:10:::0;6478:12:::1;834:98:::0;3598:191;3672:16;3691:6;;-1:-1:-1;;;;;3708:17:0;;;-1:-1:-1;;;;;;3708:17:0;;;;;;3741:40;;3691:6;;;;;;;3741:40;;3672:16;3741:40;3661:128;3598:191;:::o;5683:108::-;5595:7;;;;5753:9;5745:38;;;;-1:-1:-1;;;5745:38:0;;22074:2:1;5745:38:0;;;22056:21:1;22113:2;22093:18;;;22086:30;-1:-1:-1;;;22132:18:1;;;22125:46;22188:18;;5745:38:0;21872:340:1;41484:1146:0;41572:26;;:::i;:::-;41611:32;;:::i;:::-;41683:21;;;-1:-1:-1;;;41683:21:0;;;;41654:50;;-1:-1:-1;;;41745:22:0;;;;41715:27;;;:52;-1:-1:-1;;;41807:21:0;;;;41778:26;;;;:50;;;;41866:17;;-1:-1:-1;;;41866:17:0;;;;;;41841:22;;;:42;-1:-1:-1;;;41919:15:0;;;;41896:20;;;:38;-1:-1:-1;;;41969:16:0;;;;41945:21;;;:40;42024:20;;;;;41996:25;;;:48;42076:11;;;;;42057:16;;;:30;42123:17;;;;;;41683:21;42098:22;;:42;42183:22;;;;;;42153:27;;;:52;-1:-1:-1;;;42247:23:0;;;;42216:28;;;:54;-1:-1:-1;;;42306:17:0;;;;42281:22;;;:42;42494:35;42306:17;;42494:35;;42524:4;;42494:35;:::i;:::-;;;;;;;;;;;;;;;;;:103;;42578:19;;-1:-1:-1;;;42578:19:0;;;;42494:103;;;-1:-1:-1;;42494:103:0;42467:130;;:24;;;:130;:5;41484:1146;-1:-1:-1;;41484:1146:0:o;60451:1172::-;914:10;60603:15;60696:25;;;:15;:25;;;;;;60756:21;;60603:15;;914:10;60696:25;;;;;-1:-1:-1;;;60756:21:0;;;;60740:37;;60732:63;;;;-1:-1:-1;;;60732:63:0;;22419:2:1;60732:63:0;;;22401:21:1;22458:2;22438:18;;;22431:30;-1:-1:-1;;;22477:18:1;;;22470:43;22530:18;;60732:63:0;22217:337:1;60732:63:0;60834:15;;;:::i;:::-;-1:-1:-1;;;;;60806:25:0;;;;;;:15;:25;;;;;:43;;-1:-1:-1;;60806:43:0;;;;;;;60968:24;;;;60806:43;;-1:-1:-1;60950:43:0;;:17;:43::i;:::-;61062:20;;61045:55;;61006:12;;61045:55;;61084:15;;61045:55;;;:::i;:::-;;;;-1:-1:-1;;61045:55:0;;;;;;;;;;61021:90;;61045:55;61021:90;;;;61170:20;;61021:90;;-1:-1:-1;61122:18:0;;61153:38;;;;:::i;:::-;;;;;;;;;;;;;61143:49;;;;;;61122:70;;61203:17;61256:4;61276:8;61299:15;61329:13;61223:130;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61223:130:0;;;;;;;;;;61415:8;;-1:-1:-1;;;61392:113:0;;61223:130;;-1:-1:-1;61366:23:0;;-1:-1:-1;;;;;61415:8:0;;;;61392:39;;:113;;61446:10;;61471:4;;61223:130;;61392:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61366:139;;61548:15;61516:7;61524:15;:20;;;61516:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;-1:-1:-1;;;;;61516:47:0;;;;-1:-1:-1;;;;;;61516:47:0;;;;;;;;;61599:15;-1:-1:-1;;;;;;60451:1172:0;;;;:::o;61631:914::-;61762:4;61768;61774:7;61783;61818:13;61846:21;61882:22;61919:25;61959:18;62002:5;:13;;;61991:63;;;;;;;;;;;;:::i;:::-;61803:251;;;;;;;;;;62093:1;62073:17;:21;62065:59;;;;-1:-1:-1;;;62065:59:0;;25269:2:1;62065:59:0;;;25251:21:1;25308:2;25288:18;;;25281:30;25347:27;25327:18;;;25320:55;25392:18;;62065:59:0;25067:349:1;62065:59:0;62164:16;62182:15;62201:99;62222:12;62249:17;62281:8;62201:6;:99::i;:::-;62163:137;;;;62340:20;62376:8;62371:86;;62414:43;62422:12;62436:8;62446:10;62414:7;:43::i;:::-;62399:58;;62371:86;62478:16;;62496:17;;-1:-1:-1;62496:17:0;-1:-1:-1;62478:16:0;;-1:-1:-1;61631:914:0;;-1:-1:-1;;;;;;;61631:914:0:o;22480:177::-;22590:58;;-1:-1:-1;;;;;19689:32:1;;22590:58:0;;;19671:51:1;19738:18;;;19731:34;;;22563:86:0;;22583:5;;-1:-1:-1;;;22613:23:0;19644:18:1;;22590:58:0;;;;-1:-1:-1;;22590:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22590:58:0;-1:-1:-1;;;;;;22590:58:0;;;;;;;;;;22563:19;:86::i;5868:108::-;5595:7;;;;5927:41;;;;-1:-1:-1;;;5927:41:0;;25623:2:1;5927:41:0;;;25605:21:1;25662:2;25642:18;;;25635:30;-1:-1:-1;;;25681:18:1;;;25674:50;25741:18;;5927:41:0;25421:344:1;42638:960:0;42722:13;42737:14;42753:18;42818:8;42775:145;;;;;;;;;;;;:::i;:::-;42713:207;;;;;;;;;;42965:10;;;;;;;;;;;42955:20;;:6;:20;;;;:63;;;;-1:-1:-1;43007:11:0;;;-1:-1:-1;;;43007:11:0;;;;;42996:22;;;;;42955:63;:114;;;;-1:-1:-1;43054:15:0;;;-1:-1:-1;;;43054:15:0;;;;;43039:30;;;;;42955:114;42933:176;;;;-1:-1:-1;;;42933:176:0;;27062:2:1;42933:176:0;;;27044:21:1;27101:2;27081:18;;;27074:30;-1:-1:-1;;;27120:18:1;;;27113:42;27172:18;;42933:176:0;26860:336:1;42933:176:0;43143:11;;;;36320:5;;43306:25;43143:11;36320:5;43306:25;:::i;:::-;43273:59;;43281:20;43290:11;43281:6;:20;:::i;:::-;43273:29;;:59;;;;:::i;:::-;43272:92;;;;:::i;:::-;:124;;:274;;;;-1:-1:-1;36320:5:0;;43452:25;43466:11;36320:5;43452:25;:::i;:::-;43418:60;;43426:21;43436:11;43426:7;:21;:::i;:::-;43418:30;;:60;;;;:::i;:::-;43417:97;;;;:::i;:::-;:129;;43272:274;43250:340;;;;-1:-1:-1;;;43250:340:0;;27971:2:1;43250:340:0;;;27953:21:1;28010:2;27990:18;;;27983:30;-1:-1:-1;;;28029:18:1;;;28022:46;28085:18;;43250:340:0;27769::1;43250::0;42702:896;;;;42638:960;:::o;62750:1865::-;62889:7;62898;62919:18;62939:23;62968:12;-1:-1:-1;;;;;62968:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63105:37:0;;-1:-1:-1;;;63105:37:0;;63136:4;63105:37;;;4427:51:1;62918:91:0;;-1:-1:-1;62918:91:0;-1:-1:-1;62918:91:0;;63020:20;;-1:-1:-1;;;;;63105:22:0;;;;;4400:18:1;;63105:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63076:66;-1:-1:-1;63155:118:0;-1:-1:-1;;;;;63155:41:0;;63219:9;63076:66;63155:41;:118::i;:::-;-1:-1:-1;;;;;63329:37:0;;;;;;:20;:37;;;;;;63308:58;;;63286:129;;;;-1:-1:-1;;;63286:129:0;;29029:2:1;63286:129:0;;;29011:21:1;29068:2;29048:18;;;29041:30;-1:-1:-1;;;29087:18:1;;;29080:51;29148:18;;63286:129:0;28827:345:1;63286:129:0;-1:-1:-1;;;;;;;63432:30:0;;;63428:1180;;63484:16;63504:9;-1:-1:-1;;;;;63504:25:0;;63555:17;63614:12;63646:18;63683:1;63703;63723:8;:42;;63760:4;63723:42;;;63742:6;63723:42;63784:21;:15;63802:3;63784:21;:::i;:::-;63504:316;;;;;;-1:-1:-1;;;;;;63504:316:0;;;-1:-1:-1;;;;;29536:15:1;;;63504:316:0;;;29518:34:1;29568:18;;;29561:34;;;;29611:18;;;29604:34;;;;29654:18;;;29647:34;;;;29718:15;;;29697:19;;;29690:44;29750:19;;;29743:35;;;;29452:19;;63504:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63479:341;-1:-1:-1;63853:17:0;;-1:-1:-1;63835:36:0;;-1:-1:-1;;;;;;;63835:36:0;63428:1180;63904:154;-1:-1:-1;;;;;63904:40:0;;914:10;64002:4;64026:17;63904:40;:154::i;:::-;64073:123;-1:-1:-1;;;;;64073:35:0;;64135:9;64164:17;64073:35;:123::i;:::-;64216:16;64236:9;-1:-1:-1;;;;;64236:22:0;;64285:12;64317:15;64351:18;64388:17;64424:1;64444;64464:8;:42;;64501:4;64464:42;;;64483:6;64464:42;64525:21;:15;64543:3;64525:21;:::i;:::-;64236:325;;;;;;-1:-1:-1;;;;;;64236:325:0;;;-1:-1:-1;;;;;30515:15:1;;;64236:325:0;;;30497:34:1;30567:15;;;30547:18;;;30540:43;30599:18;;;30592:34;;;;30642:18;;;30635:34;;;;30685:19;;;30678:35;;;;30729:19;;;30722:35;30794:15;;;30773:19;;;30766:44;30826:19;;;30819:35;;;;30431:19;;64236:325:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64211:350;-1:-1:-1;64594:1:0;;-1:-1:-1;64576:20:0;;-1:-1:-1;;;;;;;64576:20:0;62750:1865;;;;;;;:::o;64741:982::-;64877:7;64919:14;;64905:10;:28;;64897:55;;;;-1:-1:-1;;;64897:55:0;;31067:2:1;64897:55:0;;;31049:21:1;31106:2;31086:18;;;31079:30;-1:-1:-1;;;31125:18:1;;;31118:44;31179:18;;64897:55:0;30865:338:1;64897:55:0;64964:17;64985:19;65008:12;-1:-1:-1;;;;;65008:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;65097:21:0;;;65060:23;65097:21;;;:10;:21;;;;;;64963:86;;-1:-1:-1;64963:86:0;;-1:-1:-1;65097:21:0;;;;;-1:-1:-1;65097:21:0;65130:109;;;;-1:-1:-1;;;65130:109:0;;31410:2:1;65130:109:0;;;31392:21:1;31449:2;31429:18;;;31422:30;31488:26;31468:18;;;31461:54;31532:18;;65130:109:0;31208:348:1;65130:109:0;65250:14;65267:12;-1:-1:-1;;;;;65267:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;;-1:-1:-1;65307:64:0;-1:-1:-1;;;;;65307:31:0;;65347:12;65362:8;65307:31;:64::i;:::-;-1:-1:-1;;;;;65382:24:0;;;65414:6;65436:11;65462:8;65485:28;65503:10;65485:15;:28;:::i;:::-;65382:307;;;-1:-1:-1;;;;;;65382:307:0;;;;;;;-1:-1:-1;;;;;32930:15:1;;;;65382:307:0;;;32912:34:1;32962:18;;;32955:34;;;;33005:18;;;32998:34;65544:1:0;33048:18:1;;;33041:43;;;65562:4:0;33100:19:1;;;33093:51;914:10:0;33160:19:1;;;33153:44;65382:307:0;;32846:19:1;;;;;65382:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65709:6:0;;64741:982;-1:-1:-1;;;;;;;;;;;64741:982:0:o;26826:649::-;27250:23;27276:69;27304:4;27276:69;;;;;;;;;;;;;;;;;27284:5;-1:-1:-1;;;;;27276:27:0;;;:69;;;;;:::i;:::-;27250:95;;27364:10;:17;27385:1;27364:22;:56;;;;27401:10;27390:30;;;;;;;;;;;;:::i;:::-;27356:111;;;;-1:-1:-1;;;27356:111:0;;33410:2:1;27356:111:0;;;33392:21:1;33449:2;33429:18;;;33422:30;33488:34;33468:18;;;33461:62;-1:-1:-1;;;33539:18:1;;;33532:40;33589:19;;27356:111:0;33208:406:1;23376:582:0;23706:10;;;23705:62;;-1:-1:-1;23722:39:0;;-1:-1:-1;;;23722:39:0;;23746:4;23722:39;;;33831:34:1;-1:-1:-1;;;;;33901:15:1;;;33881:18;;;33874:43;23722:15:0;;;;;33766:18:1;;23722:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23705:62;23683:166;;;;-1:-1:-1;;;23683:166:0;;34130:2:1;23683:166:0;;;34112:21:1;34169:2;34149:18;;;34142:30;34208:34;34188:18;;;34181:62;-1:-1:-1;;;34259:18:1;;;34252:52;34321:19;;23683:166:0;33928:418:1;23683:166:0;23887:62;;-1:-1:-1;;;;;19689:32:1;;23887:62:0;;;19671:51:1;19738:18;;;19731:34;;;23860:90:0;;23880:5;;-1:-1:-1;;;23910:22:0;19644:18:1;;23887:62:0;19497:274:1;22902:205:0;23030:68;;-1:-1:-1;;;;;34609:15:1;;;23030:68:0;;;34591:34:1;34661:15;;34641:18;;;34634:43;34693:18;;;34686:34;;;23003:96:0;;23023:5;;-1:-1:-1;;;23053:27:0;34526:18:1;;23030:68:0;34351:375:1;23003:96:0;22902:205;;;;:::o;16119:229::-;16256:12;16288:52;16310:6;16318:4;16324:1;16327:12;16288:21;:52::i;:::-;16281:59;16119:229;-1:-1:-1;;;;16119:229:0:o;17205:455::-;17375:12;17433:5;17408:21;:30;;17400:81;;;;-1:-1:-1;;;17400:81:0;;34933:2:1;17400:81:0;;;34915:21:1;34972:2;34952:18;;;34945:30;35011:34;34991:18;;;34984:62;-1:-1:-1;;;35062:18:1;;;35055:36;35108:19;;17400:81:0;34731:402:1;17400:81:0;17493:12;17507:23;17534:6;-1:-1:-1;;;;;17534:11:0;17553:5;17560:4;17534:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17492:73;;;;17583:69;17610:6;17618:7;17627:10;17639:12;17583:26;:69::i;:::-;17576:76;17205:455;-1:-1:-1;;;;;;;17205:455:0:o;19778:644::-;19963:12;19992:7;19988:427;;;20020:10;:17;20041:1;20020:22;20016:290;;-1:-1:-1;;;;;13659:19:0;;;20230:60;;;;-1:-1:-1;;;20230:60:0;;35632:2:1;20230:60:0;;;35614:21:1;35671:2;35651:18;;;35644:30;35710:31;35690:18;;;35683:59;35759:18;;20230:60:0;35430:353:1;20230:60:0;-1:-1:-1;20327:10:0;20320:17;;19988:427;20370:33;20378:10;20390:12;21125:17;;:21;21121:388;;21357:10;21351:17;21414:15;21401:10;21397:2;21393:19;21386:44;21121:388;21484:12;21477:20;;-1:-1:-1;;;21477:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:117:1:-;99:6;92:5;88:18;81:5;78:29;68:57;;121:1;118;111:12;136:523;210:6;218;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:30;377:5;353:30;:::i;:::-;402:5;-1:-1:-1;459:2:1;444:18;;431:32;472;431;472;:::i;:::-;523:7;-1:-1:-1;582:2:1;567:18;;554:32;595;554;595;:::i;:::-;646:7;636:17;;;136:523;;;;;:::o;1129:131::-;-1:-1:-1;;;;;1204:31:1;;1194:42;;1184:70;;1250:1;1247;1240:12;1265:247;1324:6;1377:2;1365:9;1356:7;1352:23;1348:32;1345:52;;;1393:1;1390;1383:12;1345:52;1432:9;1419:23;1451:31;1476:5;1451:31;:::i;:::-;1501:5;1265:247;-1:-1:-1;;;1265:247:1:o;1699:245::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1865:9;1852:23;1884:30;1908:5;1884:30;:::i;2209:348::-;2261:8;2271:6;2325:3;2318:4;2310:6;2306:17;2302:27;2292:55;;2343:1;2340;2333:12;2292:55;-1:-1:-1;2366:20:1;;2409:18;2398:30;;2395:50;;;2441:1;2438;2431:12;2395:50;2478:4;2470:6;2466:17;2454:29;;2530:3;2523:4;2514:6;2506;2502:19;2498:30;2495:39;2492:59;;;2547:1;2544;2537:12;2492:59;2209:348;;;;;:::o;2562:411::-;2633:6;2641;2694:2;2682:9;2673:7;2669:23;2665:32;2662:52;;;2710:1;2707;2700:12;2662:52;2750:9;2737:23;2783:18;2775:6;2772:30;2769:50;;;2815:1;2812;2805:12;2769:50;2854:59;2905:7;2896:6;2885:9;2881:22;2854:59;:::i;:::-;2932:8;;2828:85;;-1:-1:-1;2562:411:1;-1:-1:-1;;;;2562:411:1:o;3171:544::-;3250:6;3258;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;3375:9;3362:23;3408:18;3400:6;3397:30;3394:50;;;3440:1;3437;3430:12;3394:50;3479:59;3530:7;3521:6;3510:9;3506:22;3479:59;:::i;:::-;3557:8;;-1:-1:-1;3453:85:1;-1:-1:-1;;3642:2:1;3627:18;;3614:32;3655:30;3614:32;3655:30;:::i;3912:118::-;3998:5;3991:13;3984:21;3977:5;3974:32;3964:60;;4020:1;4017;4010:12;4035:241;4091:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:52;;;4160:1;4157;4150:12;4112:52;4199:9;4186:23;4218:28;4240:5;4218:28;:::i;5437:127::-;5498:10;5493:3;5489:20;5486:1;5479:31;5529:4;5526:1;5519:15;5553:4;5550:1;5543:15;5569:253;5641:2;5635:9;5683:4;5671:17;;5718:18;5703:34;;5739:22;;;5700:62;5697:88;;;5765:18;;:::i;:::-;5801:2;5794:22;5569:253;:::o;5827:247::-;5894:2;5888:9;5936:3;5924:16;;5970:18;5955:34;;5991:22;;;5952:62;5949:88;;;6017:18;;:::i;6079:719::-;6122:5;6175:3;6168:4;6160:6;6156:17;6152:27;6142:55;;6193:1;6190;6183:12;6142:55;6229:6;6216:20;6255:18;6292:2;6288;6285:10;6282:36;;;6298:18;;:::i;:::-;6373:2;6367:9;6341:2;6427:13;;-1:-1:-1;;6423:22:1;;;6447:2;6419:31;6415:40;6403:53;;;6471:18;;;6491:22;;;6468:46;6465:72;;;6517:18;;:::i;:::-;6557:10;6553:2;6546:22;6592:2;6584:6;6577:18;6638:3;6631:4;6626:2;6618:6;6614:15;6610:26;6607:35;6604:55;;;6655:1;6652;6645:12;6604:55;6719:2;6712:4;6704:6;6700:17;6693:4;6685:6;6681:17;6668:54;6766:1;6759:4;6754:2;6746:6;6742:15;6738:26;6731:37;6786:6;6777:15;;;;;;6079:719;;;;:::o;6803:1661::-;6895:6;6948:2;6936:9;6927:7;6923:23;6919:32;6916:52;;;6964:1;6961;6954:12;6916:52;7004:9;6991:23;7033:18;7074:2;7066:6;7063:14;7060:34;;;7090:1;7087;7080:12;7060:34;7113:22;;;;7169:4;7151:16;;;7147:27;7144:47;;;7187:1;7184;7177:12;7144:47;7213:22;;:::i;:::-;7273:2;7260:16;7301:2;7291:8;7288:16;7285:36;;;7317:1;7314;7307:12;7285:36;7344:45;7381:7;7370:8;7366:2;7362:17;7344:45;:::i;:::-;7337:5;7330:60;;7436:2;7432;7428:11;7415:25;7465:2;7455:8;7452:16;7449:36;;;7481:1;7478;7471:12;7449:36;7517:45;7554:7;7543:8;7539:2;7535:17;7517:45;:::i;:::-;7512:2;7505:5;7501:14;7494:69;;7609:2;7605;7601:11;7588:25;7638:2;7628:8;7625:16;7622:36;;;7654:1;7651;7644:12;7622:36;7690:45;7727:7;7716:8;7712:2;7708:17;7690:45;:::i;:::-;7685:2;7678:5;7674:14;7667:69;;7782:2;7778;7774:11;7761:25;7811:2;7801:8;7798:16;7795:36;;;7827:1;7824;7817:12;7795:36;7863:45;7900:7;7889:8;7885:2;7881:17;7863:45;:::i;:::-;7858:2;7851:5;7847:14;7840:69;;7955:3;7951:2;7947:12;7934:26;7985:2;7975:8;7972:16;7969:36;;;8001:1;7998;7991:12;7969:36;8038:45;8075:7;8064:8;8060:2;8056:17;8038:45;:::i;:::-;8032:3;8025:5;8021:15;8014:70;;8130:3;8126:2;8122:12;8109:26;8160:2;8150:8;8147:16;8144:36;;;8176:1;8173;8166:12;8144:36;8213:45;8250:7;8239:8;8235:2;8231:17;8213:45;:::i;:::-;8207:3;8200:5;8196:15;8189:70;;8305:3;8301:2;8297:12;8284:26;8335:2;8325:8;8322:16;8319:36;;;8351:1;8348;8341:12;8319:36;8388:45;8425:7;8414:8;8410:2;8406:17;8388:45;:::i;:::-;8382:3;8371:15;;8364:70;-1:-1:-1;8375:5:1;6803:1661;-1:-1:-1;;;;;6803:1661:1:o;8469:315::-;8537:6;8545;8598:2;8586:9;8577:7;8573:23;8569:32;8566:52;;;8614:1;8611;8604:12;8566:52;8653:9;8640:23;8672:31;8697:5;8672:31;:::i;:::-;8722:5;8774:2;8759:18;;;;8746:32;;-1:-1:-1;;;8469:315:1:o;8789:180::-;8848:6;8901:2;8889:9;8880:7;8876:23;8872:32;8869:52;;;8917:1;8914;8907:12;8869:52;-1:-1:-1;8940:23:1;;8789:180;-1:-1:-1;8789:180:1:o;8974:540::-;9051:6;9059;9067;9120:2;9108:9;9099:7;9095:23;9091:32;9088:52;;;9136:1;9133;9126:12;9088:52;9176:9;9163:23;9209:18;9201:6;9198:30;9195:50;;;9241:1;9238;9231:12;9195:50;9280:59;9331:7;9322:6;9311:9;9307:22;9280:59;:::i;:::-;9358:8;;-1:-1:-1;9254:85:1;-1:-1:-1;;9443:2:1;9428:18;;9415:32;9456:28;9415:32;9456:28;:::i;9519:385::-;9605:6;9613;9621;9629;9682:3;9670:9;9661:7;9657:23;9653:33;9650:53;;;9699:1;9696;9689:12;9650:53;-1:-1:-1;;9722:23:1;;;9792:2;9777:18;;9764:32;;-1:-1:-1;9843:2:1;9828:18;;9815:32;;9894:2;9879:18;9866:32;;-1:-1:-1;9519:385:1;-1:-1:-1;9519:385:1:o;9909:163::-;9976:20;;10036:10;10025:22;;10015:33;;10005:61;;10062:1;10059;10052:12;10077:401;10159:6;10167;10175;10183;10236:3;10224:9;10215:7;10211:23;10207:33;10204:53;;;10253:1;10250;10243:12;10204:53;10276:28;10294:9;10276:28;:::i;:::-;10266:38;;10323:37;10356:2;10345:9;10341:18;10323:37;:::i;:::-;10313:47;;10379:37;10412:2;10401:9;10397:18;10379:37;:::i;:::-;10369:47;;10435:37;10468:2;10457:9;10453:18;10435:37;:::i;:::-;10425:47;;10077:401;;;;;;;:::o;10483:322::-;10552:6;10605:2;10593:9;10584:7;10580:23;10576:32;10573:52;;;10621:1;10618;10611:12;10573:52;10661:9;10648:23;10694:18;10686:6;10683:30;10680:50;;;10726:1;10723;10716:12;10680:50;10749;10791:7;10782:6;10771:9;10767:22;10749:50;:::i;11034:388::-;11102:6;11110;11163:2;11151:9;11142:7;11138:23;11134:32;11131:52;;;11179:1;11176;11169:12;11131:52;11218:9;11205:23;11237:31;11262:5;11237:31;:::i;:::-;11287:5;-1:-1:-1;11344:2:1;11329:18;;11316:32;11357:33;11316:32;11357:33;:::i;:::-;11409:7;11399:17;;;11034:388;;;;;:::o;11427:336::-;11629:2;11611:21;;;11668:2;11648:18;;;11641:30;-1:-1:-1;;;11702:2:1;11687:18;;11680:42;11754:2;11739:18;;11427:336::o;12116:273::-;12301:6;12293;12288:3;12275:33;12257:3;12327:16;;12352:13;;;12327:16;12116:273;-1:-1:-1;12116:273:1:o;12738:267::-;12827:6;12822:3;12815:19;12879:6;12872:5;12865:4;12860:3;12856:14;12843:43;-1:-1:-1;12931:1:1;12906:16;;;12924:4;12902:27;;;12895:38;;;;12987:2;12966:15;;;-1:-1:-1;;12962:29:1;12953:39;;;12949:50;;12738:267::o;13010:329::-;13195:2;13184:9;13177:21;13158:4;13215:62;13273:2;13262:9;13258:18;13250:6;13242;13215:62;:::i;:::-;13207:70;;13325:6;13317;13313:19;13308:2;13297:9;13293:18;13286:47;13010:329;;;;;;:::o;13344:250::-;13429:1;13439:113;13453:6;13450:1;13447:13;13439:113;;;13529:11;;;13523:18;13510:11;;;13503:39;13475:2;13468:10;13439:113;;;-1:-1:-1;;13586:1:1;13568:16;;13561:27;13344:250::o;13599:289::-;13730:3;13768:6;13762:13;13784:66;13843:6;13838:3;13831:4;13823:6;13819:17;13784:66;:::i;:::-;13866:16;;;;;13599:289;-1:-1:-1;;13599:289:1:o;14237:245::-;14304:6;14357:2;14345:9;14336:7;14332:23;14328:32;14325:52;;;14373:1;14370;14363:12;14325:52;14405:9;14399:16;14424:28;14446:5;14424:28;:::i;14487:127::-;14548:10;14543:3;14539:20;14536:1;14529:31;14579:4;14576:1;14569:15;14603:4;14600:1;14593:15;14619:125;14684:9;;;14705:10;;;14702:36;;;14718:18;;:::i;15367:184::-;15437:6;15490:2;15478:9;15469:7;15465:23;15461:32;15458:52;;;15506:1;15503;15496:12;15458:52;-1:-1:-1;15529:16:1;;15367:184;-1:-1:-1;15367:184:1:o;15556:271::-;15598:3;15636:5;15630:12;15663:6;15658:3;15651:19;15679:76;15748:6;15741:4;15736:3;15732:14;15725:4;15718:5;15714:16;15679:76;:::i;:::-;15809:2;15788:15;-1:-1:-1;;15784:29:1;15775:39;;;;15816:4;15771:50;;15556:271;-1:-1:-1;;15556:271:1:o;15832:1199::-;15890:3;15934:5;15928:12;15961:4;15956:3;15949:17;15987:47;16028:4;16023:3;16019:14;16005:12;15987:47;:::i;:::-;15975:59;;16082:4;16075:5;16071:16;16065:23;16130:3;16124:4;16120:14;16113:4;16108:3;16104:14;16097:38;16158:39;16192:4;16176:14;16158:39;:::i;:::-;16144:53;;;16245:4;16238:5;16234:16;16228:23;16295:3;16287:6;16283:16;16276:4;16271:3;16267:14;16260:40;16323:41;16357:6;16341:14;16323:41;:::i;:::-;16309:55;;;16412:4;16405:5;16401:16;16395:23;16462:3;16454:6;16450:16;16443:4;16438:3;16434:14;16427:40;16490:41;16524:6;16508:14;16490:41;:::i;:::-;16476:55;;;16579:4;16572:5;16568:16;16562:23;16629:3;16621:6;16617:16;16610:4;16605:3;16601:14;16594:40;16657:41;16691:6;16675:14;16657:41;:::i;:::-;16643:55;;;16746:4;16739:5;16735:16;16729:23;16796:3;16788:6;16784:16;16777:4;16772:3;16768:14;16761:40;16824:41;16858:6;16842:14;16824:41;:::i;:::-;16810:55;;;16913:4;16906:5;16902:16;16896:23;16963:3;16955:6;16951:16;16944:4;16939:3;16935:14;16928:40;16984:41;17018:6;17002:14;16984:41;:::i;:::-;16977:48;15832:1199;-1:-1:-1;;;;;15832:1199:1:o;17036:1558::-;17121:12;;740:6;729:18;717:31;;17185:4;17178:5;17174:16;17168:23;17200:47;17241:4;17236:3;17232:14;17218:12;740:6;729:18;717:31;;664:90;17200:47;;17295:4;17288:5;17284:16;17278:23;17310:49;17353:4;17348:3;17344:14;17328;740:6;729:18;717:31;;664:90;17310:49;;17407:4;17400:5;17396:16;17390:23;17422:49;17465:4;17460:3;17456:14;17440;740:6;729:18;717:31;;664:90;17422:49;;17519:4;17512:5;17508:16;17502:23;17534:49;17577:4;17572:3;17568:14;17552;740:6;729:18;717:31;;664:90;17534:49;;17631:4;17624:5;17620:16;17614:23;17646:49;17689:4;17684:3;17680:14;17664;740:6;729:18;717:31;;664:90;17646:49;;17743:4;17736:5;17732:16;17726:23;17758:49;17801:4;17796:3;17792:14;17776;740:6;729:18;717:31;;664:90;17758:49;;17855:4;17848:5;17844:16;17838:23;17870:49;17913:4;17908:3;17904:14;17888;740:6;729:18;717:31;;664:90;17870:49;-1:-1:-1;17938:6:1;17981:14;;;17975:21;740:6;729:18;18039:12;;;717:31;18071:6;18114:14;;;18108:21;4961:10;4950:22;;;18172:12;;;4938:35;;;;18204:6;18247:14;;;18241:21;4950:22;;18305:12;;;4938:35;18337:6;18381:14;;;18375:21;4950:22;;18440:12;;;4938:35;18472:6;18516:14;;;18510:21;4950:22;;;18575:12;;;4938:35;18472:6;18540:48;4885:94;18599:893;-1:-1:-1;;;;;19092:15:1;;;19074:34;;19144:15;;;19139:2;19124:18;;19117:43;19196:15;;19191:2;19176:18;;19169:43;19243:2;19228:18;;19221:34;;;19286:3;19271:19;;19264:35;;;19024:3;19054;19315:19;;19308:31;;;18995:4;;19356:61;19398:18;;;19390:6;19356:61;:::i;:::-;19348:69;;;19426:60;19481:3;19470:9;19466:19;19458:6;19426:60;:::i;:::-;18599:893;;;;;;;;;;:::o;19776:328::-;19957:2;19946:9;19939:21;19920:4;19977:62;20035:2;20024:9;20020:18;20012:6;20004;19977:62;:::i;:::-;19969:70;;20089:6;20082:14;20075:22;20070:2;20059:9;20055:18;20048:50;19776:328;;;;;;:::o;22559:197::-;22597:3;22625:6;22666:2;22659:5;22655:14;22693:2;22684:7;22681:15;22678:41;;22699:18;;:::i;:::-;22748:1;22735:15;;22559:197;-1:-1:-1;;;22559:197:1:o;22761:385::-;22920:3;22958:6;22952:13;22974:66;23033:6;23028:3;23021:4;23013:6;23009:17;22974:66;:::i;:::-;23062:16;;;;23087:21;;;-1:-1:-1;23135:4:1;23124:16;;22761:385;-1:-1:-1;22761:385:1:o;23151:660::-;-1:-1:-1;;;;;23552:15:1;;;23534:34;;23604:15;;23599:2;23584:18;;23577:43;23484:3;23651:2;23636:18;;23629:30;;;23455:4;;23676:61;23718:18;;;23710:6;23676:61;:::i;:::-;23668:69;;;23746:59;23801:2;23790:9;23786:18;23778:6;23746:59;:::i;23816:360::-;24019:6;24008:9;24001:25;24062:6;24057:2;24046:9;24042:18;24035:34;24105:2;24100;24089:9;24085:18;24078:30;23982:4;24125:45;24166:2;24155:9;24151:18;24143:6;24125:45;:::i;24181:251::-;24251:6;24304:2;24292:9;24283:7;24279:23;24275:32;24272:52;;;24320:1;24317;24310:12;24272:52;24352:9;24346:16;24371:31;24396:5;24371:31;:::i;24437:625::-;24534:6;24542;24550;24558;24566;24619:3;24607:9;24598:7;24594:23;24590:33;24587:53;;;24636:1;24633;24626:12;24587:53;24668:9;24662:16;24687:28;24709:5;24687:28;:::i;:::-;24784:2;24769:18;;24763:25;24734:5;;-1:-1:-1;24797:30:1;24763:25;24797:30;:::i;:::-;24898:2;24883:18;;24877:25;24846:7;;-1:-1:-1;24911:30:1;24877:25;24911:30;:::i;:::-;25007:2;24992:18;;24986:25;25051:3;25036:19;;;25030:26;24437:625;;;;-1:-1:-1;24960:7:1;24986:25;25030:26;24437:625;-1:-1:-1;;;24437:625:1:o;25770:1085::-;25923:6;25931;25939;25947;25955;25963;25971;26024:3;26012:9;26003:7;25999:23;25995:33;25992:53;;;26041:1;26038;26031:12;25992:53;26073:9;26067:16;26092:31;26117:5;26092:31;:::i;:::-;26192:2;26177:18;;26171:25;26142:5;;-1:-1:-1;26205:33:1;26171:25;26205:33;:::i;:::-;26309:2;26294:18;;26288:25;26257:7;;-1:-1:-1;26322:33:1;26288:25;26322:33;:::i;:::-;26426:2;26411:18;;26405:25;26374:7;;-1:-1:-1;26439:33:1;26405:25;26439:33;:::i;:::-;26543:3;26528:19;;26522:26;26491:7;;-1:-1:-1;26557:32:1;26522:26;26557:32;:::i;:::-;26660:3;26645:19;;26639:26;26608:7;;-1:-1:-1;26674:32:1;26639:26;26674:32;:::i;:::-;26777:3;26762:19;;26756:26;26725:7;;-1:-1:-1;26791:32:1;26756:26;26791:32;:::i;:::-;26842:7;26832:17;;;25770:1085;;;;;;;;;;:::o;27201:168::-;27268:6;27294:10;;;27306;;;27290:27;;27329:11;;;27326:37;;;27343:18;;:::i;:::-;27326:37;27201:168;;;;:::o;27374:::-;27447:9;;;27478;;27495:15;;;27489:22;;27475:37;27465:71;;27516:18;;:::i;27547:217::-;27587:1;27613;27603:132;;27657:10;27652:3;27648:20;27645:1;27638:31;27692:4;27689:1;27682:15;27720:4;27717:1;27710:15;27603:132;-1:-1:-1;27749:9:1;;27547:217::o;28114:519::-;28202:6;28210;28218;28271:2;28259:9;28250:7;28246:23;28242:32;28239:52;;;28287:1;28284;28277:12;28239:52;28319:9;28313:16;28338:31;28363:5;28338:31;:::i;:::-;28438:2;28423:18;;28417:25;28388:5;;-1:-1:-1;28451:33:1;28417:25;28451:33;:::i;:::-;28555:2;28540:18;;28534:25;28503:7;;-1:-1:-1;28568:33:1;28534:25;28568:33;:::i;29789:306::-;29877:6;29885;29893;29946:2;29934:9;29925:7;29921:23;29917:32;29914:52;;;29962:1;29959;29952:12;29914:52;29991:9;29985:16;29975:26;;30041:2;30030:9;30026:18;30020:25;30010:35;;30085:2;30074:9;30070:18;30064:25;30054:35;;29789:306;;;;;:::o;31561:148::-;31650:13;;31672:31;31650:13;31672:31;:::i;31714:842::-;31811:6;31864:3;31852:9;31843:7;31839:23;31835:33;31832:53;;;31881:1;31878;31871:12;31832:53;31907:17;;:::i;:::-;31953:9;31947:16;31940:5;31933:31;31996:59;32051:2;32040:9;32036:18;31996:59;:::i;:::-;31991:2;31984:5;31980:14;31973:83;32109:2;32098:9;32094:18;32088:25;32083:2;32076:5;32072:14;32065:49;32167:2;32156:9;32152:18;32146:25;32141:2;32134:5;32130:14;32123:49;32226:3;32215:9;32211:19;32205:26;32199:3;32192:5;32188:15;32181:51;32286:3;32275:9;32271:19;32265:26;32259:3;32252:5;32248:15;32241:51;32325:60;32380:3;32369:9;32365:19;32325:60;:::i;:::-;32319:3;32308:15;;32301:85;32440:3;32425:19;;;32419:26;32402:15;;;32395:51;32465:3;32506:18;;;32500:25;32484:14;;;32477:49;;;;-1:-1:-1;32312:5:1;31714:842;-1:-1:-1;31714:842:1:o;35788:220::-;35937:2;35926:9;35919:21;35900:4;35957:45;35998:2;35987:9;35983:18;35975:6;35957:45;:::i
Swarm Source
ipfs://cb5b3bd5764be55aee0558a3c4e667cf96b4169f0b28b018ff9da1ea8d3bc386
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.