Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
Multicall
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "contracts/interfaces/ITOKEN.sol"; import "contracts/interfaces/IVTOKEN.sol"; import "contracts/interfaces/IVTOKENRewarder.sol"; import "contracts/interfaces/IMinter.sol"; import "contracts/interfaces/IGauge.sol"; import "contracts/interfaces/IBribe.sol"; import "contracts/interfaces/IVoter.sol"; import "contracts/interfaces/IPlugin.sol"; interface IChainlinkOracle { function latestAnswer() external view returns (uint256); } interface IPythOracle { struct Price { int64 price; uint64 conf; int32 expo; uint256 publishTime; } function getPriceUnsafe(bytes32 id) external view returns (Price memory price); } contract Multicall { /*===================================================================*/ /*=========================== SETTINGS ============================*/ address public constant ORACLE = 0x2880aB155794e7179c9eE2e38200202908C17B43; bytes32 public constant FEED_ID = 0xb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc; /*=========================== END SETTINGS ========================*/ /*===================================================================*/ /*---------- CONSTANTS --------------------------------------------*/ uint256 public constant DIVISOR = 10000; uint256 public constant PRECISION = 1e18; /*---------- STATE VARIABLES --------------------------------------*/ address public immutable voter; address public immutable BASE; address public immutable TOKEN; address public immutable OTOKEN; address public immutable VTOKEN; address public immutable rewarder; uint256 public immutable FEE; struct SwapCard { uint256 frBASE; uint256 mrvBASE; uint256 mrrBASE; uint256 mrrTOKEN; uint256 marketMaxTOKEN; } struct BondingCurve { uint256 priceBASE; // C1 uint256 priceTOKEN; // C2 uint256 priceOTOKEN; // C3 uint256 maxMarketSell; // C4 uint256 tvl; // C5 uint256 supplyTOKEN; // C6 uint256 supplyVTOKEN; // C7 uint256 apr; // C8 uint256 ltv; // C9 uint256 marketCap; // C10 uint256 weekly; // C11 uint256 accountBASE; // C12 uint256 accountTOKEN; // C13 uint256 accountOTOKEN; // C14 uint256 accountEarnedBASE; // C15 uint256 accountEarnedTOKEN; // C16 uint256 accountEarnedOTOKEN; // C17 uint256 accountVTOKEN; // C18 uint256 accountVotingPower; // C19 uint256 accountUsedWeights; // C20 uint256 accountBorrowCredit; // C21 uint256 accountBorrowDebt; // C22 uint256 accountMaxWithdraw; // C23 uint256 accountLastVoted; // C24 } struct GaugeCard { address plugin; // G1 address underlying; // G2 uint8 underlyingDecimals; // G3 address gauge; // G4 bool isAlive; // G5 string protocol; // G6 string symbol; // G7 address[] tokensInUnderlying; // G8 uint256 priceBase; // G9 uint256 priceOTOKEN; // G10 uint256 rewardPerToken; // G11 uint256 rewardPerTokenUSD; // G12 uint256 votingWeight; // G13 uint256 totalSupply; // G14 uint256 accountUnderlyingBalance; // G15 uint256 accountStakedBalance; // G16 uint256 accountEarnedOTOKEN; // G17 } struct BribeCard { address plugin; // B1 address bribe; // B2 bool isAlive; // B3 string protocol; // B4 string symbol; // B5 address[] rewardTokens; // B6 uint8[] rewardTokenDecimals; // B7 uint256[] rewardsPerToken; // B8 uint256[] accountRewardsEarned; // B9 uint256 voteWeight; // B10 uint256 votePercent; // B11 uint256 accountVote; // B12 } struct Portfolio { uint256 total; uint256 stakingRewards; uint256 farmingRewards; } /*---------- FUNCTIONS --------------------------------------------*/ constructor( address _voter, address _BASE, address _TOKEN, address _OTOKEN, address _VTOKEN, address _rewarder ) { voter = _voter; BASE = _BASE; TOKEN = _TOKEN; OTOKEN = _OTOKEN; VTOKEN = _VTOKEN; rewarder = _rewarder; FEE = ITOKEN(TOKEN).PROTOCOL_FEE(); } /*---------- VIEW FUNCTIONS ---------------------------------------*/ function getBasePrice() public view returns (uint256) { if (ORACLE == address(0)) { return 1e18; } else if (FEED_ID == 0x0) { return IChainlinkOracle(ORACLE).latestAnswer() * 1e18 / 1e8; } else { int64 price = IPythOracle(ORACLE).getPriceUnsafe(FEED_ID).price; return uint256(int256(price)) * 1e18 / 1e8; } } function swapCardData() external view returns (SwapCard memory swapCard) { swapCard.frBASE = ITOKEN(TOKEN).frBASE(); swapCard.mrvBASE = ITOKEN(TOKEN).mrvBASE(); swapCard.mrrBASE = ITOKEN(TOKEN).mrrBASE(); swapCard.mrrTOKEN = ITOKEN(TOKEN).mrrTOKEN(); swapCard.marketMaxTOKEN = ITOKEN(TOKEN).mrvBASE(); return swapCard; } function bondingCurveData(address account) external view returns (BondingCurve memory bondingCurve) { bondingCurve.priceBASE = getBasePrice(); bondingCurve.priceTOKEN = ITOKEN(TOKEN).getMarketPrice() * bondingCurve.priceBASE / 1e18; bondingCurve.priceOTOKEN = ITOKEN(TOKEN).getOTokenPrice() * bondingCurve.priceBASE / 1e18; bondingCurve.maxMarketSell = ITOKEN(TOKEN).getMaxSell(); bondingCurve.tvl = ITOKEN(TOKEN).getTotalValueLocked() * bondingCurve.priceBASE / 1e18; bondingCurve.supplyTOKEN = IERC20(TOKEN).totalSupply(); bondingCurve.supplyVTOKEN = IVTOKEN(VTOKEN).totalSupplyTOKEN(); bondingCurve.apr = bondingCurve.supplyVTOKEN == 0 ? 0 : (((IVTOKENRewarder(rewarder).getRewardForDuration(BASE) * bondingCurve.priceBASE / 1e18) + (IVTOKENRewarder(rewarder).getRewardForDuration(TOKEN) * bondingCurve.priceTOKEN / 1e18) + (IVTOKENRewarder(rewarder).getRewardForDuration(OTOKEN) * bondingCurve.priceOTOKEN / 1e18)) * 365 * 100 * 1e18 / (7 * IERC20(VTOKEN).totalSupply() * bondingCurve.priceTOKEN / 1e18)); bondingCurve.ltv = 100 * ITOKEN(TOKEN).getFloorPrice() * 1e18 / ITOKEN(TOKEN).getMarketPrice(); bondingCurve.marketCap = bondingCurve.supplyTOKEN * bondingCurve.priceTOKEN / 1e18; bondingCurve.weekly = IMinter(IVoter(voter).minter()).weekly(); bondingCurve.accountBASE = (account == address(0) ? 0 : IERC20(BASE).balanceOf(account)); bondingCurve.accountTOKEN = (account == address(0) ? 0 : IERC20(TOKEN).balanceOf(account)); bondingCurve.accountOTOKEN = (account == address(0) ? 0 : IERC20(OTOKEN).balanceOf(account)); bondingCurve.accountEarnedBASE = (account == address(0) ? 0 : IVTOKENRewarder(rewarder).earned(account, BASE)); bondingCurve.accountEarnedTOKEN = (account == address(0) ? 0 : IVTOKENRewarder(rewarder).earned(account, TOKEN)); bondingCurve.accountEarnedOTOKEN = (account == address(0) ? 0 : IVTOKENRewarder(rewarder).earned(account, OTOKEN)); bondingCurve.accountVTOKEN = (account == address(0) ? 0 : IVTOKEN(VTOKEN).balanceOfTOKEN(account)); bondingCurve.accountVotingPower = (account == address(0) ? 0 : IERC20(VTOKEN).balanceOf(account)); bondingCurve.accountUsedWeights = (account == address(0) ? 0 : IVoter(voter).usedWeights(account)); bondingCurve.accountBorrowCredit = (account == address(0) ? 0 : ITOKEN(TOKEN).getAccountCredit(account)); bondingCurve.accountBorrowDebt = (account == address(0) ? 0 : ITOKEN(TOKEN).debts(account)); bondingCurve.accountMaxWithdraw = (account == address(0) ? 0 : (IVoter(voter).usedWeights(account) > 0 ? 0 : bondingCurve.accountVTOKEN - bondingCurve.accountBorrowDebt)); bondingCurve.accountLastVoted = (account == address(0) ? 0 : IVoter(voter).lastVoted(account)); return bondingCurve; } function gaugeCardData(address plugin, address account) public view returns (GaugeCard memory gaugeCard) { gaugeCard.plugin = plugin; gaugeCard.underlying = IPlugin(plugin).getUnderlyingAddress(); gaugeCard.underlyingDecimals = IPlugin(plugin).getUnderlyingDecimals(); gaugeCard.gauge = IVoter(voter).gauges(plugin); gaugeCard.isAlive = IVoter(voter).isAlive(gaugeCard.gauge); gaugeCard.protocol = IPlugin(plugin).getProtocol(); gaugeCard.symbol = IPlugin(plugin).getUnderlyingSymbol(); gaugeCard.tokensInUnderlying = IPlugin(plugin).getTokensInUnderlying(); gaugeCard.priceBase = getBasePrice(); gaugeCard.priceOTOKEN = ITOKEN(TOKEN).getOTokenPrice() * (gaugeCard.priceBase) / 1e18; gaugeCard.rewardPerToken = IGauge(gaugeCard.gauge).totalSupply() == 0 ? 0 : (IGauge(IVoter(voter).gauges(plugin)).getRewardForDuration(OTOKEN) * 1e18 / IGauge(gaugeCard.gauge).totalSupply()); gaugeCard.rewardPerTokenUSD = IGauge(gaugeCard.gauge).totalSupply() == 0 ? 0 : (IGauge(IVoter(voter).gauges(plugin)).getRewardForDuration(OTOKEN) * gaugeCard.priceOTOKEN / IGauge(gaugeCard.gauge).totalSupply()); gaugeCard.votingWeight = (IVoter(voter).totalWeight() == 0 ? 0 : 100 * IVoter(voter).weights(plugin) * 1e18 / IVoter(voter).totalWeight()); gaugeCard.totalSupply = IGauge(gaugeCard.gauge).totalSupply(); gaugeCard.accountUnderlyingBalance = (account == address(0) ? 0 : IERC20(gaugeCard.underlying).balanceOf(account)); gaugeCard.accountStakedBalance = (account == address(0) ? 0 : IPlugin(plugin).balanceOf(account)); gaugeCard.accountEarnedOTOKEN = (account == address(0) ? 0 : IGauge(IVoter(voter).gauges(plugin)).earned(account, OTOKEN)); return gaugeCard; } function bribeCardData(address plugin, address account) public view returns (BribeCard memory bribeCard) { bribeCard.plugin = plugin; bribeCard.bribe = IVoter(voter).bribes(plugin); bribeCard.isAlive = IVoter(voter).isAlive(IVoter(voter).gauges(plugin)); bribeCard.protocol = IPlugin(plugin).getProtocol(); bribeCard.symbol = IPlugin(plugin).getUnderlyingSymbol(); bribeCard.rewardTokens = IBribe(IVoter(voter).bribes(plugin)).getRewardTokens(); uint8[] memory _rewardTokenDecimals = new uint8[](bribeCard.rewardTokens.length); for (uint i = 0; i < bribeCard.rewardTokens.length; i++) { _rewardTokenDecimals[i] = IERC20Metadata(bribeCard.rewardTokens[i]).decimals(); } bribeCard.rewardTokenDecimals = _rewardTokenDecimals; uint[] memory _rewardsPerToken = new uint[](bribeCard.rewardTokens.length); for (uint i = 0; i < bribeCard.rewardTokens.length; i++) { _rewardsPerToken[i] = (IBribe(bribeCard.bribe).totalSupply() == 0 ? 0 : IBribe(bribeCard.bribe).getRewardForDuration(bribeCard.rewardTokens[i]) * 1e18 / IBribe(bribeCard.bribe).totalSupply()); } bribeCard.rewardsPerToken = _rewardsPerToken; uint[] memory _accountRewardsEarned = new uint[](bribeCard.rewardTokens.length); for (uint i = 0; i < bribeCard.rewardTokens.length; i++) { _accountRewardsEarned[i] = (account == address(0) ? 0 : IBribe(IVoter(voter).bribes(plugin)).earned(account, bribeCard.rewardTokens[i])); } bribeCard.accountRewardsEarned = _accountRewardsEarned; bribeCard.voteWeight = IVoter(voter).weights(plugin); bribeCard.votePercent = (IVoter(voter).totalWeight() == 0 ? 0 : 100 * IVoter(voter).weights(plugin) * 1e18 / IVoter(voter).totalWeight()); bribeCard.accountVote = (account == address(0) ? 0 : IBribe(bribeCard.bribe).balanceOf(account)); return bribeCard; } function getGaugeCards(uint256 start, uint256 stop, address account) external view returns (GaugeCard[] memory) { GaugeCard[] memory gaugeCards = new GaugeCard[](stop - start); for (uint i = start; i < stop; i++) { gaugeCards[i] = gaugeCardData(getPlugin(i), account); } return gaugeCards; } function getBribeCards(uint256 start, uint256 stop, address account) external view returns (BribeCard[] memory) { BribeCard[] memory bribeCards = new BribeCard[](stop - start); for (uint i = start; i < stop; i++) { bribeCards[i] = bribeCardData(getPlugin(i), account); } return bribeCards; } function getPlugins() external view returns (address[] memory) { return IVoter(voter).getPlugins(); } function getPlugin(uint256 index) public view returns (address) { return IVoter(voter).plugins(index); } function quoteBuyIn(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) { uint256 feeBASE = input * FEE / DIVISOR; uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE(); uint256 newMrBASE = oldMrBASE + input - feeBASE; uint256 oldMrTOKEN = ITOKEN(TOKEN).mrrTOKEN(); output = oldMrTOKEN - (oldMrBASE * oldMrTOKEN / newMrBASE); slippage = 100 * (1e18 - (output * ITOKEN(TOKEN).getMarketPrice() / input)); minOutput = (input * 1e18 / ITOKEN(TOKEN).getMarketPrice()) * slippageTolerance / DIVISOR; autoMinOutput = (input * 1e18 / ITOKEN(TOKEN).getMarketPrice()) * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18); } function quoteBuyOut(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) { uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE(); output = DIVISOR * ((oldMrBASE * ITOKEN(TOKEN).mrrTOKEN() / (ITOKEN(TOKEN).mrrTOKEN() - input)) - oldMrBASE) / (DIVISOR - FEE); slippage = 100 * (1e18 - (input * ITOKEN(TOKEN).getMarketPrice() / output)); minOutput = input * slippageTolerance / DIVISOR; autoMinOutput = input * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18); } function quoteSellIn(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) { uint256 feeTOKEN = input * FEE / DIVISOR; uint256 oldMrTOKEN = ITOKEN(TOKEN).mrrTOKEN(); uint256 newMrTOKEN = oldMrTOKEN + input - feeTOKEN; if (newMrTOKEN > ITOKEN(TOKEN).mrvBASE()) { return (0, 0, 0, 0); } uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE(); output = oldMrBASE - (oldMrBASE * oldMrTOKEN / newMrTOKEN); slippage = 100 * (1e18 - (output * 1e18 / (input * ITOKEN(TOKEN).getMarketPrice() / 1e18))); minOutput = input * ITOKEN(TOKEN).getMarketPrice() /1e18 * slippageTolerance / DIVISOR; autoMinOutput = input * ITOKEN(TOKEN).getMarketPrice() /1e18 * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18); } function quoteSellOut(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) { uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE(); output = DIVISOR * ((oldMrBASE * ITOKEN(TOKEN).mrrTOKEN() / (oldMrBASE - input)) - ITOKEN(TOKEN).mrrTOKEN()) / (DIVISOR - FEE); if (output + ITOKEN(TOKEN).mrrTOKEN() > ITOKEN(TOKEN).mrvBASE()) { return (0, 0, 0, 0); } slippage = 100 * (1e18 - (input * 1e18 / (output * ITOKEN(TOKEN).getMarketPrice() / 1e18))); minOutput = input * slippageTolerance / DIVISOR; autoMinOutput = input * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18); } function portfolioData(address account) external view returns (Portfolio memory portfolio) { uint256 priceBASE = getBasePrice(); portfolio.total = (account == address(0) ? 0 : priceBASE * ((IERC20(BASE).balanceOf(account)) + ((IERC20(TOKEN).balanceOf(account) + IVTOKEN(VTOKEN).balanceOfTOKEN(account)) * ITOKEN(TOKEN).getMarketPrice() / 1e18) + (IERC20(OTOKEN).balanceOf(account) * ITOKEN(TOKEN).getOTokenPrice() / 1e18)) / 1e18); portfolio.stakingRewards = (account == address(0) ? 0 : priceBASE * (IVTOKENRewarder(rewarder).getRewardForDuration(BASE) + (IVTOKENRewarder(rewarder).getRewardForDuration(TOKEN) * ITOKEN(TOKEN).getMarketPrice() / 1e18) + (IVTOKENRewarder(rewarder).getRewardForDuration(OTOKEN) * ITOKEN(TOKEN).getOTokenPrice() / 1e18)) / 1e18 * IERC20(VTOKEN).balanceOf(account) / IERC20(VTOKEN).totalSupply()); address[] memory plugins = IVoter(voter).getPlugins(); uint256 rewardsOTOKEN = 0; for (uint i = 0; i < plugins.length; i++) { address gauge = IVoter(voter).gauges(plugins[i]); if (IPlugin(plugins[i]).balanceOf(account) > 0) { rewardsOTOKEN += (IGauge(gauge).getRewardForDuration(OTOKEN) * IGauge(gauge).balanceOf(account) / IGauge(gauge).totalSupply()); } } portfolio.farmingRewards = rewardsOTOKEN * ITOKEN(TOKEN).getOTokenPrice() * priceBASE / 1e36; return portfolio; } }
// 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.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IBribe { /*---------- FUNCTIONS --------------------------------------------*/ function getReward(address account) external; function notifyRewardAmount(address token, uint amount) external; /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ function _deposit(uint amount, address account) external; function _withdraw(uint amount, address account) external; function addReward(address rewardToken) external; /*---------- VIEW FUNCTIONS ---------------------------------------*/ function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function rewardPerToken(address reward) external view returns (uint); function getRewardForDuration(address reward) external view returns (uint); function left(address reward) external view returns (uint); function earned(address account, address reward) external view returns (uint); function getRewardTokens() external view returns (address[] memory); function DURATION() external view returns (uint); function isRewardToken(address token) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IGauge { /*---------- FUNCTIONS --------------------------------------------*/ function getReward(address account) external; function notifyRewardAmount(address token, uint amount) external; /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ function _deposit(address account, uint256 amount) external; function _withdraw(address account, uint256 amount) external; function addReward(address rewardToken) external; /*---------- VIEW FUNCTIONS ---------------------------------------*/ function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function rewardPerToken(address reward) external view returns (uint); function getRewardForDuration(address reward) external view returns (uint); function earned(address account, address reward) external view returns (uint); function left(address token) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IMinter { /*---------- FUNCTIONS --------------------------------------------*/ function update_period() external returns (uint256); /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ /*---------- VIEW FUNCTIONS ---------------------------------------*/ function team() external view returns (address); function weekly() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IPlugin { /*---------- FUNCTIONS --------------------------------------------*/ function claimAndDistribute() external; /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ function setGauge(address gauge) external; function setBribe(address bribe) external; /*---------- VIEW FUNCTIONS ---------------------------------------*/ function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function getUnderlyingName() external view returns (string memory); function getUnderlyingSymbol() external view returns (string memory); function getUnderlyingAddress() external view returns (address); function getProtocol() external view returns (string memory); function getTokensInUnderlying() external view returns (address[] memory); function getBribeTokens() external view returns (address[] memory); function getUnderlyingDecimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface ITOKEN { /*---------- FUNCTIONS --------------------------------------------*/ /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ /*---------- VIEW FUNCTIONS ---------------------------------------*/ function BASE() external view returns (address); function OTOKEN() external view returns (address); function VTOKEN() external view returns (address); function totalSupply() external view returns (uint256); function frBASE() external view returns (uint256); function mrvBASE() external view returns (uint256); function mrrBASE() external view returns (uint256); function mrrTOKEN() external view returns (uint256); function getFloorPrice() external view returns (uint256); function getMaxSell() external view returns (uint256); function getMarketPrice() external view returns (uint256); function getOTokenPrice() external view returns (uint256); function getTotalValueLocked() external view returns (uint256); function getAccountCredit(address account) external view returns (uint256) ; function debts(address account) external view returns (uint256); function FEES() external view returns (address); function PROTOCOL_FEE() external view returns (uint256); function DIVISOR() external view returns (uint256); function PRECISION() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IVoter { /*---------- FUNCTIONS --------------------------------------------*/ function distribute(address _gauge) external; function emitDeposit(address account, uint amount) external; function emitWithdraw(address account, uint amount) external; function notifyRewardAmount(uint amount) external; /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ /*---------- VIEW FUNCTIONS ---------------------------------------*/ function OTOKEN() external view returns (address); function plugins(uint256 index) external view returns (address); function getPlugins() external view returns (address[] memory); function gauges(address pool) external view returns (address); function bribes(address pool) external view returns (address); function isAlive(address gauge) external view returns (bool); function usedWeights(address account) external view returns (uint256); function weights(address pool) external view returns (uint256); function totalWeight() external view returns (uint256); function votes(address account, address pool) external view returns (uint256); function lastVoted(address account) external view returns (uint256); function minter() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IVTOKEN { /*---------- FUNCTIONS --------------------------------------------*/ /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ /*---------- VIEW FUNCTIONS ---------------------------------------*/ function OTOKEN() external view returns (address); function balanceOf(address account) external view returns (uint256); function balanceOfTOKEN(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function totalSupplyTOKEN() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IVTOKENRewarder { /*---------- FUNCTIONS --------------------------------------------*/ function balanceOf(address account) external view returns (uint256); function notifyRewardAmount(address token, uint amount) external; /*---------- RESTRICTED FUNCTIONS ---------------------------------*/ function _deposit(uint amount, address account) external; function _withdraw(uint amount, address account) external; function addReward(address rewardToken) external; /*---------- VIEW FUNCTIONS ---------------------------------------*/ function rewardPerToken(address _rewardsToken) external view returns (uint256); function getRewardForDuration(address reward) external view returns (uint); function earned(address account, address _rewardsToken) external view returns (uint256); }
{ "optimizer": { "enabled": true, "runs": 200, "details": {} }, "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":"_voter","type":"address"},{"internalType":"address","name":"_BASE","type":"address"},{"internalType":"address","name":"_TOKEN","type":"address"},{"internalType":"address","name":"_OTOKEN","type":"address"},{"internalType":"address","name":"_VTOKEN","type":"address"},{"internalType":"address","name":"_rewarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEED_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"bondingCurveData","outputs":[{"components":[{"internalType":"uint256","name":"priceBASE","type":"uint256"},{"internalType":"uint256","name":"priceTOKEN","type":"uint256"},{"internalType":"uint256","name":"priceOTOKEN","type":"uint256"},{"internalType":"uint256","name":"maxMarketSell","type":"uint256"},{"internalType":"uint256","name":"tvl","type":"uint256"},{"internalType":"uint256","name":"supplyTOKEN","type":"uint256"},{"internalType":"uint256","name":"supplyVTOKEN","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"ltv","type":"uint256"},{"internalType":"uint256","name":"marketCap","type":"uint256"},{"internalType":"uint256","name":"weekly","type":"uint256"},{"internalType":"uint256","name":"accountBASE","type":"uint256"},{"internalType":"uint256","name":"accountTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountOTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountEarnedBASE","type":"uint256"},{"internalType":"uint256","name":"accountEarnedTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountEarnedOTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountVTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountVotingPower","type":"uint256"},{"internalType":"uint256","name":"accountUsedWeights","type":"uint256"},{"internalType":"uint256","name":"accountBorrowCredit","type":"uint256"},{"internalType":"uint256","name":"accountBorrowDebt","type":"uint256"},{"internalType":"uint256","name":"accountMaxWithdraw","type":"uint256"},{"internalType":"uint256","name":"accountLastVoted","type":"uint256"}],"internalType":"struct Multicall.BondingCurve","name":"bondingCurve","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"bribeCardData","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"bribe","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint8[]","name":"rewardTokenDecimals","type":"uint8[]"},{"internalType":"uint256[]","name":"rewardsPerToken","type":"uint256[]"},{"internalType":"uint256[]","name":"accountRewardsEarned","type":"uint256[]"},{"internalType":"uint256","name":"voteWeight","type":"uint256"},{"internalType":"uint256","name":"votePercent","type":"uint256"},{"internalType":"uint256","name":"accountVote","type":"uint256"}],"internalType":"struct Multicall.BribeCard","name":"bribeCard","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"gaugeCardData","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"underlyingDecimals","type":"uint8"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"tokensInUnderlying","type":"address[]"},{"internalType":"uint256","name":"priceBase","type":"uint256"},{"internalType":"uint256","name":"priceOTOKEN","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenUSD","type":"uint256"},{"internalType":"uint256","name":"votingWeight","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"accountUnderlyingBalance","type":"uint256"},{"internalType":"uint256","name":"accountStakedBalance","type":"uint256"},{"internalType":"uint256","name":"accountEarnedOTOKEN","type":"uint256"}],"internalType":"struct Multicall.GaugeCard","name":"gaugeCard","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getBribeCards","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"bribe","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint8[]","name":"rewardTokenDecimals","type":"uint8[]"},{"internalType":"uint256[]","name":"rewardsPerToken","type":"uint256[]"},{"internalType":"uint256[]","name":"accountRewardsEarned","type":"uint256[]"},{"internalType":"uint256","name":"voteWeight","type":"uint256"},{"internalType":"uint256","name":"votePercent","type":"uint256"},{"internalType":"uint256","name":"accountVote","type":"uint256"}],"internalType":"struct Multicall.BribeCard[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getGaugeCards","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"underlyingDecimals","type":"uint8"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"tokensInUnderlying","type":"address[]"},{"internalType":"uint256","name":"priceBase","type":"uint256"},{"internalType":"uint256","name":"priceOTOKEN","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenUSD","type":"uint256"},{"internalType":"uint256","name":"votingWeight","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"accountUnderlyingBalance","type":"uint256"},{"internalType":"uint256","name":"accountStakedBalance","type":"uint256"},{"internalType":"uint256","name":"accountEarnedOTOKEN","type":"uint256"}],"internalType":"struct Multicall.GaugeCard[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPlugin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlugins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"portfolioData","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"stakingRewards","type":"uint256"},{"internalType":"uint256","name":"farmingRewards","type":"uint256"}],"internalType":"struct Multicall.Portfolio","name":"portfolio","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteBuyIn","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteBuyOut","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteSellIn","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteSellOut","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapCardData","outputs":[{"components":[{"internalType":"uint256","name":"frBASE","type":"uint256"},{"internalType":"uint256","name":"mrvBASE","type":"uint256"},{"internalType":"uint256","name":"mrrBASE","type":"uint256"},{"internalType":"uint256","name":"mrrTOKEN","type":"uint256"},{"internalType":"uint256","name":"marketMaxTOKEN","type":"uint256"}],"internalType":"struct Multicall.SwapCard","name":"swapCard","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101606040523480156200001257600080fd5b50604051620064dc380380620064dc8339810160408190526200003591620000f5565b6001600160a01b0380871660805285811660a05284811660c081905284821660e052838216610100529082166101205260408051630b4501fd60e01b81529051630b4501fd916004808201926020929091908290030181865afa158015620000a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c7919062000176565b610140525062000190945050505050565b80516001600160a01b0381168114620000f057600080fd5b919050565b60008060008060008060c087890312156200010f57600080fd5b6200011a87620000d8565b95506200012a60208801620000d8565b94506200013a60408801620000d8565b93506200014a60608801620000d8565b92506200015a60808801620000d8565b91506200016a60a08801620000d8565b90509295509295509295565b6000602082840312156200018957600080fd5b5051919050565b60805160a05160c05160e051610100516101205161014051615ffd620004df6000396000818161051e01528181613ffe015281816144b001528181614a04015261543c01526000818161055801528181611821015281816118f1015281816119be01528181611f2d01528181611ffc015281816120cb01528181612bc301528181612d0c0152612dca0152600081816105a6015281816116970152818161173301528181612172015281816122190152818161280f015281816129ef0152612a8e0152600081816104f701528181610b6c01528181610d8701528181611226015281816117ee01528181611e5e015281816120a3015281816126e601528181612b9b01526131450152600081816104210152818161095d0152818161138901528181611436015281816114d40152818161156d0152818161160c015281816118be01528181611a9901528181611b1b01528181611db701528181611fd4015281816123650152818161240c01528181612648015281816127700152818161289901528181612b0501528181612c4d01528181612ce40152818161320001528181613eeb01528181613f6d01528181614027015281816140b30152818161416b015281816141ed0152818161429c015281816144e50152818161458201528181614623015281816146a50152818161475d0152818161483b0152818161493f01528181614a3901528181614abb01528181614b6401528181614c0a01528181614cc301528181614dc601528181614e8c01528181614f1701528181614fa20152818161502d015281816150b801528181615329015281816153ab01528181615467015281816154f301526155ac01526000818161057f0152818161198b01528181611d1001528181611f05015281816129410152612da2015260008181610387015281816106e40152818161077801528181610aea01528181610d0501528181610e2401528181610eab01528181610f4a0152818161119c01528181611bfb015281816122bf015281816124b50152818161257f01528181612e8601528181612f1d015281816132d80152818161336c01528181613550015281816139ed01528181613b5701528181613bce01528181613c5501528181613cf40152818161514401526151e60152615ffd6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806384e883ef116100de578063b49f4afd11610097578063d91b996211610071578063d91b996214610540578063dcc3e06e14610553578063ec342ad01461057a578063fb548427146105a157600080fd5b8063b49f4afd146104ea578063c544df0c146104f2578063c57981b51461051957600080fd5b806384e883ef1461044357806389b96d4d146104565780639736f34814610469578063a2d869b2146104b3578063aaf5eb68146104c8578063b322706b146104d757600080fd5b806338013f021161013057806338013f021461034f57806346c96aac14610382578063668be7f0146103a95780637a12e531146103c95780637c72adf1146103fc57806382bfefc81461041c57600080fd5b806301d61c49146101785780630bf5f590146101b25780630d66951c146101d25780631ffbacb7146102f1578063235052d6146103265780633410fe6e14610346575b600080fd5b61019f7fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc81565b6040519081526020015b60405180910390f35b6101c56101c0366004615767565b6105c8565b6040516101a9919061595f565b6101e56101e0366004615979565b6112b0565b6040516101a99190815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e08083015190820152610200808301519082015261022080830151908201526102408083015190820152610260808301519082015261028080830151908201526102a080830151908201526102c080830151908201526102e091820151918101919091526103000190565b6103046102ff366004615979565b6125fd565b60408051825181526020808401519082015291810151908201526060016101a9565b610339610334366004615767565b6132ab565b6040516101a99190615b02565b61019f61271081565b61036a732880ab155794e7179c9ee2e38200202908c17b4381565b6040516001600160a01b0390911681526020016101a9565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6103bc6103b7366004615b15565b613e2a565b6040516101a99190615b4e565b6103dc6103d7366004615bb0565b613ee1565b6040805194855260208501939093529183015260608201526080016101a9565b61040f61040a366004615b15565b6143f4565b6040516101a99190615bd2565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6103dc610451366004615bb0565b6144a2565b6103dc610464366004615bb0565b6149f6565b610471614e58565b6040516101a99190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b6104bb615140565b6040516101a99190615c27565b61019f670de0b6b3a764000081565b61036a6104e5366004615c74565b6151cd565b61019f615259565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61019f7f000000000000000000000000000000000000000000000000000000000000000081565b6103dc61054e366004615bb0565b61531f565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6105d0615636565b6001600160a01b03831680825260408051634453434160e11b815290516388a68682916004808201926020929091908290030181865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190615c8d565b81602001906001600160a01b031690816001600160a01b031681525050826001600160a01b03166392081a476040518163ffffffff1660e01b8152600401602060405180830381865afa158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190615caa565b60ff166040828101919091525163b9a09fd560e01b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190615c8d565b6001600160a01b0390811660608301819052604051631703e5f960e01b815260048101919091527f000000000000000000000000000000000000000000000000000000000000000090911690631703e5f990602401602060405180830381865afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190615ccd565b151560808201526040805163d16352af60e01b815290516001600160a01b0385169163d16352af9160048083019260009291908290030181865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108599190810190615d36565b8160a00181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa15801561089f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c79190810190615d36565b8160c00181905250826001600160a01b031663b1942b166040518163ffffffff1660e01b8152600401600060405180830381865afa15801561090d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109359190810190615dc1565b60e0820152610942615259565b81610100018181525050670de0b6b3a76400008161010001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190615e73565b6109e69190615ea2565b6109f09190615eb9565b8161012001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190615e73565b15610c025780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190615e73565b60405163b9a09fd560e01b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b559190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919091169063bcd1101490602401602060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190615e73565b610bf390670de0b6b3a7640000615ea2565b610bfd9190615eb9565b610c05565b60005b8161014001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c759190615e73565b15610e155780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190615e73565b61012082015160405163b9a09fd560e01b81526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa158015610d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d709190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919091169063bcd1101490602401602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc9190615e73565b610e069190615ea2565b610e109190615eb9565b610e18565b60005b816101600181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190615e73565b15610fe1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190615e73565b6040516353e5642360e11b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a7cac84690602401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615e73565b610fc0906064615ea2565b610fd290670de0b6b3a7640000615ea2565b610fdc9190615eb9565b610fe4565b60005b8161018001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190615e73565b6101a08201526001600160a01b038216156110de5760208101516040516370a0823160e01b81526001600160a01b038481166004830152909116906370a0823190602401602060405180830381865afa1580156110b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d99190615e73565b6110e1565b60005b6101c08201526001600160a01b03821615611165576040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190615e73565b611168565b60005b6101e08201526001600160a01b038216156112a05760405163b9a09fd560e01b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190615c8d565b60405163211dc32d60e01b81526001600160a01b0384811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830152919091169063211dc32d90604401602060405180830381865afa158015611277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129b9190615e73565b6112a3565b60005b6102008201525b92915050565b6113686040518061030001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611370615259565b816000018181525050670de0b6b3a764000081600001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190615e73565b6114139190615ea2565b61141d9190615eb9565b816020018181525050670de0b6b3a764000081600001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190615e73565b6114bf9190615ea2565b6114c99190615eb9565b8160400181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663466f63116040518163ffffffff1660e01b8152600401602060405180830381865afa158015611530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115549190615e73565b816060018181525050670de0b6b3a764000081600001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b26025aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190615e73565b6115f79190615ea2565b6116019190615eb9565b8160800181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168c9190615e73565b8160a00181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663183c77c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190615e73565b60c0820181905215611a8b57670de0b6b3a764000081602001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190615e73565b6117be906007615ea2565b6117c89190615ea2565b6117d29190615eb9565b6040828101519051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000092917f00000000000000000000000000000000000000000000000000000000000000009091169063bcd1101490602401602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190615e73565b6118989190615ea2565b6118a29190615eb9565b6020830151604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000092917f00000000000000000000000000000000000000000000000000000000000000009091169063bcd1101490602401602060405180830381865afa15801561193a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195e9190615e73565b6119689190615ea2565b6119729190615eb9565b8351604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000092917f00000000000000000000000000000000000000000000000000000000000000009091169063bcd1101490602401602060405180830381865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615e73565b611a359190615ea2565b611a3f9190615eb9565b611a499190615edb565b611a539190615edb565b611a5f9061016d615ea2565b611a6a906064615ea2565b611a7c90670de0b6b3a7640000615ea2565b611a869190615eb9565b611a8e565b60005b8160e00181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b199190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632a33d6b26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b9190615e73565b611ba6906064615ea2565b611bb890670de0b6b3a7640000615ea2565b611bc29190615eb9565b610100820152602081015160a0820151670de0b6b3a764000091611be591615ea2565b611bef9190615eb9565b816101200181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190615c8d565b6001600160a01b03166326cfc17b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615e73565b6101408201526001600160a01b03821615611d80576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190615e73565b611d83565b60005b6101608201526001600160a01b03821615611e27576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190615e73565b611e2a565b60005b6101808201526001600160a01b03821615611ece576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190615e73565b611ed1565b60005b6101a08201526001600160a01b03821615611f9d5760405163211dc32d60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063211dc32d90604401602060405180830381865afa158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190615e73565b611fa0565b60005b6101c08201526001600160a01b0382161561206c5760405163211dc32d60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063211dc32d90604401602060405180830381865afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120679190615e73565b61206f565b60005b6101e08201526001600160a01b0382161561213b5760405163211dc32d60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063211dc32d90604401602060405180830381865afa158015612112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121369190615e73565b61213e565b60005b6102008201526001600160a01b038216156121e257604051631ef1589960e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690631ef1589990602401602060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd9190615e73565b6121e5565b60005b6102208201526001600160a01b03821615612289576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122849190615e73565b61228c565b60005b6102408201526001600160a01b0382161561232e57604051620be37960e21b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690622f8de490602401602060405180830381865afa158015612305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123299190615e73565b612331565b60005b6102608201526001600160a01b038216156123d557604051634c7ebd3760e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634c7ebd3790602401602060405180830381865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190615e73565b6123d8565b60005b6102808201526001600160a01b0382161561247c57604051632ecd4e7d60e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690632ecd4e7d90602401602060405180830381865afa158015612453573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124779190615e73565b61247f565b60005b6102a08201526001600160a01b0382161561254857604051620be37960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690622f8de490602401602060405180830381865afa1580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125219190615e73565b1161254157806102a0015181610220015161253c9190615eee565b61254b565b600061254b565b60005b6102c08201526001600160a01b038216156125ef57604051639a61df8960e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639a61df8990602401602060405180830381865afa1580156125c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ea9190615e73565b6125f2565b60005b6102e0820152919050565b61262160405180606001604052806000815260200160008152602001600081525090565b600061262b615259565b90506001600160a01b038316156129d957670de0b6b3a7640000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c79190615e73565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615e73565b61275b9190615ea2565b6127659190615eb9565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190615e73565b604051631ef1589960e01b81526001600160a01b0388811660048301527f00000000000000000000000000000000000000000000000000000000000000001690631ef1589990602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156128e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129049190615e73565b61290e9190615edb565b6129189190615ea2565b6129229190615eb9565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190615e73565b6129b69190615edb565b6129c09190615edb565b6129ca9083615ea2565b6129d49190615eb9565b6129dc565b60005b82526001600160a01b03831615612e76577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190615e73565b6040516370a0823160e01b81526001600160a01b0385811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af99190615e73565b670de0b6b3a7640000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190615e73565b604051632f34440560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063bcd1101490602401602060405180830381865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190615e73565b612c389190615ea2565b612c429190615eb9565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccd9190615e73565b604051632f34440560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063bcd1101490602401602060405180830381865afa158015612d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d779190615e73565b612d819190615ea2565b612d8b9190615eb9565b604051632f34440560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063bcd1101490602401602060405180830381865afa158015612e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e359190615e73565b612e3f9190615edb565b612e499190615edb565b612e539085615ea2565b612e5d9190615eb9565b612e679190615ea2565b612e719190615eb9565b612e79565b60005b82602001818152505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa158015612ee2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f0a9190810190615dc1565b90506000805b82518110156131ec5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b9a09fd5858481518110612f5c57612f5c615f01565b60200260200101516040518263ffffffff1660e01b8152600401612f8f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd09190615c8d565b90506000848381518110612fe657612fe6615f01565b60209081029190910101516040516370a0823160e01b81526001600160a01b038a81166004830152909116906370a0823190602401602060405180830381865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190615e73565b11156131d957806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c49190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301528316906370a0823190602401602060405180830381865afa15801561310a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312e9190615e73565b604051632f34440560e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015284169063bcd1101490602401602060405180830381865afa158015613194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b89190615e73565b6131c29190615ea2565b6131cc9190615eb9565b6131d69084615edb565b92505b50806131e481615f17565b915050612f10565b506ec097ce7bc90715b34b9f1000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327f9190615e73565b6132899084615ea2565b6132939190615ea2565b61329d9190615eb9565b604085015250919392505050565b6132b36156da565b6001600160a01b03838116808352604051635462ecad60e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000009091169063a8c5d95a90602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615c8d565b6001600160a01b03908116602083015260405163b9a09fd560e01b815284821660048201527f000000000000000000000000000000000000000000000000000000000000000090911690631703e5f990829063b9a09fd590602401602060405180830381865afa1580156133bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e19190615c8d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134499190615ccd565b816040019015159081151581525050826001600160a01b031663d16352af6040518163ffffffff1660e01b8152600401600060405180830381865afa158015613496573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134be9190810190615d36565b8160600181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261352c9190810190615d36565b6080820152604051635462ecad60e11b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8c5d95a90602401602060405180830381865afa158015613597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bb9190615c8d565b6001600160a01b031663c4f59f9b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156135f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136209190810190615dc1565b60a082018190525160009067ffffffffffffffff81111561364357613643615cef565b60405190808252806020026020018201604052801561366c578160200160208202803683370190505b50905060005b8260a0015151811015613734578260a00151818151811061369557613695615f01565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190615caa565b82828151811061371057613710615f01565b60ff909216602092830291909101909101528061372c81615f17565b915050613672565b5060c0820181905260a08201515160009067ffffffffffffffff81111561375d5761375d615cef565b604051908082528060200260200182016040528015613786578160200160208202803683370190505b50905060005b8360a001515181101561395a5783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ff9190615e73565b156139285783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386a9190615e73565b84602001516001600160a01b031663bcd110148660a00151848151811061389357613893615f01565b60200260200101516040518263ffffffff1660e01b81526004016138c691906001600160a01b0391909116815260200190565b602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190615e73565b61391990670de0b6b3a7640000615ea2565b6139239190615eb9565b61392b565b60005b82828151811061393d5761393d615f01565b60209081029190910101528061395281615f17565b91505061378c565b5060e0830181905260a08301515160009067ffffffffffffffff81111561398357613983615cef565b6040519080825280602002602001820160405280156139ac578160200160208202803683370190505b50905060005b8460a0015151811015613b2f576001600160a01b03861615613afd57604051635462ecad60e11b81526001600160a01b0388811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8c5d95a90602401602060405180830381865afa158015613a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a589190615c8d565b6001600160a01b031663211dc32d878760a001518481518110613a7d57613a7d615f01565b60200260200101516040518363ffffffff1660e01b8152600401613ab79291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015613ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af89190615e73565b613b00565b60005b828281518110613b1257613b12615f01565b602090810291909101015280613b2781615f17565b9150506139b2565b5061010084018190526040516353e5642360e11b81526001600160a01b0387811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a7cac84690602401602060405180830381865afa158015613b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc29190615e73565b846101200181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4e9190615e73565b15613d8b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd59190615e73565b6040516353e5642360e11b81526001600160a01b0388811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a7cac84690602401602060405180830381865afa158015613d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5f9190615e73565b613d6a906064615ea2565b613d7c90670de0b6b3a7640000615ea2565b613d869190615eb9565b613d8e565b60005b6101408501526001600160a01b03851615613e185760208401516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa158015613def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e139190615e73565b613e1b565b60005b61016085015250505092915050565b60606000613e388585615eee565b67ffffffffffffffff811115613e5057613e50615cef565b604051908082528060200260200182016040528015613e8957816020015b613e766156da565b815260200190600190039081613e6e5790505b509050845b84811015613ed857613ea8613ea2826151cd565b856132ab565b828281518110613eba57613eba615f01565b60200260200101819052508080613ed090615f17565b915050613e8e565b50949350505050565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f6b9190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fed9190615e73565b613ff79190615edb565b90506140257f0000000000000000000000000000000000000000000000000000000000000000612710615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a79190615e73565b6140b18984615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561410f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141339190615e73565b61413d9085615ea2565b6141479190615eb9565b6141519190615eee565b61415d90612710615ea2565b6141679190615eb9565b94507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141eb9190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061426d9190615e73565b6142779087615edb565b1115614291576000806000809450945094509450506143eb565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431c9190615e73565b6143269087615ea2565b6143309190615eb9565b61434288670de0b6b3a7640000615ea2565b61434c9190615eb9565b61435e90670de0b6b3a7640000615eee565b614369906064615ea2565b93506127106143788789615ea2565b6143829190615eb9565b9250614398612710670de0b6b3a7640000615ea2565b6143aa85670de0b6b3a7640000615edb565b6143b5906064615ea2565b6143c9612710670de0b6b3a7640000615ea2565b6143d39190615eee565b6143dd9089615ea2565b6143e79190615eb9565b9150505b92959194509250565b606060006144028585615eee565b67ffffffffffffffff81111561441a5761441a615cef565b60405190808252806020026020018201604052801561445357816020015b614440615636565b8152602001906001900390816144385790505b509050845b84811015613ed85761447261446c826151cd565b856105c8565b82828151811061448457614484615f01565b6020026020010181905250808061449a90615f17565b915050614458565b6000808080806127106144d57f000000000000000000000000000000000000000000000000000000000000000089615ea2565b6144df9190615eb9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145659190615e73565b90506000826145748a84615edb565b61457e9190615eee565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146029190615e73565b81111561461f5760008060008096509650965096505050506143eb565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa15801561467f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146a39190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147259190615e73565b61472f9190615edb565b90508161473c8483615ea2565b6147469190615eb9565b6147509082615eee565b9750670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147dd9190615e73565b6147e7908c615ea2565b6147f19190615eb9565b61480389670de0b6b3a7640000615ea2565b61480d9190615eb9565b61481f90670de0b6b3a7640000615eee565b61482a906064615ea2565b965061271089670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bb9190615e73565b6148c5908e615ea2565b6148cf9190615eb9565b6148d99190615ea2565b6148e39190615eb9565b95506148f9612710670de0b6b3a7640000615ea2565b61490b88670de0b6b3a7640000615edb565b614916906064615ea2565b61492a612710670de0b6b3a7640000615ea2565b6149349190615eee565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561499b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149bf9190615e73565b6149c9908e615ea2565b6149d39190615eb9565b6149dd9190615ea2565b6149e79190615eb9565b94505050505092959194509250565b600080808080612710614a297f000000000000000000000000000000000000000000000000000000000000000089615ea2565b614a339190615eb9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ab99190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b3b9190615e73565b614b459190615edb565b9050600082614b548a84615edb565b614b5e9190615eee565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614be49190615e73565b905081614bf18285615ea2565b614bfb9190615eb9565b614c059082615eee565b9750897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c8a9190615e73565b614c94908a615ea2565b614c9e9190615eb9565b614cb090670de0b6b3a7640000615eee565b614cbb906064615ea2565b9650612710897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d439190615e73565b614d558d670de0b6b3a7640000615ea2565b614d5f9190615eb9565b614d699190615ea2565b614d739190615eb9565b9550614d89612710670de0b6b3a7640000615ea2565b614d9b88670de0b6b3a7640000615edb565b614da6906064615ea2565b614dba612710670de0b6b3a7640000615ea2565b614dc49190615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e469190615e73565b6149c98d670de0b6b3a7640000615ea2565b614e8a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad6cb8236040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f0c9190615e73565b8160000181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f979190615e73565b8160200181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ffe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150229190615e73565b8160400181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150ad9190615e73565b8160600181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151389190615e73565b608082015290565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa1580156151a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526151c89190810190615dc1565b905090565b60405163f0a317eb60e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f0a317eb90602401602060405180830381865afa158015615235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190615c8d565b60006040516396834ad360e01b81527fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc6004820152600090732880ab155794e7179c9ee2e38200202908c17b43906396834ad390602401608060405180830381865afa1580156152cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152f19190615f30565b5190506305f5e10061530f600783900b670de0b6b3a7640000615ea2565b6153199190615eb9565b91505090565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015615385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153a99190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061542b9190615e73565b6154359190615edb565b90506154637f0000000000000000000000000000000000000000000000000000000000000000612710615eee565b81887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156154c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e79190615e73565b6154f19190615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561554f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155739190615e73565b61557d9085615ea2565b6155879190615eb9565b6155919190615eee565b61559d90612710615ea2565b6155a79190615eb9565b9450847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015615608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061562c9190615e73565b6143429089615ea2565b60405180610220016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff16815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461576457600080fd5b50565b6000806040838503121561577a57600080fd5b82356157858161574f565b915060208301356157958161574f565b809150509250929050565b60005b838110156157bb5781810151838201526020016157a3565b50506000910152565b600081518084526157dc8160208601602086016157a0565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156158295781516001600160a01b031687529582019590820190600101615804565b509495945050505050565b80516001600160a01b031682526000610220602083015161586060208601826001600160a01b03169052565b506040830151615875604086018260ff169052565b50606083015161589060608601826001600160a01b03169052565b5060808301516158a4608086018215159052565b5060a08301518160a08601526158bc828601826157c4565b91505060c083015184820360c08601526158d682826157c4565b91505060e083015184820360e08601526158f082826157f0565b610100858101519087015261012080860151908701526101408086015190870152610160808601519087015261018080860151908701526101a080860151908701526101c080860151908701526101e08086015190870152610200948501519490950193909352509192915050565b6020815260006159726020830184615834565b9392505050565b60006020828403121561598b57600080fd5b81356159728161574f565b600081518084526020808501945080840160005b8381101561582957815160ff16875295820195908201906001016159aa565b600081518084526020808501945080840160005b83811015615829578151875295820195908201906001016159dd565b80516001600160a01b0316825260006101806020830151615a2560208601826001600160a01b03169052565b506040830151615a39604086018215159052565b506060830151816060860152615a51828601826157c4565b91505060808301518482036080860152615a6b82826157c4565b91505060a083015184820360a0860152615a8582826157f0565b91505060c083015184820360c0860152615a9f8282615996565b91505060e083015184820360e0860152615ab982826159c9565b9150506101008084015185830382870152615ad483826159c9565b6101208681015190880152610140808701519088015261016095860151959096019490945250929392505050565b60208152600061597260208301846159f9565b600080600060608486031215615b2a57600080fd5b83359250602084013591506040840135615b438161574f565b809150509250925092565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615b918583516159f9565b94509285019290850190600101615b75565b5092979650505050505050565b60008060408385031215615bc357600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615c15858351615834565b94509285019290850190600101615bf9565b6020808252825182820181905260009190848201906040850190845b81811015615c685783516001600160a01b031683529284019291840191600101615c43565b50909695505050505050565b600060208284031215615c8657600080fd5b5035919050565b600060208284031215615c9f57600080fd5b81516159728161574f565b600060208284031215615cbc57600080fd5b815160ff8116811461597257600080fd5b600060208284031215615cdf57600080fd5b8151801515811461597257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615d2e57615d2e615cef565b604052919050565b600060208284031215615d4857600080fd5b815167ffffffffffffffff80821115615d6057600080fd5b818401915084601f830112615d7457600080fd5b815181811115615d8657615d86615cef565b615d99601f8201601f1916602001615d05565b9150808252856020828501011115615db057600080fd5b613ed88160208401602086016157a0565b60006020808385031215615dd457600080fd5b825167ffffffffffffffff80821115615dec57600080fd5b818501915085601f830112615e0057600080fd5b815181811115615e1257615e12615cef565b8060051b9150615e23848301615d05565b8181529183018401918481019088841115615e3d57600080fd5b938501935b83851015615e675784519250615e578361574f565b8282529385019390850190615e42565b98975050505050505050565b600060208284031215615e8557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112aa576112aa615e8c565b600082615ed657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156112aa576112aa615e8c565b818103818111156112aa576112aa615e8c565b634e487b7160e01b600052603260045260246000fd5b600060018201615f2957615f29615e8c565b5060010190565b600060808284031215615f4257600080fd5b6040516080810167ffffffffffffffff8282108183111715615f6657615f66615cef565b81604052845191508160070b8214615f7d57600080fd5b9082526020840151908082168214615f9457600080fd5b5060208201526040830151600381900b8114615faf57600080fd5b6040820152606092830151928101929092525091905056fea26469706673582212208a89af54be4aff56084fdd166363765ab49416af2a409ac0a103eafa9e3d820a64736f6c63430008130033000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3800000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f20000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806384e883ef116100de578063b49f4afd11610097578063d91b996211610071578063d91b996214610540578063dcc3e06e14610553578063ec342ad01461057a578063fb548427146105a157600080fd5b8063b49f4afd146104ea578063c544df0c146104f2578063c57981b51461051957600080fd5b806384e883ef1461044357806389b96d4d146104565780639736f34814610469578063a2d869b2146104b3578063aaf5eb68146104c8578063b322706b146104d757600080fd5b806338013f021161013057806338013f021461034f57806346c96aac14610382578063668be7f0146103a95780637a12e531146103c95780637c72adf1146103fc57806382bfefc81461041c57600080fd5b806301d61c49146101785780630bf5f590146101b25780630d66951c146101d25780631ffbacb7146102f1578063235052d6146103265780633410fe6e14610346575b600080fd5b61019f7fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc81565b6040519081526020015b60405180910390f35b6101c56101c0366004615767565b6105c8565b6040516101a9919061595f565b6101e56101e0366004615979565b6112b0565b6040516101a99190815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e08083015190820152610200808301519082015261022080830151908201526102408083015190820152610260808301519082015261028080830151908201526102a080830151908201526102c080830151908201526102e091820151918101919091526103000190565b6103046102ff366004615979565b6125fd565b60408051825181526020808401519082015291810151908201526060016101a9565b610339610334366004615767565b6132ab565b6040516101a99190615b02565b61019f61271081565b61036a732880ab155794e7179c9ee2e38200202908c17b4381565b6040516001600160a01b0390911681526020016101a9565b61036a7f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e81565b6103bc6103b7366004615b15565b613e2a565b6040516101a99190615b4e565b6103dc6103d7366004615bb0565b613ee1565b6040805194855260208501939093529183015260608201526080016101a9565b61040f61040a366004615b15565b6143f4565b6040516101a99190615bd2565b61036a7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b81565b6103dc610451366004615bb0565b6144a2565b6103dc610464366004615bb0565b6149f6565b610471614e58565b6040516101a99190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b6104bb615140565b6040516101a99190615c27565b61019f670de0b6b3a764000081565b61036a6104e5366004615c74565b6151cd565b61019f615259565b61036a7f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081565b61019f7f000000000000000000000000000000000000000000000000000000000000003281565b6103dc61054e366004615bb0565b61531f565b61036a7f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a70762581565b61036a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b61036a7f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f281565b6105d0615636565b6001600160a01b03831680825260408051634453434160e11b815290516388a68682916004808201926020929091908290030181865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190615c8d565b81602001906001600160a01b031690816001600160a01b031681525050826001600160a01b03166392081a476040518163ffffffff1660e01b8152600401602060405180830381865afa158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190615caa565b60ff166040828101919091525163b9a09fd560e01b81526001600160a01b0384811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190615c8d565b6001600160a01b0390811660608301819052604051631703e5f960e01b815260048101919091527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e90911690631703e5f990602401602060405180830381865afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190615ccd565b151560808201526040805163d16352af60e01b815290516001600160a01b0385169163d16352af9160048083019260009291908290030181865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108599190810190615d36565b8160a00181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa15801561089f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c79190810190615d36565b8160c00181905250826001600160a01b031663b1942b166040518163ffffffff1660e01b8152600401600060405180830381865afa15801561090d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109359190810190615dc1565b60e0820152610942615259565b81610100018181525050670de0b6b3a76400008161010001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190615e73565b6109e69190615ea2565b6109f09190615eb9565b8161012001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190615e73565b15610c025780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190615e73565b60405163b9a09fd560e01b81526001600160a01b0385811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b559190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166004830152919091169063bcd1101490602401602060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190615e73565b610bf390670de0b6b3a7640000615ea2565b610bfd9190615eb9565b610c05565b60005b8161014001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c759190615e73565b15610e155780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190615e73565b61012082015160405163b9a09fd560e01b81526001600160a01b0386811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa158015610d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d709190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166004830152919091169063bcd1101490602401602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc9190615e73565b610e069190615ea2565b610e109190615eb9565b610e18565b60005b816101600181815250507f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190615e73565b15610fe1577f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190615e73565b6040516353e5642360e11b81526001600160a01b0385811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a7cac84690602401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615e73565b610fc0906064615ea2565b610fd290670de0b6b3a7640000615ea2565b610fdc9190615eb9565b610fe4565b60005b8161018001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190615e73565b6101a08201526001600160a01b038216156110de5760208101516040516370a0823160e01b81526001600160a01b038481166004830152909116906370a0823190602401602060405180830381865afa1580156110b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d99190615e73565b6110e1565b60005b6101c08201526001600160a01b03821615611165576040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190615e73565b611168565b60005b6101e08201526001600160a01b038216156112a05760405163b9a09fd560e01b81526001600160a01b0384811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190615c8d565b60405163211dc32d60e01b81526001600160a01b0384811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166024830152919091169063211dc32d90604401602060405180830381865afa158015611277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129b9190615e73565b6112a3565b60005b6102008201525b92915050565b6113686040518061030001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611370615259565b816000018181525050670de0b6b3a764000081600001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190615e73565b6114139190615ea2565b61141d9190615eb9565b816020018181525050670de0b6b3a764000081600001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190615e73565b6114bf9190615ea2565b6114c99190615eb9565b8160400181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663466f63116040518163ffffffff1660e01b8152600401602060405180830381865afa158015611530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115549190615e73565b816060018181525050670de0b6b3a764000081600001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663b26025aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190615e73565b6115f79190615ea2565b6116019190615eb9565b8160800181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168c9190615e73565b8160a00181815250507f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f26001600160a01b031663183c77c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190615e73565b60c0820181905215611a8b57670de0b6b3a764000081602001517f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f26001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190615e73565b6117be906007615ea2565b6117c89190615ea2565b6117d29190615eb9565b6040828101519051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166004830152670de0b6b3a764000092917f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a7076259091169063bcd1101490602401602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190615e73565b6118989190615ea2565b6118a29190615eb9565b6020830151604051632f34440560e21b81526001600160a01b037f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b81166004830152670de0b6b3a764000092917f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a7076259091169063bcd1101490602401602060405180830381865afa15801561193a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195e9190615e73565b6119689190615ea2565b6119729190615eb9565b8351604051632f34440560e21b81526001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881166004830152670de0b6b3a764000092917f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a7076259091169063bcd1101490602401602060405180830381865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615e73565b611a359190615ea2565b611a3f9190615eb9565b611a499190615edb565b611a539190615edb565b611a5f9061016d615ea2565b611a6a906064615ea2565b611a7c90670de0b6b3a7640000615ea2565b611a869190615eb9565b611a8e565b60005b8160e00181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b199190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316632a33d6b26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b9190615e73565b611ba6906064615ea2565b611bb890670de0b6b3a7640000615ea2565b611bc29190615eb9565b610100820152602081015160a0820151670de0b6b3a764000091611be591615ea2565b611bef9190615eb9565b816101200181815250507f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190615c8d565b6001600160a01b03166326cfc17b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615e73565b6101408201526001600160a01b03821615611d80576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190615e73565b611d83565b60005b6101608201526001600160a01b03821615611e27576040516370a0823160e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b16906370a0823190602401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190615e73565b611e2a565b60005b6101808201526001600160a01b03821615611ece576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a016906370a0823190602401602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190615e73565b611ed1565b60005b6101a08201526001600160a01b03821615611f9d5760405163211dc32d60e01b81526001600160a01b0383811660048301527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38811660248301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063211dc32d90604401602060405180830381865afa158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190615e73565b611fa0565b60005b6101c08201526001600160a01b0382161561206c5760405163211dc32d60e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b811660248301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063211dc32d90604401602060405180830381865afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120679190615e73565b61206f565b60005b6101e08201526001600160a01b0382161561213b5760405163211dc32d60e01b81526001600160a01b0383811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0811660248301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063211dc32d90604401602060405180830381865afa158015612112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121369190615e73565b61213e565b60005b6102008201526001600160a01b038216156121e257604051631ef1589960e01b81526001600160a01b0383811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f21690631ef1589990602401602060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd9190615e73565b6121e5565b60005b6102208201526001600160a01b03821615612289576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f216906370a0823190602401602060405180830381865afa158015612260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122849190615e73565b61228c565b60005b6102408201526001600160a01b0382161561232e57604051620be37960e21b81526001600160a01b0383811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e1690622f8de490602401602060405180830381865afa158015612305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123299190615e73565b612331565b60005b6102608201526001600160a01b038216156123d557604051634c7ebd3760e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b1690634c7ebd3790602401602060405180830381865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190615e73565b6123d8565b60005b6102808201526001600160a01b0382161561247c57604051632ecd4e7d60e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b1690632ecd4e7d90602401602060405180830381865afa158015612453573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124779190615e73565b61247f565b60005b6102a08201526001600160a01b0382161561254857604051620be37960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e90911690622f8de490602401602060405180830381865afa1580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125219190615e73565b1161254157806102a0015181610220015161253c9190615eee565b61254b565b600061254b565b60005b6102c08201526001600160a01b038216156125ef57604051639a61df8960e01b81526001600160a01b0383811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e1690639a61df8990602401602060405180830381865afa1580156125c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ea9190615e73565b6125f2565b60005b6102e0820152919050565b61262160405180606001604052806000815260200160008152602001600081525090565b600061262b615259565b90506001600160a01b038316156129d957670de0b6b3a7640000807f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c79190615e73565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a016906370a0823190602401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615e73565b61275b9190615ea2565b6127659190615eb9565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190615e73565b604051631ef1589960e01b81526001600160a01b0388811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f21690631ef1589990602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b16906370a0823190602401602060405180830381865afa1580156128e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129049190615e73565b61290e9190615edb565b6129189190615ea2565b6129229190615eb9565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816906370a0823190602401602060405180830381865afa158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190615e73565b6129b69190615edb565b6129c09190615edb565b6129ca9083615ea2565b6129d49190615eb9565b6129dc565b60005b82526001600160a01b03831615612e76577f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f26001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190615e73565b6040516370a0823160e01b81526001600160a01b0385811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f216906370a0823190602401602060405180830381865afa158015612ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af99190615e73565b670de0b6b3a7640000807f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190615e73565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0811660048301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063bcd1101490602401602060405180830381865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190615e73565b612c389190615ea2565b612c429190615eb9565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccd9190615e73565b604051632f34440560e21b81526001600160a01b037f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b811660048301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063bcd1101490602401602060405180830381865afa158015612d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d779190615e73565b612d819190615ea2565b612d8b9190615eb9565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38811660048301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063bcd1101490602401602060405180830381865afa158015612e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e359190615e73565b612e3f9190615edb565b612e499190615edb565b612e539085615ea2565b612e5d9190615eb9565b612e679190615ea2565b612e719190615eb9565b612e79565b60005b82602001818152505060007f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa158015612ee2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f0a9190810190615dc1565b90506000805b82518110156131ec5760007f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663b9a09fd5858481518110612f5c57612f5c615f01565b60200260200101516040518263ffffffff1660e01b8152600401612f8f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd09190615c8d565b90506000848381518110612fe657612fe6615f01565b60209081029190910101516040516370a0823160e01b81526001600160a01b038a81166004830152909116906370a0823190602401602060405180830381865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190615e73565b11156131d957806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c49190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301528316906370a0823190602401602060405180830381865afa15801561310a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312e9190615e73565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a08116600483015284169063bcd1101490602401602060405180830381865afa158015613194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b89190615e73565b6131c29190615ea2565b6131cc9190615eb9565b6131d69084615edb565b92505b50806131e481615f17565b915050612f10565b506ec097ce7bc90715b34b9f1000000000837f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327f9190615e73565b6132899084615ea2565b6132939190615ea2565b61329d9190615eb9565b604085015250919392505050565b6132b36156da565b6001600160a01b03838116808352604051635462ecad60e11b815260048101919091527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e9091169063a8c5d95a90602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615c8d565b6001600160a01b03908116602083015260405163b9a09fd560e01b815284821660048201527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e90911690631703e5f990829063b9a09fd590602401602060405180830381865afa1580156133bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e19190615c8d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134499190615ccd565b816040019015159081151581525050826001600160a01b031663d16352af6040518163ffffffff1660e01b8152600401600060405180830381865afa158015613496573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134be9190810190615d36565b8160600181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261352c9190810190615d36565b6080820152604051635462ecad60e11b81526001600160a01b0384811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a8c5d95a90602401602060405180830381865afa158015613597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bb9190615c8d565b6001600160a01b031663c4f59f9b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156135f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136209190810190615dc1565b60a082018190525160009067ffffffffffffffff81111561364357613643615cef565b60405190808252806020026020018201604052801561366c578160200160208202803683370190505b50905060005b8260a0015151811015613734578260a00151818151811061369557613695615f01565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190615caa565b82828151811061371057613710615f01565b60ff909216602092830291909101909101528061372c81615f17565b915050613672565b5060c0820181905260a08201515160009067ffffffffffffffff81111561375d5761375d615cef565b604051908082528060200260200182016040528015613786578160200160208202803683370190505b50905060005b8360a001515181101561395a5783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ff9190615e73565b156139285783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386a9190615e73565b84602001516001600160a01b031663bcd110148660a00151848151811061389357613893615f01565b60200260200101516040518263ffffffff1660e01b81526004016138c691906001600160a01b0391909116815260200190565b602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190615e73565b61391990670de0b6b3a7640000615ea2565b6139239190615eb9565b61392b565b60005b82828151811061393d5761393d615f01565b60209081029190910101528061395281615f17565b91505061378c565b5060e0830181905260a08301515160009067ffffffffffffffff81111561398357613983615cef565b6040519080825280602002602001820160405280156139ac578160200160208202803683370190505b50905060005b8460a0015151811015613b2f576001600160a01b03861615613afd57604051635462ecad60e11b81526001600160a01b0388811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a8c5d95a90602401602060405180830381865afa158015613a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a589190615c8d565b6001600160a01b031663211dc32d878760a001518481518110613a7d57613a7d615f01565b60200260200101516040518363ffffffff1660e01b8152600401613ab79291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015613ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af89190615e73565b613b00565b60005b828281518110613b1257613b12615f01565b602090810291909101015280613b2781615f17565b9150506139b2565b5061010084018190526040516353e5642360e11b81526001600160a01b0387811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a7cac84690602401602060405180830381865afa158015613b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc29190615e73565b846101200181815250507f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4e9190615e73565b15613d8b577f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd59190615e73565b6040516353e5642360e11b81526001600160a01b0388811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a7cac84690602401602060405180830381865afa158015613d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5f9190615e73565b613d6a906064615ea2565b613d7c90670de0b6b3a7640000615ea2565b613d869190615eb9565b613d8e565b60005b6101408501526001600160a01b03851615613e185760208401516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa158015613def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e139190615e73565b613e1b565b60005b61016085015250505092915050565b60606000613e388585615eee565b67ffffffffffffffff811115613e5057613e50615cef565b604051908082528060200260200182016040528015613e8957816020015b613e766156da565b815260200190600190039081613e6e5790505b509050845b84811015613ed857613ea8613ea2826151cd565b856132ab565b828281518110613eba57613eba615f01565b60200260200101819052508080613ed090615f17565b915050613e8e565b50949350505050565b60008060008060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f6b9190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fed9190615e73565b613ff79190615edb565b90506140257f0000000000000000000000000000000000000000000000000000000000000032612710615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a79190615e73565b6140b18984615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561410f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141339190615e73565b61413d9085615ea2565b6141479190615eb9565b6141519190615eee565b61415d90612710615ea2565b6141679190615eb9565b94507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141eb9190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061426d9190615e73565b6142779087615edb565b1115614291576000806000809450945094509450506143eb565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431c9190615e73565b6143269087615ea2565b6143309190615eb9565b61434288670de0b6b3a7640000615ea2565b61434c9190615eb9565b61435e90670de0b6b3a7640000615eee565b614369906064615ea2565b93506127106143788789615ea2565b6143829190615eb9565b9250614398612710670de0b6b3a7640000615ea2565b6143aa85670de0b6b3a7640000615edb565b6143b5906064615ea2565b6143c9612710670de0b6b3a7640000615ea2565b6143d39190615eee565b6143dd9089615ea2565b6143e79190615eb9565b9150505b92959194509250565b606060006144028585615eee565b67ffffffffffffffff81111561441a5761441a615cef565b60405190808252806020026020018201604052801561445357816020015b614440615636565b8152602001906001900390816144385790505b509050845b84811015613ed85761447261446c826151cd565b856105c8565b82828151811061448457614484615f01565b6020026020010181905250808061449a90615f17565b915050614458565b6000808080806127106144d57f000000000000000000000000000000000000000000000000000000000000003289615ea2565b6144df9190615eb9565b905060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145659190615e73565b90506000826145748a84615edb565b61457e9190615eee565b90507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146029190615e73565b81111561461f5760008060008096509650965096505050506143eb565b60007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa15801561467f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146a39190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147259190615e73565b61472f9190615edb565b90508161473c8483615ea2565b6147469190615eb9565b6147509082615eee565b9750670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147dd9190615e73565b6147e7908c615ea2565b6147f19190615eb9565b61480389670de0b6b3a7640000615ea2565b61480d9190615eb9565b61481f90670de0b6b3a7640000615eee565b61482a906064615ea2565b965061271089670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bb9190615e73565b6148c5908e615ea2565b6148cf9190615eb9565b6148d99190615ea2565b6148e39190615eb9565b95506148f9612710670de0b6b3a7640000615ea2565b61490b88670de0b6b3a7640000615edb565b614916906064615ea2565b61492a612710670de0b6b3a7640000615ea2565b6149349190615eee565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561499b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149bf9190615e73565b6149c9908e615ea2565b6149d39190615eb9565b6149dd9190615ea2565b6149e79190615eb9565b94505050505092959194509250565b600080808080612710614a297f000000000000000000000000000000000000000000000000000000000000003289615ea2565b614a339190615eb9565b905060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ab99190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b3b9190615e73565b614b459190615edb565b9050600082614b548a84615edb565b614b5e9190615eee565b905060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614be49190615e73565b905081614bf18285615ea2565b614bfb9190615eb9565b614c059082615eee565b9750897f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c8a9190615e73565b614c94908a615ea2565b614c9e9190615eb9565b614cb090670de0b6b3a7640000615eee565b614cbb906064615ea2565b9650612710897f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d439190615e73565b614d558d670de0b6b3a7640000615ea2565b614d5f9190615eb9565b614d699190615ea2565b614d739190615eb9565b9550614d89612710670de0b6b3a7640000615ea2565b614d9b88670de0b6b3a7640000615edb565b614da6906064615ea2565b614dba612710670de0b6b3a7640000615ea2565b614dc49190615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e469190615e73565b6149c98d670de0b6b3a7640000615ea2565b614e8a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663ad6cb8236040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f0c9190615e73565b8160000181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f979190615e73565b8160200181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ffe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150229190615e73565b8160400181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150ad9190615e73565b8160600181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151389190615e73565b608082015290565b60607f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa1580156151a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526151c89190810190615dc1565b905090565b60405163f0a317eb60e01b8152600481018290526000907f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03169063f0a317eb90602401602060405180830381865afa158015615235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190615c8d565b60006040516396834ad360e01b81527fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc6004820152600090732880ab155794e7179c9ee2e38200202908c17b43906396834ad390602401608060405180830381865afa1580156152cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152f19190615f30565b5190506305f5e10061530f600783900b670de0b6b3a7640000615ea2565b6153199190615eb9565b91505090565b60008060008060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015615385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153a99190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061542b9190615e73565b6154359190615edb565b90506154637f0000000000000000000000000000000000000000000000000000000000000032612710615eee565b81887f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156154c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e79190615e73565b6154f19190615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561554f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155739190615e73565b61557d9085615ea2565b6155879190615eb9565b6155919190615eee565b61559d90612710615ea2565b6155a79190615eb9565b9450847f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015615608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061562c9190615e73565b6143429089615ea2565b60405180610220016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff16815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461576457600080fd5b50565b6000806040838503121561577a57600080fd5b82356157858161574f565b915060208301356157958161574f565b809150509250929050565b60005b838110156157bb5781810151838201526020016157a3565b50506000910152565b600081518084526157dc8160208601602086016157a0565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156158295781516001600160a01b031687529582019590820190600101615804565b509495945050505050565b80516001600160a01b031682526000610220602083015161586060208601826001600160a01b03169052565b506040830151615875604086018260ff169052565b50606083015161589060608601826001600160a01b03169052565b5060808301516158a4608086018215159052565b5060a08301518160a08601526158bc828601826157c4565b91505060c083015184820360c08601526158d682826157c4565b91505060e083015184820360e08601526158f082826157f0565b610100858101519087015261012080860151908701526101408086015190870152610160808601519087015261018080860151908701526101a080860151908701526101c080860151908701526101e08086015190870152610200948501519490950193909352509192915050565b6020815260006159726020830184615834565b9392505050565b60006020828403121561598b57600080fd5b81356159728161574f565b600081518084526020808501945080840160005b8381101561582957815160ff16875295820195908201906001016159aa565b600081518084526020808501945080840160005b83811015615829578151875295820195908201906001016159dd565b80516001600160a01b0316825260006101806020830151615a2560208601826001600160a01b03169052565b506040830151615a39604086018215159052565b506060830151816060860152615a51828601826157c4565b91505060808301518482036080860152615a6b82826157c4565b91505060a083015184820360a0860152615a8582826157f0565b91505060c083015184820360c0860152615a9f8282615996565b91505060e083015184820360e0860152615ab982826159c9565b9150506101008084015185830382870152615ad483826159c9565b6101208681015190880152610140808701519088015261016095860151959096019490945250929392505050565b60208152600061597260208301846159f9565b600080600060608486031215615b2a57600080fd5b83359250602084013591506040840135615b438161574f565b809150509250925092565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615b918583516159f9565b94509285019290850190600101615b75565b5092979650505050505050565b60008060408385031215615bc357600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615c15858351615834565b94509285019290850190600101615bf9565b6020808252825182820181905260009190848201906040850190845b81811015615c685783516001600160a01b031683529284019291840191600101615c43565b50909695505050505050565b600060208284031215615c8657600080fd5b5035919050565b600060208284031215615c9f57600080fd5b81516159728161574f565b600060208284031215615cbc57600080fd5b815160ff8116811461597257600080fd5b600060208284031215615cdf57600080fd5b8151801515811461597257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615d2e57615d2e615cef565b604052919050565b600060208284031215615d4857600080fd5b815167ffffffffffffffff80821115615d6057600080fd5b818401915084601f830112615d7457600080fd5b815181811115615d8657615d86615cef565b615d99601f8201601f1916602001615d05565b9150808252856020828501011115615db057600080fd5b613ed88160208401602086016157a0565b60006020808385031215615dd457600080fd5b825167ffffffffffffffff80821115615dec57600080fd5b818501915085601f830112615e0057600080fd5b815181811115615e1257615e12615cef565b8060051b9150615e23848301615d05565b8181529183018401918481019088841115615e3d57600080fd5b938501935b83851015615e675784519250615e578361574f565b8282529385019390850190615e42565b98975050505050505050565b600060208284031215615e8557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112aa576112aa615e8c565b600082615ed657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156112aa576112aa615e8c565b818103818111156112aa576112aa615e8c565b634e487b7160e01b600052603260045260246000fd5b600060018201615f2957615f29615e8c565b5060010190565b600060808284031215615f4257600080fd5b6040516080810167ffffffffffffffff8282108183111715615f6657615f66615cef565b81604052845191508160070b8214615f7d57600080fd5b9082526020840151908082168214615f9457600080fd5b5060208201526040830151600381900b8114615faf57600080fd5b6040820152606092830151928101929092525091905056fea26469706673582212208a89af54be4aff56084fdd166363765ab49416af2a409ac0a103eafa9e3d820a64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3800000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f20000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625
-----Decoded View---------------
Arg [0] : _voter (address): 0xB85213e2be9fd369Eb502532d0Ae9a8Fc1D8883E
Arg [1] : _BASE (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [2] : _TOKEN (address): 0x41408E1510AC6f651FD6D8a142EC1B24bdAF1b5B
Arg [3] : _OTOKEN (address): 0xfd3e3c69698b722c8FC3C20B853DCE35C149F4A0
Arg [4] : _VTOKEN (address): 0xD5dCbDdd672b80EA9179A21B7691A34fb85615F2
Arg [5] : _rewarder (address): 0x2acF851CF6B2b827c4f794433cC5C0aE1A707625
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [2] : 00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b
Arg [3] : 000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0
Arg [4] : 000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f2
Arg [5] : 0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.