ERC-20
Marketing
Overview
Max Total Supply
100,000,000 DOKI
Holders
289 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
166,667 DOKIValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OkidokiSocial
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.8.4; // SPDX-License-Identifier: Apache-2.0 import "./SafeMath.sol"; import "./Address.sol"; import "./RewardsToken.sol"; import "./IUniswapV2Factory.sol"; import "./IUniswapV2Router.sol"; import "./IRewardsTracker.sol"; contract OkidokiSocial is RewardsToken { using SafeMath for uint256; using Address for address; // Supply, limits and fees uint256 private constant REWARDS_TRACKER_IDENTIFIER = 1; uint256 private constant TOTAL_SUPPLY = 100000000 * (10**9); uint256 public maxTxAmount = TOTAL_SUPPLY.mul(2).div(1000); // .2% uint256 private platformFee = 75; // 0.75% uint256 private _previousPlatformFee = platformFee; uint256 public devFee = 625; // 6.25% uint256 public sellDevFee = 0; // 0% uint256 private _previousDevFee = devFee; uint256 public rewardsFee = 300; // 3% uint256 public sellRewardsFee = 0; // 0% uint256 private _previousRewardsFee = rewardsFee; uint256 public launchSellFee = 1500; // 15% uint256 private _previousLaunchSellFee = launchSellFee; address payable private _platformWalletAddress = payable(0x2FFef3ff3f53EA177be6f40c701cfd79d79B90Ea); address payable private _devWalletAddress = payable(0x5e8a57536510C3c9635F6d940d0Ffa42E2F83995); uint256 public launchSellFeeDeadline = 0; IRewardsTracker private _rewardsTracker; // Fallback to generic transfer. On by default bool public useGenericTransfer = true; // Prepared for launch bool private preparedForLaunch = false; // Exclusions mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromMaxTx; // Token -> ETH swap support IUniswapV2Router public uniswapV2Router; address public uniswapV2Pair; bool currentlySwapping; bool public swapAndRedirectEthFeesEnabled = true; uint256 private minTokensBeforeSwap = 1000 * 10**9; // Events and modifiers event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event SwapAndRedirectEthFeesUpdated(bool enabled); event OnSwapAndRedirectEthFees( uint256 tokensSwapped, uint256 ethToDevWallet ); event MaxTxAmountUpdated(uint256 maxTxAmount); event GenericTransferChanged(bool useGenericTransfer); event ExcludeFromFees(address wallet); event IncludeInFees(address wallet); event DevWalletUpdated(address newDevWallet); event RewardsTrackerUpdated(address newRewardsTracker); event RouterUpdated(address newRouterAddress); event FeesChanged( uint256 newDevFee, uint256 newSellDevFee, uint256 newRewardsFee, uint256 newSellRewardsFee ); event LaunchFeeUpdated(uint256 newLaunchSellFee); modifier lockTheSwap() { currentlySwapping = true; _; currentlySwapping = false; } constructor() ERC20("Okidoki Social", "DOKI") { IUniswapV2Router _uniswapV2Router = IUniswapV2Router( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); // Create a uniswap pair for this new token uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); // set the rest of the contract variables uniswapV2Router = _uniswapV2Router; // mint supply _mint(owner(), TOTAL_SUPPLY); // exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; // internal exclude from max tx _isExcludedFromMaxTx[owner()] = true; _isExcludedFromMaxTx[address(this)] = true; // exclude from rewards excludeFromRewards(address(this)); excludeFromRewards(address(0xdead)); excludeFromRewards(uniswapV2Pair); } function decimals() public view virtual override returns (uint8) { return 9; } function _transfer( address from, address to, uint256 amount ) internal virtual override { // launch preparation require(preparedForLaunch || _msgSender() == owner(), "Contract has not been prepared for launch and user is not owner"); // fallback implementation if (useGenericTransfer) { super._transfer(from, to, amount); return; } if ( !_isExcludedFromMaxTx[from] && !_isExcludedFromMaxTx[to] // by default false ) { require( amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount" ); } // sell fees uint256 baseRewardsFee = rewardsFee; uint256 baseDevFee = devFee; if (to == uniswapV2Pair) { devFee = sellDevFee; rewardsFee = sellRewardsFee; if (launchSellFeeDeadline >= block.timestamp) { devFee = devFee.add(launchSellFee); } } // start swap to ETH uint256 contractTokenBalance = balanceOf(address(this)); bool overMinTokenBalance = contractTokenBalance >= minTokensBeforeSwap; if ( overMinTokenBalance && !currentlySwapping && from != uniswapV2Pair && swapAndRedirectEthFeesEnabled ) { // add dev fee swapAndRedirectEthFees(contractTokenBalance); } if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { removeAllFee(); } (uint256 tTransferAmount, uint256 tFee) = _getValues(amount); _balances[from] = _balances[from].sub(amount); _balances[to] = _balances[to].add(tTransferAmount); _takeFee(tFee); if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { restoreAllFee(); } // restore fees devFee = baseDevFee; rewardsFee = baseRewardsFee; emit Transfer(from, to, tTransferAmount); } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function _getValues(uint256 tAmount) private view returns (uint256, uint256) { uint256 tFee = calculateFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee); return (tTransferAmount, tFee); } function _takeFee(uint256 fee) private { _balances[address(this)] = _balances[address(this)].add(fee); } function calculateFee(uint256 _amount) private view returns (uint256) { uint256 totalFee = devFee.add(rewardsFee).add(platformFee); return _amount.mul(totalFee).div(10000); } function removeAllFee() private { if (devFee == 0 && rewardsFee == 0 && platformFee == 0) return; _previousPlatformFee = platformFee; _previousDevFee = devFee; _previousRewardsFee = rewardsFee; platformFee = 0; devFee = 0; rewardsFee = 0; } function restoreAllFee() private { platformFee = _previousPlatformFee; devFee = _previousDevFee; rewardsFee = _previousRewardsFee; } function swapAndRedirectEthFees(uint256 contractTokenBalance) private lockTheSwap { uint256 totalRedirectFee = devFee.add(rewardsFee).add(platformFee); if (totalRedirectFee == 0) return; // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the fee events include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(contractTokenBalance); uint256 newBalance = address(this).balance.sub(initialBalance); if (newBalance > 0) { // send to platform wallet uint256 platformBalance = newBalance.mul(platformFee).div(totalRedirectFee); sendEthToWallet(_platformWalletAddress, platformBalance); // // send to rewards wallet // uint256 rewardsBalance = newBalance.mul(rewardsFee).div(totalRedirectFee); if (rewardsBalance > 0 && address(_rewardsTracker) != address(0)) { try _rewardsTracker.addAllocation{value: rewardsBalance}(REWARDS_TRACKER_IDENTIFIER) {} catch {} } // // send to dev wallet // uint256 devBalance = newBalance.mul(devFee).div(totalRedirectFee); sendEthToWallet(_devWalletAddress, devBalance); emit OnSwapAndRedirectEthFees(contractTokenBalance, newBalance); } } function sendEthToWallet(address wallet, uint256 amount) private { if (amount > 0) { payable(wallet).transfer(amount); } } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function prepareForLaunch() external onlyOwner { require(!preparedForLaunch, "Already prepared for launch"); // ready for launch preparedForLaunch = true; // sell penalty for the first 24 hours launchSellFeeDeadline = block.timestamp + 4 days; } function setUseGenericTransfer(bool genericTransfer) external onlyOwner { useGenericTransfer = genericTransfer; emit GenericTransferChanged(genericTransfer); } // for 0.5% input 5, for 1% input 10 function setMaxTxPercent(uint256 newMaxTx) external onlyOwner { require(newMaxTx >= 5, "Max TX should be above 0.5%"); maxTxAmount = TOTAL_SUPPLY.mul(newMaxTx).div(1000); emit MaxTxAmountUpdated(maxTxAmount); } function isExcludedFromFee(address account) external view returns (bool) { return _isExcludedFromFee[account]; } function excludeFromFee(address account) external onlyOwner { _isExcludedFromFee[account] = true; emit ExcludeFromFees(account); } function includeInFee(address account) external onlyOwner { _isExcludedFromFee[account] = false; emit IncludeInFees(account); } function setFees( uint256 newDevFee, uint256 newSellDevFee, uint256 newRewardsFee, uint256 newSellRewardsFee ) external onlyOwner { require( newDevFee <= 1000 && newSellDevFee <= 1000 && newRewardsFee <= 1000 && newSellRewardsFee <= 1000, "Fees exceed maximum allowed value" ); devFee = newDevFee; sellDevFee = newSellDevFee; rewardsFee = newRewardsFee; sellRewardsFee = newSellRewardsFee; emit FeesChanged(newDevFee, newSellDevFee, newRewardsFee, newSellRewardsFee); } function setLaunchSellFee(uint256 newLaunchSellFee) external onlyOwner { require(newLaunchSellFee <= 2500, "Maximum launch sell fee is 25%"); launchSellFee = newLaunchSellFee; emit LaunchFeeUpdated(newLaunchSellFee); } function setDevWallet(address payable newDevWallet) external onlyOwner { _devWalletAddress = newDevWallet; emit DevWalletUpdated(newDevWallet); } function setRewardsTracker(address payable newRewardsTracker) external onlyOwner { _rewardsTracker = IRewardsTracker(newRewardsTracker); emit RewardsTrackerUpdated(newRewardsTracker); } function setRouterAddress(address newRouter) external onlyOwner { IUniswapV2Router _newUniswapRouter = IUniswapV2Router(newRouter); uniswapV2Pair = IUniswapV2Factory(_newUniswapRouter.factory()) .createPair(address(this), _newUniswapRouter.WETH()); uniswapV2Router = _newUniswapRouter; emit RouterUpdated(newRouter); } function setSwapAndRedirectEthFeesEnabled(bool enabled) external onlyOwner { swapAndRedirectEthFeesEnabled = enabled; emit SwapAndRedirectEthFeesUpdated(enabled); } function setMinTokensBeforeSwap(uint256 minTokens) external onlyOwner { minTokensBeforeSwap = minTokens * 10**9; emit MinTokensBeforeSwapUpdated(minTokens); } // emergency claim functions function manualSwap() external onlyOwner { uint256 contractBalance = balanceOf(address(this)); swapTokensForEth(contractBalance); } function manualSend() external onlyOwner { uint256 contractEthBalance = address(this).balance; sendEthToWallet(_devWalletAddress, contractEthBalance); } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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 functionCall(target, data, "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" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; using Address for address; mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 internal _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
pragma solidity 0.8.4; // SPDX-License-Identifier: Apache-2.0 interface IRewardsTracker { function addAllocation(uint identifier) external payable; }
pragma solidity 0.8.4; // SPDX-License-Identifier: MIT interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); }
pragma solidity 0.8.4; // SPDX-License-Identifier: MIT interface IUniswapV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
pragma solidity 0.8.4; // SPDX-License-Identifier: MIT import "./Context.sol"; /** * @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. */ 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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) external virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: Apache-2.0 import "./ERC20.sol"; import "./Ownable.sol"; abstract contract RewardsToken is ERC20, Ownable { address[] private excludedFromRewards; mapping(address => bool) private isAddressExcluded; event ExcludeFromRewards(address wallet); event IncludeInRewards(address wallet); function deleteExcluded(uint index) internal { require(index < excludedFromRewards.length, "Index is greater than array length"); excludedFromRewards[index] = excludedFromRewards[excludedFromRewards.length - 1]; excludedFromRewards.pop(); } function getExcludedBalances() internal view returns (uint256) { uint256 totalExcludedHoldings = 0; for (uint i = 0; i < excludedFromRewards.length; i++) { totalExcludedHoldings += balanceOf(excludedFromRewards[i]); } return totalExcludedHoldings; } function excludeFromRewards(address wallet) public onlyOwner { require(!isAddressExcluded[wallet], "Address is already excluded from rewards"); excludedFromRewards.push(wallet); isAddressExcluded[wallet] = true; emit ExcludeFromRewards(wallet); } function includeInRewards(address wallet) external onlyOwner { require(isAddressExcluded[wallet], "Address is not excluded from rewards"); for (uint i = 0; i < excludedFromRewards.length; i++) { if (excludedFromRewards[i] == wallet) { isAddressExcluded[wallet] = false; deleteExcluded(i); break; } } emit IncludeInRewards(wallet); } function isExcludedFromRewards(address wallet) external view returns (bool) { return isAddressExcluded[wallet]; } function getAllExcludedFromRewards() external view returns (address[] memory) { return excludedFromRewards; } function getRewardsSupply() public view returns (uint256) { return _totalSupply - getExcludedBalances(); } }
pragma solidity ^0.8.4; // SPDX-License-Identifier: MIT /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludeFromRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellRewardsFee","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"useGenericTransfer","type":"bool"}],"name":"GenericTransferChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludeInFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludeInRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLaunchSellFee","type":"uint256"}],"name":"LaunchFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethToDevWallet","type":"uint256"}],"name":"OnSwapAndRedirectEthFees","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":"newRewardsTracker","type":"address"}],"name":"RewardsTrackerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndRedirectEthFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllExcludedFromRewards","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"includeInRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchSellFeeDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prepareForLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDevFee","type":"uint256"},{"internalType":"uint256","name":"newSellDevFee","type":"uint256"},{"internalType":"uint256","name":"newRewardsFee","type":"uint256"},{"internalType":"uint256","name":"newSellRewardsFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLaunchSellFee","type":"uint256"}],"name":"setLaunchSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTx","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newRewardsTracker","type":"address"}],"name":"setRewardsTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndRedirectEthFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"genericTransfer","type":"bool"}],"name":"setUseGenericTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndRedirectEthFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useGenericTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052620000426103e86200002e600267016345785d8a00006200049660201b620017851790919060201c565b6200052a60201b6200180b1790919060201c565b600855604b6009819055600a55610271600b8190556000600c819055600d9190915561012c600e819055600f8290556010556105dc6011819055601255601380546001600160a01b0319908116732ffef3ff3f53ea177be6f40c701cfd79d79b90ea1790915560148054909116735e8a57536510c3c9635f6d940d0ffa42e2f839951790556015556016805461ffff60a01b1916600160a01b179055601a805460ff60a81b1916600160a81b17905564e8d4a51000601b553480156200010757600080fd5b50604080518082018252600e81526d13dada591bdada4814dbd8da585b60921b602080830191825283518085019094526004845263444f4b4960e01b9084015281519192916200015a9160039162000885565b5080516200017090600490602084019062000885565b5050506000620001856200057460201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200022657600080fd5b505afa1580156200023b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026191906200092b565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002aa57600080fd5b505afa158015620002bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e591906200092b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200032e57600080fd5b505af115801562000343573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036991906200092b565b601a80546001600160a01b03199081166001600160a01b039384161790915560198054909116838316179055600554620003ad911667016345785d8a000062000578565b600160176000620003c66005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260179092528120805490921660019081179092556018906200041f6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553080825260189093522080549092166001179091556200046b9062000674565b6200047861dead62000674565b601a546200048f906001600160a01b031662000674565b5062000a5b565b600082620004a75750600062000524565b6000620004b58385620009e6565b905082620004c48583620009c5565b14620005215760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b90505b92915050565b60006200052183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620007e660201b60201c565b3390565b6001600160a01b038216620005d05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000518565b620005ec816002546200082260201b6200184d1790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200061f9183906200184d62000822821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6005546001600160a01b03163314620006d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000518565b6001600160a01b03811660009081526007602052604090205460ff16156200074c5760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b606482015260840162000518565b6006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155600081815260076020908152604091829020805460ff1916909417909355519081527f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd6910160405180910390a150565b600081836200080a5760405162461bcd60e51b815260040162000518919062000954565b506000620008198486620009c5565b95945050505050565b600080620008318385620009aa565b905083811015620005215760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000518565b828054620008939062000a08565b90600052602060002090601f016020900481019282620008b7576000855562000902565b82601f10620008d257805160ff191683800117855562000902565b8280016001018555821562000902579182015b8281111562000902578251825591602001919060010190620008e5565b506200091092915062000914565b5090565b5b8082111562000910576000815560010162000915565b6000602082840312156200093d578081fd5b81516001600160a01b038116811462000521578182fd5b6000602080835283518082850152825b81811015620009825785810183015185820160400152820162000964565b81811115620009945783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115620009c057620009c062000a45565b500190565b600082620009e157634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161562000a035762000a0362000a45565b500290565b600181811c9082168062000a1d57607f821691505b6020821081141562000a3f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6129708062000a6b6000396000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063ada46d0a116100c1578063dd62ed3e1161007a578063dd62ed3e1461076a578063e89bcca2146107b0578063ea2f0b37146107d0578063f2fde38b146107f0578063f429389014610810578063fffa1dd91461082557600080fd5b8063ada46d0a146106bc578063af01f2b2146106de578063b609995e146106f4578063ba385abb14610714578063bb8d513114610734578063d543dbeb1461074a57600080fd5b806395d89b411161011357806395d89b411461061b57806398850b6414610630578063a0d82dc514610651578063a1ab19a314610667578063a457c2d71461067c578063a9059cbb1461069c57600080fd5b806370a082311461057c578063715018a6146105b25780638421b507146105c75780638c0b5e22146105e75780638da5cb5b146105fd57600080fd5b8063313ce567116101e857806349bd5a5e116101ac57806349bd5a5e146104c257806351bc3c85146104e25780635342acb4146104f757806354959363146105305780636827e764146105465780636fcba3771461055c57600080fd5b8063313ce56714610426578063395093511461044257806341cb87fc14610462578063437823ec1461048257806348a46473146104a257600080fd5b80631694505e1161023a5780631694505e1461035957806318160ddd146103915780631f53ac02146103b057806323b872dd146103d057806326b6308d146103f05780632bb14e1d1461041057600080fd5b806306fdde0314610282578063095ea7b3146102ad5780630e832273146102dd578063111e037614610316578063113201fa1461033857600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b5061029761083a565b6040516102a4919061271a565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004612630565b6108cc565b60405190151581526020016102a4565b3480156102e957600080fd5b506102cd6102f8366004612580565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561032257600080fd5b50610336610331366004612580565b6108e3565b005b34801561034457600080fd5b50601a546102cd90600160a81b900460ff1681565b34801561036557600080fd5b50601954610379906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561039d57600080fd5b506002545b6040519081526020016102a4565b3480156103bc57600080fd5b506103366103cb366004612580565b610a2b565b3480156103dc57600080fd5b506102cd6103eb3660046125f0565b610aa3565b3480156103fc57600080fd5b5061033661040b36600461265b565b610b0c565b34801561041c57600080fd5b506103a2600e5481565b34801561043257600080fd5b50604051600981526020016102a4565b34801561044e57600080fd5b506102cd61045d366004612630565b610b83565b34801561046e57600080fd5b5061033661047d366004612580565b610bb9565b34801561048e57600080fd5b5061033661049d366004612580565b610dbe565b3480156104ae57600080fd5b506103366104bd36600461267b565b610e3c565b3480156104ce57600080fd5b50601a54610379906001600160a01b031681565b3480156104ee57600080fd5b50610336610ea7565b34801561050357600080fd5b506102cd610512366004612580565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561053c57600080fd5b506103a260115481565b34801561055257600080fd5b506103a2600b5481565b34801561056857600080fd5b50610336610577366004612693565b610eed565b34801561058857600080fd5b506103a2610597366004612580565b6001600160a01b031660009081526020819052604090205490565b3480156105be57600080fd5b50610336610fff565b3480156105d357600080fd5b506103366105e236600461267b565b611073565b3480156105f357600080fd5b506103a260085481565b34801561060957600080fd5b506005546001600160a01b0316610379565b34801561062757600080fd5b50610297611124565b34801561063c57600080fd5b506016546102cd90600160a01b900460ff1681565b34801561065d57600080fd5b506103a2600c5481565b34801561067357600080fd5b50610336611133565b34801561068857600080fd5b506102cd610697366004612630565b6111dc565b3480156106a857600080fd5b506102cd6106b7366004612630565b61122b565b3480156106c857600080fd5b506106d1611238565b6040516102a49190612707565b3480156106ea57600080fd5b506103a260155481565b34801561070057600080fd5b5061033661070f366004612580565b611299565b34801561072057600080fd5b5061033661072f366004612580565b611404565b34801561074057600080fd5b506103a2600f5481565b34801561075657600080fd5b5061033661076536600461267b565b61147c565b34801561077657600080fd5b506103a26107853660046125b8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156107bc57600080fd5b506103366107cb36600461265b565b61154a565b3480156107dc57600080fd5b506103366107eb366004612580565b6115c1565b3480156107fc57600080fd5b5061033661080b366004612580565b61163c565b34801561081c57600080fd5b50610336611727565b34801561083157600080fd5b506103a2611769565b6060600380546108499061284c565b80601f01602080910402602001604051908101604052809291908181526020018280546108759061284c565b80156108c25780601f10610897576101008083540402835291602001916108c2565b820191906000526020600020905b8154815290600101906020018083116108a557829003601f168201915b5050505050905090565b60006108d93384846118ac565b5060015b92915050565b6005546001600160a01b031633146109165760405162461bcd60e51b815260040161090d9061276d565b60405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16156109905760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b606482015260840161090d565b6006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155600081815260076020908152604091829020805460ff1916909417909355519081527f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd691015b60405180910390a150565b6005546001600160a01b03163314610a555760405162461bcd60e51b815260040161090d9061276d565b601480546001600160a01b0319166001600160a01b0383169081179091556040519081527f31bb1993faff4f8409d7baad771f861e093ef4ce2c92c6e0cb10b82d1c7324cb90602001610a20565b6000610ab08484846119d1565b610b028433610afd856040518060600160405280602881526020016128ee602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611d63565b6118ac565b5060019392505050565b6005546001600160a01b03163314610b365760405162461bcd60e51b815260040161090d9061276d565b601a8054821515600160a81b0260ff60a81b199091161790556040517fd9fca2a469120637ae54e43ab68dfdcd9354db52d615dea3d3a66a085e6f41b990610a2090831515815260200190565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108d9918590610afd908661184d565b6005546001600160a01b03163314610be35760405162461bcd60e51b815260040161090d9061276d565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2157600080fd5b505afa158015610c35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c59919061259c565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca157600080fd5b505afa158015610cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd9919061259c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d59919061259c565b601a80546001600160a01b03199081166001600160a01b03938416179091556019805490911683831617905560405190831681527f7aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc809060200160405180910390a15050565b6005546001600160a01b03163314610de85760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b038116600081815260176020908152604091829020805460ff1916600117905590519182527f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369101610a20565b6005546001600160a01b03163314610e665760405162461bcd60e51b815260040161090d9061276d565b610e7481633b9aca00612816565b601b556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001610a20565b6005546001600160a01b03163314610ed15760405162461bcd60e51b815260040161090d9061276d565b30600090815260208190526040902054610eea81611d9d565b50565b6005546001600160a01b03163314610f175760405162461bcd60e51b815260040161090d9061276d565b6103e88411158015610f2b57506103e88311155b8015610f3957506103e88211155b8015610f4757506103e88111155b610f9d5760405162461bcd60e51b815260206004820152602160248201527f4665657320657863656564206d6178696d756d20616c6c6f7765642076616c756044820152606560f81b606482015260840161090d565b600b849055600c839055600e829055600f8190556040805185815260208101859052908101839052606081018290527f7027e29faa2460f22e800d92db38d4795b668c7104da6b87afaeaf502a269ca59060800160405180910390a150505050565b6005546001600160a01b031633146110295760405162461bcd60e51b815260040161090d9061276d565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461109d5760405162461bcd60e51b815260040161090d9061276d565b6109c48111156110ef5760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206c61756e63682073656c6c20666565206973203235250000604482015260640161090d565b60118190556040518181527fc799be5eb19a1a6d6ba7368d21e2bc367c8a335e4a07cd3d954482e6f714d3c590602001610a20565b6060600480546108499061284c565b6005546001600160a01b0316331461115d5760405162461bcd60e51b815260040161090d9061276d565b601654600160a81b900460ff16156111b75760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920707265706172656420666f72206c61756e63680000000000604482015260640161090d565b6016805460ff60a81b1916600160a81b1790556111d742620546006127de565b601555565b60006108d93384610afd85604051806060016040528060258152602001612916602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611d63565b60006108d93384846119d1565b606060068054806020026020016040519081016040528092919081815260200182805480156108c257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611272575050505050905090565b6005546001600160a01b031633146112c35760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b03811660009081526007602052604090205460ff166113375760405162461bcd60e51b8152602060048201526024808201527f41646472657373206973206e6f74206578636c756465642066726f6d207265776044820152636172647360e01b606482015260840161090d565b60005b6006548110156113ca57816001600160a01b03166006828154811061136f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156113b8576001600160a01b0382166000908152600760205260409020805460ff191690556113b381611f22565b6113ca565b806113c281612881565b91505061133a565b506040516001600160a01b03821681527f87434094d24a90fbd9a8ffcf2be9818d237c06a12d126296bc1ea7d58959433490602001610a20565b6005546001600160a01b0316331461142e5760405162461bcd60e51b815260040161090d9061276d565b601680546001600160a01b0319166001600160a01b0383169081179091556040519081527f535be0bbc71c839ded01277ab57f29f2e810c1ff0255bb938d7cb8e96ac8ca1a90602001610a20565b6005546001600160a01b031633146114a65760405162461bcd60e51b815260040161090d9061276d565b60058110156114f75760405162461bcd60e51b815260206004820152601b60248201527f4d61782054582073686f756c642062652061626f766520302e35250000000000604482015260640161090d565b6115156103e861150f67016345785d8a000084611785565b9061180b565b60088190556040519081527f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf90602001610a20565b6005546001600160a01b031633146115745760405162461bcd60e51b815260040161090d9061276d565b60168054821515600160a01b0260ff60a01b199091161790556040517f7d952115fd41bb443db2ae9cde6670e8dd72fefb507b7a4e0156c57e439afaf590610a2090831515815260200190565b6005546001600160a01b031633146115eb5760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b038116600081815260176020908152604091829020805460ff1916905590519182527f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d9101610a20565b6005546001600160a01b031633146116665760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b0381166116cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161090d565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146117515760405162461bcd60e51b815260040161090d9061276d565b6014544790610eea906001600160a01b031682612058565b6000611773612098565b6002546117809190612835565b905090565b600082611794575060006108dd565b60006117a08385612816565b9050826117ad85836127f6565b146118045760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161090d565b9392505050565b600061180483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612113565b60008061185a83856127de565b9050838110156118045760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161090d565b6001600160a01b03831661190e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161090d565b6001600160a01b03821661196f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161090d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b601654600160a81b900460ff16806119f357506005546001600160a01b031633145b611a655760405162461bcd60e51b815260206004820152603f60248201527f436f6e747261637420686173206e6f74206265656e207072657061726564206660448201527f6f72206c61756e636820616e642075736572206973206e6f74206f776e657200606482015260840161090d565b601654600160a01b900460ff1615611a8757611a82838383612141565b505050565b6001600160a01b03831660009081526018602052604090205460ff16158015611ac957506001600160a01b03821660009081526018602052604090205460ff16155b15611b3057600854811115611b305760405162461bcd60e51b815260206004820152602760248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152661e105b5bdd5b9d60ca1b606482015260840161090d565b600e54600b54601a546001600160a01b0385811691161415611b7457600c54600b55600f54600e556015544211611b7457601154600b54611b709161184d565b600b555b30600090815260208190526040902054601b5481108015908190611ba25750601a54600160a01b900460ff16155b8015611bbc5750601a546001600160a01b03888116911614155b8015611bd15750601a54600160a81b900460ff165b15611bdf57611bdf826122c4565b6001600160a01b03871660009081526017602052604090205460ff1680611c1e57506001600160a01b03861660009081526017602052604090205460ff165b15611c2b57611c2b612473565b600080611c37876124b8565b6001600160a01b038b166000908152602081905260409020549193509150611c5f90886124df565b6001600160a01b03808b1660009081526020819052604080822093909355908a1681522054611c8e908361184d565b6001600160a01b038916600090815260208190526040902055611cb081612521565b6001600160a01b03891660009081526017602052604090205460ff1680611cef57506001600160a01b03881660009081526017602052604090205460ff165b15611d0b57611d0b600a54600955600d54600b55601054600e55565b600b859055600e8690556040518281526001600160a01b03808a1691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b60008184841115611d875760405162461bcd60e51b815260040161090d919061271a565b506000611d948486612835565b95945050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611de057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611e3457600080fd5b505afa158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6c919061259c565b81600181518110611e8d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601954611eb391309116846118ac565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac94790611eec9085906000908690309042906004016127a2565b600060405180830381600087803b158015611f0657600080fd5b505af1158015611f1a573d6000803e3d6000fd5b505050505050565b6006548110611f7e5760405162461bcd60e51b815260206004820152602260248201527f496e6465782069732067726561746572207468616e206172726179206c656e676044820152610e8d60f31b606482015260840161090d565b60068054611f8e90600190612835565b81548110611fac57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600680546001600160a01b039092169183908110611fe657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600680548061203357634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b8015612094576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611a82573d6000803e3d6000fd5b5050565b600080805b60065481101561210d576120ef600682815481106120cb57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168252819052604090205490565b6120f990836127de565b91508061210581612881565b91505061209d565b50919050565b600081836121345760405162461bcd60e51b815260040161090d919061271a565b506000611d9484866127f6565b6001600160a01b0383166121a55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161090d565b6001600160a01b0382166122075760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161090d565b612244816040518060600160405280602681526020016128c8602691396001600160a01b0386166000908152602081905260409020549190611d63565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612273908261184d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016119c4565b601a805460ff60a01b1916600160a01b179055600954600e54600b546000926122f89290916122f29161184d565b9061184d565b9050806123055750612463565b4761230f83611d9d565b600061231b47836124df565b9050801561245f57600061233e8461150f6009548561178590919063ffffffff16565b601354909150612357906001600160a01b031682612058565b60006123728561150f600e548661178590919063ffffffff16565b905060008111801561238e57506016546001600160a01b031615155b156123ee5760165460405163febd221b60e01b8152600160048201526001600160a01b039091169063febd221b9083906024016000604051808303818588803b1580156123da57600080fd5b505af1935050505080156123ec575060015b505b60006124098661150f600b548761178590919063ffffffff16565b601454909150612422906001600160a01b031682612058565b60408051888152602081018690527f3736f4ec17d19b9b4f0fbeeb377db969da082d70e2e16221f77d5b321570e8c7910160405180910390a15050505b5050505b50601a805460ff60a01b19169055565b600b541580156124835750600e54155b801561248f5750600954155b1561249657565b60098054600a55600b8054600d55600e80546010556000928390559082905555565b60008060006124c68461254e565b905060006124d485836124df565b959194509092505050565b600061180483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d63565b3060009081526020819052604090205461253b908261184d565b3060009081526020819052604090205550565b60008061256e6009546122f2600e54600b5461184d90919063ffffffff16565b905061180461271061150f8584611785565b600060208284031215612591578081fd5b8135611804816128b2565b6000602082840312156125ad578081fd5b8151611804816128b2565b600080604083850312156125ca578081fd5b82356125d5816128b2565b915060208301356125e5816128b2565b809150509250929050565b600080600060608486031215612604578081fd5b833561260f816128b2565b9250602084013561261f816128b2565b929592945050506040919091013590565b60008060408385031215612642578182fd5b823561264d816128b2565b946020939093013593505050565b60006020828403121561266c578081fd5b81358015158114611804578182fd5b60006020828403121561268c578081fd5b5035919050565b600080600080608085870312156126a8578081fd5b5050823594602084013594506040840135936060013592509050565b6000815180845260208085019450808401835b838110156126fc5781516001600160a01b0316875295820195908201906001016126d7565b509495945050505050565b60208152600061180460208301846126c4565b6000602080835283518082850152825b818110156127465785810183015185820160400152820161272a565b818111156127575783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b85815284602082015260a0604082015260006127c160a08301866126c4565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156127f1576127f161289c565b500190565b60008261281157634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156128305761283061289c565b500290565b6000828210156128475761284761289c565b500390565b600181811c9082168061286057607f821691505b6020821081141561210d57634e487b7160e01b600052602260045260246000fd5b60006000198214156128955761289561289c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610eea57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203df17a0636b3d4cf9f950ce3352685d69cfdea849736ad4e76e51179a5ce284764736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102765760003560e01c806370a082311161014f578063ada46d0a116100c1578063dd62ed3e1161007a578063dd62ed3e1461076a578063e89bcca2146107b0578063ea2f0b37146107d0578063f2fde38b146107f0578063f429389014610810578063fffa1dd91461082557600080fd5b8063ada46d0a146106bc578063af01f2b2146106de578063b609995e146106f4578063ba385abb14610714578063bb8d513114610734578063d543dbeb1461074a57600080fd5b806395d89b411161011357806395d89b411461061b57806398850b6414610630578063a0d82dc514610651578063a1ab19a314610667578063a457c2d71461067c578063a9059cbb1461069c57600080fd5b806370a082311461057c578063715018a6146105b25780638421b507146105c75780638c0b5e22146105e75780638da5cb5b146105fd57600080fd5b8063313ce567116101e857806349bd5a5e116101ac57806349bd5a5e146104c257806351bc3c85146104e25780635342acb4146104f757806354959363146105305780636827e764146105465780636fcba3771461055c57600080fd5b8063313ce56714610426578063395093511461044257806341cb87fc14610462578063437823ec1461048257806348a46473146104a257600080fd5b80631694505e1161023a5780631694505e1461035957806318160ddd146103915780631f53ac02146103b057806323b872dd146103d057806326b6308d146103f05780632bb14e1d1461041057600080fd5b806306fdde0314610282578063095ea7b3146102ad5780630e832273146102dd578063111e037614610316578063113201fa1461033857600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b5061029761083a565b6040516102a4919061271a565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004612630565b6108cc565b60405190151581526020016102a4565b3480156102e957600080fd5b506102cd6102f8366004612580565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561032257600080fd5b50610336610331366004612580565b6108e3565b005b34801561034457600080fd5b50601a546102cd90600160a81b900460ff1681565b34801561036557600080fd5b50601954610379906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561039d57600080fd5b506002545b6040519081526020016102a4565b3480156103bc57600080fd5b506103366103cb366004612580565b610a2b565b3480156103dc57600080fd5b506102cd6103eb3660046125f0565b610aa3565b3480156103fc57600080fd5b5061033661040b36600461265b565b610b0c565b34801561041c57600080fd5b506103a2600e5481565b34801561043257600080fd5b50604051600981526020016102a4565b34801561044e57600080fd5b506102cd61045d366004612630565b610b83565b34801561046e57600080fd5b5061033661047d366004612580565b610bb9565b34801561048e57600080fd5b5061033661049d366004612580565b610dbe565b3480156104ae57600080fd5b506103366104bd36600461267b565b610e3c565b3480156104ce57600080fd5b50601a54610379906001600160a01b031681565b3480156104ee57600080fd5b50610336610ea7565b34801561050357600080fd5b506102cd610512366004612580565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561053c57600080fd5b506103a260115481565b34801561055257600080fd5b506103a2600b5481565b34801561056857600080fd5b50610336610577366004612693565b610eed565b34801561058857600080fd5b506103a2610597366004612580565b6001600160a01b031660009081526020819052604090205490565b3480156105be57600080fd5b50610336610fff565b3480156105d357600080fd5b506103366105e236600461267b565b611073565b3480156105f357600080fd5b506103a260085481565b34801561060957600080fd5b506005546001600160a01b0316610379565b34801561062757600080fd5b50610297611124565b34801561063c57600080fd5b506016546102cd90600160a01b900460ff1681565b34801561065d57600080fd5b506103a2600c5481565b34801561067357600080fd5b50610336611133565b34801561068857600080fd5b506102cd610697366004612630565b6111dc565b3480156106a857600080fd5b506102cd6106b7366004612630565b61122b565b3480156106c857600080fd5b506106d1611238565b6040516102a49190612707565b3480156106ea57600080fd5b506103a260155481565b34801561070057600080fd5b5061033661070f366004612580565b611299565b34801561072057600080fd5b5061033661072f366004612580565b611404565b34801561074057600080fd5b506103a2600f5481565b34801561075657600080fd5b5061033661076536600461267b565b61147c565b34801561077657600080fd5b506103a26107853660046125b8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156107bc57600080fd5b506103366107cb36600461265b565b61154a565b3480156107dc57600080fd5b506103366107eb366004612580565b6115c1565b3480156107fc57600080fd5b5061033661080b366004612580565b61163c565b34801561081c57600080fd5b50610336611727565b34801561083157600080fd5b506103a2611769565b6060600380546108499061284c565b80601f01602080910402602001604051908101604052809291908181526020018280546108759061284c565b80156108c25780601f10610897576101008083540402835291602001916108c2565b820191906000526020600020905b8154815290600101906020018083116108a557829003601f168201915b5050505050905090565b60006108d93384846118ac565b5060015b92915050565b6005546001600160a01b031633146109165760405162461bcd60e51b815260040161090d9061276d565b60405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16156109905760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b606482015260840161090d565b6006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155600081815260076020908152604091829020805460ff1916909417909355519081527f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd691015b60405180910390a150565b6005546001600160a01b03163314610a555760405162461bcd60e51b815260040161090d9061276d565b601480546001600160a01b0319166001600160a01b0383169081179091556040519081527f31bb1993faff4f8409d7baad771f861e093ef4ce2c92c6e0cb10b82d1c7324cb90602001610a20565b6000610ab08484846119d1565b610b028433610afd856040518060600160405280602881526020016128ee602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611d63565b6118ac565b5060019392505050565b6005546001600160a01b03163314610b365760405162461bcd60e51b815260040161090d9061276d565b601a8054821515600160a81b0260ff60a81b199091161790556040517fd9fca2a469120637ae54e43ab68dfdcd9354db52d615dea3d3a66a085e6f41b990610a2090831515815260200190565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108d9918590610afd908661184d565b6005546001600160a01b03163314610be35760405162461bcd60e51b815260040161090d9061276d565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2157600080fd5b505afa158015610c35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c59919061259c565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca157600080fd5b505afa158015610cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd9919061259c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d59919061259c565b601a80546001600160a01b03199081166001600160a01b03938416179091556019805490911683831617905560405190831681527f7aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc809060200160405180910390a15050565b6005546001600160a01b03163314610de85760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b038116600081815260176020908152604091829020805460ff1916600117905590519182527f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369101610a20565b6005546001600160a01b03163314610e665760405162461bcd60e51b815260040161090d9061276d565b610e7481633b9aca00612816565b601b556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001610a20565b6005546001600160a01b03163314610ed15760405162461bcd60e51b815260040161090d9061276d565b30600090815260208190526040902054610eea81611d9d565b50565b6005546001600160a01b03163314610f175760405162461bcd60e51b815260040161090d9061276d565b6103e88411158015610f2b57506103e88311155b8015610f3957506103e88211155b8015610f4757506103e88111155b610f9d5760405162461bcd60e51b815260206004820152602160248201527f4665657320657863656564206d6178696d756d20616c6c6f7765642076616c756044820152606560f81b606482015260840161090d565b600b849055600c839055600e829055600f8190556040805185815260208101859052908101839052606081018290527f7027e29faa2460f22e800d92db38d4795b668c7104da6b87afaeaf502a269ca59060800160405180910390a150505050565b6005546001600160a01b031633146110295760405162461bcd60e51b815260040161090d9061276d565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461109d5760405162461bcd60e51b815260040161090d9061276d565b6109c48111156110ef5760405162461bcd60e51b815260206004820152601e60248201527f4d6178696d756d206c61756e63682073656c6c20666565206973203235250000604482015260640161090d565b60118190556040518181527fc799be5eb19a1a6d6ba7368d21e2bc367c8a335e4a07cd3d954482e6f714d3c590602001610a20565b6060600480546108499061284c565b6005546001600160a01b0316331461115d5760405162461bcd60e51b815260040161090d9061276d565b601654600160a81b900460ff16156111b75760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920707265706172656420666f72206c61756e63680000000000604482015260640161090d565b6016805460ff60a81b1916600160a81b1790556111d742620546006127de565b601555565b60006108d93384610afd85604051806060016040528060258152602001612916602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611d63565b60006108d93384846119d1565b606060068054806020026020016040519081016040528092919081815260200182805480156108c257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611272575050505050905090565b6005546001600160a01b031633146112c35760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b03811660009081526007602052604090205460ff166113375760405162461bcd60e51b8152602060048201526024808201527f41646472657373206973206e6f74206578636c756465642066726f6d207265776044820152636172647360e01b606482015260840161090d565b60005b6006548110156113ca57816001600160a01b03166006828154811061136f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156113b8576001600160a01b0382166000908152600760205260409020805460ff191690556113b381611f22565b6113ca565b806113c281612881565b91505061133a565b506040516001600160a01b03821681527f87434094d24a90fbd9a8ffcf2be9818d237c06a12d126296bc1ea7d58959433490602001610a20565b6005546001600160a01b0316331461142e5760405162461bcd60e51b815260040161090d9061276d565b601680546001600160a01b0319166001600160a01b0383169081179091556040519081527f535be0bbc71c839ded01277ab57f29f2e810c1ff0255bb938d7cb8e96ac8ca1a90602001610a20565b6005546001600160a01b031633146114a65760405162461bcd60e51b815260040161090d9061276d565b60058110156114f75760405162461bcd60e51b815260206004820152601b60248201527f4d61782054582073686f756c642062652061626f766520302e35250000000000604482015260640161090d565b6115156103e861150f67016345785d8a000084611785565b9061180b565b60088190556040519081527f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf90602001610a20565b6005546001600160a01b031633146115745760405162461bcd60e51b815260040161090d9061276d565b60168054821515600160a01b0260ff60a01b199091161790556040517f7d952115fd41bb443db2ae9cde6670e8dd72fefb507b7a4e0156c57e439afaf590610a2090831515815260200190565b6005546001600160a01b031633146115eb5760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b038116600081815260176020908152604091829020805460ff1916905590519182527f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d9101610a20565b6005546001600160a01b031633146116665760405162461bcd60e51b815260040161090d9061276d565b6001600160a01b0381166116cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161090d565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146117515760405162461bcd60e51b815260040161090d9061276d565b6014544790610eea906001600160a01b031682612058565b6000611773612098565b6002546117809190612835565b905090565b600082611794575060006108dd565b60006117a08385612816565b9050826117ad85836127f6565b146118045760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161090d565b9392505050565b600061180483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612113565b60008061185a83856127de565b9050838110156118045760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161090d565b6001600160a01b03831661190e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161090d565b6001600160a01b03821661196f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161090d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b601654600160a81b900460ff16806119f357506005546001600160a01b031633145b611a655760405162461bcd60e51b815260206004820152603f60248201527f436f6e747261637420686173206e6f74206265656e207072657061726564206660448201527f6f72206c61756e636820616e642075736572206973206e6f74206f776e657200606482015260840161090d565b601654600160a01b900460ff1615611a8757611a82838383612141565b505050565b6001600160a01b03831660009081526018602052604090205460ff16158015611ac957506001600160a01b03821660009081526018602052604090205460ff16155b15611b3057600854811115611b305760405162461bcd60e51b815260206004820152602760248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152661e105b5bdd5b9d60ca1b606482015260840161090d565b600e54600b54601a546001600160a01b0385811691161415611b7457600c54600b55600f54600e556015544211611b7457601154600b54611b709161184d565b600b555b30600090815260208190526040902054601b5481108015908190611ba25750601a54600160a01b900460ff16155b8015611bbc5750601a546001600160a01b03888116911614155b8015611bd15750601a54600160a81b900460ff165b15611bdf57611bdf826122c4565b6001600160a01b03871660009081526017602052604090205460ff1680611c1e57506001600160a01b03861660009081526017602052604090205460ff165b15611c2b57611c2b612473565b600080611c37876124b8565b6001600160a01b038b166000908152602081905260409020549193509150611c5f90886124df565b6001600160a01b03808b1660009081526020819052604080822093909355908a1681522054611c8e908361184d565b6001600160a01b038916600090815260208190526040902055611cb081612521565b6001600160a01b03891660009081526017602052604090205460ff1680611cef57506001600160a01b03881660009081526017602052604090205460ff165b15611d0b57611d0b600a54600955600d54600b55601054600e55565b600b859055600e8690556040518281526001600160a01b03808a1691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b60008184841115611d875760405162461bcd60e51b815260040161090d919061271a565b506000611d948486612835565b95945050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611de057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611e3457600080fd5b505afa158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6c919061259c565b81600181518110611e8d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601954611eb391309116846118ac565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac94790611eec9085906000908690309042906004016127a2565b600060405180830381600087803b158015611f0657600080fd5b505af1158015611f1a573d6000803e3d6000fd5b505050505050565b6006548110611f7e5760405162461bcd60e51b815260206004820152602260248201527f496e6465782069732067726561746572207468616e206172726179206c656e676044820152610e8d60f31b606482015260840161090d565b60068054611f8e90600190612835565b81548110611fac57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600680546001600160a01b039092169183908110611fe657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600680548061203357634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b8015612094576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611a82573d6000803e3d6000fd5b5050565b600080805b60065481101561210d576120ef600682815481106120cb57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168252819052604090205490565b6120f990836127de565b91508061210581612881565b91505061209d565b50919050565b600081836121345760405162461bcd60e51b815260040161090d919061271a565b506000611d9484866127f6565b6001600160a01b0383166121a55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161090d565b6001600160a01b0382166122075760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161090d565b612244816040518060600160405280602681526020016128c8602691396001600160a01b0386166000908152602081905260409020549190611d63565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612273908261184d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016119c4565b601a805460ff60a01b1916600160a01b179055600954600e54600b546000926122f89290916122f29161184d565b9061184d565b9050806123055750612463565b4761230f83611d9d565b600061231b47836124df565b9050801561245f57600061233e8461150f6009548561178590919063ffffffff16565b601354909150612357906001600160a01b031682612058565b60006123728561150f600e548661178590919063ffffffff16565b905060008111801561238e57506016546001600160a01b031615155b156123ee5760165460405163febd221b60e01b8152600160048201526001600160a01b039091169063febd221b9083906024016000604051808303818588803b1580156123da57600080fd5b505af1935050505080156123ec575060015b505b60006124098661150f600b548761178590919063ffffffff16565b601454909150612422906001600160a01b031682612058565b60408051888152602081018690527f3736f4ec17d19b9b4f0fbeeb377db969da082d70e2e16221f77d5b321570e8c7910160405180910390a15050505b5050505b50601a805460ff60a01b19169055565b600b541580156124835750600e54155b801561248f5750600954155b1561249657565b60098054600a55600b8054600d55600e80546010556000928390559082905555565b60008060006124c68461254e565b905060006124d485836124df565b959194509092505050565b600061180483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d63565b3060009081526020819052604090205461253b908261184d565b3060009081526020819052604090205550565b60008061256e6009546122f2600e54600b5461184d90919063ffffffff16565b905061180461271061150f8584611785565b600060208284031215612591578081fd5b8135611804816128b2565b6000602082840312156125ad578081fd5b8151611804816128b2565b600080604083850312156125ca578081fd5b82356125d5816128b2565b915060208301356125e5816128b2565b809150509250929050565b600080600060608486031215612604578081fd5b833561260f816128b2565b9250602084013561261f816128b2565b929592945050506040919091013590565b60008060408385031215612642578182fd5b823561264d816128b2565b946020939093013593505050565b60006020828403121561266c578081fd5b81358015158114611804578182fd5b60006020828403121561268c578081fd5b5035919050565b600080600080608085870312156126a8578081fd5b5050823594602084013594506040840135936060013592509050565b6000815180845260208085019450808401835b838110156126fc5781516001600160a01b0316875295820195908201906001016126d7565b509495945050505050565b60208152600061180460208301846126c4565b6000602080835283518082850152825b818110156127465785810183015185820160400152820161272a565b818111156127575783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b85815284602082015260a0604082015260006127c160a08301866126c4565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156127f1576127f161289c565b500190565b60008261281157634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156128305761283061289c565b500290565b6000828210156128475761284761289c565b500390565b600181811c9082168061286057607f821691505b6020821081141561210d57634e487b7160e01b600052602260045260246000fd5b60006000198214156128955761289561289c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610eea57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203df17a0636b3d4cf9f950ce3352685d69cfdea849736ad4e76e51179a5ce284764736f6c63430008040033
Deployed Bytecode Sourcemap
243:12968:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2168:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4265:166;;;;;;;;;;-1:-1:-1;4265:166:3;;;;;:::i;:::-;;:::i;:::-;;;4541:14:12;;4534:22;4516:41;;4504:2;4489:18;4265:166:3;4471:92:12;1694:125:10;;;;;;;;;;-1:-1:-1;1694:125:10;;;;;:::i;:::-;-1:-1:-1;;;;;1787:25:10;1764:4;1787:25;;;:17;:25;;;;;;;;;1694:125;952:282;;;;;;;;;;-1:-1:-1;952:282:10;;;;;:::i;:::-;;:::i;:::-;;1845:48:2;;;;;;;;;;-1:-1:-1;1845:48:2;;;;-1:-1:-1;;;1845:48:2;;;;;;1737:39;;;;;;;;;;-1:-1:-1;1737:39:2;;;;-1:-1:-1;;;;;1737:39:2;;;;;;-1:-1:-1;;;;;3541:32:12;;;3523:51;;3511:2;3496:18;1737:39:2;3478:102:12;3256:106:3;;;;;;;;;;-1:-1:-1;3343:12:3;;3256:106;;;12229:25:12;;;12217:2;12202:18;3256:106:3;12184:76:12;11671:185:2;;;;;;;;;;-1:-1:-1;11671:185:2;;;;;:::i;:::-;;:::i;4898:347:3:-;;;;;;;;;;-1:-1:-1;4898:347:3;;;;;:::i;:::-;;:::i;12469:184:2:-;;;;;;;;;;-1:-1:-1;12469:184:2;;;;;:::i;:::-;;:::i;825:31::-;;;;;;;;;;;;;;;;3900:90;;;;;;;;;;-1:-1:-1;3900:90:2;;3982:1;13643:36:12;;13631:2;13616:18;3900:90:2;13598:87:12;5640:215:3;;;;;;;;;;-1:-1:-1;5640:215:3;;;;;:::i;:::-;;:::i;12097:366:2:-;;;;;;;;;;-1:-1:-1;12097:366:2;;;;;:::i;:::-;;:::i;10479:150::-;;;;;;;;;;-1:-1:-1;10479:150:2;;;;;:::i;:::-;;:::i;12659:178::-;;;;;;;;;;-1:-1:-1;12659:178:2;;;;;:::i;:::-;;:::i;1782:28::-;;;;;;;;;;-1:-1:-1;1782:28:2;;;;-1:-1:-1;;;;;1782:28:2;;;12880:151;;;;;;;;;;;;;:::i;10349:124::-;;;;;;;;;;-1:-1:-1;10349:124:2;;;;;:::i;:::-;-1:-1:-1;;;;;10439:27:2;10416:4;10439:27;;;:18;:27;;;;;;;;;10349:124;968:35;;;;;;;;;;;;;;;;691:27;;;;;;;;;;;;;;;;10788:625;;;;;;;;;;-1:-1:-1;10788:625:2;;;;;:::i;:::-;;:::i;3420:125:3:-;;;;;;;;;;-1:-1:-1;3420:125:3;;;;;:::i;:::-;-1:-1:-1;;;;;3520:18:3;3494:7;3520:18;;;;;;;;;;;;3420:125;1696:147:9;;;;;;;;;;;;;:::i;11419:246:2:-;;;;;;;;;;-1:-1:-1;11419:246:2;;;;;:::i;:::-;;:::i;514:58::-;;;;;;;;;;;;;;;;1073:77:9;;;;;;;;;;-1:-1:-1;1137:6:9;;-1:-1:-1;;;;;1137:6:9;1073:77;;2379:102:3;;;;;;;;;;;;;:::i;1445:37:2:-;;;;;;;;;;-1:-1:-1;1445:37:2;;;;-1:-1:-1;;;1445:37:2;;;;;;733:29;;;;;;;;;;;;;;;;9574:291;;;;;;;;;;;;;:::i;6342:266:3:-;;;;;;;;;;-1:-1:-1;6342:266:3;;;;;:::i;:::-;;:::i;3748:172::-;;;;;;;;;;-1:-1:-1;3748:172:3;;;;;:::i;:::-;;:::i;1829:121:10:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1301:40:2:-;;;;;;;;;;;;;;;;1244:440:10;;;;;;;;;;-1:-1:-1;1244:440:10;;;;;:::i;:::-;;:::i;11866:225:2:-;;;;;;;;;;-1:-1:-1;11866:225:2;;;;;:::i;:::-;;:::i;868:33::-;;;;;;;;;;;;;;;;10101:238;;;;;;;;;;-1:-1:-1;10101:238:2;;;;;:::i;:::-;;:::i;3978:149:3:-;;;;;;;;;;-1:-1:-1;3978:149:3;;;;;:::i;:::-;-1:-1:-1;;;;;4093:18:3;;;4067:7;4093:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3978:149;9871:179:2;;;;;;;;;;-1:-1:-1;9871:179:2;;;;;:::i;:::-;;:::i;10635:147::-;;;;;;;;;;-1:-1:-1;10635:147:2;;;;;:::i;:::-;;:::i;1992:276:9:-;;;;;;;;;;-1:-1:-1;1992:276:9;;;;;:::i;:::-;;:::i;13037:172:2:-;;;;;;;;;;;;;:::i;1960:118:10:-;;;;;;;;;;;;;:::i;2168:98:3:-;2222:13;2254:5;2247:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2168:98;:::o;4265:166::-;4348:4;4364:39;169:10:1;4387:7:3;4396:6;4364:8;:39::i;:::-;-1:-1:-1;4420:4:3;4265:166;;;;;:::o;952:282:10:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;1032:25:10;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;1031:26;1023:79;;;::::0;-1:-1:-1;;;1023:79:10;;9508:2:12;1023:79:10::1;::::0;::::1;9490:21:12::0;9547:2;9527:18;;;9520:30;9586:34;9566:18;;;9559:62;-1:-1:-1;;;9637:18:12;;;9630:38;9685:19;;1023:79:10::1;9480:230:12::0;1023:79:10::1;1112:19;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;1112:32:10::1;-1:-1:-1::0;;;;;1112:32:10;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1154:25:10;;;:17:::1;1112:32;1154:25:::0;;;;;;;;:32;;-1:-1:-1;;1154:32:10::1;::::0;;::::1;::::0;;;1201:26;3523:51:12;;;1201:26:10::1;::::0;3496:18:12;1201:26:10::1;;;;;;;;952:282:::0;:::o;11671:185:2:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;11772:17:2::1;:32:::0;;-1:-1:-1;;;;;;11772:32:2::1;-1:-1:-1::0;;;;;11772:32:2;::::1;::::0;;::::1;::::0;;;11819:30:::1;::::0;3523:51:12;;;11819:30:2::1;::::0;3511:2:12;3496:18;11819:30:2::1;3478:102:12::0;4898:347:3;5034:4;5050:36;5060:6;5068:9;5079:6;5050:9;:36::i;:::-;5096:121;5105:6;169:10:1;5127:89:3;5165:6;5127:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5127:19:3;;;;;;:11;:19;;;;;;;;169:10:1;5127:33:3;;;;;;;;;;:37;:89::i;:::-;5096:8;:121::i;:::-;-1:-1:-1;5234:4:3;4898:347;;;;;:::o;12469:184:2:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;12554:29:2::1;:39:::0;;;::::1;;-1:-1:-1::0;;;12554:39:2::1;-1:-1:-1::0;;;;12554:39:2;;::::1;;::::0;;12608:38:::1;::::0;::::1;::::0;::::1;::::0;12586:7;4541:14:12;4534:22;4516:41;;4504:2;4489:18;;4471:92;5640:215:3;169:10:1;5728:4:3;5776:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5776:34:3;;;;;;;;;;5728:4;;5744:83;;5767:7;;5776:50;;5815:10;5776:38;:50::i;12097:366:2:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;12171:34:2::1;12225:9;12171:64;;12279:17;-1:-1:-1::0;;;;;12279:25:2::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12261:70:2::1;;12340:4;12347:17;-1:-1:-1::0;;;;;12347:22:2::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12261:111;::::0;-1:-1:-1;;;;;;12261:111:2::1;::::0;;;;;;-1:-1:-1;;;;;4031:15:12;;;12261:111:2::1;::::0;::::1;4013:34:12::0;4083:15;;4063:18;;;4056:43;3948:18;;12261:111:2::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12245:13;:127:::0;;-1:-1:-1;;;;;;12245:127:2;;::::1;-1:-1:-1::0;;;;;12245:127:2;;::::1;;::::0;;;12382:15:::1;:35:::0;;;;::::1;::::0;;::::1;;::::0;;12432:24:::1;::::0;3541:32:12;;;3523:51;;12432:24:2::1;::::0;3511:2:12;3496:18;12432:24:2::1;;;;;;;1346:1:9;12097:366:2::0;:::o;10479:150::-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;10549:27:2;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;10549:34:2::1;10579:4;10549:34;::::0;;10598:24;;3523:51:12;;;10598:24:2::1;::::0;3496:18:12;10598:24:2::1;3478:102:12::0;12659:178:2;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;12761:17:2::1;:9:::0;12773:5:::1;12761:17;:::i;:::-;12739:19;:39:::0;12793:37:::1;::::0;12229:25:12;;;12793:37:2::1;::::0;12217:2:12;12202:18;12793:37:2::1;12184:76:12::0;12880:151:2;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;12975:4:2::1;12931:23;3520:18:3::0;;;;;;;;;;;12991:33:2::1;3520:18:3::0;12991:16:2::1;:33::i;:::-;1346:1:9;12880:151:2:o:0;10788:625::-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;10998:4:2::1;10985:9;:17;;:54;;;;;11035:4;11018:13;:21;;10985:54;:91;;;;;11072:4;11055:13;:21;;10985:91;:132;;;;;11113:4;11092:17;:25;;10985:132;10964:212;;;::::0;-1:-1:-1;;;10964:212:2;;8348:2:12;10964:212:2::1;::::0;::::1;8330:21:12::0;8387:2;8367:18;;;8360:30;8426:34;8406:18;;;8399:62;-1:-1:-1;;;8477:18:12;;;8470:31;8518:19;;10964:212:2::1;8320:223:12::0;10964:212:2::1;11186:6;:18:::0;;;11214:10:::1;:26:::0;;;11250:10:::1;:26:::0;;;11286:14:::1;:34:::0;;;11335:71:::1;::::0;;13336:25:12;;;13392:2;13377:18;;13370:34;;;13420:18;;;13413:34;;;13478:2;13463:18;;13456:34;;;11335:71:2::1;::::0;13323:3:12;13308:19;11335:71:2::1;;;;;;;10788:625:::0;;;;:::o;1696:147:9:-;1277:6;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;1788:6:::1;::::0;1767:40:::1;::::0;1804:1:::1;::::0;-1:-1:-1;;;;;1788:6:9::1;::::0;1767:40:::1;::::0;1804:1;;1767:40:::1;1817:6;:19:::0;;-1:-1:-1;;;;;;1817:19:9::1;::::0;;1696:147::o;11419:246:2:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;11528:4:2::1;11508:16;:24;;11500:67;;;::::0;-1:-1:-1;;;11500:67:2;;6825:2:12;11500:67:2::1;::::0;::::1;6807:21:12::0;6864:2;6844:18;;;6837:30;6903:32;6883:18;;;6876:60;6953:18;;11500:67:2::1;6797:180:12::0;11500:67:2::1;11577:13;:32:::0;;;11624:34:::1;::::0;12229:25:12;;;11624:34:2::1;::::0;12217:2:12;12202:18;11624:34:2::1;12184:76:12::0;2379:102:3;2435:13;2467:7;2460:14;;;;;:::i;9574:291:2:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;9640:17:2::1;::::0;-1:-1:-1;;;9640:17:2;::::1;;;9639:18;9631:58;;;::::0;-1:-1:-1;;;9631:58:2;;10278:2:12;9631:58:2::1;::::0;::::1;10260:21:12::0;10317:2;10297:18;;;10290:30;10356:29;10336:18;;;10329:57;10403:18;;9631:58:2::1;10250:177:12::0;9631:58:2::1;9728:17;:24:::0;;-1:-1:-1;;;;9728:24:2::1;-1:-1:-1::0;;;9728:24:2::1;::::0;;9834::::1;:15;9852:6;9834:24;:::i;:::-;9810:21;:48:::0;9574:291::o;6342:266:3:-;6435:4;6451:129;169:10:1;6474:7:3;6483:96;6522:15;6483:96;;;;;;;;;;;;;;;;;169:10:1;6483:25:3;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6483:34:3;;;;;;;;;;;;:38;:96::i;3748:172::-;3834:4;3850:42;169:10:1;3874:9:3;3885:6;3850:9;:42::i;1829:121:10:-;1889:16;1924:19;1917:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1917:26:10;;;;;;;;;;;;;;;;;;;;;;1829:121;:::o;1244:440::-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;1323:25:10;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;1315:74;;;::::0;-1:-1:-1;;;1315:74:10;;7943:2:12;1315:74:10::1;::::0;::::1;7925:21:12::0;7982:2;7962:18;;;7955:30;8021:34;8001:18;;;7994:62;-1:-1:-1;;;8072:18:12;;;8065:34;8116:19;;1315:74:10::1;7915:226:12::0;1315:74:10::1;1404:6;1399:240;1420:19;:26:::0;1416:30;::::1;1399:240;;;1497:6;-1:-1:-1::0;;;;;1471:32:10::1;:19;1491:1;1471:22;;;;;;-1:-1:-1::0;;;1471:22:10::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;1471:22:10::1;:32;1467:162;;;-1:-1:-1::0;;;;;1523:25:10;::::1;1551:5;1523:25:::0;;;:17:::1;:25;::::0;;;;:33;;-1:-1:-1;;1523:33:10::1;::::0;;1574:17:::1;1589:1:::0;1574:14:::1;:17::i;:::-;1609:5;;1467:162;1448:3:::0;::::1;::::0;::::1;:::i;:::-;;;;1399:240;;;-1:-1:-1::0;1653:24:10::1;::::0;-1:-1:-1;;;;;3541:32:12;;3523:51;;1653:24:10::1;::::0;3511:2:12;3496:18;1653:24:10::1;3478:102:12::0;11866:225:2;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;11977:15:2::1;:52:::0;;-1:-1:-1;;;;;;11977:52:2::1;-1:-1:-1::0;;;;;11977:52:2;::::1;::::0;;::::1;::::0;;;12044:40:::1;::::0;3523:51:12;;;12044:40:2::1;::::0;3511:2:12;3496:18;12044:40:2::1;3478:102:12::0;10101:238:2;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;10193:1:2::1;10181:8;:13;;10173:53;;;::::0;-1:-1:-1;;;10173:53:2;;8750:2:12;10173:53:2::1;::::0;::::1;8732:21:12::0;8789:2;8769:18;;;8762:30;8828:29;8808:18;;;8801:57;8875:18;;10173:53:2::1;8722:177:12::0;10173:53:2::1;10250:36;10281:4;10250:26;488:19;10267:8:::0;10250:16:::1;:26::i;:::-;:30:::0;::::1;:36::i;:::-;10236:11;:50:::0;;;10301:31:::1;::::0;12229:25:12;;;10301:31:2::1;::::0;12217:2:12;12202:18;10301:31:2::1;12184:76:12::0;9871:179:2;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;9953:18:2::1;:36:::0;;;::::1;;-1:-1:-1::0;;;9953:36:2::1;-1:-1:-1::0;;;;9953:36:2;;::::1;;::::0;;10004:39:::1;::::0;::::1;::::0;::::1;::::0;9974:15;4541:14:12;4534:22;4516:41;;4504:2;4489:18;;4471:92;10635:147:2;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;10703:27:2;::::1;10733:5;10703:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;10703:35:2::1;::::0;;10753:22;;3523:51:12;;;10753:22:2::1;::::0;3496:18:12;10753:22:2::1;3478:102:12::0;1992:276:9;1277:6;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;2095:22:9;::::1;2074:107;;;::::0;-1:-1:-1;;;2074:107:9;;6015:2:12;2074:107:9::1;::::0;::::1;5997:21:12::0;6054:2;6034:18;;;6027:30;6093:34;6073:18;;;6066:62;-1:-1:-1;;;6144:18:12;;;6137:36;6190:19;;2074:107:9::1;5987:228:12::0;2074:107:9::1;2217:6;::::0;2196:38:::1;::::0;-1:-1:-1;;;;;2196:38:9;;::::1;::::0;2217:6:::1;::::0;2196:38:::1;::::0;2217:6:::1;::::0;2196:38:::1;2244:6;:17:::0;;-1:-1:-1;;;;;;2244:17:9::1;-1:-1:-1::0;;;;;2244:17:9;;;::::1;::::0;;;::::1;::::0;;1992:276::o;13037:172:2:-;1277:6:9;;-1:-1:-1;;;;;1277:6:9;169:10:1;1277:22:9;1269:67;;;;-1:-1:-1;;;1269:67:9;;;;;;;:::i;:::-;13164:17:2::1;::::0;13117:21:::1;::::0;13148:54:::1;::::0;-1:-1:-1;;;;;13164:17:2::1;13117:21:::0;13148:15:::1;:54::i;1960:118:10:-:0;2009:7;2050:21;:19;:21::i;:::-;2035:12;;:36;;;;:::i;:::-;2028:43;;1960:118;:::o;2211:459:11:-;2269:7;2510:6;2506:45;;-1:-1:-1;2539:1:11;2532:8;;2506:45;2561:9;2573:5;2577:1;2573;:5;:::i;:::-;2561:17;-1:-1:-1;2605:1:11;2596:5;2600:1;2561:17;2596:5;:::i;:::-;:10;2588:56;;;;-1:-1:-1;;;2588:56:11;;9106:2:12;2588:56:11;;;9088:21:12;9145:2;9125:18;;;9118:30;9184:34;9164:18;;;9157:62;-1:-1:-1;;;9235:18:12;;;9228:31;9276:19;;2588:56:11;9078:223:12;2588:56:11;2662:1;2211:459;-1:-1:-1;;;2211:459:11:o;3132:130::-;3190:7;3216:39;3220:1;3223;3216:39;;;;;;;;;;;;;;;;;:3;:39::i;875:176::-;933:7;;964:5;968:1;964;:5;:::i;:::-;952:17;;992:1;987;:6;;979:46;;;;-1:-1:-1;;;979:46:11;;7184:2:12;979:46:11;;;7166:21:12;7223:2;7203:18;;;7196:30;7262:29;7242:18;;;7235:57;7309:18;;979:46:11;7156:177:12;9441:370:3;-1:-1:-1;;;;;9572:19:3;;9564:68;;;;-1:-1:-1;;;9564:68:3;;11040:2:12;9564:68:3;;;11022:21:12;11079:2;11059:18;;;11052:30;11118:34;11098:18;;;11091:62;-1:-1:-1;;;11169:18:12;;;11162:34;11213:19;;9564:68:3;11012:226:12;9564:68:3;-1:-1:-1;;;;;9650:21:3;;9642:68;;;;-1:-1:-1;;;9642:68:3;;6422:2:12;9642:68:3;;;6404:21:12;6461:2;6441:18;;;6434:30;6500:34;6480:18;;;6473:62;-1:-1:-1;;;6551:18:12;;;6544:32;6593:19;;9642:68:3;6394:224:12;9642:68:3;-1:-1:-1;;;;;9721:18:3;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9772:32;;12229:25:12;;;9772:32:3;;12202:18:12;9772:32:3;;;;;;;;9441:370;;;:::o;3996:2058:2:-;4161:17;;-1:-1:-1;;;4161:17:2;;;;;:44;;-1:-1:-1;1137:6:9;;-1:-1:-1;;;;;1137:6:9;169:10:1;4182:23:2;4161:44;4153:120;;;;-1:-1:-1;;;4153:120:2;;11445:2:12;4153:120:2;;;11427:21:12;11484:2;11464:18;;;11457:30;11523:34;11503:18;;;11496:62;11594:33;11574:18;;;11567:61;11645:19;;4153:120:2;11417:253:12;4153:120:2;4323:18;;-1:-1:-1;;;4323:18:2;;;;4319:102;;;4357:33;4373:4;4379:2;4383:6;4357:15;:33::i;:::-;3996:2058;;;:::o;4319:102::-;-1:-1:-1;;;;;4449:26:2;;;;;;:20;:26;;;;;;;;4448:27;:68;;;;-1:-1:-1;;;;;;4492:24:2;;;;;;:20;:24;;;;;;;;4491:25;4448:68;4431:260;;;4596:11;;4586:6;:21;;4561:119;;;;-1:-1:-1;;;4561:119:2;;11877:2:12;4561:119:2;;;11859:21:12;11916:2;11896:18;;;11889:30;11955:34;11935:18;;;11928:62;-1:-1:-1;;;12006:18:12;;;11999:37;12053:19;;4561:119:2;11849:229:12;4561:119:2;4747:10;;4788:6;;4814:13;;-1:-1:-1;;;;;4808:19:2;;;4814:13;;4808:19;4804:237;;;4852:10;;4843:6;:19;4889:14;;4876:10;:27;4922:21;;4947:15;-1:-1:-1;4918:113:2;;5002:13;;4991:6;;:25;;:10;:25::i;:::-;4982:6;:34;4918:113;5129:4;5080:28;3520:18:3;;;;;;;;;;;5196:19:2;;5172:43;;;;;;;5242:53;;-1:-1:-1;5278:17:2;;-1:-1:-1;;;5278:17:2;;;;5277:18;5242:53;:90;;;;-1:-1:-1;5319:13:2;;-1:-1:-1;;;;;5311:21:2;;;5319:13;;5311:21;;5242:90;:135;;;;-1:-1:-1;5348:29:2;;-1:-1:-1;;;5348:29:2;;;;5242:135;5225:259;;;5429:44;5452:20;5429:22;:44::i;:::-;-1:-1:-1;;;;;5498:24:2;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;5526:22:2;;;;;;:18;:22;;;;;;;;5498:50;5494:95;;;5564:14;:12;:14::i;:::-;5600:23;5625:12;5641:18;5652:6;5641:10;:18::i;:::-;-1:-1:-1;;;;;5687:15:2;;:9;:15;;;;;;;;;;;5599:60;;-1:-1:-1;5599:60:2;-1:-1:-1;5687:27:2;;5707:6;5687:19;:27::i;:::-;-1:-1:-1;;;;;5669:15:2;;;:9;:15;;;;;;;;;;;:45;;;;5740:13;;;;;;;:34;;5758:15;5740:17;:34::i;:::-;-1:-1:-1;;;;;5724:13:2;;:9;:13;;;;;;;;;;:50;5785:14;5794:4;5785:8;:14::i;:::-;-1:-1:-1;;;;;5814:24:2;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;5842:22:2;;;;;;:18;:22;;;;;;;;5814:50;5810:96;;;5880:15;7122:20;;7108:11;:34;7161:15;;7152:6;:24;7199:19;;7186:10;:32;7065:160;5880:15;5940:6;:19;;;5969:10;:27;;;6012:35;;12229:25:12;;;-1:-1:-1;;;;;6012:35:2;;;;;;;;;;12217:2:12;12202:18;6012:35:2;;;;;;;3996:2058;;;;;;;;;:::o;1747:217:11:-;1863:7;1898:12;1890:6;;;;1882:29;;;;-1:-1:-1;;;1882:29:11;;;;;;;;:::i;:::-;-1:-1:-1;1921:9:11;1933:5;1937:1;1933;:5;:::i;:::-;1921:17;1747:217;-1:-1:-1;;;;;1747:217:11:o;8995:573:2:-;9143:16;;;9157:1;9143:16;;;;;;;;9119:21;;9143:16;;;;;;;;;;-1:-1:-1;9143:16:2;9119:40;;9187:4;9169;9174:1;9169:7;;;;;;-1:-1:-1;;;9169:7:2;;;;;;;;;-1:-1:-1;;;;;9169:23:2;;;:7;;;;;;;;;;:23;;;;9212:15;;:22;;;-1:-1:-1;;;9212:22:2;;;;:15;;;;;:20;;:22;;;;;9169:7;;9212:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9202:4;9207:1;9202:7;;;;;;-1:-1:-1;;;9202:7:2;;;;;;;;;-1:-1:-1;;;;;9202:32:2;;;:7;;;;;;;;;:32;9277:15;;9245:62;;9262:4;;9277:15;9295:11;9245:8;:62::i;:::-;9343:15;;:218;;-1:-1:-1;;;9343:218:2;;-1:-1:-1;;;;;9343:15:2;;;;:66;;:218;;9423:11;;9343:15;;9491:4;;9517;;9536:15;;9343:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8995:573;;:::o;367:268:10:-;438:19;:26;430:34;;422:81;;;;-1:-1:-1;;;422:81:10;;7540:2:12;422:81:10;;;7522:21:12;7579:2;7559:18;;;7552:30;7618:34;7598:18;;;7591:62;-1:-1:-1;;;7669:18:12;;;7662:32;7711:19;;422:81:10;7512:224:12;422:81:10;542:19;562:26;;:30;;591:1;;562:30;:::i;:::-;542:51;;;;;;-1:-1:-1;;;542:51:10;;;;;;;;;;;;;;;;;;;513:19;:26;;-1:-1:-1;;;;;542:51:10;;;;533:5;;513:26;;;;-1:-1:-1;;;513:26:10;;;;;;;;;;;;;;;;;:80;;;;;-1:-1:-1;;;;;513:80:10;;;;;-1:-1:-1;;;;;513:80:10;;;;;;603:19;:25;;;;;-1:-1:-1;;;603:25:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;603:25:10;;;;;-1:-1:-1;;;;;;603:25:10;;;;;;-1:-1:-1;367:268:10:o;8835:154:2:-;8914:10;;8910:73;;8940:32;;-1:-1:-1;;;;;8940:24:2;;;:32;;;;;8965:6;;8940:32;;;;8965:6;8940:24;:32;;;;;;;;;;;;;;;;;;;8910:73;8835:154;;:::o;645:297:10:-;699:7;;;761:137;782:19;:26;778:30;;761:137;;;854:33;864:19;884:1;864:22;;;;;;-1:-1:-1;;;864:22:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;864:22:10;3520:18:3;;;;;;;;;;3420:125;854:33:10;829:58;;;;:::i;:::-;;-1:-1:-1;810:3:10;;;;:::i;:::-;;;;761:137;;;-1:-1:-1;914:21:10;645:297;-1:-1:-1;645:297:10:o;3744:302:11:-;3860:7;3894:12;3887:5;3879:28;;;;-1:-1:-1;;;3879:28:11;;;;;;;;:::i;:::-;-1:-1:-1;3917:9:11;3929:5;3933:1;3929;:5;:::i;7082:560:3:-;-1:-1:-1;;;;;7217:20:3;;7209:70;;;;-1:-1:-1;;;7209:70:3;;10634:2:12;7209:70:3;;;10616:21:12;10673:2;10653:18;;;10646:30;10712:34;10692:18;;;10685:62;-1:-1:-1;;;10763:18:12;;;10756:35;10808:19;;7209:70:3;10606:227:12;7209:70:3;-1:-1:-1;;;;;7297:23:3;;7289:71;;;;-1:-1:-1;;;7289:71:3;;5611:2:12;7289:71:3;;;5593:21:12;5650:2;5630:18;;;5623:30;5689:34;5669:18;;;5662:62;-1:-1:-1;;;5740:18:12;;;5733:33;5783:19;;7289:71:3;5583:225:12;7289:71:3;7449;7471:6;7449:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7449:17:3;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;7429:17:3;;;:9;:17;;;;;;;;;;;:91;;;;7553:20;;;;;;;:32;;7578:6;7553:24;:32::i;:::-;-1:-1:-1;;;;;7530:20:3;;;:9;:20;;;;;;;;;;;;:55;;;;7600:35;12229:25:12;;;7530:20:3;;7600:35;;;;;;12202:18:12;7600:35:3;12184:76:12;7231:1598:2;2808:17;:24;;-1:-1:-1;;;;2808:24:2;-1:-1:-1;;;2808:24:2;;;7397:11:::1;::::0;7381:10:::1;::::0;7370:6:::1;::::0;2808:24;;7370:39:::1;::::0;7397:11;;7370:22:::1;::::0;:10:::1;:22::i;:::-;:26:::0;::::1;:39::i;:::-;7343:66:::0;-1:-1:-1;7423:21:2;7419:34:::1;;7446:7;;;7419:34;7752:21;7815:38;7832:20:::0;7815:16:::1;:38::i;:::-;7864:18;7885:41;:21;7911:14:::0;7885:25:::1;:41::i;:::-;7864:62:::0;-1:-1:-1;7941:14:2;;7937:886:::1;;8010:23;8036:49;8068:16;8036:27;8051:11;;8036:10;:14;;:27;;;;:::i;:49::-;8115:22;::::0;8010:75;;-1:-1:-1;8099:56:2::1;::::0;-1:-1:-1;;;;;8115:22:2::1;8010:75:::0;8099:15:::1;:56::i;:::-;8238:22;8263:48;8294:16;8263:26;8278:10;;8263;:14;;:26;;;;:::i;:48::-;8238:73;;8346:1;8329:14;:18;:60;;;;-1:-1:-1::0;8359:15:2::1;::::0;-1:-1:-1;;;;;8359:15:2::1;8351:38:::0;::::1;8329:60;8325:194;;;8413:15;::::0;:80:::1;::::0;-1:-1:-1;;;8413:80:2;;:15;:80:::1;::::0;::::1;12229:25:12::0;-1:-1:-1;;;;;8413:15:2;;::::1;::::0;:29:::1;::::0;8450:14;;12202:18:12;;8413:80:2::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;8409:96:::0;::::1;8609:18;8630:44;8657:16;8630:22;8645:6;;8630:10;:14;;:22;;;;:::i;:44::-;8704:17;::::0;8609:65;;-1:-1:-1;8688:46:2::1;::::0;-1:-1:-1;;;;;8704:17:2::1;8609:65:::0;8688:15:::1;:46::i;:::-;8754:58;::::0;;13026:25:12;;;13082:2;13067:18;;13060:34;;;8754:58:2::1;::::0;12999:18:12;8754:58:2::1;;;;;;;7937:886;;;;2842:1;;;;-1:-1:-1::0;2853:17:2;:25;;-1:-1:-1;;;;2853:25:2;;;7231:1598::o;6757:302::-;6803:6;;:11;:30;;;;-1:-1:-1;6818:10:2;;:15;6803:30;:50;;;;-1:-1:-1;6837:11:2;;:16;6803:50;6799:63;;;6757:302::o;6799:63::-;6895:11;;;6872:20;:34;6934:6;;;6916:15;:24;6972:10;;;6950:19;:32;-1:-1:-1;6993:15:2;;;;7018:10;;;;7038:14;6757:302::o;6150:251::-;6233:7;6242;6265:12;6280:21;6293:7;6280:12;:21::i;:::-;6265:36;-1:-1:-1;6311:23:2;6337:17;:7;6265:36;6337:11;:17::i;:::-;6311:43;6389:4;;-1:-1:-1;6150:251:2;;-1:-1:-1;;;6150:251:2:o;1322:134:11:-;1380:7;1406:43;1410:1;1413;1406:43;;;;;;;;;;;;;;;;;:3;:43::i;6407:116:2:-;6501:4;6483:9;:24;;;;;;;;;;;:33;;6512:3;6483:28;:33::i;:::-;6474:4;6456:9;:24;;;;;;;;;;:60;-1:-1:-1;6407:116:2:o;6529:222::-;6614:7;6637:16;6656:39;6683:11;;6656:22;6667:10;;6656:6;;:10;;:22;;;;:::i;:39::-;6637:58;-1:-1:-1;6712:32:2;6738:5;6712:21;:7;6637:58;6712:11;:21::i;14:257:12:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;812:398::-;880:6;888;941:2;929:9;920:7;916:23;912:32;909:2;;;962:6;954;947:22;909:2;1006:9;993:23;1025:31;1050:5;1025:31;:::i;:::-;1075:5;-1:-1:-1;1132:2:12;1117:18;;1104:32;1145:33;1104:32;1145:33;:::i;:::-;1197:7;1187:17;;;899:311;;;;;:::o;1215:466::-;1292:6;1300;1308;1361:2;1349:9;1340:7;1336:23;1332:32;1329:2;;;1382:6;1374;1367:22;1329:2;1426:9;1413:23;1445:31;1470:5;1445:31;:::i;:::-;1495:5;-1:-1:-1;1552:2:12;1537:18;;1524:32;1565:33;1524:32;1565:33;:::i;:::-;1319:362;;1617:7;;-1:-1:-1;;;1671:2:12;1656:18;;;;1643:32;;1319:362::o;1686:325::-;1754:6;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:2;;;1836:6;1828;1821:22;1783:2;1880:9;1867:23;1899:31;1924:5;1899:31;:::i;:::-;1949:5;2001:2;1986:18;;;;1973:32;;-1:-1:-1;;;1773:238:12:o;2016:293::-;2072:6;2125:2;2113:9;2104:7;2100:23;2096:32;2093:2;;;2146:6;2138;2131:22;2093:2;2190:9;2177:23;2243:5;2236:13;2229:21;2222:5;2219:32;2209:2;;2270:6;2262;2255:22;2314:190;2373:6;2426:2;2414:9;2405:7;2401:23;2397:32;2394:2;;;2447:6;2439;2432:22;2394:2;-1:-1:-1;2475:23:12;;2384:120;-1:-1:-1;2384:120:12:o;2509:395::-;2595:6;2603;2611;2619;2672:3;2660:9;2651:7;2647:23;2643:33;2640:2;;;2694:6;2686;2679:22;2640:2;-1:-1:-1;;2722:23:12;;;2792:2;2777:18;;2764:32;;-1:-1:-1;2843:2:12;2828:18;;2815:32;;2894:2;2879:18;2866:32;;-1:-1:-1;2630:274:12;-1:-1:-1;2630:274:12:o;2909:463::-;2962:3;3000:5;2994:12;3027:6;3022:3;3015:19;3053:4;3082:2;3077:3;3073:12;3066:19;;3119:2;3112:5;3108:14;3140:3;3152:195;3166:6;3163:1;3160:13;3152:195;;;3231:13;;-1:-1:-1;;;;;3227:39:12;3215:52;;3287:12;;;;3322:15;;;;3263:1;3181:9;3152:195;;;-1:-1:-1;3363:3:12;;2970:402;-1:-1:-1;;;;;2970:402:12:o;4110:261::-;4289:2;4278:9;4271:21;4252:4;4309:56;4361:2;4350:9;4346:18;4338:6;4309:56;:::i;4801:603::-;4913:4;4942:2;4971;4960:9;4953:21;5003:6;4997:13;5046:6;5041:2;5030:9;5026:18;5019:34;5071:4;5084:140;5098:6;5095:1;5092:13;5084:140;;;5193:14;;;5189:23;;5183:30;5159:17;;;5178:2;5155:26;5148:66;5113:10;;5084:140;;;5242:6;5239:1;5236:13;5233:2;;;5312:4;5307:2;5298:6;5287:9;5283:22;5279:31;5272:45;5233:2;-1:-1:-1;5388:2:12;5367:15;-1:-1:-1;;5363:29:12;5348:45;;;;5395:2;5344:54;;4922:482;-1:-1:-1;;;4922:482:12:o;9715:356::-;9917:2;9899:21;;;9936:18;;;9929:30;9995:34;9990:2;9975:18;;9968:62;10062:2;10047:18;;9889:182::o;12265:582::-;12564:6;12553:9;12546:25;12607:6;12602:2;12591:9;12587:18;12580:34;12650:3;12645:2;12634:9;12630:18;12623:31;12527:4;12671:57;12723:3;12712:9;12708:19;12700:6;12671:57;:::i;:::-;-1:-1:-1;;;;;12764:32:12;;;;12759:2;12744:18;;12737:60;-1:-1:-1;12828:3:12;12813:19;12806:35;12663:65;12536:311;-1:-1:-1;;;12536:311:12:o;13690:128::-;13730:3;13761:1;13757:6;13754:1;13751:13;13748:2;;;13767:18;;:::i;:::-;-1:-1:-1;13803:9:12;;13738:80::o;13823:217::-;13863:1;13889;13879:2;;-1:-1:-1;;;13914:31:12;;13968:4;13965:1;13958:15;13996:4;13921:1;13986:15;13879:2;-1:-1:-1;14025:9:12;;13869:171::o;14045:168::-;14085:7;14151:1;14147;14143:6;14139:14;14136:1;14133:21;14128:1;14121:9;14114:17;14110:45;14107:2;;;14158:18;;:::i;:::-;-1:-1:-1;14198:9:12;;14097:116::o;14218:125::-;14258:4;14286:1;14283;14280:8;14277:2;;;14291:18;;:::i;:::-;-1:-1:-1;14328:9:12;;14267:76::o;14348:380::-;14427:1;14423:12;;;;14470;;;14491:2;;14545:4;14537:6;14533:17;14523:27;;14491:2;14598;14590:6;14587:14;14567:18;14564:38;14561:2;;;14644:10;14639:3;14635:20;14632:1;14625:31;14679:4;14676:1;14669:15;14707:4;14704:1;14697:15;14733:135;14772:3;-1:-1:-1;;14793:17:12;;14790:2;;;14813:18;;:::i;:::-;-1:-1:-1;14860:1:12;14849:13;;14780:88::o;14873:127::-;14934:10;14929:3;14925:20;14922:1;14915:31;14965:4;14962:1;14955:15;14989:4;14986:1;14979:15;15005:131;-1:-1:-1;;;;;15080:31:12;;15070:42;;15060:2;;15126:1;15123;15116:12
Swarm Source
ipfs://3df17a0636b3d4cf9f950ce3352685d69cfdea849736ad4e76e51179a5ce2847
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.