Feature Tip: Add private address tag to any address under My Name Tag !
Grand token contract has migrated to a new address.
ERC-20
Overview
Max Total Supply
11,600,000 $GB
Holders
1,518
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000000038512 $GBValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Grand
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity =0.8.15; // import "./openzeppelin-contracts/token/ERC20/ERC20.sol"; // import "./openzeppelin-contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./interfaces/IRouter.sol"; contract Grand is ERC20, Ownable { IUniswapRouter public router; address public pair; uint256 constant _totalFullSupply = 50_000_000 * 1e18; uint256 constant _liquiditySupply = _totalFullSupply * 10 / 100; // 10% = 5_000_000 * 1e18; uint256 public _stakingRewardSupply = _totalFullSupply * 45 / 100; // 45% = 22_500_000 * 1e18; uint256 public _tradingIncentiveSupply = _totalFullSupply * 20 / 100; // 20% = 10_000_000 * 1e18; uint256 public _marketingBudgetSupply = _totalFullSupply * 10 / 100; // 10% = 5_000_000 * 1e18; uint256 public _privateSaleSupply = _totalFullSupply * 8 / 100; // 8% = 4_000_000 * 1e18; uint256 public _teamTokensSupply = _totalFullSupply * 7 / 100; // 7% = 3_500_000 * 1e18; uint256 public stakingRewardsMintedAt = 0; uint256 public tradingIncentiveMintedAt = 0; uint256 public marketingBudgetMintedAt = 0; uint256 public privateSaleMintedAt = 0; uint256 public teamTokensMintedAt = 0; // whitelist max buy amount in whitelist step uint256 constant _wlMaxBuyAmount = _liquiditySupply / 100; // 1% of liquidity = 50_000 * 1e18; uint256 public maxHoldingAmount = _liquiditySupply / 50; // 2% of initial liquidity, 0.2% of total supply = 100_000 * 1e18 bool private swapping; bool public swapEnabled; bool public tradingEnabled; bool public stakingLaunched; bool public tradingIncentiveLaunched; uint256 private launchTimestamp; address public treasuryWallet; uint256 public swapTokensAtAmount; uint256 public buyTax; uint256 public sellTax; uint256[] private taxTimestampSteps; uint256[] private buyTaxSteps; uint256[] private sellTaxSteps; mapping(address => bool) public whitelisted; mapping(address => bool) public blacklisted; mapping(address => bool) public isExcludedFromFees; mapping(address => bool) private _isExcludedFromMaxWallet; mapping(address => bool) public automatedMarketMakerPairs; address[] public whitelist_users = [ 0x1A69284e302046AeB25017766A79f89A08e01261, 0x5119757E2c791A6De4F3a5Bf38b9fDbfACbd1068, 0xAFD644Cd6FaB74C9Ab9444c3E420029D4E6B717A, 0x85d659fD40f0354A419947cb3baCCC1DDa938e61, 0xDB1bA7c360a7c42A9C163A133906AC4B86891853, 0x2c5d7333d81eB0eeC7f1ab437d0Bf18f371e06b9, 0x4CB64dFa9985634BF5442DA1c421F8D493380dA3, 0x366391f9C9a66AC4A2cf2a7E7788E6BeF80CDeCC, 0x3F4373aFdde3D7dE3AC433AcC7De685338c3980e, 0x220b522979B9F2Ca0F83663fcfF2ee2426aa449C, 0x6fcDaa9e3ee14540EeA3cFC40Bea16bC61F1c2b8, 0xEE08323d41cbA6C0b72f8d952da8d364bc1Ea71d, 0x6e74205481C0A61650951a463b18EdD7BCb51e5a, 0x10E3D80E50fd146175BCEA8D25C5be0085e2BE59, 0xFdC4C32ac821eB7137f23aC55e3E10C7280eBf7d, 0xc210204c50e78251689DabE7091Be4d2320F00AB, 0x5A7a61FACE3C7Bf578098Ad80Fe7E7c471B4277C, 0x9d156bc7c8768294510A4A41883d5A4EB15b15E3, 0x5671B8dadc4B50e253B52330C558C9DA112C4886, 0x42FeeC5c7e7D3c725864A2716CA357Fa9993CCC0, 0x3185EF019BA1C04B8d65eDB64c1c34C3eaE52271, 0x9c15078EbFcC032D00faCbB4fB9829b60C6e26b4, 0xdbF66aCD1F816E44CeBA22b93cA245155D879392, 0x5Baa197fFEd76a44E7F22fc6E050e7D99025D201, 0xBC35D102F498B6ACDa7ceC5168Fb4B19D9255953, 0x79D06301491f92AA60B58eEc3cfbB9ef2E0Ea4f6, 0x9053137E530b881Fb47E9abdC881dE266F313a1F, 0x0d3C00C1Da6d3f7791E7320A7130556eBDd46767, 0x0A753312Aa7F500fbd8De099B15A2e2761757615, 0x289213e63B7E827a19Bc48e6cb132f6D2dD89342, 0x5fa85E6FEa19F73f92E665c1d4A0d20F0467d33E, 0xDa4e25fC45e82dcDe872c8eaD40a6F012428E1EE, 0x8Cfa8Dd7BD8a1316f145c52D842C09EaC212F642, 0xb1F0801cf68aAC49789e4332690fb4B8b44Cde68, 0x2719F75F3734475a0157e1257C12596B8Ac2D1E5, 0xc7f91e6650Fe21791B1f8af864eD019B6853294E, 0xa9C3eB1b8250Daddf039A010b67a089D8384f648, 0xAB2ccE9850e7Dc9b86e9EBf465F86B06a4329766, 0x44CDDD49C6098B77108336FC5f10A4CC9037d764, 0xCA1bbb512759dE1bE41ab739151553AACFB5073C, 0x5B8aCeDd3D078AA30703AdE6a1ca8caC944aD181, 0x99F5D9E4B88403Fe3590481198396c910610203A, 0xC15e8aE9BC6Bdea3bfdD16b3498c5C4Af9baC670, 0xc746696E0f4488c81FC222d3547CCC0777eb860D, 0x7978D693892F2A20F5DF40561F1E0C48b90e1D73, 0x1fC593215253271e3077798D784311F6B95902E1, 0x03150902655e881D873622020BABF8678183C7A6, 0xE12A574dc83664784B0a3d4672bF9D6E55B5014e, 0xbDFbe0F5858477CABec37784fdd0aB86e0E600d1, 0xA59c43ceEF4c1981432c35921E9b3778Fce79faA ]; event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); constructor(address _treasury) ERC20("Grand", "$GB") { swapEnabled = true; router = IUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address _pair = IFactory(router.factory()).createPair( address(this), router.WETH() ); pair = _pair; _setAutomatedMarketMakerPair(pair, true); setSwapTokensAtAmount(40000); treasuryWallet = _treasury; excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromMaxWallet(address(pair), true); excludeFromMaxWallet(address(this), true); excludeFromMaxWallet(address(router), true); excludeFromMaxWallet(owner(), true); taxTimestampSteps.push(30 minutes); taxTimestampSteps.push(15 minutes); taxTimestampSteps.push(15 minutes); buyTaxSteps.push(4000); buyTaxSteps.push(3000); buyTaxSteps.push(1500); sellTaxSteps.push(4000); sellTaxSteps.push(3000); sellTaxSteps.push(1500); buyTax = 500; sellTax = 500; for (uint i = 0; i < whitelist_users.length; i ++) { whitelisted[whitelist_users[i]] = true; } // initial = liquidity + 30% of marketing budget uint256 initialMintAmt = _liquiditySupply + _marketingBudgetSupply * 3 / 10; // reduce remained _marketingBudgetSupply _marketingBudgetSupply = _marketingBudgetSupply * 7 / 10; _mint(msg.sender, initialMintAmt); } // only owner function setSwapEnabled(bool _enabled) external onlyOwner { swapEnabled = _enabled; } // only owner function enableTrading(bool _enable) external onlyOwner { require(tradingEnabled != _enable && launchTimestamp > 0, "Already Set"); tradingEnabled = _enable; } // only owner function launch() external onlyOwner { launchTimestamp = block.timestamp; tradingEnabled = true; } // only owner /// @dev Set new pairs created due to listing in new DEX function setAutomatedMarketMakerPair(address newPair, bool value) external onlyOwner { _setAutomatedMarketMakerPair(newPair, value); } function _setAutomatedMarketMakerPair(address newPair, bool value) private { require( automatedMarketMakerPairs[newPair] != value, "Automated market maker pair is already set to that value" ); automatedMarketMakerPairs[newPair] = value; emit SetAutomatedMarketMakerPair(newPair, value); } // only owner function setTreasuryWallet(address newWallet) public onlyOwner { treasuryWallet = newWallet; } // only owner function setSwapTokensAtAmount(uint256 amount) public onlyOwner { swapTokensAtAmount = amount * 10**18; } function updateMaxHoldingAmount(uint256 newNum) public onlyOwner { require(newNum >= 100000, "Cannot set maxHoldingAmount lower than 100k tokens"); maxHoldingAmount = newNum * 10**18; } // only owner function setBuyTax(uint256 _tax) external onlyOwner { require(_tax <= 2000, "Fee must be <= 20%"); buyTax = _tax; } // only owner function setSellTax(uint256 _tax) external onlyOwner { require(_tax <= 2000, "Fee must be <= 20%"); sellTax = _tax; } // only owner function setTaxSteps(uint256[] calldata _timestamps, uint256[] calldata _buyTaxes, uint256[] calldata _sellTaxes) external onlyOwner { taxTimestampSteps = _timestamps; buyTaxSteps = _buyTaxes; sellTaxSteps = _sellTaxes; } // only owner function blacklist(address user, bool value) external onlyOwner { require(blacklisted[user] != value, "Already Set"); blacklisted[user] = value; } // only owner function whitelist(address user, bool value) external onlyOwner { require(whitelisted[user] != value, "Already Set"); whitelisted[user] = value; } // only owner function excludeFromFees(address account, bool excluded) public onlyOwner { require( isExcludedFromFees[account] != excluded, "Account is already the value of 'excluded'" ); isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeFromMaxWallet(address account, bool excluded) public onlyOwner { _isExcludedFromMaxWallet[account] = excluded; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(!blacklisted[from] && !blacklisted[to], "Blacklisted"); if ( !isExcludedFromFees[from] && !isExcludedFromFees[to] && !swapping ) { require(tradingEnabled, "Trading not active"); if (!_isExcludedFromMaxWallet[to]) { require( amount + balanceOf(to) <= maxHoldingAmount, "Unable to exceed maxHoldingAmount" ); } } if (amount == 0) { super._transfer(from, to, 0); return; } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount && contractTokenBalance > 0; if ( canSwap && !swapping && swapEnabled && automatedMarketMakerPairs[to] && !isExcludedFromFees[from] && !isExcludedFromFees[to] ) { swapping = true; if (sellTax > 0) { swapToTreasury(swapTokensAtAmount); } swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (isExcludedFromFees[from] || isExcludedFromFees[to]) { takeFee = false; } // if no swap if (!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from]) takeFee = false; else if (isFirstStepTrade()) { // if swap and first step, and if whitelisted user, then no fee // buy or sell if (whitelisted[to] || whitelisted[from]) { takeFee = false; // if wl is buying, then check balance if (whitelisted[to]) { require(balanceOf(to) + amount <= _wlMaxBuyAmount, "Exceed max buy amount!"); } } } if (takeFee) { uint256 feeAmt; if (automatedMarketMakerPairs[to]) feeAmt = (amount * getSellTax()) / 10000; else if (automatedMarketMakerPairs[from]) feeAmt = (amount * getBuyTax()) / 10000; amount = amount - feeAmt; super._transfer(from, address(this), feeAmt); } super._transfer(from, to, amount); } function swapToTreasury(uint256 tokens) private { swapTokensForETH(tokens); uint256 EthTaxBalance = address(this).balance; // Send ETH to treasury uint256 trAmt = EthTaxBalance; if (trAmt > 0) { (bool success, ) = payable(treasuryWallet).call{value: trAmt}(""); require(success, "Failed to send ETH to treasury wallet"); } } function swapTokensForETH(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); _approve(address(this), address(router), tokenAmount); // make the swap // router.swapExactTokensForETH( router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function isFirstStepTrade() internal view returns (bool) { uint256 curTick = block.timestamp; return curTick <= (launchTimestamp + taxTimestampSteps[0]); } function getSellTax() internal view returns (uint256) { uint256 curTick = block.timestamp; uint256 i; uint256 tick = launchTimestamp; for (i = 0; i < taxTimestampSteps.length; i ++) { if (curTick <= tick + taxTimestampSteps[i]) return sellTaxSteps[i]; tick += taxTimestampSteps[i]; } return sellTax; } function getBuyTax() internal view returns (uint256) { uint256 curTick = block.timestamp; uint256 i; uint256 tick = launchTimestamp; for (i = 0; i < taxTimestampSteps.length; i ++) { if (curTick <= tick + taxTimestampSteps[i]) return buyTaxSteps[i]; tick += taxTimestampSteps[i]; } return buyTax; } // only owner function mintMarketingBudget() external onlyOwner { require(launchTimestamp > 0, "token is not launched yet"); require(_marketingBudgetSupply > 0, "no token to mint"); uint256 curTick = block.timestamp; if (marketingBudgetMintedAt == 0) { marketingBudgetMintedAt = launchTimestamp; } if (marketingBudgetMintedAt + 7 days <= curTick) { uint256 mintAmount = _totalFullSupply * 1 / 100; // 10% of _marketingBudgetSupply // if mintAmount is bigger than _marketingBudgetSupply, then set it to _marketingBudgetSupply if (mintAmount > _marketingBudgetSupply) mintAmount = _marketingBudgetSupply; // reduce _marketingBudgetSupply by subtrating mintAmount _marketingBudgetSupply = _marketingBudgetSupply - mintAmount; _mint(msg.sender, mintAmount); marketingBudgetMintedAt = marketingBudgetMintedAt + 7 days; } } // only owner function mintPrivateSale() external onlyOwner { require(launchTimestamp > 0, "token is not launched yet"); require(_privateSaleSupply > 0, "no token to mint"); uint256 curTick = block.timestamp; if (privateSaleMintedAt == 0) { // at first, 2 days after tge, mint 30% if (launchTimestamp + 2 days <= curTick) { uint256 mintAmount = (_totalFullSupply * 8 / 100) * 3 / 10; // 30% first _mint(msg.sender, mintAmount); privateSaleMintedAt = launchTimestamp + 2 days; _privateSaleSupply = _privateSaleSupply - mintAmount; } } else { if (privateSaleMintedAt + 7 days <= curTick) { uint256 mintAmount = (_totalFullSupply * 8 / 100) / 10; // 10% of _privateSaleSupply // if mintAmount is bigger than _privateSaleSupply, then set it to _privateSaleSupply if (mintAmount > _privateSaleSupply) mintAmount = _privateSaleSupply; // reduce _privateSaleSupply by subtrating mintAmount _privateSaleSupply = _privateSaleSupply - mintAmount; _mint(msg.sender, mintAmount); privateSaleMintedAt = privateSaleMintedAt + 7 days; } } } // only owner function mintTeamTokens() external onlyOwner { require(launchTimestamp > 0, "token is not launched yet"); require(_teamTokensSupply > 0, "no token to mint"); require(launchTimestamp + 30 days <= block.timestamp, "1 month should past"); uint256 curTick = block.timestamp; if (teamTokensMintedAt == 0) { teamTokensMintedAt = launchTimestamp + 30 days; } if (teamTokensMintedAt + 7 days <= curTick) { uint256 mintAmount = (_totalFullSupply * 7 / 100) / 20; // 5% of _teamTokensSupply // if mintAmount is bigger than _teamTokensSupply, then set it to _teamTokensSupply if (mintAmount > _teamTokensSupply) mintAmount = _teamTokensSupply; // reduce _teamTokensSupply by subtrating mintAmount _teamTokensSupply = _teamTokensSupply - mintAmount; _mint(msg.sender, mintAmount); teamTokensMintedAt = teamTokensMintedAt + 7 days; } } function launchStaking() external onlyOwner { stakingLaunched = true; } function launchTradingIncentive() external onlyOwner { tradingIncentiveLaunched = true; } // only owner function mintStakingRewards() external onlyOwner { require(launchTimestamp > 0, "token is not launched yet"); require(_stakingRewardSupply > 0, "no token to mint"); require(stakingLaunched, "staking is not launched yet"); uint256 curTick = block.timestamp; if (stakingRewardsMintedAt == 0) { // at first, mint 30% uint256 mintAmount = (_totalFullSupply * 45 / 100) * 3 / 10; // 30% first _mint(msg.sender, mintAmount); stakingRewardsMintedAt = curTick; _stakingRewardSupply = _stakingRewardSupply - mintAmount; } else { if (stakingRewardsMintedAt + 7 days <= curTick) { uint256 mintAmount = (_totalFullSupply * 45 / 100) / 10; // 10% of _stakingRewardSupply // if mintAmount is bigger than _stakingRewardSupply, then set it to _stakingRewardSupply if (mintAmount > _stakingRewardSupply) mintAmount = _stakingRewardSupply; // reduce _stakingRewardSupply by subtrating mintAmount _stakingRewardSupply = _stakingRewardSupply - mintAmount; _mint(msg.sender, mintAmount); stakingRewardsMintedAt = stakingRewardsMintedAt + 7 days; } } } // only owner function mintTradingIncentive() external onlyOwner { require(launchTimestamp > 0, "token is not launched yet"); require(_tradingIncentiveSupply > 0, "no token to mint"); require(tradingIncentiveLaunched, "trading incentive is not launched yet"); uint256 curTick = block.timestamp; if (tradingIncentiveMintedAt == 0) { // at first, mint 30% uint256 mintAmount = (_totalFullSupply * 20 / 100) * 3 / 10; // 30% first _mint(msg.sender, mintAmount); tradingIncentiveMintedAt = curTick; _tradingIncentiveSupply = _tradingIncentiveSupply - mintAmount; } else { if (tradingIncentiveMintedAt + 7 days <= curTick) { uint256 mintAmount = (_totalFullSupply * 20 / 100) / 10; // 10% of _tradingIncentiveSupply // if mintAmount is bigger than _tradingIncentiveSupply, then set it to _tradingIncentiveSupply if (mintAmount > _tradingIncentiveSupply) mintAmount = _tradingIncentiveSupply; // reduce _tradingIncentiveSupply by subtrating mintAmount _tradingIncentiveSupply = _tradingIncentiveSupply - mintAmount; _mint(msg.sender, mintAmount); tradingIncentiveMintedAt = tradingIncentiveMintedAt + 7 days; } } } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead 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 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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 += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface IPair { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external view returns (address); } interface IFactory{ function createPair(address tokenA, address tokenB) external returns (address pair); function getPair(address tokenA, address tokenB) external view returns (address pair); } interface IUniswapRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external; }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":[],"name":"_marketingBudgetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_privateSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stakingRewardSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamTokensSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingIncentiveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","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":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","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":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTradingIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingBudgetMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHoldingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMarketingBudget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintTradingIncentive","outputs":[],"stateMutability":"nonpayable","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"_buyTaxes","type":"uint256[]"},{"internalType":"uint256[]","name":"_sellTaxes","type":"uint256[]"}],"name":"setTaxSteps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingRewardsMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamTokensMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIncentiveLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIncentiveMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxHoldingAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelist_users","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526064602d6a295be96e6406697200000062000020919062001d8a565b6200002c919062001e1a565b600855606460146a295be96e640669720000006200004b919062001d8a565b62000057919062001e1a565b6009556064600a6a295be96e6406697200000062000076919062001d8a565b62000082919062001e1a565b600a55606460086a295be96e64066972000000620000a1919062001d8a565b620000ad919062001e1a565b600b55606460076a295be96e64066972000000620000cc919062001d8a565b620000d8919062001e1a565b600c556000600d556000600e556000600f556000601055600060115560326064600a6a295be96e6406697200000062000112919062001d8a565b6200011e919062001e1a565b6200012a919062001e1a565b601255604051806106400160405280731a69284e302046aeb25017766a79f89a08e0126173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735119757e2c791a6de4f3a5bf38b9fdbfacbd106873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173afd644cd6fab74c9ab9444c3e420029d4e6b717a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017385d659fd40f0354a419947cb3baccc1dda938e6173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173db1ba7c360a7c42a9c163a133906ac4b8689185373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732c5d7333d81eb0eec7f1ab437d0bf18f371e06b973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734cb64dfa9985634bf5442da1c421f8d493380da373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173366391f9c9a66ac4a2cf2a7e7788e6bef80cdecc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733f4373afdde3d7de3ac433acc7de685338c3980e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173220b522979b9f2ca0f83663fcff2ee2426aa449c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736fcdaa9e3ee14540eea3cfc40bea16bc61f1c2b873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ee08323d41cba6c0b72f8d952da8d364bc1ea71d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736e74205481c0a61650951a463b18edd7bcb51e5a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017310e3d80e50fd146175bcea8d25c5be0085e2be5973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173fdc4c32ac821eb7137f23ac55e3e10c7280ebf7d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c210204c50e78251689dabe7091be4d2320f00ab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735a7a61face3c7bf578098ad80fe7e7c471b4277c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739d156bc7c8768294510a4a41883d5a4eb15b15e373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735671b8dadc4b50e253b52330c558c9da112c488673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017342feec5c7e7d3c725864a2716ca357fa9993ccc073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733185ef019ba1c04b8d65edb64c1c34c3eae5227173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739c15078ebfcc032d00facbb4fb9829b60c6e26b473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173dbf66acd1f816e44ceba22b93ca245155d87939273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735baa197ffed76a44e7f22fc6e050e7d99025d20173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bc35d102f498b6acda7cec5168fb4b19d925595373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017379d06301491f92aa60b58eec3cfbb9ef2e0ea4f673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739053137e530b881fb47e9abdc881de266f313a1f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730d3c00c1da6d3f7791e7320a7130556ebdd4676773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730a753312aa7f500fbd8de099b15a2e276175761573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173289213e63b7e827a19bc48e6cb132f6d2dd8934273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735fa85e6fea19f73f92e665c1d4a0d20f0467d33e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173da4e25fc45e82dcde872c8ead40a6f012428e1ee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738cfa8dd7bd8a1316f145c52d842c09eac212f64273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b1f0801cf68aac49789e4332690fb4b8b44cde6873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732719f75f3734475a0157e1257c12596b8ac2d1e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c7f91e6650fe21791b1f8af864ed019b6853294e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a9c3eb1b8250daddf039a010b67a089d8384f64873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ab2cce9850e7dc9b86e9ebf465f86b06a432976673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017344cddd49c6098b77108336fc5f10a4cc9037d76473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ca1bbb512759de1be41ab739151553aacfb5073c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735b8acedd3d078aa30703ade6a1ca8cac944ad18173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017399f5d9e4b88403fe3590481198396c910610203a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c15e8ae9bc6bdea3bfdd16b3498c5c4af9bac67073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c746696e0f4488c81fc222d3547ccc0777eb860d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737978d693892f2a20f5df40561f1e0c48b90e1d7373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001731fc593215253271e3077798d784311f6b95902e173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017303150902655e881d873622020babf8678183c7a673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e12a574dc83664784b0a3d4672bf9d6e55b5014e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bdfbe0f5858477cabec37784fdd0ab86e0e600d173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a59c43ceef4c1981432c35921e9b3778fce79faa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250602190603262000ef592919062001ca3565b5034801562000f0357600080fd5b50604051620076b2380380620076b2833981810160405281019062000f29919062001ebc565b6040518060400160405280600581526020017f4772616e640000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f2447420000000000000000000000000000000000000000000000000000000000815250816003908162000fa691906200215e565b50806004908162000fb891906200215e565b50505062000fdb62000fcf6200168360201b60201c565b6200168b60201b60201c565b6001601360016101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620010bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010e1919062001ebc565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200116b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001191919062001ebc565b6040518363ffffffff1660e01b8152600401620011b092919062002256565b6020604051808303816000875af1158015620011d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011f6919062001ebc565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200126e600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200175160201b60201c565b62001281619c406200188760201b60201c565b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620012e4620012d6620018b660201b60201c565b6001620018e060201b60201c565b620012f7306001620018e060201b60201c565b6200132c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162001a3060201b60201c565b6200133f30600162001a3060201b60201c565b62001374600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162001a3060201b60201c565b6200139662001388620018b660201b60201c565b600162001a3060201b60201c565b601961070890806001815401808255809150506001900390600052602060002001600090919091909150556019610384908060018154018082558091505060019003906000526020600020016000909190919091505560196103849080600181540180825580915050600190039060005260206000200160009091909190915055601a610fa09080600181540180825580915050600190039060005260206000200160009091909190915055601a610bb89080600181540180825580915050600190039060005260206000200160009091909190915055601a6105dc9080600181540180825580915050600190039060005260206000200160009091909190915055601b610fa09080600181540180825580915050600190039060005260206000200160009091909190915055601b610bb89080600181540180825580915050600190039060005260206000200160009091909190915055601b6105dc90806001815401808255809150506001900390600052602060002001600090919091909150556101f46017819055506101f460188190555060005b602180549050811015620015eb576001601c60006021848154811062001559576200155862002283565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620015e290620022b2565b9150506200152e565b506000600a6003600a5462001601919062001d8a565b6200160d919062001e1a565b6064600a6a295be96e6406697200000062001629919062001d8a565b62001635919062001e1a565b620016419190620022ff565b9050600a6007600a5462001656919062001d8a565b62001662919062001e1a565b600a819055506200167a338262001a9b60201b60201c565b505050620025e9565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503620017e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017dd90620023e3565b60405180910390fd5b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6200189762001c0860201b60201c565b670de0b6b3a764000081620018ad919062001d8a565b60168190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620018f062001c0860201b60201c565b801515601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150362001985576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200197c906200247b565b60405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162001a249190620024ba565b60405180910390a25050565b62001a4062001c0860201b60201c565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362001b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b049062002527565b60405180910390fd5b62001b216000838362001c9960201b60201c565b806002600082825462001b359190620022ff565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162001be891906200255a565b60405180910390a362001c046000838362001c9e60201b60201c565b5050565b62001c186200168360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662001c3e620018b660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462001c97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001c8e90620025c7565b60405180910390fd5b565b505050565b505050565b82805482825590600052602060002090810192821562001d1f579160200282015b8281111562001d1e5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062001cc4565b5b50905062001d2e919062001d32565b5090565b5b8082111562001d4d57600081600090555060010162001d33565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001d978262001d51565b915062001da48362001d51565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001de05762001ddf62001d5b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062001e278262001d51565b915062001e348362001d51565b92508262001e475762001e4662001deb565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001e848262001e57565b9050919050565b62001e968162001e77565b811462001ea257600080fd5b50565b60008151905062001eb68162001e8b565b92915050565b60006020828403121562001ed55762001ed462001e52565b5b600062001ee58482850162001ea5565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001f7057607f821691505b60208210810362001f865762001f8562001f28565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262001ff07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001fb1565b62001ffc868362001fb1565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200203f62002039620020338462001d51565b62002014565b62001d51565b9050919050565b6000819050919050565b6200205b836200201e565b620020736200206a8262002046565b84845462001fbe565b825550505050565b600090565b6200208a6200207b565b6200209781848462002050565b505050565b5b81811015620020bf57620020b360008262002080565b6001810190506200209d565b5050565b601f8211156200210e57620020d88162001f8c565b620020e38462001fa1565b81016020851015620020f3578190505b6200210b620021028562001fa1565b8301826200209c565b50505b505050565b600082821c905092915050565b6000620021336000198460080262002113565b1980831691505092915050565b60006200214e838362002120565b9150826002028217905092915050565b620021698262001eee565b67ffffffffffffffff81111562002185576200218462001ef9565b5b62002191825462001f57565b6200219e828285620020c3565b600060209050601f831160018114620021d65760008415620021c1578287015190505b620021cd858262002140565b8655506200223d565b601f198416620021e68662001f8c565b60005b828110156200221057848901518255600182019150602085019450602081019050620021e9565b868310156200223057848901516200222c601f89168262002120565b8355505b6001600288020188555050505b505050505050565b620022508162001e77565b82525050565b60006040820190506200226d600083018562002245565b6200227c602083018462002245565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620022bf8262001d51565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620022f457620022f362001d5b565b5b600182019050919050565b60006200230c8262001d51565b9150620023198362001d51565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562002351576200235062001d5b565b5b828201905092915050565b600082825260208201905092915050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000620023cb6038836200235c565b9150620023d8826200236d565b604082019050919050565b60006020820190508181036000830152620023fe81620023bc565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b600062002463602a836200235c565b9150620024708262002405565b604082019050919050565b60006020820190508181036000830152620024968162002454565b9050919050565b60008115159050919050565b620024b4816200249d565b82525050565b6000602082019050620024d16000830184620024a9565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200250f601f836200235c565b91506200251c82620024d7565b602082019050919050565b60006020820190508181036000830152620025428162002500565b9050919050565b620025548162001d51565b82525050565b600060208201905062002571600083018462002549565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620025af6020836200235c565b9150620025bc8262002577565b602082019050919050565b60006020820190508181036000830152620025e281620025a0565b9050919050565b6150b980620025f96000396000f3fe6080604052600436106103a65760003560e01c80638ed938a7116101e7578063d7b1a5271161010d578063e5ff2e8a116100a0578063f2fde38b1161006f578063f2fde38b14610d3f578063f3fd05ae14610d68578063f59c370814610da5578063f887ea4014610dce576103ad565b8063e5ff2e8a14610ca9578063ede43ab214610cc0578063f16a45d114610ceb578063f275f64b14610d16576103ad565b8063dd62ed3e116100dc578063dd62ed3e14610bed578063e01af92c14610c2a578063e1af569814610c53578063e2f4560514610c7e576103ad565b8063d7b1a52714610b1f578063d936547e14610b4a578063dbac26e914610b87578063dc1052e214610bc4576103ad565b8063a9059cbb11610185578063c024666811610154578063c024666814610a77578063cc1776d314610aa0578063d17e9b1914610acb578063d2fcc00114610af6576103ad565b8063a9059cbb146109a9578063a9803cde146109e6578063afa4f3b214610a11578063b62496f514610a3a576103ad565b8063a30a2474116101c1578063a30a247414610901578063a457c2d714610918578063a8602fea14610955578063a8aa1b311461097e576103ad565b80638ed938a71461089657806395d89b41146108ad5780639a7a23d6146108d8576103ad565b80634fbee193116102cc578063715018a61161026a57806389f9a1d31161023957806389f9a1d3146107ec5780638cd09d50146108175780638da5cb5b146108405780638ec3c19d1461086b576103ad565b8063715018a61461076a578063730604681461078157806385ca915c146107aa57806388415f4d146107c1576103ad565b80635a6e5be1116102a65780635a6e5be1146106c05780636ddd1713146106eb5780636e55b0221461071657806370a082311461072d576103ad565b80634fbee1931461062f578063589936641461066c57806359bb6fb014610697576103ad565b80632754305811610344578063404e512911610313578063404e5129146105855780634626402b146105ae5780634ada218b146105d95780634f7041a514610604576103ad565b806327543058146104db578063313ce5671461050657806339509351146105315780633c062b301461056e576103ad565b806318160ddd1161038057806318160ddd146104315780631ecbb32a1461045c57806323b872dd1461048757806326bbf7ed146104c4576103ad565b806301339c21146103b257806306fdde03146103c9578063095ea7b3146103f4576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610df9565b005b3480156103d557600080fd5b506103de610e25565b6040516103eb9190613adb565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613b9b565b610eb7565b6040516104289190613bf6565b60405180910390f35b34801561043d57600080fd5b50610446610eda565b6040516104539190613c20565b60405180910390f35b34801561046857600080fd5b50610471610ee4565b60405161047e9190613c20565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613c3b565b610eea565b6040516104bb9190613bf6565b60405180910390f35b3480156104d057600080fd5b506104d9610f19565b005b3480156104e757600080fd5b506104f061110a565b6040516104fd9190613c20565b60405180910390f35b34801561051257600080fd5b5061051b611110565b6040516105289190613caa565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613b9b565b611119565b6040516105659190613bf6565b60405180910390f35b34801561057a57600080fd5b50610583611150565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613cf1565b611341565b005b3480156105ba57600080fd5b506105c3611436565b6040516105d09190613d40565b60405180910390f35b3480156105e557600080fd5b506105ee61145c565b6040516105fb9190613bf6565b60405180910390f35b34801561061057600080fd5b5061061961146f565b6040516106269190613c20565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613d5b565b611475565b6040516106639190613bf6565b60405180910390f35b34801561067857600080fd5b50610681611495565b60405161068e9190613c20565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190613ded565b61149b565b005b3480156106cc57600080fd5b506106d56114e1565b6040516106e29190613c20565b60405180910390f35b3480156106f757600080fd5b506107006114e7565b60405161070d9190613bf6565b60405180910390f35b34801561072257600080fd5b5061072b6114fa565b005b34801561073957600080fd5b50610754600480360381019061074f9190613d5b565b61162e565b6040516107619190613c20565b60405180910390f35b34801561077657600080fd5b5061077f611676565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613ea1565b61168a565b005b3480156107b657600080fd5b506107bf6116f5565b005b3480156107cd57600080fd5b506107d661171a565b6040516107e39190613c20565b60405180910390f35b3480156107f857600080fd5b50610801611720565b60405161080e9190613c20565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613ea1565b611726565b005b34801561084c57600080fd5b5061085561177d565b6040516108629190613d40565b60405180910390f35b34801561087757600080fd5b506108806117a7565b60405161088d9190613c20565b60405180910390f35b3480156108a257600080fd5b506108ab6117ad565b005b3480156108b957600080fd5b506108c2611977565b6040516108cf9190613adb565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa9190613cf1565b611a09565b005b34801561090d57600080fd5b50610916611a1f565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613b9b565b611a44565b60405161094c9190613bf6565b60405180910390f35b34801561096157600080fd5b5061097c60048036038101906109779190613d5b565b611abb565b005b34801561098a57600080fd5b50610993611b07565b6040516109a09190613d40565b60405180910390f35b3480156109b557600080fd5b506109d060048036038101906109cb9190613b9b565b611b2d565b6040516109dd9190613bf6565b60405180910390f35b3480156109f257600080fd5b506109fb611b50565b604051610a089190613c20565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613ea1565b611b56565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613d5b565b611b7b565b604051610a6e9190613bf6565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613cf1565b611b9a565b005b348015610aac57600080fd5b50610ab5611cdd565b604051610ac29190613c20565b60405180910390f35b348015610ad757600080fd5b50610ae0611ce3565b604051610aed9190613bf6565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190613cf1565b611cf6565b005b348015610b2b57600080fd5b50610b34611d59565b604051610b419190613c20565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190613d5b565b611d5f565b604051610b7e9190613bf6565b60405180910390f35b348015610b9357600080fd5b50610bae6004803603810190610ba99190613d5b565b611d7f565b604051610bbb9190613bf6565b60405180910390f35b348015610bd057600080fd5b50610beb6004803603810190610be69190613ea1565b611d9f565b005b348015610bf957600080fd5b50610c146004803603810190610c0f9190613ece565b611df6565b604051610c219190613c20565b60405180910390f35b348015610c3657600080fd5b50610c516004803603810190610c4c9190613f0e565b611e7d565b005b348015610c5f57600080fd5b50610c68611ea2565b604051610c759190613bf6565b60405180910390f35b348015610c8a57600080fd5b50610c93611eb5565b604051610ca09190613c20565b60405180910390f35b348015610cb557600080fd5b50610cbe611ebb565b005b348015610ccc57600080fd5b50610cd561205c565b604051610ce29190613c20565b60405180910390f35b348015610cf757600080fd5b50610d00612062565b604051610d0d9190613c20565b60405180910390f35b348015610d2257600080fd5b50610d3d6004803603810190610d389190613f0e565b612068565b005b348015610d4b57600080fd5b50610d666004803603810190610d619190613d5b565b6120f1565b005b348015610d7457600080fd5b50610d8f6004803603810190610d8a9190613ea1565b612174565b604051610d9c9190613d40565b60405180910390f35b348015610db157600080fd5b50610dcc6004803603810190610dc79190613cf1565b6121b3565b005b348015610dda57600080fd5b50610de36122a8565b604051610df09190613f9a565b60405180910390f35b610e016122ce565b426014819055506001601360026101000a81548160ff021916908315150217905550565b606060038054610e3490613fe4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090613fe4565b8015610ead5780601f10610e8257610100808354040283529160200191610ead565b820191906000526020600020905b815481529060010190602001808311610e9057829003601f168201915b5050505050905090565b600080610ec261234c565b9050610ecf818585612354565b600191505092915050565b6000600254905090565b60115481565b600080610ef561234c565b9050610f0285828561251d565b610f0d8585856125a9565b60019150509392505050565b610f216122ce565b600060145411610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614061565b60405180910390fd5b600060085411610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906140cd565b60405180910390fd5b601360039054906101000a900460ff16610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190614139565b60405180910390fd5b60004290506000600d5403611074576000600a60036064602d6a295be96e640669720000006110299190614188565b6110339190614211565b61103d9190614188565b6110479190614211565b90506110533382612f11565b81600d81905550806008546110689190614242565b60088190555050611107565b8062093a80600d546110869190614276565b11611106576000600a6064602d6a295be96e640669720000006110a99190614188565b6110b39190614211565b6110bd9190614211565b90506008548111156110cf5760085490505b806008546110dd9190614242565b6008819055506110ed3382612f11565b62093a80600d546110fe9190614276565b600d81905550505b5b50565b60105481565b60006012905090565b60008061112461234c565b90506111458185856111368589611df6565b6111409190614276565b612354565b600191505092915050565b6111586122ce565b60006014541161119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614061565b60405180910390fd5b6000600954116111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d9906140cd565b60405180910390fd5b601360049054906101000a900460ff16611231576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112289061433e565b60405180910390fd5b60004290506000600e54036112ab576000600a6003606460146a295be96e640669720000006112609190614188565b61126a9190614211565b6112749190614188565b61127e9190614211565b905061128a3382612f11565b81600e819055508060095461129f9190614242565b6009819055505061133e565b8062093a80600e546112bd9190614276565b1161133d576000600a606460146a295be96e640669720000006112e09190614188565b6112ea9190614211565b6112f49190614211565b90506009548111156113065760095490505b806009546113149190614242565b6009819055506113243382612f11565b62093a80600e546113359190614276565b600e81905550505b5b50565b6113496122ce565b801515601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906143aa565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360029054906101000a900460ff1681565b60175481565b601e6020528060005260406000206000915054906101000a900460ff1681565b600b5481565b6114a36122ce565b8585601991906114b49291906139d8565b508383601a91906114c69291906139d8565b508181601b91906114d89291906139d8565b50505050505050565b60085481565b601360019054906101000a900460ff1681565b6115026122ce565b600060145411611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90614061565b60405180910390fd5b6000600a541161158c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611583906140cd565b60405180910390fd5b60004290506000600f54036115a557601454600f819055505b8062093a80600f546115b79190614276565b1161162b576000606460016a295be96e640669720000006115d89190614188565b6115e29190614211565b9050600a548111156115f457600a5490505b80600a546116029190614242565b600a819055506116123382612f11565b62093a80600f546116239190614276565b600f81905550505b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61167e6122ce565b6116886000613067565b565b6116926122ce565b620186a08110156116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf9061443c565b60405180910390fd5b670de0b6b3a7640000816116ec9190614188565b60128190555050565b6116fd6122ce565b6001601360046101000a81548160ff021916908315150217905550565b600d5481565b60125481565b61172e6122ce565b6107d0811115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906144a8565b60405180910390fd5b8060188190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6117b56122ce565b6000601454116117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614061565b60405180910390fd5b6000600b541161183f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611836906140cd565b60405180910390fd5b60004290506000601054036118e157806202a3006014546118609190614276565b116118dc576000600a6003606460086a295be96e640669720000006118859190614188565b61188f9190614211565b6118999190614188565b6118a39190614211565b90506118af3382612f11565b6202a3006014546118c09190614276565b60108190555080600b546118d49190614242565b600b81905550505b611974565b8062093a806010546118f39190614276565b11611973576000600a606460086a295be96e640669720000006119169190614188565b6119209190614211565b61192a9190614211565b9050600b5481111561193c57600b5490505b80600b5461194a9190614242565b600b8190555061195a3382612f11565b62093a8060105461196b9190614276565b601081905550505b5b50565b60606004805461198690613fe4565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290613fe4565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b5050505050905090565b611a116122ce565b611a1b828261312d565b5050565b611a276122ce565b6001601360036101000a81548160ff021916908315150217905550565b600080611a4f61234c565b90506000611a5d8286611df6565b905083811015611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a999061453a565b60405180910390fd5b611aaf8286868403612354565b60019250505092915050565b611ac36122ce565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611b3861234c565b9050611b458185856125a9565b600191505092915050565b600c5481565b611b5e6122ce565b670de0b6b3a764000081611b729190614188565b60168190555050565b602080528060005260406000206000915054906101000a900460ff1681565b611ba26122ce565b801515601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b906145cc565b60405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611cd19190613bf6565b60405180910390a25050565b60185481565b601360049054906101000a900460ff1681565b611cfe6122ce565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b601c6020528060005260406000206000915054906101000a900460ff1681565b601d6020528060005260406000206000915054906101000a900460ff1681565b611da76122ce565b6107d0811115611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de3906144a8565b60405180910390fd5b8060178190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e856122ce565b80601360016101000a81548160ff02191690831515021790555050565b601360039054906101000a900460ff1681565b60165481565b611ec36122ce565b600060145411611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90614061565b60405180910390fd5b6000600c5411611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906140cd565b60405180910390fd5b4262278d00601454611f5f9190614276565b1115611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9790614638565b60405180910390fd5b6000429050600060115403611fc75762278d00601454611fc09190614276565b6011819055505b8062093a80601154611fd99190614276565b116120595760006014606460076a295be96e64066972000000611ffc9190614188565b6120069190614211565b6120109190614211565b9050600c5481111561202257600c5490505b80600c546120309190614242565b600c819055506120403382612f11565b62093a806011546120519190614276565b601181905550505b50565b600f5481565b600a5481565b6120706122ce565b801515601360029054906101000a900460ff1615151415801561209557506000601454115b6120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb906143aa565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b6120f96122ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f906146ca565b60405180910390fd5b61217181613067565b50565b6021818154811061218457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121bb6122ce565b801515601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906143aa565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122d661234c565b73ffffffffffffffffffffffffffffffffffffffff166122f461177d565b73ffffffffffffffffffffffffffffffffffffffff161461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614736565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061485a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125109190613c20565b60405180910390a3505050565b60006125298484611df6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a35781811015612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c906148c6565b60405180910390fd5b6125a28484848403612354565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906149ea565b60405180910390fd5b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561272b5750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190614a56565b60405180910390fd5b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561280e5750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156128275750601360009054906101000a900460ff16155b1561292657601360029054906101000a900460ff1661287b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287290614ac2565b60405180910390fd5b601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612925576012546128d88361162e565b826128e39190614276565b1115612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90614b54565b60405180910390fd5b5b5b6000810361293f5761293a83836000613260565b612f0c565b600061294a3061162e565b9050600060165482101580156129605750600082115b905080801561297c5750601360009054906101000a900460ff16155b80156129945750601360019054906101000a900460ff165b80156129e95750602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612a3f5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612a955750601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ae8576001601360006101000a81548160ff02191690831515021790555060006018541115612acc57612acb6016546134d6565b5b6000601360006101000a81548160ff0219169083151502179055505b6000601360009054906101000a900460ff16159050601e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612b9e5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ba857600090505b602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c4c5750602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c5a5760009050612deb565b612c626135c7565b15612dea57601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d085750601c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612de95760009050601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612de857606480600a6a295be96e64066972000000612d7e9190614188565b612d889190614211565b612d929190614211565b84612d9c8761162e565b612da69190614276565b1115612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614bc0565b60405180910390fd5b5b5b5b5b8015612efd576000602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612e6c57612710612e50613603565b86612e5b9190614188565b612e659190614211565b9050612ee2565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ee157612710612ec96136c7565b86612ed49190614188565b612ede9190614211565b90505b5b8085612eee9190614242565b9450612efb873083613260565b505b612f08868686613260565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7790614c2c565b60405180910390fd5b612f8c6000838361378b565b8060026000828254612f9e9190614276565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161304f9190613c20565b60405180910390a361306360008383613790565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b690614cbe565b60405180910390fd5b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c690614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361333e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613335906149ea565b60405180910390fd5b61334983838361378b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614d50565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134bd9190613c20565b60405180910390a36134d0848484613790565b50505050565b6134df81613795565b6000479050600081905060008111156135c2576000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161353a90614da1565b60006040518083038185875af1925050503d8060008114613577576040519150601f19603f3d011682016040523d82523d6000602084013e61357c565b606091505b50509050806135c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b790614e28565b60405180910390fd5b505b505050565b60008042905060196000815481106135e2576135e1614e48565b5b90600052602060002001546014546135fa9190614276565b81111591505090565b6000804290506000806014549050600091505b6019805490508210156136bb576019828154811061363757613636614e48565b5b90600052602060002001548161364d9190614276565b831161367c57601b828154811061366757613666614e48565b5b906000526020600020015493505050506136c4565b601982815481106136905761368f614e48565b5b9060005260206000200154816136a69190614276565b905081806136b390614e77565b925050613616565b60185493505050505b90565b6000804290506000806014549050600091505b60198054905082101561377f57601982815481106136fb576136fa614e48565b5b9060005260206000200154816137119190614276565b831161374057601a828154811061372b5761372a614e48565b5b90600052602060002001549350505050613788565b6019828154811061375457613753614e48565b5b90600052602060002001548161376a9190614276565b9050818061377790614e77565b9250506136da565b60175493505050505b90565b505050565b505050565b6000600267ffffffffffffffff8111156137b2576137b1614ebf565b5b6040519080825280602002602001820160405280156137e05781602001602082028036833780820191505090505b50905030816000815181106137f8576137f7614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c39190614f03565b816001815181106138d7576138d6614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061393e30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612354565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139a2959493929190615029565b600060405180830381600087803b1580156139bc57600080fd5b505af11580156139d0573d6000803e3d6000fd5b505050505050565b828054828255906000526020600020908101928215613a14579160200282015b82811115613a135782358255916020019190600101906139f8565b5b509050613a219190613a25565b5090565b5b80821115613a3e576000816000905550600101613a26565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a7c578082015181840152602081019050613a61565b83811115613a8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613aad82613a42565b613ab78185613a4d565b9350613ac7818560208601613a5e565b613ad081613a91565b840191505092915050565b60006020820190508181036000830152613af58184613aa2565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3282613b07565b9050919050565b613b4281613b27565b8114613b4d57600080fd5b50565b600081359050613b5f81613b39565b92915050565b6000819050919050565b613b7881613b65565b8114613b8357600080fd5b50565b600081359050613b9581613b6f565b92915050565b60008060408385031215613bb257613bb1613afd565b5b6000613bc085828601613b50565b9250506020613bd185828601613b86565b9150509250929050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b613c1a81613b65565b82525050565b6000602082019050613c356000830184613c11565b92915050565b600080600060608486031215613c5457613c53613afd565b5b6000613c6286828701613b50565b9350506020613c7386828701613b50565b9250506040613c8486828701613b86565b9150509250925092565b600060ff82169050919050565b613ca481613c8e565b82525050565b6000602082019050613cbf6000830184613c9b565b92915050565b613cce81613bdb565b8114613cd957600080fd5b50565b600081359050613ceb81613cc5565b92915050565b60008060408385031215613d0857613d07613afd565b5b6000613d1685828601613b50565b9250506020613d2785828601613cdc565b9150509250929050565b613d3a81613b27565b82525050565b6000602082019050613d556000830184613d31565b92915050565b600060208284031215613d7157613d70613afd565b5b6000613d7f84828501613b50565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613dad57613dac613d88565b5b8235905067ffffffffffffffff811115613dca57613dc9613d8d565b5b602083019150836020820283011115613de657613de5613d92565b5b9250929050565b60008060008060008060608789031215613e0a57613e09613afd565b5b600087013567ffffffffffffffff811115613e2857613e27613b02565b5b613e3489828a01613d97565b9650965050602087013567ffffffffffffffff811115613e5757613e56613b02565b5b613e6389828a01613d97565b9450945050604087013567ffffffffffffffff811115613e8657613e85613b02565b5b613e9289828a01613d97565b92509250509295509295509295565b600060208284031215613eb757613eb6613afd565b5b6000613ec584828501613b86565b91505092915050565b60008060408385031215613ee557613ee4613afd565b5b6000613ef385828601613b50565b9250506020613f0485828601613b50565b9150509250929050565b600060208284031215613f2457613f23613afd565b5b6000613f3284828501613cdc565b91505092915050565b6000819050919050565b6000613f60613f5b613f5684613b07565b613f3b565b613b07565b9050919050565b6000613f7282613f45565b9050919050565b6000613f8482613f67565b9050919050565b613f9481613f79565b82525050565b6000602082019050613faf6000830184613f8b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ffc57607f821691505b60208210810361400f5761400e613fb5565b5b50919050565b7f746f6b656e206973206e6f74206c61756e636865642079657400000000000000600082015250565b600061404b601983613a4d565b915061405682614015565b602082019050919050565b6000602082019050818103600083015261407a8161403e565b9050919050565b7f6e6f20746f6b656e20746f206d696e7400000000000000000000000000000000600082015250565b60006140b7601083613a4d565b91506140c282614081565b602082019050919050565b600060208201905081810360008301526140e6816140aa565b9050919050565b7f7374616b696e67206973206e6f74206c61756e63686564207965740000000000600082015250565b6000614123601b83613a4d565b915061412e826140ed565b602082019050919050565b6000602082019050818103600083015261415281614116565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061419382613b65565b915061419e83613b65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141d7576141d6614159565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061421c82613b65565b915061422783613b65565b925082614237576142366141e2565b5b828204905092915050565b600061424d82613b65565b915061425883613b65565b92508282101561426b5761426a614159565b5b828203905092915050565b600061428182613b65565b915061428c83613b65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142c1576142c0614159565b5b828201905092915050565b7f74726164696e6720696e63656e74697665206973206e6f74206c61756e63686560008201527f6420796574000000000000000000000000000000000000000000000000000000602082015250565b6000614328602583613a4d565b9150614333826142cc565b604082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f416c726561647920536574000000000000000000000000000000000000000000600082015250565b6000614394600b83613a4d565b915061439f8261435e565b602082019050919050565b600060208201905081810360008301526143c381614387565b9050919050565b7f43616e6e6f7420736574206d6178486f6c64696e67416d6f756e74206c6f776560008201527f72207468616e203130306b20746f6b656e730000000000000000000000000000602082015250565b6000614426603283613a4d565b9150614431826143ca565b604082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f466565206d757374206265203c3d203230250000000000000000000000000000600082015250565b6000614492601283613a4d565b915061449d8261445c565b602082019050919050565b600060208201905081810360008301526144c181614485565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614524602583613a4d565b915061452f826144c8565b604082019050919050565b6000602082019050818103600083015261455381614517565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b60006145b6602a83613a4d565b91506145c18261455a565b604082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f31206d6f6e74682073686f756c64207061737400000000000000000000000000600082015250565b6000614622601383613a4d565b915061462d826145ec565b602082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b4602683613a4d565b91506146bf82614658565b604082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614720602083613a4d565b915061472b826146ea565b602082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147b2602483613a4d565b91506147bd82614756565b604082019050919050565b600060208201905081810360008301526147e1816147a5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614844602283613a4d565b915061484f826147e8565b604082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006148b0601d83613a4d565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614942602583613a4d565b915061494d826148e6565b604082019050919050565b6000602082019050818103600083015261497181614935565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006149d4602383613a4d565b91506149df82614978565b604082019050919050565b60006020820190508181036000830152614a03816149c7565b9050919050565b7f426c61636b6c6973746564000000000000000000000000000000000000000000600082015250565b6000614a40600b83613a4d565b9150614a4b82614a0a565b602082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614aac601283613a4d565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f556e61626c6520746f20657863656564206d6178486f6c64696e67416d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b3e602183613a4d565b9150614b4982614ae2565b604082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f457863656564206d61782062757920616d6f756e742100000000000000000000600082015250565b6000614baa601683613a4d565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614c16601f83613a4d565b9150614c2182614be0565b602082019050919050565b60006020820190508181036000830152614c4581614c09565b9050919050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000614ca8603883613a4d565b9150614cb382614c4c565b604082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d3a602683613a4d565b9150614d4582614cde565b604082019050919050565b60006020820190508181036000830152614d6981614d2d565b9050919050565b600081905092915050565b50565b6000614d8b600083614d70565b9150614d9682614d7b565b600082019050919050565b6000614dac82614d7e565b9150819050919050565b7f4661696c656420746f2073656e642045544820746f207472656173757279207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b6000614e12602583613a4d565b9150614e1d82614db6565b604082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e8282613b65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614eb457614eb3614159565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614efd81613b39565b92915050565b600060208284031215614f1957614f18613afd565b5b6000614f2784828501614eee565b91505092915050565b6000819050919050565b6000614f55614f50614f4b84614f30565b613f3b565b613b65565b9050919050565b614f6581614f3a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614fa081613b27565b82525050565b6000614fb28383614f97565b60208301905092915050565b6000602082019050919050565b6000614fd682614f6b565b614fe08185614f76565b9350614feb83614f87565b8060005b8381101561501c5781516150038882614fa6565b975061500e83614fbe565b925050600181019050614fef565b5085935050505092915050565b600060a08201905061503e6000830188613c11565b61504b6020830187614f5c565b818103604083015261505d8186614fcb565b905061506c6060830185613d31565b6150796080830184613c11565b969550505050505056fea2646970667358221220d77c497273a150dfaaab1a3b97863137f31edb4301dafeb16f730c7c37137a6b64736f6c634300080f003300000000000000000000000048a2450ae9ed6b035b75f715f226ced05cda5a0a
Deployed Bytecode
0x6080604052600436106103a65760003560e01c80638ed938a7116101e7578063d7b1a5271161010d578063e5ff2e8a116100a0578063f2fde38b1161006f578063f2fde38b14610d3f578063f3fd05ae14610d68578063f59c370814610da5578063f887ea4014610dce576103ad565b8063e5ff2e8a14610ca9578063ede43ab214610cc0578063f16a45d114610ceb578063f275f64b14610d16576103ad565b8063dd62ed3e116100dc578063dd62ed3e14610bed578063e01af92c14610c2a578063e1af569814610c53578063e2f4560514610c7e576103ad565b8063d7b1a52714610b1f578063d936547e14610b4a578063dbac26e914610b87578063dc1052e214610bc4576103ad565b8063a9059cbb11610185578063c024666811610154578063c024666814610a77578063cc1776d314610aa0578063d17e9b1914610acb578063d2fcc00114610af6576103ad565b8063a9059cbb146109a9578063a9803cde146109e6578063afa4f3b214610a11578063b62496f514610a3a576103ad565b8063a30a2474116101c1578063a30a247414610901578063a457c2d714610918578063a8602fea14610955578063a8aa1b311461097e576103ad565b80638ed938a71461089657806395d89b41146108ad5780639a7a23d6146108d8576103ad565b80634fbee193116102cc578063715018a61161026a57806389f9a1d31161023957806389f9a1d3146107ec5780638cd09d50146108175780638da5cb5b146108405780638ec3c19d1461086b576103ad565b8063715018a61461076a578063730604681461078157806385ca915c146107aa57806388415f4d146107c1576103ad565b80635a6e5be1116102a65780635a6e5be1146106c05780636ddd1713146106eb5780636e55b0221461071657806370a082311461072d576103ad565b80634fbee1931461062f578063589936641461066c57806359bb6fb014610697576103ad565b80632754305811610344578063404e512911610313578063404e5129146105855780634626402b146105ae5780634ada218b146105d95780634f7041a514610604576103ad565b806327543058146104db578063313ce5671461050657806339509351146105315780633c062b301461056e576103ad565b806318160ddd1161038057806318160ddd146104315780631ecbb32a1461045c57806323b872dd1461048757806326bbf7ed146104c4576103ad565b806301339c21146103b257806306fdde03146103c9578063095ea7b3146103f4576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610df9565b005b3480156103d557600080fd5b506103de610e25565b6040516103eb9190613adb565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613b9b565b610eb7565b6040516104289190613bf6565b60405180910390f35b34801561043d57600080fd5b50610446610eda565b6040516104539190613c20565b60405180910390f35b34801561046857600080fd5b50610471610ee4565b60405161047e9190613c20565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613c3b565b610eea565b6040516104bb9190613bf6565b60405180910390f35b3480156104d057600080fd5b506104d9610f19565b005b3480156104e757600080fd5b506104f061110a565b6040516104fd9190613c20565b60405180910390f35b34801561051257600080fd5b5061051b611110565b6040516105289190613caa565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613b9b565b611119565b6040516105659190613bf6565b60405180910390f35b34801561057a57600080fd5b50610583611150565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613cf1565b611341565b005b3480156105ba57600080fd5b506105c3611436565b6040516105d09190613d40565b60405180910390f35b3480156105e557600080fd5b506105ee61145c565b6040516105fb9190613bf6565b60405180910390f35b34801561061057600080fd5b5061061961146f565b6040516106269190613c20565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613d5b565b611475565b6040516106639190613bf6565b60405180910390f35b34801561067857600080fd5b50610681611495565b60405161068e9190613c20565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190613ded565b61149b565b005b3480156106cc57600080fd5b506106d56114e1565b6040516106e29190613c20565b60405180910390f35b3480156106f757600080fd5b506107006114e7565b60405161070d9190613bf6565b60405180910390f35b34801561072257600080fd5b5061072b6114fa565b005b34801561073957600080fd5b50610754600480360381019061074f9190613d5b565b61162e565b6040516107619190613c20565b60405180910390f35b34801561077657600080fd5b5061077f611676565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613ea1565b61168a565b005b3480156107b657600080fd5b506107bf6116f5565b005b3480156107cd57600080fd5b506107d661171a565b6040516107e39190613c20565b60405180910390f35b3480156107f857600080fd5b50610801611720565b60405161080e9190613c20565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613ea1565b611726565b005b34801561084c57600080fd5b5061085561177d565b6040516108629190613d40565b60405180910390f35b34801561087757600080fd5b506108806117a7565b60405161088d9190613c20565b60405180910390f35b3480156108a257600080fd5b506108ab6117ad565b005b3480156108b957600080fd5b506108c2611977565b6040516108cf9190613adb565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa9190613cf1565b611a09565b005b34801561090d57600080fd5b50610916611a1f565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613b9b565b611a44565b60405161094c9190613bf6565b60405180910390f35b34801561096157600080fd5b5061097c60048036038101906109779190613d5b565b611abb565b005b34801561098a57600080fd5b50610993611b07565b6040516109a09190613d40565b60405180910390f35b3480156109b557600080fd5b506109d060048036038101906109cb9190613b9b565b611b2d565b6040516109dd9190613bf6565b60405180910390f35b3480156109f257600080fd5b506109fb611b50565b604051610a089190613c20565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613ea1565b611b56565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613d5b565b611b7b565b604051610a6e9190613bf6565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613cf1565b611b9a565b005b348015610aac57600080fd5b50610ab5611cdd565b604051610ac29190613c20565b60405180910390f35b348015610ad757600080fd5b50610ae0611ce3565b604051610aed9190613bf6565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190613cf1565b611cf6565b005b348015610b2b57600080fd5b50610b34611d59565b604051610b419190613c20565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190613d5b565b611d5f565b604051610b7e9190613bf6565b60405180910390f35b348015610b9357600080fd5b50610bae6004803603810190610ba99190613d5b565b611d7f565b604051610bbb9190613bf6565b60405180910390f35b348015610bd057600080fd5b50610beb6004803603810190610be69190613ea1565b611d9f565b005b348015610bf957600080fd5b50610c146004803603810190610c0f9190613ece565b611df6565b604051610c219190613c20565b60405180910390f35b348015610c3657600080fd5b50610c516004803603810190610c4c9190613f0e565b611e7d565b005b348015610c5f57600080fd5b50610c68611ea2565b604051610c759190613bf6565b60405180910390f35b348015610c8a57600080fd5b50610c93611eb5565b604051610ca09190613c20565b60405180910390f35b348015610cb557600080fd5b50610cbe611ebb565b005b348015610ccc57600080fd5b50610cd561205c565b604051610ce29190613c20565b60405180910390f35b348015610cf757600080fd5b50610d00612062565b604051610d0d9190613c20565b60405180910390f35b348015610d2257600080fd5b50610d3d6004803603810190610d389190613f0e565b612068565b005b348015610d4b57600080fd5b50610d666004803603810190610d619190613d5b565b6120f1565b005b348015610d7457600080fd5b50610d8f6004803603810190610d8a9190613ea1565b612174565b604051610d9c9190613d40565b60405180910390f35b348015610db157600080fd5b50610dcc6004803603810190610dc79190613cf1565b6121b3565b005b348015610dda57600080fd5b50610de36122a8565b604051610df09190613f9a565b60405180910390f35b610e016122ce565b426014819055506001601360026101000a81548160ff021916908315150217905550565b606060038054610e3490613fe4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090613fe4565b8015610ead5780601f10610e8257610100808354040283529160200191610ead565b820191906000526020600020905b815481529060010190602001808311610e9057829003601f168201915b5050505050905090565b600080610ec261234c565b9050610ecf818585612354565b600191505092915050565b6000600254905090565b60115481565b600080610ef561234c565b9050610f0285828561251d565b610f0d8585856125a9565b60019150509392505050565b610f216122ce565b600060145411610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614061565b60405180910390fd5b600060085411610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906140cd565b60405180910390fd5b601360039054906101000a900460ff16610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190614139565b60405180910390fd5b60004290506000600d5403611074576000600a60036064602d6a295be96e640669720000006110299190614188565b6110339190614211565b61103d9190614188565b6110479190614211565b90506110533382612f11565b81600d81905550806008546110689190614242565b60088190555050611107565b8062093a80600d546110869190614276565b11611106576000600a6064602d6a295be96e640669720000006110a99190614188565b6110b39190614211565b6110bd9190614211565b90506008548111156110cf5760085490505b806008546110dd9190614242565b6008819055506110ed3382612f11565b62093a80600d546110fe9190614276565b600d81905550505b5b50565b60105481565b60006012905090565b60008061112461234c565b90506111458185856111368589611df6565b6111409190614276565b612354565b600191505092915050565b6111586122ce565b60006014541161119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614061565b60405180910390fd5b6000600954116111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d9906140cd565b60405180910390fd5b601360049054906101000a900460ff16611231576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112289061433e565b60405180910390fd5b60004290506000600e54036112ab576000600a6003606460146a295be96e640669720000006112609190614188565b61126a9190614211565b6112749190614188565b61127e9190614211565b905061128a3382612f11565b81600e819055508060095461129f9190614242565b6009819055505061133e565b8062093a80600e546112bd9190614276565b1161133d576000600a606460146a295be96e640669720000006112e09190614188565b6112ea9190614211565b6112f49190614211565b90506009548111156113065760095490505b806009546113149190614242565b6009819055506113243382612f11565b62093a80600e546113359190614276565b600e81905550505b5b50565b6113496122ce565b801515601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906143aa565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360029054906101000a900460ff1681565b60175481565b601e6020528060005260406000206000915054906101000a900460ff1681565b600b5481565b6114a36122ce565b8585601991906114b49291906139d8565b508383601a91906114c69291906139d8565b508181601b91906114d89291906139d8565b50505050505050565b60085481565b601360019054906101000a900460ff1681565b6115026122ce565b600060145411611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90614061565b60405180910390fd5b6000600a541161158c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611583906140cd565b60405180910390fd5b60004290506000600f54036115a557601454600f819055505b8062093a80600f546115b79190614276565b1161162b576000606460016a295be96e640669720000006115d89190614188565b6115e29190614211565b9050600a548111156115f457600a5490505b80600a546116029190614242565b600a819055506116123382612f11565b62093a80600f546116239190614276565b600f81905550505b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61167e6122ce565b6116886000613067565b565b6116926122ce565b620186a08110156116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf9061443c565b60405180910390fd5b670de0b6b3a7640000816116ec9190614188565b60128190555050565b6116fd6122ce565b6001601360046101000a81548160ff021916908315150217905550565b600d5481565b60125481565b61172e6122ce565b6107d0811115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906144a8565b60405180910390fd5b8060188190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6117b56122ce565b6000601454116117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614061565b60405180910390fd5b6000600b541161183f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611836906140cd565b60405180910390fd5b60004290506000601054036118e157806202a3006014546118609190614276565b116118dc576000600a6003606460086a295be96e640669720000006118859190614188565b61188f9190614211565b6118999190614188565b6118a39190614211565b90506118af3382612f11565b6202a3006014546118c09190614276565b60108190555080600b546118d49190614242565b600b81905550505b611974565b8062093a806010546118f39190614276565b11611973576000600a606460086a295be96e640669720000006119169190614188565b6119209190614211565b61192a9190614211565b9050600b5481111561193c57600b5490505b80600b5461194a9190614242565b600b8190555061195a3382612f11565b62093a8060105461196b9190614276565b601081905550505b5b50565b60606004805461198690613fe4565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290613fe4565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b5050505050905090565b611a116122ce565b611a1b828261312d565b5050565b611a276122ce565b6001601360036101000a81548160ff021916908315150217905550565b600080611a4f61234c565b90506000611a5d8286611df6565b905083811015611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a999061453a565b60405180910390fd5b611aaf8286868403612354565b60019250505092915050565b611ac36122ce565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611b3861234c565b9050611b458185856125a9565b600191505092915050565b600c5481565b611b5e6122ce565b670de0b6b3a764000081611b729190614188565b60168190555050565b602080528060005260406000206000915054906101000a900460ff1681565b611ba26122ce565b801515601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b906145cc565b60405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611cd19190613bf6565b60405180910390a25050565b60185481565b601360049054906101000a900460ff1681565b611cfe6122ce565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b601c6020528060005260406000206000915054906101000a900460ff1681565b601d6020528060005260406000206000915054906101000a900460ff1681565b611da76122ce565b6107d0811115611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de3906144a8565b60405180910390fd5b8060178190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e856122ce565b80601360016101000a81548160ff02191690831515021790555050565b601360039054906101000a900460ff1681565b60165481565b611ec36122ce565b600060145411611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90614061565b60405180910390fd5b6000600c5411611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906140cd565b60405180910390fd5b4262278d00601454611f5f9190614276565b1115611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9790614638565b60405180910390fd5b6000429050600060115403611fc75762278d00601454611fc09190614276565b6011819055505b8062093a80601154611fd99190614276565b116120595760006014606460076a295be96e64066972000000611ffc9190614188565b6120069190614211565b6120109190614211565b9050600c5481111561202257600c5490505b80600c546120309190614242565b600c819055506120403382612f11565b62093a806011546120519190614276565b601181905550505b50565b600f5481565b600a5481565b6120706122ce565b801515601360029054906101000a900460ff1615151415801561209557506000601454115b6120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb906143aa565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b6120f96122ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f906146ca565b60405180910390fd5b61217181613067565b50565b6021818154811061218457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121bb6122ce565b801515601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906143aa565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122d661234c565b73ffffffffffffffffffffffffffffffffffffffff166122f461177d565b73ffffffffffffffffffffffffffffffffffffffff161461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614736565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061485a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125109190613c20565b60405180910390a3505050565b60006125298484611df6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a35781811015612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c906148c6565b60405180910390fd5b6125a28484848403612354565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906149ea565b60405180910390fd5b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561272b5750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190614a56565b60405180910390fd5b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561280e5750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156128275750601360009054906101000a900460ff16155b1561292657601360029054906101000a900460ff1661287b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287290614ac2565b60405180910390fd5b601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612925576012546128d88361162e565b826128e39190614276565b1115612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90614b54565b60405180910390fd5b5b5b6000810361293f5761293a83836000613260565b612f0c565b600061294a3061162e565b9050600060165482101580156129605750600082115b905080801561297c5750601360009054906101000a900460ff16155b80156129945750601360019054906101000a900460ff165b80156129e95750602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612a3f5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612a955750601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ae8576001601360006101000a81548160ff02191690831515021790555060006018541115612acc57612acb6016546134d6565b5b6000601360006101000a81548160ff0219169083151502179055505b6000601360009054906101000a900460ff16159050601e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612b9e5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ba857600090505b602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c4c5750602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c5a5760009050612deb565b612c626135c7565b15612dea57601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d085750601c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612de95760009050601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612de857606480600a6a295be96e64066972000000612d7e9190614188565b612d889190614211565b612d929190614211565b84612d9c8761162e565b612da69190614276565b1115612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614bc0565b60405180910390fd5b5b5b5b5b8015612efd576000602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612e6c57612710612e50613603565b86612e5b9190614188565b612e659190614211565b9050612ee2565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ee157612710612ec96136c7565b86612ed49190614188565b612ede9190614211565b90505b5b8085612eee9190614242565b9450612efb873083613260565b505b612f08868686613260565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7790614c2c565b60405180910390fd5b612f8c6000838361378b565b8060026000828254612f9e9190614276565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161304f9190613c20565b60405180910390a361306360008383613790565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b690614cbe565b60405180910390fd5b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c690614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361333e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613335906149ea565b60405180910390fd5b61334983838361378b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614d50565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134bd9190613c20565b60405180910390a36134d0848484613790565b50505050565b6134df81613795565b6000479050600081905060008111156135c2576000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161353a90614da1565b60006040518083038185875af1925050503d8060008114613577576040519150601f19603f3d011682016040523d82523d6000602084013e61357c565b606091505b50509050806135c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b790614e28565b60405180910390fd5b505b505050565b60008042905060196000815481106135e2576135e1614e48565b5b90600052602060002001546014546135fa9190614276565b81111591505090565b6000804290506000806014549050600091505b6019805490508210156136bb576019828154811061363757613636614e48565b5b90600052602060002001548161364d9190614276565b831161367c57601b828154811061366757613666614e48565b5b906000526020600020015493505050506136c4565b601982815481106136905761368f614e48565b5b9060005260206000200154816136a69190614276565b905081806136b390614e77565b925050613616565b60185493505050505b90565b6000804290506000806014549050600091505b60198054905082101561377f57601982815481106136fb576136fa614e48565b5b9060005260206000200154816137119190614276565b831161374057601a828154811061372b5761372a614e48565b5b90600052602060002001549350505050613788565b6019828154811061375457613753614e48565b5b90600052602060002001548161376a9190614276565b9050818061377790614e77565b9250506136da565b60175493505050505b90565b505050565b505050565b6000600267ffffffffffffffff8111156137b2576137b1614ebf565b5b6040519080825280602002602001820160405280156137e05781602001602082028036833780820191505090505b50905030816000815181106137f8576137f7614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c39190614f03565b816001815181106138d7576138d6614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061393e30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612354565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139a2959493929190615029565b600060405180830381600087803b1580156139bc57600080fd5b505af11580156139d0573d6000803e3d6000fd5b505050505050565b828054828255906000526020600020908101928215613a14579160200282015b82811115613a135782358255916020019190600101906139f8565b5b509050613a219190613a25565b5090565b5b80821115613a3e576000816000905550600101613a26565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a7c578082015181840152602081019050613a61565b83811115613a8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613aad82613a42565b613ab78185613a4d565b9350613ac7818560208601613a5e565b613ad081613a91565b840191505092915050565b60006020820190508181036000830152613af58184613aa2565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3282613b07565b9050919050565b613b4281613b27565b8114613b4d57600080fd5b50565b600081359050613b5f81613b39565b92915050565b6000819050919050565b613b7881613b65565b8114613b8357600080fd5b50565b600081359050613b9581613b6f565b92915050565b60008060408385031215613bb257613bb1613afd565b5b6000613bc085828601613b50565b9250506020613bd185828601613b86565b9150509250929050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b613c1a81613b65565b82525050565b6000602082019050613c356000830184613c11565b92915050565b600080600060608486031215613c5457613c53613afd565b5b6000613c6286828701613b50565b9350506020613c7386828701613b50565b9250506040613c8486828701613b86565b9150509250925092565b600060ff82169050919050565b613ca481613c8e565b82525050565b6000602082019050613cbf6000830184613c9b565b92915050565b613cce81613bdb565b8114613cd957600080fd5b50565b600081359050613ceb81613cc5565b92915050565b60008060408385031215613d0857613d07613afd565b5b6000613d1685828601613b50565b9250506020613d2785828601613cdc565b9150509250929050565b613d3a81613b27565b82525050565b6000602082019050613d556000830184613d31565b92915050565b600060208284031215613d7157613d70613afd565b5b6000613d7f84828501613b50565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613dad57613dac613d88565b5b8235905067ffffffffffffffff811115613dca57613dc9613d8d565b5b602083019150836020820283011115613de657613de5613d92565b5b9250929050565b60008060008060008060608789031215613e0a57613e09613afd565b5b600087013567ffffffffffffffff811115613e2857613e27613b02565b5b613e3489828a01613d97565b9650965050602087013567ffffffffffffffff811115613e5757613e56613b02565b5b613e6389828a01613d97565b9450945050604087013567ffffffffffffffff811115613e8657613e85613b02565b5b613e9289828a01613d97565b92509250509295509295509295565b600060208284031215613eb757613eb6613afd565b5b6000613ec584828501613b86565b91505092915050565b60008060408385031215613ee557613ee4613afd565b5b6000613ef385828601613b50565b9250506020613f0485828601613b50565b9150509250929050565b600060208284031215613f2457613f23613afd565b5b6000613f3284828501613cdc565b91505092915050565b6000819050919050565b6000613f60613f5b613f5684613b07565b613f3b565b613b07565b9050919050565b6000613f7282613f45565b9050919050565b6000613f8482613f67565b9050919050565b613f9481613f79565b82525050565b6000602082019050613faf6000830184613f8b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ffc57607f821691505b60208210810361400f5761400e613fb5565b5b50919050565b7f746f6b656e206973206e6f74206c61756e636865642079657400000000000000600082015250565b600061404b601983613a4d565b915061405682614015565b602082019050919050565b6000602082019050818103600083015261407a8161403e565b9050919050565b7f6e6f20746f6b656e20746f206d696e7400000000000000000000000000000000600082015250565b60006140b7601083613a4d565b91506140c282614081565b602082019050919050565b600060208201905081810360008301526140e6816140aa565b9050919050565b7f7374616b696e67206973206e6f74206c61756e63686564207965740000000000600082015250565b6000614123601b83613a4d565b915061412e826140ed565b602082019050919050565b6000602082019050818103600083015261415281614116565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061419382613b65565b915061419e83613b65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141d7576141d6614159565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061421c82613b65565b915061422783613b65565b925082614237576142366141e2565b5b828204905092915050565b600061424d82613b65565b915061425883613b65565b92508282101561426b5761426a614159565b5b828203905092915050565b600061428182613b65565b915061428c83613b65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142c1576142c0614159565b5b828201905092915050565b7f74726164696e6720696e63656e74697665206973206e6f74206c61756e63686560008201527f6420796574000000000000000000000000000000000000000000000000000000602082015250565b6000614328602583613a4d565b9150614333826142cc565b604082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f416c726561647920536574000000000000000000000000000000000000000000600082015250565b6000614394600b83613a4d565b915061439f8261435e565b602082019050919050565b600060208201905081810360008301526143c381614387565b9050919050565b7f43616e6e6f7420736574206d6178486f6c64696e67416d6f756e74206c6f776560008201527f72207468616e203130306b20746f6b656e730000000000000000000000000000602082015250565b6000614426603283613a4d565b9150614431826143ca565b604082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f466565206d757374206265203c3d203230250000000000000000000000000000600082015250565b6000614492601283613a4d565b915061449d8261445c565b602082019050919050565b600060208201905081810360008301526144c181614485565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614524602583613a4d565b915061452f826144c8565b604082019050919050565b6000602082019050818103600083015261455381614517565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b60006145b6602a83613a4d565b91506145c18261455a565b604082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f31206d6f6e74682073686f756c64207061737400000000000000000000000000600082015250565b6000614622601383613a4d565b915061462d826145ec565b602082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b4602683613a4d565b91506146bf82614658565b604082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614720602083613a4d565b915061472b826146ea565b602082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147b2602483613a4d565b91506147bd82614756565b604082019050919050565b600060208201905081810360008301526147e1816147a5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614844602283613a4d565b915061484f826147e8565b604082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006148b0601d83613a4d565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614942602583613a4d565b915061494d826148e6565b604082019050919050565b6000602082019050818103600083015261497181614935565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006149d4602383613a4d565b91506149df82614978565b604082019050919050565b60006020820190508181036000830152614a03816149c7565b9050919050565b7f426c61636b6c6973746564000000000000000000000000000000000000000000600082015250565b6000614a40600b83613a4d565b9150614a4b82614a0a565b602082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614aac601283613a4d565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f556e61626c6520746f20657863656564206d6178486f6c64696e67416d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b3e602183613a4d565b9150614b4982614ae2565b604082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f457863656564206d61782062757920616d6f756e742100000000000000000000600082015250565b6000614baa601683613a4d565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614c16601f83613a4d565b9150614c2182614be0565b602082019050919050565b60006020820190508181036000830152614c4581614c09565b9050919050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000614ca8603883613a4d565b9150614cb382614c4c565b604082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d3a602683613a4d565b9150614d4582614cde565b604082019050919050565b60006020820190508181036000830152614d6981614d2d565b9050919050565b600081905092915050565b50565b6000614d8b600083614d70565b9150614d9682614d7b565b600082019050919050565b6000614dac82614d7e565b9150819050919050565b7f4661696c656420746f2073656e642045544820746f207472656173757279207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b6000614e12602583613a4d565b9150614e1d82614db6565b604082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e8282613b65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614eb457614eb3614159565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614efd81613b39565b92915050565b600060208284031215614f1957614f18613afd565b5b6000614f2784828501614eee565b91505092915050565b6000819050919050565b6000614f55614f50614f4b84614f30565b613f3b565b613b65565b9050919050565b614f6581614f3a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614fa081613b27565b82525050565b6000614fb28383614f97565b60208301905092915050565b6000602082019050919050565b6000614fd682614f6b565b614fe08185614f76565b9350614feb83614f87565b8060005b8381101561501c5781516150038882614fa6565b975061500e83614fbe565b925050600181019050614fef565b5085935050505092915050565b600060a08201905061503e6000830188613c11565b61504b6020830187614f5c565b818103604083015261505d8186614fcb565b905061506c6060830185613d31565b6150796080830184613c11565b969550505050505056fea2646970667358221220d77c497273a150dfaaab1a3b97863137f31edb4301dafeb16f730c7c37137a6b64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000048a2450ae9ed6b035b75f715f226ced05cda5a0a
-----Decoded View---------------
Arg [0] : _treasury (address): 0x48a2450ae9eD6b035b75f715f226CEd05CdA5A0A
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000048a2450ae9ed6b035b75f715f226ced05cda5a0a
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.