[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "AmountMustBeGreaterThanZero", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "minimumAmount", "type": "uint256" } ], "name": "AmountOfTokensLessThanMinimumRequired", "type": "error" }, { "inputs": [], "name": "AutoSwapPrevented", "type": "error" }, { "inputs": [], "name": "BoughtAmountTooLow", "type": "error" }, { "inputs": [], "name": "ContractIsNotInitialized", "type": "error" }, { "inputs": [], "name": "DecreasesK", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "ERC2612ExpiredSignature", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "signer", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC2612InvalidSigner", "type": "error" }, { "inputs": [], "name": "FailedToSendNativeCurrency", "type": "error" }, { "inputs": [], "name": "InsufficientLiquidity", "type": "error" }, { "inputs": [], "name": "InsufficientLiquidityMinted", "type": "error" }, { "inputs": [], "name": "InvalidAddress", "type": "error" }, { "inputs": [], "name": "InvalidFeeRate", "type": "error" }, { "inputs": [], "name": "InvalidMaxWalletPercent", "type": "error" }, { "inputs": [], "name": "InvalidOwner", "type": "error" }, { "inputs": [], "name": "InvalidRecipient", "type": "error" }, { "inputs": [], "name": "InvalidReserves", "type": "error" }, { "inputs": [], "name": "MaxWalletAmountExceeded", "type": "error" }, { "inputs": [], "name": "NameAndSymbolAlreadySet", "type": "error" }, { "inputs": [], "name": "NameAndSymbolMustNotBeEmpty", "type": "error" }, { "inputs": [], "name": "NativeRepaymentFailed", "type": "error" }, { "inputs": [], "name": "NoFeesToClaim", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [], "name": "SlippageToleranceExceeded", "type": "error" }, { "inputs": [], "name": "StillBonding", "type": "error" }, { "inputs": [], "name": "SupplyAlreadyMinted", "type": "error" }, { "inputs": [], "name": "SwapNotEnabled", "type": "error" }, { "inputs": [], "name": "TokenRepaymentFailed", "type": "error" }, { "inputs": [], "name": "TransactionExpired", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "Unauthorized", "type": "error" }, { "inputs": [], "name": "YouHaveNoLiquidity", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "provider", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "liquidityMinted", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "AddLiquidity", "type": "event" }, { "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": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountNative", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountToken", "type": "uint256" } ], "name": "FeesCollected", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "feeTo", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "FeesDistributed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "tokenPriceInNative", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativePriceInToken", "type": "uint256" }, { "indexed": false, "internalType": "uint32", "name": "blockTimestampLast", "type": "uint32" } ], "name": "PricesUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "provider", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "liquidityBurned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "RemoveLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountTokenIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountNativeIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountTokenOut", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountNativeOut", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "flashSwap", "type": "bool" } ], "name": "Swap", "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": "BASE_SWAP_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DEAD_ADDRESS", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "FLASHSWAP_FEE_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_FEE_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINIMUM_LIQUIDITY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "PERMIT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SCALE_FACTOR", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedNativeFactoryFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedNativeTradingFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedTokenFactoryFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedTokenTradingFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amountToken_", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "addLiquidity", "outputs": [ { "internalType": "uint256", "name": "liquidity", "type": "uint256" } ], "stateMutability": "payable", "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": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "blockTimestampLast", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burnFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "burstFactory", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "claimFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "completeTheCurve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "curveComplete", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract IBIFKN314Factory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeCollector", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amountNativeOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountTokenOut", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashSwap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "outputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "inputReserve", "type": "uint256" }, { "internalType": "uint256", "name": "outputReserve", "type": "uint256" } ], "name": "getAmountIn", "outputs": [ { "internalType": "uint256", "name": "inputAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "inputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "inputReserve", "type": "uint256" }, { "internalType": "uint256", "name": "outputReserve", "type": "uint256" } ], "name": "getAmountOut", "outputs": [ { "internalType": "uint256", "name": "outputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "factoryFee", "type": "uint256" }, { "internalType": "uint256", "name": "tradingFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "getAmountsForLP", "outputs": [ { "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReserves", "outputs": [ { "internalType": "uint256", "name": "amountNative", "type": "uint256" }, { "internalType": "uint256", "name": "amountToken", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTokensInContract", "outputs": [ { "internalType": "uint256", "name": "tokenBalance", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "tokenName", "type": "string" }, { "internalType": "string", "name": "tokenSymbol", "type": "string" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "burstFactory_", "type": "address" } ], "name": "initializeBurstToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "initializeFactory", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isInitialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "isMaxWalletExempt", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "liquidityToken", "outputs": [ { "internalType": "contract BIFKN314LP", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxWalletEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxWalletPercent", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "metadataURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "price0CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "price1CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "removeLiquidity", "outputs": [ { "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "feeCollector_", "type": "address" } ], "name": "setFeeCollector", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "setMaxWalletEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "addressToChange", "type": "address" }, { "internalType": "bool", "name": "isExempt", "type": "bool" } ], "name": "setMaxWalletExempt", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxWalletPercent_", "type": "uint256" } ], "name": "setMaxWalletPercent", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "newURI", "type": "string" } ], "name": "setMetadataURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "totalSupply_", "type": "uint256" }, { "internalType": "address", "name": "owner_", "type": "address" }, { "internalType": "uint256", "name": "feeRate_", "type": "uint256" }, { "internalType": "uint256", "name": "maxWalletPercent_", "type": "uint256" }, { "internalType": "string", "name": "metadataURI_", "type": "string" } ], "name": "setSupplyAndMint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "setTradingEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "feeRate", "type": "uint256" } ], "name": "setTradingFeeRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "minimumTokensOut", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "swapNativeToToken", "outputs": [ { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokensSold", "type": "uint256" }, { "internalType": "uint256", "name": "minimumNativeOut", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "swapTokenToNative", "outputs": [ { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tradingEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tradingFeeRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60806040523480156200001157600080fd5b5060016007553362000023816200002a565b506200007c565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6150e0806200008c6000396000f3fe60806040526004361061037c5760003560e01c80635a3d5493116101cd578063a42dce8011610108578063ce4b5bbe116100ab578063dd62ed3e1161007a578063dd62ed3e14610af7578063e01df1a814610b17578063e156afd514610b2d578063e6cb316614610b42578063f2fde38b14610b6257600080fd5b8063ce4b5bbe14610a92578063d045a32914610aa8578063d294f09314610ac2578063d505accf14610ad757600080fd5b8063a42dce8014610983578063a614ff75146109a3578063a9059cbb146109c3578063ba9a7a56146109e3578063c415b95c146109f9578063c45a015514610a19578063c4ccdeea14610a40578063c5700a0214610a6057600080fd5b806385f8c2591161017057806385f8c259146108af5780638b19d6cf146108cf5780638da5cb5b146108ef5780638f017f921461090f57806392f6576e1461092557806395d89b411461093b5780639aa5d46214610950578063a10d2e3d1461096357600080fd5b80635a3d5493146107b757806370a08231146107cd578063715018a6146107ed578063750521f5146108025780637537ccb61461082257806379cc6790146108425780637ecebe001461086257806382bf293c1461088f57600080fd5b8063355cf34b116102b857806343cd8f7e1161025b5780634dacb6231161022a5780634dacb623146107355780634e6fd6c414610755578063538a3f0e1461076b5780635909c0d51461078b5780635a2b6c07146107a157600080fd5b806343cd8f7e146106a75780634ada218b146106d45780634b224583146106f55780634cd88b761461071557600080fd5b8063355cf34b146103bf5780633644e515146105fa578063392e53cd146106105780633a244650146106315780633c2f1806146106465780633d9a3d191461065b57806340ed04c71461067157806342966c681461068757600080fd5b80631091f67c116103205780631091f67c146104fe57806318160ddd1461051e5780631ab52a6c1461053357806320f1b9121461054957806323b872dd1461056a5780632783b5ba1461058a57806330adf81f146105aa578063313ce567146105de57600080fd5b8062813371146103bf57806303ee438c146103e7578063054d50d41461040957806306fdde03146104445780630902f1ac14610459578063095ea7b3146104835780630b52820a146104b35780630bd11f8a146104ce57600080fd5b366103ba573360009081526008602052604090205460ff166103b8576103b66103a6346001610b82565b6103b14260b46136a0565b610bdc565b505b005b600080fd5b3480156103cb57600080fd5b506103d4601e81565b6040519081526020015b60405180910390f35b3480156103f357600080fd5b506103fc610d41565b6040516103de9190613703565b34801561041557600080fd5b50610429610424366004613716565b610dcf565b604080519384526020840192909252908201526060016103de565b34801561045057600080fd5b506103fc610ec9565b34801561046557600080fd5b5061046e610f5b565b604080519283526020830191909152016103de565b34801561048f57600080fd5b506104a361049e366004613757565b610fd5565b60405190151581526020016103de565b6104c16103b1366004613783565b6040516103de91906137a5565b3480156104da57600080fd5b506104a36104e93660046137e9565b600b6020526000908152604090205460ff1681565b34801561050a57600080fd5b506103b8610519366004613806565b610fed565b34801561052a57600080fd5b506002546103d4565b34801561053f57600080fd5b506103d460115481565b34801561055557600080fd5b506018546104a390600160a01b900460ff1681565b34801561057657600080fd5b506104a361058536600461381f565b611055565b34801561059657600080fd5b506103b86105a53660046137e9565b61108d565b3480156105b657600080fd5b506103d47f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156105ea57600080fd5b50604051601281526020016103de565b34801561060657600080fd5b506103d460055481565b34801561061c57600080fd5b50600a546104a390600160a01b900460ff1681565b34801561063d57600080fd5b506103b8611120565b34801561065257600080fd5b506103d4611162565b34801561066757600080fd5b506103d4600f5481565b34801561067d57600080fd5b506103d460125481565b34801561069357600080fd5b506103b86106a2366004613806565b611172565b3480156106b357600080fd5b50600a546106c7906001600160a01b031681565b6040516103de9190613860565b3480156106e057600080fd5b50600a546104a390600160a81b900460ff1681565b34801561070157600080fd5b506104c1610710366004613716565b61117f565b34801561072157600080fd5b506103b8610730366004613917565b6112d9565b34801561074157600080fd5b506018546106c7906001600160a01b031681565b34801561076157600080fd5b506106c761dead81565b34801561077757600080fd5b506103b86107863660046137e9565b6113db565b34801561079757600080fd5b506103d4600c5481565b3480156107ad57600080fd5b506103d460145481565b3480156107c357600080fd5b506103d4600d5481565b3480156107d957600080fd5b506103d46107e83660046137e9565b611442565b3480156107f957600080fd5b506103b861145d565b34801561080e57600080fd5b506103b861081d36600461397b565b61148a565b34801561082e57600080fd5b506103b861083d3660046139c8565b6114bb565b34801561084e57600080fd5b506103b861085d366004613757565b611561565b34801561086e57600080fd5b506103d461087d3660046137e9565b60066020526000908152604090205481565b34801561089b57600080fd5b506103b86108aa366004613806565b611576565b3480156108bb57600080fd5b506103d46108ca366004613716565b6115ed565b3480156108db57600080fd5b506103b86108ea3660046139fd565b611692565b3480156108fb57600080fd5b506017546106c7906001600160a01b031681565b34801561091b57600080fd5b506103d460155481565b34801561093157600080fd5b506103d46101f481565b34801561094757600080fd5b506103fc61178c565b6103d461095e366004613a6a565b61179b565b34801561096f57600080fd5b5061046e61097e366004613806565b611b73565b34801561098f57600080fd5b506103b861099e3660046137e9565b611cc1565b3480156109af57600080fd5b506103b86109be366004613a91565b611d2b565b3480156109cf57600080fd5b506104a36109de366004613757565b611d8a565b3480156109ef57600080fd5b506103d46103e881565b348015610a0557600080fd5b506016546106c7906001600160a01b031681565b348015610a2557600080fd5b50600e546106c790600160201b90046001600160a01b031681565b348015610a4c57600080fd5b5061046e610a5b366004613a6a565b611db7565b348015610a6c57600080fd5b50600e54610a7d9063ffffffff1681565b60405163ffffffff90911681526020016103de565b348015610a9e57600080fd5b506103d461271081565b348015610ab457600080fd5b506010546104a39060ff1681565b348015610ace57600080fd5b506103b8611fb9565b348015610ae357600080fd5b506103b8610af2366004613aac565b61208d565b348015610b0357600080fd5b506103d4610b12366004613b23565b612264565b348015610b2357600080fd5b506103d460135481565b348015610b3957600080fd5b506103b861228f565b348015610b4e57600080fd5b506103b8610b5d366004613b5c565b6122c5565b348015610b6e57600080fd5b506103b8610b7d3660046137e9565b612656565b6000806000610b8f610f5b565b915091506000610bb78686610ba45783610ba6565b845b87610bb15785610dcf565b84610dcf565b50509050601481610bc89190613c08565b610bd29082613c1c565b9695505050505050565b6060610be66126a7565b81804210610c07576040516338e5e54b60e21b815260040160405180910390fd5b600080610c12610f5b565b90925090503433610c238285613c1c565b93506000806000610c36858c89896126d1565b9250925092508060146000828254610c4e91906136a0565b90915550610c5f90508260016127ab565b610c698484612913565b610c743085856129e0565b610c7c612a3f565b60408051600280825260608201835290916020830190803683370190505098508489600081518110610cb057610cb0613c2f565b6020026020010181815250508289600181518110610cd057610cd0613c2f565b6020908102919091018101919091526040805160008082529281018890529081018590526060810182905260808101919091526001600160a01b0385169060008051602061508b8339815191529060a00160405180910390a25050505050505050610d3b6001600755565b92915050565b60098054610d4e90613c45565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a90613c45565b8015610dc75780601f10610d9c57610100808354040283529160200191610dc7565b820191906000526020600020905b815481529060010190602001808311610daa57829003601f168201915b505050505081565b60008060008061271090506000601354601e610deb91906136a0565b610df790612710613c1c565b90506000610e05838a613c7f565b9050600088118015610e175750600087115b15610ea45782610e2682612bb9565b610e309190613c08565b945082610e3c82612c71565b610e469190613c08565b93506000610e548383613c7f565b90506000610e628983613c7f565b905060008286610e746127108e613c7f565b610e7e9190613c7f565b610e8891906136a0565b9050808281610e9957610e99613bf2565b049850505050610ebd565b604051633dce448b60e11b815260040160405180910390fd5b50505093509350939050565b606060038054610ed890613c45565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0490613c45565b8015610f515780601f10610f2657610100808354040283529160200191610f51565b820191906000526020600020905b815481529060010190602001808311610f3457829003601f168201915b5050505050905090565b60008060004790506000601154601454610f7591906136a0565b90506000610f81611162565b90506000601254601554610f9591906136a0565b905082841015610fa6576000610fb0565b610fb08385613c1c565b955080821015610fc1576000610fcb565b610fcb8183613c1c565b9450505050509091565b600033610fe3818585612c96565b5060019392505050565b6017546001600160a01b0316336001600160a01b03161461102d57335b60405163472511eb60e11b81526004016110249190613860565b60405180910390fd5b6101f481111561105057604051630adad23360e31b815260040160405180910390fd5b601355565b60006110618383612ca3565b1561106e57506001611086565b6110788383612913565b611083848484612cec565b90505b9392505050565b6017546001600160a01b0316336001600160a01b0316146110ae573361100a565b6001600160a01b0381166110d55760405163e6c4247b60e01b815260040160405180910390fd5b6018546001600160a01b0316156110fe5760405162dc149f60e41b815260040160405180910390fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6018546001600160a01b0316331461114d573360405163472511eb60e11b81526004016110249190613860565b6018805460ff60a01b1916600160a01b179055565b600061116d30611442565b905090565b61117c3382612d10565b50565b60606111896126a7565b818042106111aa576040516338e5e54b60e21b815260040160405180910390fd5b6000806111b5610f5b565b9150915060006111c23390565b905060008060006111d58b8b87896126d1565b92509250925080601560008282546111ed91906136a0565b909155506111fe90508260006127ab565b61120984308d612d46565b6112138484612d51565b61121b612a3f565b60408051600280825260608201835290916020830190803683370190505097508a8860008151811061124f5761124f613c2f565b602002602001018181525050828860018151811061126f5761126f613c2f565b602090810291909101810191909152604080518d815260009281018390529081018290526060810185905260808101919091526001600160a01b0385169060008051602061508b8339815191529060a00160405180910390a2505050505050506110866001600755565b6017546001600160a01b0316336001600160a01b0316146112fa573361100a565b6113048282612e03565b6040516113109061367d565b604051809103906000f08015801561132c573d6000803e3d6000fd5b50600a80546001600160a01b0319166001600160a01b03929092169182179055604051634cd88b7690611363908590602001613c96565b60408051601f19818403018152828201825260038352620424c560ec1b602084015290516001600160e01b031960e085901b1681526113a59290600401613cc3565b600060405180830381600087803b1580156113bf57600080fd5b505af11580156113d3573d6000803e3d6000fd5b505050505050565b600e54600160201b90046001600160a01b03161561140b5760405162dc149f60e41b815260040160405180910390fd5b600e8054640100000000600160c01b031916600160201b6001600160a01b038481168202929092179283905561117c920416612f40565b6001600160a01b031660009081526020819052604090205490565b6017546001600160a01b0316336001600160a01b03161461147e573361100a565b6114886000612f40565b565b6017546001600160a01b0316336001600160a01b0316146114ab573361100a565b60096114b78282613d37565b5050565b6017546001600160a01b0316336001600160a01b0316146114dc573361100a565b8015801561151857506001600160a01b038216158061150357506001600160a01b03821630145b8061151857506001600160a01b03821661dead145b156115365760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b61156c823383612f92565b6114b78282612d10565b6017546001600160a01b0316336001600160a01b031614611597573361100a565b6127108111156115ba576040516326dd075560e01b815260040160405180910390fd5b60105460ff1680156115ca575080155b156115e8576040516326dd075560e01b815260040160405180910390fd5b600f55565b60135460009061271090829061160490601e6136a0565b61161090612710613c1c565b905061161c8282613c7f565b905060008411801561162e5750600085115b15610ea4576000826127106116438989613c7f565b61164d9190613c7f565b6116579190613c7f565b90506000826116668988613c1c565b6116709190613c7f565b905080828161168157611681613bf2565b046001019450505050509392505050565b6017546001600160a01b0316336001600160a01b0316146116b3573361100a565b846000036116d457604051635e85ae7360e01b815260040160405180910390fd5b60006116df60025490565b11156116fe57604051630a87463f60e21b815260040160405180910390fd5b6001600160a01b038416611725576040516349e27cff60e01b815260040160405180910390fd5b8115611741576010805460ff1916600117905561174182611576565b600961174d8282613d37565b5061175783610fed565b61176084612f40565b601680546001600160a01b0319166001600160a01b0386161790556117858486612ff2565b5050505050565b606060048054610ed890613c45565b60006117a56126a7565b818042106117c6576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff161580156117f057506017546001600160a01b03828116911614155b1561180e5760405163aae677e160e01b815260040160405180910390fd5b851580611819575034155b1561183757604051635e85ae7360e01b815260040160405180910390fd5b600080611842610f5b565b90925090506118513483613c1c565b91506000600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cc9190613df7565b90503489600083900361197e5760006118ed6118e88385613c7f565b613028565b90506118fb6103e882613c1c565b600a546040516340c10f1960e01b8152919a506001600160a01b0316906340c10f19906119329061dead906103e890600401613e10565b600060405180830381600087803b15801561194c57600080fd5b505af1158015611960573d6000803e3d6000fd5b5050600a805460ff60a01b1916600160a01b17905550611a7a915050565b841580611989575083155b156119a757604051633dce448b60e11b815260040160405180910390fd5b846119b28584613c7f565b6119bc9190613c08565b905060006119ca8686613110565b9050818c10156119f757604051633885308960e21b8152600481018d905260248101839052604401611024565b611a2986611a058686613c7f565b611a0f9190613c08565b86611a1a8786613c7f565b611a249190613c08565b61311c565b98506000611a3784886136a0565b90506000611a4584886136a0565b90506000611a538383613c7f565b905083811015611a755760405162bfbd3d60e31b815260040160405180910390fd5b505050505b87600003611a9b57604051633489be7560e21b815260040160405180910390fd5b600a546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611acd908d908c90600401613e10565b600060405180830381600087803b158015611ae757600080fd5b505af1158015611afb573d6000803e3d6000fd5b50505050611b0a863083612d46565b611b12612a3f565b604080518981523460208201529081018290526001600160a01b03808c1691908816907f2f3289d16dbc3007471d28c4936df3a95222bc938112449400d049637e3309ce9060600160405180910390a3505050505050506110866001600755565b60008082600003611b9757604051635e85ae7360e01b815260040160405180910390fd5b600080611ba2610f5b565b915091508160001480611bb3575080155b15611bd157604051633dce448b60e11b815260040160405180910390fd5b600a54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3f9190613df7565b905080600003611c625760405163bb55fd2760e01b815260040160405180910390fd5b80611c6d8488613c7f565b611c779190613c08565b945080611c848388613c7f565b611c8e9190613c08565b9350841580611c9b575083155b15611cb95760405163bb55fd2760e01b815260040160405180910390fd5b505050915091565b6017546001600160a01b0316336001600160a01b031614611ce2573361100a565b6001600160a01b038116611d095760405163e6c4247b60e01b815260040160405180910390fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316336001600160a01b031614611d4c573361100a565b808015611d595750600f54155b15611d77576040516326dd075560e01b815260040160405180910390fd5b6010805460ff1916911515919091179055565b6000611d968383612ca3565b15611da357506001610d3b565b611dad8383612913565b6110868383613132565b600080611dc26126a7565b82804210611de3576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff16611e0f5760405163aae677e160e01b815260040160405180910390fd5b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611e40908590600401613860565b602060405180830381865afa158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190613df7565b905080600003611ea457604051635a5ec44f60e01b815260040160405180910390fd5b80881115611ec55760405163bb55fd2760e01b815260040160405180910390fd5b611ece88611b73565b600a5460405163079cc67960e41b81529297509095506001600160a01b0316906379cc679090611f049085908c90600401613e10565b600060405180830381600087803b158015611f1e57600080fd5b505af1158015611f32573d6000803e3d6000fd5b50505050611f408786612d51565b611f4b3088866129e0565b60408051898152602081018790529081018590526001600160a01b0380891691908416907feb755d537a0caac69ccb1ac1dc2b7397a32bb19f93bd06013c57ac0b2e5dd69c9060600160405180910390a3611fa4612a3f565b505050611fb16001600755565b935093915050565b6016546001600160a01b0316336001600160a01b031614611fda573361100a565b6014546015543382158015611fed575081155b1561200b5760405163211b631760e21b815260040160405180910390fd5b6000601455612018611162565b82111561202a57612027611162565b91505b60006015556120398184612d51565b6120443082846129e0565b60408051848152602081018490526001600160a01b038316917f2e4fb6077d4acf86e12bb7411fb82b2b3eaa6a49787f4b1e17b423e7ea841169910160405180910390a2505050565b428410156120b15760405163313c898160e11b815260048101859052602401611024565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761210483613e29565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161217d92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156121e8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158061221d5750886001600160a01b0316816001600160a01b031614155b1561224e576040516325c0072360e11b81526001600160a01b0380831660048301528a166024820152604401611024565b612259898989612c96565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6017546001600160a01b0316336001600160a01b0316146122b0573361100a565b600a805460ff60a81b1916600160a81b179055565b6122cd6126a7565b6122d5613140565b600a54600160a01b900460ff166122ff5760405163aae677e160e01b815260040160405180910390fd5b600a54600160a81b900460ff1661232957604051637e99d8bb60e01b815260040160405180910390fd5b83158015612335575082155b1561235357604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b038516158061237157506001600160a01b03851630145b1561238f57604051634e46966960e11b815260040160405180910390fd5b60008061239a610f5b565b91509150818611806123ab57508085115b156123c95760405163bb55fd2760e01b815260040160405180910390fd5b3386156123da576123da8888612d51565b85156123f5576123ea8887612913565b6123f53089886129e0565b60405163f3438c1760e01b81526001600160a01b0389169063f3438c17906124299084908b908b908b908b90600401613e42565b600060405180830381600087803b15801561244357600080fd5b505af1158015612457573d6000803e3d6000fd5b50505050600080612466610f5b565b91509150600085831161247a576000612484565b6124848684613c1c565b905060008583116124965760006124a0565b6124a08684613c1c565b9050811580156124ae575080155b156124cc5760405163e2ddc74960e01b815260040160405180910390fd5b6000601354601e6124dd91906136a0565b905060006124eb8285613c7f565b6124f761271088613c7f565b6125019190613c1c565b9050600061250f8385613c7f565b61251b61271088613c7f565b6125259190613c1c565b90506125346002612710613f72565b61253e8a8c613c7f565b6125489190613c7f565b6125528284613c7f565b10156125705760405162bfbd3d60e31b815260040160405180910390fd5b50505061257c82612c71565b6014600082825461258d91906136a0565b9091555061259c905081612c71565b601560008282546125ad91906136a0565b909155506125c690506125bf83612bb9565b60016127ab565b6125d96125d282612bb9565b60006127ab565b6125e1612a3f565b60408051828152602081018490529081018b9052606081018c9052600160808201526001600160a01b0386169060008051602061508b8339815191529060a00160405180910390a25050505050505061264c336000908152600860205260409020805460ff19169055565b6117856001600755565b6017546001600160a01b0316336001600160a01b031614612677573361100a565b6001600160a01b03811661269e576040516349e27cff60e01b815260040160405180910390fd5b61117c81612f40565b6002600754036126ca57604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b60008060006126e187868661318d565b60006126ed8686613110565b90506126fa888787610dcf565b9195509350915060008490036127235760405163271a700960e01b815260040160405180910390fd5b868410156127445760405163339454fb60e11b815260040160405180910390fd5b600083612751848b613c1c565b61275b9190613c1c565b61276590886136a0565b905060006127738688613c1c565b9050826127808383613110565b101561279e5760405162bfbd3d60e31b815260040160405180910390fd5b5050509450945094915050565b600e54600160201b90046001600160a01b0316156114b7576000600e60049054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283c9190613f81565b90506000600e60049054906101000a90046001600160a01b03166001600160a01b031663ef973d476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b79190613df7565b90506001600160a01b0382161561290d5782156128eb5783601160008282546128e091906136a0565b909155506129039050565b83601260008282546128fd91906136a0565b90915550505b61290d828261322b565b50505050565b60105460ff16612921575050565b6001600160a01b03821630148061293f57506001600160a01b038216155b8061295457506001600160a01b03821661dead145b8061297757506001600160a01b0382166000908152600b602052604090205460ff165b15612980575050565b6000612710600f5461299160025490565b61299b9190613c7f565b6129a59190613c08565b905080826129b285611442565b6129bc91906136a0565b11156129db5760405163a9a44dff60e01b815260040160405180910390fd5b505050565b6001600160a01b038316612a0a576000604051634b637e8f60e11b81526004016110249190613860565b6001600160a01b038216612a3457600060405163ec442f0560e01b81526004016110249190613860565b6129db838383613345565b600080612a4a610f5b565b915091508160001480612a5b575080155b15612a7957604051633dce448b60e11b815260040160405180910390fd5b6000612a89600160201b42613f9e565b600e54909150600090612aa29063ffffffff1683613fb2565b905060008163ffffffff16118015612ab957508315155b8015612ac457508215155b15612b6657600160701b600084612adb8388613c7f565b612ae59190613c08565b9050600086612af48488613c7f565b612afe9190613c08565b9050612b1063ffffffff851683613c7f565b600c6000828254612b2191906136a0565b90915550612b37905063ffffffff851682613c7f565b600d6000828254612b4891906136a0565b9091555050600e805463ffffffff191663ffffffff87161790555050505b600c54600d54600e5460408051938452602084019290925263ffffffff1682820152517f1d0b407d784b19534f95cb221efeda97b16fcb4171eb57280723bad5ccfce40d9181900360600190a150505050565b600e54600090600160201b90046001600160a01b0316612bdb57506000919050565b612710600e60049054906101000a90046001600160a01b03166001600160a01b031663978bbdb96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c559190613df7565b612c5f9084613c7f565b612c699190613c08565b90505b919050565b6000601354600003612c8557506000919050565b61271060135483612c5f9190613c7f565b6129db83838360016133ea565b60006001600160a01b03831630148015612ccd57503360009081526008602052604090205460ff16155b15610d3b57610fe382612ce1846000610b82565b6107104260b46136a0565b600033612cfa858285612f92565b612d058585856129e0565b506001949350505050565b6001600160a01b038216612d3a576000604051634b637e8f60e11b81526004016110249190613860565b6114b782600083613345565b6129db8383836129e0565b80600003612d5d575050565b6001600160a01b038216612d845760405163e6c4247b60e01b815260040160405180910390fd5b47811115612d8f5750475b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ddc576040519150601f19603f3d011682016040523d82523d6000602084013e612de1565b606091505b50509050806129db57604051634173d3a560e11b815260040160405180910390fd5b81511580612e1057508051155b15612e2e576040516379db2df160e11b815260040160405180910390fd5b60038054612e3b90613c45565b1515905080612e57575060048054612e5290613c45565b151590505b15612e7557604051634a8cdeb560e01b815260040160405180910390fd5b6003612e818382613d37565b506004612e8e8282613d37565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6003604051612ebf9190613fd6565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612f9e8484612264565b9050600019811461290d5781811015612fe357604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611024565b61290d848484840360006133ea565b6001600160a01b03821661301c57600060405163ec442f0560e01b81526004016110249190613860565b6114b760008383613345565b60008160000361303a57506000919050565b60006001613047846134bf565b901c6001901b9050600181848161306057613060613bf2565b048201901c9050600181848161307857613078613bf2565b048201901c9050600181848161309057613090613bf2565b048201901c905060018184816130a8576130a8613bf2565b048201901c905060018184816130c0576130c0613bf2565b048201901c905060018184816130d8576130d8613bf2565b048201901c905060018184816130f0576130f0613bf2565b048201901c90506110868182858161310a5761310a613bf2565b0461311c565b60006110868284613c7f565b600081831061312b5781611086565b5090919050565b600033610fe38185856129e0565b3360009081526008602052604090205460ff161561317157604051631584469560e11b815260040160405180910390fd5b336000908152600860205260409020805460ff19166001179055565b600a54600160a01b900460ff166131b75760405163aae677e160e01b815260040160405180910390fd5b600a54600160a81b900460ff166131e157604051637e99d8bb60e01b815260040160405180910390fd5b8260000361320257604051635e85ae7360e01b815260040160405180910390fd5b81158061320d575080155b156129db57604051633dce448b60e11b815260040160405180910390fd5b60115460125460008083158015613240575082155b1561324d57505050505050565b60008411801561325d5750848410155b1561326c576000601155600191505b82156132ca5760008061327d610f5b565b909250905060008161328f8488613c7f565b6132999190613c08565b90508781106132c6576132aa611162565b8611156132bc576132b9611162565b95505b6000601255600193505b5050505b81156132da576132da8685612d51565b80156132eb576132eb3087856129e0565b81806132f45750805b156113d35760408051858152602081018590526001600160a01b038816917f85da6ab72d2b48932522aea80adb8ca4fab6cdeb87bc2e7f6c03fd78d3b2100e910160405180910390a2505050505050565b613350838383613553565b601854600160a01b900460ff166129db576018546001600160a01b0384811691161480159061338757506001600160a01b03831615155b80156133a157506018546001600160a01b03838116911614155b80156133b857506001600160a01b03821661dead14155b80156133cc57506001600160a01b03821615155b156129db5760405163188acae760e11b815260040160405180910390fd5b6001600160a01b03841661341457600060405163e602df0560e01b81526004016110249190613860565b6001600160a01b03831661343e576000604051634a1406b160e11b81526004016110249190613860565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561290d57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516134b191815260200190565b60405180910390a350505050565b600080608083901c156134d457608092831c92015b604083901c156134e657604092831c92015b602083901c156134f857602092831c92015b601083901c1561350a57601092831c92015b600883901c1561351c57600892831c92015b600483901c1561352e57600492831c92015b600283901c1561354057600292831c92015b600183901c15610d3b5760010192915050565b6001600160a01b03831661357e57806002600082825461357391906136a0565b909155506135f09050565b6001600160a01b038316600090815260208190526040902054818110156135d15760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401611024565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661360c5760028054829003905561362b565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161367091815260200190565b60405180910390a3505050565b61103e8061404d83390190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610d3b57610d3b61368a565b60005b838110156136ce5781810151838201526020016136b6565b50506000910152565b600081518084526136ef8160208601602086016136b3565b601f01601f19169290920160200192915050565b60208152600061108660208301846136d7565b60008060006060848603121561372b57600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038116811461117c57600080fd5b6000806040838503121561376a57600080fd5b823561377581613742565b946020939093013593505050565b6000806040838503121561379657600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156137dd578351835292840192918401916001016137c1565b50909695505050505050565b6000602082840312156137fb57600080fd5b813561108681613742565b60006020828403121561381857600080fd5b5035919050565b60008060006060848603121561383457600080fd5b833561383f81613742565b9250602084013561384f81613742565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261389b57600080fd5b813567ffffffffffffffff808211156138b6576138b6613874565b604051601f8301601f19908116603f011681019082821181831017156138de576138de613874565b816040528381528660208588010111156138f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561392a57600080fd5b823567ffffffffffffffff8082111561394257600080fd5b61394e8683870161388a565b9350602085013591508082111561396457600080fd5b506139718582860161388a565b9150509250929050565b60006020828403121561398d57600080fd5b813567ffffffffffffffff8111156139a457600080fd5b6139b08482850161388a565b949350505050565b80358015158114612c6c57600080fd5b600080604083850312156139db57600080fd5b82356139e681613742565b91506139f4602084016139b8565b90509250929050565b600080600080600060a08688031215613a1557600080fd5b853594506020860135613a2781613742565b93506040860135925060608601359150608086013567ffffffffffffffff811115613a5157600080fd5b613a5d8882890161388a565b9150509295509295909350565b600080600060608486031215613a7f57600080fd5b83359250602084013561384f81613742565b600060208284031215613aa357600080fd5b611086826139b8565b600080600080600080600060e0888a031215613ac757600080fd5b8735613ad281613742565b96506020880135613ae281613742565b95506040880135945060608801359350608088013560ff81168114613b0657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613b3657600080fd5b8235613b4181613742565b91506020830135613b5181613742565b809150509250929050565b600080600080600060808688031215613b7457600080fd5b8535613b7f81613742565b94506020860135935060408601359250606086013567ffffffffffffffff80821115613baa57600080fd5b818801915088601f830112613bbe57600080fd5b813581811115613bcd57600080fd5b896020828501011115613bdf57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052601260045260246000fd5b600082613c1757613c17613bf2565b500490565b81810381811115610d3b57610d3b61368a565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613c5957607f821691505b602082108103613c7957634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610d3b57610d3b61368a565b60008251613ca88184602087016136b3565b68102628102a37b5b2b760b91b920191825250600901919050565b604081526000613cd660408301856136d7565b8281036020840152613ce881856136d7565b95945050505050565b601f8211156129db57600081815260208120601f850160051c81016020861015613d185750805b601f850160051c820191505b818110156113d357828155600101613d24565b815167ffffffffffffffff811115613d5157613d51613874565b613d6581613d5f8454613c45565b84613cf1565b602080601f831160018114613d9a5760008415613d825750858301515b600019600386901b1c1916600185901b1785556113d3565b600085815260208120601f198616915b82811015613dc957888601518255948401946001909101908401613daa565b5085821015613de75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215613e0957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060018201613e3b57613e3b61368a565b5060010190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b600181815b80851115613ec9578160001904821115613eaf57613eaf61368a565b80851615613ebc57918102915b93841c9390800290613e93565b509250929050565b600082613ee057506001610d3b565b81613eed57506000610d3b565b8160018114613f035760028114613f0d57613f29565b6001915050610d3b565b60ff841115613f1e57613f1e61368a565b50506001821b610d3b565b5060208310610133831016604e8410600b8410161715613f4c575081810a610d3b565b613f568383613e8e565b8060001904821115613f6a57613f6a61368a565b029392505050565b600061108660ff841683613ed1565b600060208284031215613f9357600080fd5b815161108681613742565b600082613fad57613fad613bf2565b500690565b63ffffffff828116828216039080821115613fcf57613fcf61368a565b5092915050565b6000808354613fe481613c45565b60018281168015613ffc576001811461401157614040565b60ff1984168752821515830287019450614040565b8760005260208060002060005b858110156140375781548a82015290840190820161401e565b50505082870194505b5092969550505050505056fe60a060405234801561001057600080fd5b5033608081905261100161003d600039600081816101ed0152818161039f015261040f01526110016000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80634837e204116100a25780637ecebe00116100715780637ecebe001461026b57806395d89b411461028b578063a9059cbb14610293578063d505accf146102a6578063dd62ed3e146102b957600080fd5b80634837e204146101e85780634cd88b761461021c57806370a082311461022f57806379cc67901461025857600080fd5b806330adf81f116100e957806330adf81f14610181578063313ce567146101a85780633644e515146101b757806340c10f19146101c057806342966c68146101d557600080fd5b806306fdde031461011b578063095ea7b31461013957806318160ddd1461015c57806323b872dd1461016e575b600080fd5b6101236102cc565b6040516101309190610aff565b60405180910390f35b61014c610147366004610b69565b61035e565b6040519015158152602001610130565b6002545b604051908152602001610130565b61014c61017c366004610b93565b610378565b6101607f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160128152602001610130565b61016060055481565b6101d36101ce366004610b69565b61039c565b005b6101d36101e3366004610bcf565b6103ff565b61020f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101309190610be8565b6101d361022a366004610c9f565b61040c565b61016061023d366004610d03565b6001600160a01b031660009081526020819052604090205490565b6101d3610266366004610b69565b61044c565b610160610279366004610d03565b60066020526000908152604090205481565b610123610461565b61014c6102a1366004610b69565b610470565b6101d36102b4366004610d25565b61047e565b6101606102c7366004610d98565b610655565b6060600380546102db90610dcb565b80601f016020809104026020016040519081016040528092919081815260200182805461030790610dcb565b80156103545780601f1061032957610100808354040283529160200191610354565b820191906000526020600020905b81548152906001019060200180831161033757829003601f168201915b5050505050905090565b60003361036c818585610680565b60019150505b92915050565b600033610386858285610692565b6103918585856106f8565b506001949350505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146103f157335b60405163472511eb60e11b81526004016103e89190610be8565b60405180910390fd5b6103fb8282610757565b5050565b610409338261078d565b50565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461044257336103ce565b6103fb82826107c3565b610457823383610692565b6103fb828261078d565b6060600480546102db90610dcb565b60003361036c8185856106f8565b428410156104a25760405163313c898160e11b8152600481018590526024016103e8565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876104f583610e1b565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161056e92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156105d9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158061060e5750886001600160a01b0316816001600160a01b031614155b1561063f576040516325c0072360e11b81526001600160a01b0380831660048301528a1660248201526044016103e8565b61064a898989610680565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61068d8383836001610900565b505050565b600061069e8484610655565b905060001981146106f257818110156106e357604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016103e8565b6106f284848484036000610900565b50505050565b6001600160a01b038316610722576000604051634b637e8f60e11b81526004016103e89190610be8565b6001600160a01b03821661074c57600060405163ec442f0560e01b81526004016103e89190610be8565b61068d8383836109d5565b6001600160a01b03821661078157600060405163ec442f0560e01b81526004016103e89190610be8565b6103fb600083836109d5565b6001600160a01b0382166107b7576000604051634b637e8f60e11b81526004016103e89190610be8565b6103fb826000836109d5565b815115806107d057508051155b156107ee576040516379db2df160e11b815260040160405180910390fd5b600380546107fb90610dcb565b151590508061081757506004805461081290610dcb565b151590505b1561083557604051634a8cdeb560e01b815260040160405180910390fd5b60036108418382610e82565b50600461084e8282610e82565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405161087f9190610f42565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b6001600160a01b03841661092a57600060405163e602df0560e01b81526004016103e89190610be8565b6001600160a01b038316610954576000604051634a1406b160e11b81526004016103e89190610be8565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156106f257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109c791815260200190565b60405180910390a350505050565b6001600160a01b038316610a005780600260008282546109f59190610fb8565b90915550610a729050565b6001600160a01b03831660009081526020819052604090205481811015610a535760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016103e8565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610a8e57600280548290039055610aad565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610af291815260200190565b60405180910390a3505050565b600060208083528351808285015260005b81811015610b2c57858101830151858201604001528201610b10565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b6457600080fd5b919050565b60008060408385031215610b7c57600080fd5b610b8583610b4d565b946020939093013593505050565b600080600060608486031215610ba857600080fd5b610bb184610b4d565b9250610bbf60208501610b4d565b9150604084013590509250925092565b600060208284031215610be157600080fd5b5035919050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610c2357600080fd5b813567ffffffffffffffff80821115610c3e57610c3e610bfc565b604051601f8301601f19908116603f01168101908282118183101715610c6657610c66610bfc565b81604052838152866020858801011115610c7f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610cb257600080fd5b823567ffffffffffffffff80821115610cca57600080fd5b610cd686838701610c12565b93506020850135915080821115610cec57600080fd5b50610cf985828601610c12565b9150509250929050565b600060208284031215610d1557600080fd5b610d1e82610b4d565b9392505050565b600080600080600080600060e0888a031215610d4057600080fd5b610d4988610b4d565b9650610d5760208901610b4d565b95506040880135945060608801359350608088013560ff81168114610d7b57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610dab57600080fd5b610db483610b4d565b9150610dc260208401610b4d565b90509250929050565b600181811c90821680610ddf57607f821691505b602082108103610dff57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060018201610e2d57610e2d610e05565b5060010190565b601f82111561068d57600081815260208120601f850160051c81016020861015610e5b5750805b601f850160051c820191505b81811015610e7a57828155600101610e67565b505050505050565b815167ffffffffffffffff811115610e9c57610e9c610bfc565b610eb081610eaa8454610dcb565b84610e34565b602080601f831160018114610ee55760008415610ecd5750858301515b600019600386901b1c1916600185901b178555610e7a565b600085815260208120601f198616915b82811015610f1457888601518255948401946001909101908401610ef5565b5085821015610f325787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354610f5081610dcb565b60018281168015610f685760018114610f7d57610fac565b60ff1984168752821515830287019450610fac565b8760005260208060002060005b85811015610fa35781548a820152908401908201610f8a565b50505082870194505b50929695505050505050565b8082018082111561037257610372610e0556fea2646970667358221220ade3b1eb5ec4f757871c03ac2e9df92f938c8ced574713ab8e3bf22bdbff0cf064736f6c63430008140033d44b536c8222cd875ef4b7f421435c474a3e1035e29c64e5f039af6944de4beaa26469706673582212208f8a08a3fab852dbc6acaa0e50107c9c29e70e4ea889fffb4776cefd03ed3df264736f6c63430008140033